9remote 3.0.26 → 3.0.30

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 (320) hide show
  1. package/README.md +15 -11
  2. package/dist/bin/desktop-bridge.cs +5 -5
  3. package/dist/bin/desktop-elevate.cs +1 -1
  4. package/dist/cli.cjs +120 -87
  5. package/dist/ptyDaemon.cjs +9 -9
  6. package/dist/server.cjs +213 -212
  7. package/dist/ui/assets/index-efgSOMyZ.js +8 -0
  8. package/dist/ui/index.html +1 -1
  9. package/dist/web/404.html +1 -1
  10. package/dist/web/__next.__PAGE__.txt +2 -2
  11. package/dist/web/__next._full.txt +4 -3
  12. package/dist/web/__next._head.txt +1 -1
  13. package/dist/web/__next._index.txt +3 -2
  14. package/dist/web/__next._tree.txt +3 -2
  15. package/dist/web/_next/static/NEXFR4gbx_Fw8QgP6HAJw/_buildManifest.js +1 -0
  16. package/dist/web/_next/static/chunks/1222.a2ce7d7f04241e2a.js +1 -0
  17. package/dist/web/_next/static/chunks/1228.046ad5fd038f5192.js +1 -0
  18. package/dist/web/_next/static/chunks/1243.1d11020940b8a88b.js +1 -0
  19. package/dist/web/_next/static/chunks/132.1ed2fce3a4b6f7ee.js +1 -0
  20. package/dist/web/_next/static/chunks/1750.2cbe0f722b879a3b.js +1 -0
  21. package/dist/web/_next/static/chunks/2038.b7c72b442a1b2d92.js +1 -0
  22. package/dist/web/_next/static/chunks/2097-4937b5f90f482cf8.js +1 -0
  23. package/dist/web/_next/static/chunks/213.f07a816120a320ba.js +1 -0
  24. package/dist/web/_next/static/chunks/2180.23585bd3f3308f3a.js +1 -0
  25. package/dist/web/_next/static/chunks/2849.360e2c64521fa795.js +1 -0
  26. package/dist/web/_next/static/chunks/3429.98d7e79ff6d2a6ce.js +1 -0
  27. package/dist/web/_next/static/chunks/3514.9079bf49bb3e05c9.js +1 -0
  28. package/dist/web/_next/static/chunks/4643.ddf3ea3a760e73a5.js +1 -0
  29. package/dist/web/_next/static/chunks/5788-a6716c825d4a7fc3.js +1 -0
  30. package/dist/web/_next/static/chunks/6276.aa48f74970f7ef3d.js +1 -0
  31. package/dist/web/_next/static/chunks/6419.99aa173d83f20370.js +1 -0
  32. package/dist/web/_next/static/chunks/6552-f908d82b4c4161ed.js +1 -0
  33. package/dist/web/_next/static/chunks/674.97a7237f011fb986.js +1 -0
  34. package/dist/web/_next/static/chunks/6742.bc3783b9784ead96.js +1 -0
  35. package/dist/web/_next/static/chunks/7507.28a3807b5d02a5c1.js +1 -0
  36. package/dist/web/_next/static/chunks/7960.026e07028dd25edb.js +1 -0
  37. package/dist/web/_next/static/chunks/8467.290e9bde34b58e7c.js +1 -0
  38. package/dist/web/_next/static/chunks/8638.237712645dcdcb8a.js +1 -0
  39. package/dist/web/_next/static/chunks/8922-6961d48ca52e1c93.js +1 -0
  40. package/dist/web/_next/static/chunks/925.fe600c6039a3201d.js +1 -0
  41. package/dist/web/_next/static/chunks/9259.c450f561db04037d.js +1 -0
  42. package/dist/web/_next/static/chunks/9299.83236781dfa74eb0.js +1 -0
  43. package/dist/web/_next/static/chunks/9871-9cd97efc98617c33.js +1 -0
  44. package/dist/web/_next/static/chunks/app/_global-error/page-e656bb9bc0f3fd3d.js +1 -0
  45. package/dist/web/_next/static/chunks/app/admin/access/page-3a49e3c597eea658.js +5 -0
  46. package/dist/web/_next/static/chunks/app/admin/login/page-c7bdfdfbcc763df4.js +1 -0
  47. package/dist/web/_next/static/chunks/app/admin/ota/page-406ff48a5882efa4.js +5 -0
  48. package/dist/web/_next/static/chunks/app/admin/page-434461c255fd088a.js +5 -0
  49. package/dist/web/_next/static/chunks/app/admin/turn/page-dd7552f387e08b36.js +5 -0
  50. package/dist/web/_next/static/chunks/app/dev/question/page-ab488886d05baea5.js +1 -0
  51. package/dist/web/_next/static/chunks/app/download/page-33ffe95ce3abb566.js +1 -0
  52. package/dist/web/_next/static/chunks/app/login/page-a2d6ff37be787acd.js +1 -0
  53. package/dist/web/_next/static/chunks/app/page-bb1a7719eaabad49.js +22 -0
  54. package/dist/web/_next/static/chunks/app/workspace/browse/page-e656bb9bc0f3fd3d.js +1 -0
  55. package/dist/web/_next/static/chunks/app/workspace/editor/page-e656bb9bc0f3fd3d.js +1 -0
  56. package/dist/web/_next/static/chunks/app/workspace/files/page-e656bb9bc0f3fd3d.js +1 -0
  57. package/dist/web/_next/static/chunks/app/workspace/git/page-e656bb9bc0f3fd3d.js +1 -0
  58. package/dist/web/_next/static/chunks/app/workspace/layout-0753f643f5ed4893.js +15 -0
  59. package/dist/web/_next/static/chunks/app/workspace/mobile/page-e656bb9bc0f3fd3d.js +1 -0
  60. package/dist/web/_next/static/chunks/app/workspace/page-e656bb9bc0f3fd3d.js +1 -0
  61. package/dist/web/_next/static/chunks/app/workspace/pair/page-e656bb9bc0f3fd3d.js +1 -0
  62. package/dist/web/_next/static/chunks/app/workspace/remote/page-e656bb9bc0f3fd3d.js +1 -0
  63. package/dist/web/_next/static/chunks/app/workspace/terminal/[sessionId]/page-e656bb9bc0f3fd3d.js +1 -0
  64. package/dist/web/_next/static/chunks/app/workspace/welcome/page-e656bb9bc0f3fd3d.js +1 -0
  65. package/dist/web/_next/static/chunks/app/workspace/workspaces/page-e656bb9bc0f3fd3d.js +1 -0
  66. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/app-error-e656bb9bc0f3fd3d.js +1 -0
  67. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/forbidden-e656bb9bc0f3fd3d.js +1 -0
  68. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/not-found-e656bb9bc0f3fd3d.js +1 -0
  69. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/unauthorized-e656bb9bc0f3fd3d.js +1 -0
  70. package/dist/web/_next/static/chunks/webpack-b56d3361b185b0cb.js +1 -0
  71. package/dist/web/_next/static/css/7e8c7b663586bab9.css +1 -0
  72. package/dist/web/_next/static/css/{56adcd4d72bf2d84.css → adc0ee53b89bee3c.css} +1 -1
  73. package/dist/web/_not-found/__next._full.txt +3 -2
  74. package/dist/web/_not-found/__next._head.txt +1 -1
  75. package/dist/web/_not-found/__next._index.txt +3 -2
  76. package/dist/web/_not-found/__next._not-found.__PAGE__.txt +1 -1
  77. package/dist/web/_not-found/__next._not-found.txt +1 -1
  78. package/dist/web/_not-found/__next._tree.txt +3 -2
  79. package/dist/web/_not-found.html +1 -1
  80. package/dist/web/_not-found.txt +3 -2
  81. package/dist/web/admin/__next._full.txt +4 -3
  82. package/dist/web/admin/__next._head.txt +1 -1
  83. package/dist/web/admin/__next._index.txt +3 -2
  84. package/dist/web/admin/__next._tree.txt +3 -2
  85. package/dist/web/admin/__next.admin.__PAGE__.txt +2 -2
  86. package/dist/web/admin/__next.admin.txt +1 -1
  87. package/dist/web/admin/access/__next._full.txt +28 -0
  88. package/dist/web/admin/{admins → access}/__next._head.txt +1 -1
  89. package/dist/web/admin/access/__next._index.txt +11 -0
  90. package/dist/web/admin/{admins → access}/__next._tree.txt +3 -2
  91. package/dist/web/admin/{admins/__next.admin.admins.__PAGE__.txt → access/__next.admin.access.__PAGE__.txt} +2 -2
  92. package/dist/web/admin/{admins/__next.admin.admins.txt → access/__next.admin.access.txt} +1 -1
  93. package/dist/web/admin/{admins → access}/__next.admin.txt +1 -1
  94. package/dist/web/admin/access.html +1 -0
  95. package/dist/web/admin/access.txt +28 -0
  96. package/dist/web/admin/login/__next._full.txt +4 -3
  97. package/dist/web/admin/login/__next._head.txt +1 -1
  98. package/dist/web/admin/login/__next._index.txt +3 -2
  99. package/dist/web/admin/login/__next._tree.txt +3 -2
  100. package/dist/web/admin/login/__next.admin.login.__PAGE__.txt +2 -2
  101. package/dist/web/admin/login/__next.admin.login.txt +1 -1
  102. package/dist/web/admin/login/__next.admin.txt +1 -1
  103. package/dist/web/admin/login.html +1 -1
  104. package/dist/web/admin/login.txt +4 -3
  105. package/dist/web/admin/ota/__next._full.txt +4 -3
  106. package/dist/web/admin/ota/__next._head.txt +1 -1
  107. package/dist/web/admin/ota/__next._index.txt +3 -2
  108. package/dist/web/admin/ota/__next._tree.txt +3 -2
  109. package/dist/web/admin/ota/__next.admin.ota.__PAGE__.txt +2 -2
  110. package/dist/web/admin/ota/__next.admin.ota.txt +1 -1
  111. package/dist/web/admin/ota/__next.admin.txt +1 -1
  112. package/dist/web/admin/ota.html +1 -1
  113. package/dist/web/admin/ota.txt +4 -3
  114. package/dist/web/admin/turn/__next._full.txt +4 -3
  115. package/dist/web/admin/turn/__next._head.txt +1 -1
  116. package/dist/web/admin/turn/__next._index.txt +3 -2
  117. package/dist/web/admin/turn/__next._tree.txt +3 -2
  118. package/dist/web/admin/turn/__next.admin.turn.__PAGE__.txt +2 -2
  119. package/dist/web/admin/turn/__next.admin.turn.txt +1 -1
  120. package/dist/web/admin/turn/__next.admin.txt +1 -1
  121. package/dist/web/admin/turn.html +1 -1
  122. package/dist/web/admin/turn.txt +4 -3
  123. package/dist/web/admin.html +1 -1
  124. package/dist/web/admin.txt +4 -3
  125. package/dist/web/dev/question/__next._full.txt +4 -3
  126. package/dist/web/dev/question/__next._head.txt +1 -1
  127. package/dist/web/dev/question/__next._index.txt +3 -2
  128. package/dist/web/dev/question/__next._tree.txt +3 -2
  129. package/dist/web/dev/question/__next.dev.question.__PAGE__.txt +2 -2
  130. package/dist/web/dev/question/__next.dev.question.txt +1 -1
  131. package/dist/web/dev/question/__next.dev.txt +1 -1
  132. package/dist/web/dev/question.html +1 -1
  133. package/dist/web/dev/question.txt +4 -3
  134. package/dist/web/download/__next._full.txt +25 -0
  135. package/dist/web/download/__next._head.txt +6 -0
  136. package/dist/web/download/__next._index.txt +11 -0
  137. package/dist/web/{admin/modes → download}/__next._tree.txt +3 -2
  138. package/dist/web/download/__next.download.__PAGE__.txt +6 -0
  139. package/dist/web/{admin/modes/__next.admin.modes.txt → download/__next.download.txt} +1 -1
  140. package/dist/web/download.html +1 -0
  141. package/dist/web/download.txt +25 -0
  142. package/dist/web/index.html +1 -1
  143. package/dist/web/index.txt +4 -3
  144. package/dist/web/login/__next._full.txt +4 -3
  145. package/dist/web/login/__next._head.txt +1 -1
  146. package/dist/web/login/__next._index.txt +3 -2
  147. package/dist/web/login/__next._tree.txt +3 -2
  148. package/dist/web/login/__next.login.__PAGE__.txt +2 -2
  149. package/dist/web/login/__next.login.txt +1 -1
  150. package/dist/web/login.html +1 -1
  151. package/dist/web/login.txt +4 -3
  152. package/dist/web/workspace/__next._full.txt +5 -4
  153. package/dist/web/workspace/__next._head.txt +1 -1
  154. package/dist/web/workspace/__next._index.txt +3 -2
  155. package/dist/web/workspace/__next._tree.txt +4 -3
  156. package/dist/web/workspace/__next.workspace.__PAGE__.txt +1 -1
  157. package/dist/web/workspace/__next.workspace.txt +3 -3
  158. package/dist/web/workspace/browse/__next._full.txt +5 -4
  159. package/dist/web/workspace/browse/__next._head.txt +1 -1
  160. package/dist/web/workspace/browse/__next._index.txt +3 -2
  161. package/dist/web/workspace/browse/__next._tree.txt +4 -3
  162. package/dist/web/workspace/browse/__next.workspace.browse.__PAGE__.txt +1 -1
  163. package/dist/web/workspace/browse/__next.workspace.browse.txt +1 -1
  164. package/dist/web/workspace/browse/__next.workspace.txt +3 -3
  165. package/dist/web/workspace/browse.html +1 -1
  166. package/dist/web/workspace/browse.txt +5 -4
  167. package/dist/web/workspace/editor/__next._full.txt +5 -4
  168. package/dist/web/workspace/editor/__next._head.txt +1 -1
  169. package/dist/web/workspace/editor/__next._index.txt +3 -2
  170. package/dist/web/workspace/editor/__next._tree.txt +4 -3
  171. package/dist/web/workspace/editor/__next.workspace.editor.__PAGE__.txt +1 -1
  172. package/dist/web/workspace/editor/__next.workspace.editor.txt +1 -1
  173. package/dist/web/workspace/editor/__next.workspace.txt +3 -3
  174. package/dist/web/workspace/editor.html +1 -1
  175. package/dist/web/workspace/editor.txt +5 -4
  176. package/dist/web/workspace/files/__next._full.txt +5 -4
  177. package/dist/web/workspace/files/__next._head.txt +1 -1
  178. package/dist/web/workspace/files/__next._index.txt +3 -2
  179. package/dist/web/workspace/files/__next._tree.txt +4 -3
  180. package/dist/web/workspace/files/__next.workspace.files.__PAGE__.txt +1 -1
  181. package/dist/web/workspace/files/__next.workspace.files.txt +1 -1
  182. package/dist/web/workspace/files/__next.workspace.txt +3 -3
  183. package/dist/web/workspace/files.html +1 -1
  184. package/dist/web/workspace/files.txt +5 -4
  185. package/dist/web/workspace/git/__next._full.txt +5 -4
  186. package/dist/web/workspace/git/__next._head.txt +1 -1
  187. package/dist/web/workspace/git/__next._index.txt +3 -2
  188. package/dist/web/workspace/git/__next._tree.txt +4 -3
  189. package/dist/web/workspace/git/__next.workspace.git.__PAGE__.txt +1 -1
  190. package/dist/web/workspace/git/__next.workspace.git.txt +1 -1
  191. package/dist/web/workspace/git/__next.workspace.txt +3 -3
  192. package/dist/web/workspace/git.html +1 -1
  193. package/dist/web/workspace/git.txt +5 -4
  194. package/dist/web/workspace/mobile/__next._full.txt +5 -4
  195. package/dist/web/workspace/mobile/__next._head.txt +1 -1
  196. package/dist/web/workspace/mobile/__next._index.txt +3 -2
  197. package/dist/web/workspace/mobile/__next._tree.txt +4 -3
  198. package/dist/web/workspace/mobile/__next.workspace.mobile.__PAGE__.txt +1 -1
  199. package/dist/web/workspace/mobile/__next.workspace.mobile.txt +1 -1
  200. package/dist/web/workspace/mobile/__next.workspace.txt +3 -3
  201. package/dist/web/workspace/mobile.html +1 -1
  202. package/dist/web/workspace/mobile.txt +5 -4
  203. package/dist/web/workspace/pair/__next._full.txt +28 -0
  204. package/dist/web/{admin/modes → workspace/pair}/__next._head.txt +1 -1
  205. package/dist/web/workspace/pair/__next._index.txt +11 -0
  206. package/dist/web/workspace/pair/__next._tree.txt +7 -0
  207. package/dist/web/workspace/pair/__next.workspace.pair.__PAGE__.txt +5 -0
  208. package/dist/web/{admin/modes/__next.admin.txt → workspace/pair/__next.workspace.pair.txt} +1 -1
  209. package/dist/web/workspace/pair/__next.workspace.txt +8 -0
  210. package/dist/web/workspace/pair.html +1 -0
  211. package/dist/web/workspace/pair.txt +28 -0
  212. package/dist/web/workspace/remote/__next._full.txt +5 -4
  213. package/dist/web/workspace/remote/__next._head.txt +1 -1
  214. package/dist/web/workspace/remote/__next._index.txt +3 -2
  215. package/dist/web/workspace/remote/__next._tree.txt +4 -3
  216. package/dist/web/workspace/remote/__next.workspace.remote.__PAGE__.txt +1 -1
  217. package/dist/web/workspace/remote/__next.workspace.remote.txt +1 -1
  218. package/dist/web/workspace/remote/__next.workspace.txt +3 -3
  219. package/dist/web/workspace/remote.html +1 -1
  220. package/dist/web/workspace/remote.txt +5 -4
  221. package/dist/web/workspace/terminal/default/__next._full.txt +10 -7
  222. package/dist/web/workspace/terminal/default/__next._head.txt +1 -1
  223. package/dist/web/workspace/terminal/default/__next._index.txt +3 -2
  224. package/dist/web/workspace/terminal/default/__next._tree.txt +4 -3
  225. package/dist/web/workspace/terminal/default/__next.workspace.terminal.$d$sessionId.__PAGE__.txt +1 -1
  226. package/dist/web/workspace/terminal/default/__next.workspace.terminal.$d$sessionId.txt +1 -1
  227. package/dist/web/workspace/terminal/default/__next.workspace.terminal.txt +1 -1
  228. package/dist/web/workspace/terminal/default/__next.workspace.txt +3 -3
  229. package/dist/web/workspace/terminal/default.html +1 -1
  230. package/dist/web/workspace/terminal/default.txt +10 -7
  231. package/dist/web/workspace/welcome/__next._full.txt +28 -0
  232. package/dist/web/workspace/welcome/__next._head.txt +6 -0
  233. package/dist/web/workspace/welcome/__next._index.txt +11 -0
  234. package/dist/web/workspace/welcome/__next._tree.txt +7 -0
  235. package/dist/web/workspace/welcome/__next.workspace.txt +8 -0
  236. package/dist/web/workspace/welcome/__next.workspace.welcome.__PAGE__.txt +5 -0
  237. package/dist/web/workspace/welcome/__next.workspace.welcome.txt +5 -0
  238. package/dist/web/workspace/welcome.html +1 -0
  239. package/dist/web/workspace/welcome.txt +28 -0
  240. package/dist/web/workspace/workspaces/__next._full.txt +5 -4
  241. package/dist/web/workspace/workspaces/__next._head.txt +1 -1
  242. package/dist/web/workspace/workspaces/__next._index.txt +3 -2
  243. package/dist/web/workspace/workspaces/__next._tree.txt +4 -3
  244. package/dist/web/workspace/workspaces/__next.workspace.txt +3 -3
  245. package/dist/web/workspace/workspaces/__next.workspace.workspaces.__PAGE__.txt +1 -1
  246. package/dist/web/workspace/workspaces/__next.workspace.workspaces.txt +1 -1
  247. package/dist/web/workspace/workspaces.html +1 -1
  248. package/dist/web/workspace/workspaces.txt +5 -4
  249. package/dist/web/workspace.html +1 -1
  250. package/dist/web/workspace.txt +5 -4
  251. package/package.json +2 -2
  252. package/dist/ui/assets/index-QJ8XujYD.js +0 -8
  253. package/dist/web/_next/static/3Ub2UottdyLvMDIkOLKKI/_buildManifest.js +0 -1
  254. package/dist/web/_next/static/chunks/1222.aa4f7f7f397533e9.js +0 -1
  255. package/dist/web/_next/static/chunks/1228.d291278320bca9ca.js +0 -1
  256. package/dist/web/_next/static/chunks/1243.f35c2e6494079e05.js +0 -1
  257. package/dist/web/_next/static/chunks/132.6032826021079bce.js +0 -1
  258. package/dist/web/_next/static/chunks/1750.2278b084cb33e817.js +0 -1
  259. package/dist/web/_next/static/chunks/2038.640b672702093b24.js +0 -1
  260. package/dist/web/_next/static/chunks/213.68ce1361aee3281a.js +0 -1
  261. package/dist/web/_next/static/chunks/2180.e6bad8186f52ff89.js +0 -1
  262. package/dist/web/_next/static/chunks/2849.f2bcad51c68e44b5.js +0 -1
  263. package/dist/web/_next/static/chunks/2881-71aed16f0b88cb34.js +0 -1
  264. package/dist/web/_next/static/chunks/3429.436b229808b33e81.js +0 -1
  265. package/dist/web/_next/static/chunks/3514.9643e815d690f2fb.js +0 -1
  266. package/dist/web/_next/static/chunks/4643.dbb152682d076617.js +0 -1
  267. package/dist/web/_next/static/chunks/5788-811d2ec2cd62d7dd.js +0 -1
  268. package/dist/web/_next/static/chunks/6419.842467d9a877e770.js +0 -1
  269. package/dist/web/_next/static/chunks/6552-1ddf0600fddfd553.js +0 -1
  270. package/dist/web/_next/static/chunks/674.2b5ffad0676aedbe.js +0 -1
  271. package/dist/web/_next/static/chunks/6742.8e137138a5d1c9e1.js +0 -1
  272. package/dist/web/_next/static/chunks/7507.1204ae29f46e3f01.js +0 -1
  273. package/dist/web/_next/static/chunks/7960.3b1c77b882ba4bb1.js +0 -1
  274. package/dist/web/_next/static/chunks/8467.f34d938a32d40325.js +0 -1
  275. package/dist/web/_next/static/chunks/8638.03c6480d4aaeb5b3.js +0 -1
  276. package/dist/web/_next/static/chunks/925.7ef504ee39f11840.js +0 -1
  277. package/dist/web/_next/static/chunks/9259.f4337cbb56e2e0b6.js +0 -1
  278. package/dist/web/_next/static/chunks/9299.af2a95f6ece07482.js +0 -1
  279. package/dist/web/_next/static/chunks/9958-8030d12d1aa9659a.js +0 -1
  280. package/dist/web/_next/static/chunks/app/_global-error/page-1105b0cfd58cfb3c.js +0 -1
  281. package/dist/web/_next/static/chunks/app/admin/admins/page-306d339ee530b5f6.js +0 -1
  282. package/dist/web/_next/static/chunks/app/admin/login/page-691eef7459d86ee3.js +0 -1
  283. package/dist/web/_next/static/chunks/app/admin/modes/page-6e1277223ac77414.js +0 -1
  284. package/dist/web/_next/static/chunks/app/admin/ota/page-3a2b0ecbedd59e35.js +0 -1
  285. package/dist/web/_next/static/chunks/app/admin/page-1fca731dbc8d61d3.js +0 -1
  286. package/dist/web/_next/static/chunks/app/admin/turn/page-7df8fb088cf7ccda.js +0 -1
  287. package/dist/web/_next/static/chunks/app/dev/question/page-92c77506bb59e639.js +0 -1
  288. package/dist/web/_next/static/chunks/app/login/page-b9bf23a0d85d4619.js +0 -1
  289. package/dist/web/_next/static/chunks/app/page-2f7393a2e7449d58.js +0 -22
  290. package/dist/web/_next/static/chunks/app/workspace/browse/page-1105b0cfd58cfb3c.js +0 -1
  291. package/dist/web/_next/static/chunks/app/workspace/editor/page-1105b0cfd58cfb3c.js +0 -1
  292. package/dist/web/_next/static/chunks/app/workspace/files/page-1105b0cfd58cfb3c.js +0 -1
  293. package/dist/web/_next/static/chunks/app/workspace/git/page-1105b0cfd58cfb3c.js +0 -1
  294. package/dist/web/_next/static/chunks/app/workspace/layout-42068ca26afe0bd6.js +0 -15
  295. package/dist/web/_next/static/chunks/app/workspace/mobile/page-1105b0cfd58cfb3c.js +0 -1
  296. package/dist/web/_next/static/chunks/app/workspace/page-1105b0cfd58cfb3c.js +0 -1
  297. package/dist/web/_next/static/chunks/app/workspace/remote/page-1105b0cfd58cfb3c.js +0 -1
  298. package/dist/web/_next/static/chunks/app/workspace/terminal/[sessionId]/page-1105b0cfd58cfb3c.js +0 -1
  299. package/dist/web/_next/static/chunks/app/workspace/workspaces/page-1105b0cfd58cfb3c.js +0 -1
  300. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/app-error-1105b0cfd58cfb3c.js +0 -1
  301. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/forbidden-1105b0cfd58cfb3c.js +0 -1
  302. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/not-found-1105b0cfd58cfb3c.js +0 -1
  303. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/unauthorized-1105b0cfd58cfb3c.js +0 -1
  304. package/dist/web/_next/static/chunks/webpack-6c9c0816af64073a.js +0 -1
  305. package/dist/web/_next/static/css/be666ba38225da3a.css +0 -1
  306. package/dist/web/admin/admins/__next._full.txt +0 -27
  307. package/dist/web/admin/admins/__next._index.txt +0 -10
  308. package/dist/web/admin/admins.html +0 -1
  309. package/dist/web/admin/admins.txt +0 -27
  310. package/dist/web/admin/modes/__next._full.txt +0 -27
  311. package/dist/web/admin/modes/__next._index.txt +0 -10
  312. package/dist/web/admin/modes/__next.admin.modes.__PAGE__.txt +0 -9
  313. package/dist/web/admin/modes.html +0 -1
  314. package/dist/web/admin/modes.txt +0 -27
  315. package/dist/web/file.svg +0 -1
  316. package/dist/web/globe.svg +0 -1
  317. package/dist/web/next.svg +0 -1
  318. package/dist/web/vercel.svg +0 -1
  319. package/dist/web/window.svg +0 -1
  320. /package/dist/web/_next/static/{3Ub2UottdyLvMDIkOLKKI → NEXFR4gbx_Fw8QgP6HAJw}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8922],{8910:(e,a,t)=>{t.d(a,{e:()=>r});function r(e=10){if(navigator.vibrate)return void navigator.vibrate(e);if("u">typeof document){if(!("u">typeof navigator&&(/iPad|iPhone|iPod/.test(navigator.userAgent)||window.DEVICE_INFO?.platform==="ios"||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)))return;let e=document.createElement("div"),a=Math.random().toString(36).slice(2);e.innerHTML=`<input type="checkbox" id="${a}" switch /><label for="${a}"></label>`,e.setAttribute("style","display:none !important;opacity:0 !important;visibility:hidden !important;"),document.body.appendChild(e),e.querySelector("label").click(),setTimeout(()=>e.remove(),100)}}},30240:(e,a,t)=>{t.d(a,{A:()=>l});var r=t(73365);function l(){return(0,r.jsxs)("div",{className:"fixed inset-0 -z-10 overflow-hidden pointer-events-none landing-bg",children:[(0,r.jsx)("div",{className:"absolute inset-0 landing-grid"}),(0,r.jsx)("div",{className:"absolute inset-0 landing-vignette"})]})}},44976:(e,a,t)=>{t.d(a,{D:()=>i,ThemeProvider:()=>A});var r=t(73365),l=t(1521),c=t(79063);let u=(0,l.createContext)({theme:c.SS,setTheme:()=>{},toggleTheme:()=>{}}),F=e=>{if("u"<typeof document)return;let a=document.documentElement;a.classList.remove("light","dark"),a.classList.add(e),a.style.colorScheme=e;try{let a=window.__TAURI__?.window?.getCurrentWindow?.();a&&(a.setTheme?.(e)?.catch?.(()=>{}),a.setBackgroundColor?.("light"===e?"#e7e7e9":"#2a2a2a")?.catch?.(()=>{}))}catch{}},o=e=>{if(window.ReactNativeWebView)try{window.ReactNativeWebView.postMessage(JSON.stringify({type:"THEME_CHANGE",theme:e}))}catch(e){}};function A({children:e}){let[a,t]=(0,l.useState)(c.SS);(0,l.useEffect)(()=>{let e=localStorage.getItem(c.AQ)||localStorage.getItem("9remote-theme"),a=c.$.includes(e)?e:c.SS;t(a),F(a),o(a)},[]);let i=(0,l.useCallback)(e=>{c.$.includes(e)&&(t(e),F(e),o(e),localStorage.setItem(c.AQ,e),localStorage.setItem("9remote-theme",e))},[]),n=(0,l.useCallback)(()=>{i("dark"===a?"light":"dark")},[a,i]);return(0,r.jsx)(u.Provider,{value:{theme:a,setTheme:i,toggleTheme:n},children:e})}let i=()=>(0,l.useContext)(u)},79063:(e,a,t)=>{t.d(a,{$:()=>r,AQ:()=>c,In:()=>i,SS:()=>l,aC:()=>F,g4:()=>A});let r=["dark","light"],l="dark",c="app_theme_v2";function u(e){return{background:e.bg,foreground:e.text,cursor:e.accent||e.peach||e.blue,cursorAccent:e.bg,selectionBackground:e.surface1,black:e.surfaceDim||e.bg,red:e.red,green:e.green,yellow:e.yellow,blue:e.blue,magenta:e.mauve,cyan:e.teal,white:e.subtext0||e.text,brightBlack:e.overlay0,brightRed:e.red,brightGreen:e.green,brightYellow:e.yellow,brightBlue:e.blue,brightMagenta:e.mauve,brightCyan:e.teal,brightWhite:e.text}}let F={dark:u({bg:"#1A1A1A",surface0:"#232323",surface1:"#2A2A2A",surfaceDim:"#101010",overlay0:"#5C5C5C",text:"#FFFFFF",subtext0:"#A0A0A0",red:"#FF8080",green:"#99FFE4",yellow:"#FFC799",blue:"#B0B0B0",mauve:"#FFD1A8",teal:"#66DDCC",peach:"#FFC799",accent:"#FFC799"}),light:u({bg:"#F5F5F5",surface0:"#E8E8E8",surface1:"#DDDDDD",surfaceDim:"#EFEFEF",overlay0:"#999999",text:"#1A1A1A",subtext0:"#5A5A5A",red:"#D9534F",green:"#2A9D8F",yellow:"#E07A3C",blue:"#6B6B6B",mauve:"#C97B5A",teal:"#3A9B8E",peach:"#E07A3C",accent:"#E07A3C"})},o={catppuccinMocha:u({bg:"#181825",surface0:"#31324A",surface1:"#45475A",surfaceDim:"#1E1E2E",overlay0:"#6C708E",text:"#CDD6F4",subtext0:"#A6ADC8",red:"#F38BA8",green:"#A6E3A1",yellow:"#F9E2AF",blue:"#89B4FA",mauve:"#CBA7F7",teal:"#94E2D5",peach:"#FAB387",accent:"#89B4FA"}),monokaiPro:u({bg:"#2D2A2E",surface0:"#353034",surface1:"#3D383C",surfaceDim:"#221F22",overlay0:"#72696A",text:"#FFF1F3",subtext0:"#C8C5C8",red:"#FD6883",green:"#ADDA78",yellow:"#F9CC6C",blue:"#F38D70",mauve:"#A8A9EB",teal:"#85DACC",peach:"#F38D70",accent:"#A8A9EB"}),gruvboxMaterial:u({bg:"#282828",surface0:"#3C3836",surface1:"#504945",surfaceDim:"#1D2021",overlay0:"#928374",text:"#D4BE98",subtext0:"#A89984",red:"#EA6962",green:"#A9B665",yellow:"#D8A657",blue:"#7DAEA3",mauve:"#D3869B",teal:"#89B482",peach:"#E78A4E",accent:"#E78A4E"}),dracula:u({bg:"#282A36",surface0:"#44475A",surface1:"#6272A4",surfaceDim:"#282A36",overlay0:"#6272A4",text:"#F8F8F2",subtext0:"#D2D2DC",red:"#FF5555",green:"#50FA7B",yellow:"#F1FA8C",blue:"#8BE9FD",mauve:"#FF79C6",teal:"#8BE9FD",peach:"#FFB86C",accent:"#BD93F9"}),everforest:u({bg:"#2D353B",surface0:"#343F44",surface1:"#3D484D",surfaceDim:"#232A2E",overlay0:"#7A8478",text:"#D3C6AA",subtext0:"#9DA9A0",red:"#E67E80",green:"#A7C080",yellow:"#DBBC7F",blue:"#7FBBB3",mauve:"#D699B6",teal:"#83C092",peach:"#E69875",accent:"#A7C080"}),linear:u({bg:"#08090A",surface0:"#0F1011",surface1:"#141516",surfaceDim:"#010102",overlay0:"#3E3E44",text:"#F7F8F8",subtext0:"#B4B4B8",red:"#F34E52",green:"#27A644",yellow:"#E4F222",blue:"#8FA6FF",mauve:"#8B5CF6",teal:"#02B8CC",peach:"#F7BF8B",accent:"#5E6AD2"}),synthwave:u({bg:"#262335",surface0:"#241B2F",surface1:"#34294F",surfaceDim:"#171520",overlay0:"#9D8BCA",text:"#FFFFFF",subtext0:"#FFFFFF99",red:"#FE4450",green:"#72F1B8",yellow:"#FEDE5D",blue:"#03EDF9",mauve:"#FF7EDB",teal:"#03EDF9",peach:"#F97E72",accent:"#FF7EDB"}),poimandres:u({bg:"#1B1E28",surface0:"#303340",surface1:"#3A4050",surfaceDim:"#14161F",overlay0:"#506477",text:"#E4F0FB",subtext0:"#A6ACCD",red:"#D0679D",green:"#5DE4C7",yellow:"#FFFAC2",blue:"#ADD7FF",mauve:"#F087BD",teal:"#5DE4C7",peach:"#F087BD",accent:"#5DE4C7"}),ayuMirage:u({bg:"#1F2430",surface0:"#212733",surface1:"#272D3A",surfaceDim:"#161B26",overlay0:"#686868",text:"#CBCCC6",subtext0:"#9A9B95",red:"#F08778",green:"#53BF97",yellow:"#FDCC60",blue:"#60B8D6",mauve:"#EC7171",teal:"#98E6CA",peach:"#FFA759",accent:"#FFCC66"}),githubDarkDimmed:u({bg:"#22272E",surface0:"#2D333B",surface1:"#373E47",surfaceDim:"#1C2128",overlay0:"#545D68",text:"#CDD9E5",subtext0:"#909DAB",red:"#F47067",green:"#57AB5A",yellow:"#C69026",blue:"#539BF5",mauve:"#B083F0",teal:"#39C5CF",peach:"#DAAA3F",accent:"#539BF5"}),palenight:u({bg:"#292D3E",surface0:"#313553",surface1:"#3A3F5F",surfaceDim:"#1F2233",overlay0:"#676E95",text:"#D0D0D0",subtext0:"#A0A0C0",red:"#E05252",green:"#2BE8A8",yellow:"#FFCB6B",blue:"#3FD0E0",mauve:"#C792EA",teal:"#3FD0E0",peach:"#FFCB6B",accent:"#82AAFF"}),nordDark:u({bg:"#2E3440",surface0:"#3B4252",surface1:"#434C5E",surfaceDim:"#232831",overlay0:"#4C566A",text:"#ECEFF4",subtext0:"#D8DEE9",red:"#BF616A",green:"#A3BE8C",yellow:"#EBCB8B",blue:"#81A1C1",mauve:"#B48EAD",teal:"#88C0D0",peach:"#D08770",accent:"#88C0D0"}),horizon:u({bg:"#1C1E26",surface0:"#232530",surface1:"#2E303E",surfaceDim:"#16161C",overlay0:"#6B6F8A",text:"#E0E0E0",subtext0:"#C5C8DA",red:"#E95678",green:"#29D398",yellow:"#FAB795",blue:"#26BBD9",mauve:"#EE64AC",teal:"#59E1E3",peach:"#FAB795",accent:"#EE64AC"}),kanagawaDragon:u({bg:"#181616",surface0:"#1D1C1C",surface1:"#252424",surfaceDim:"#0D0C0C",overlay0:"#7A6F7A",text:"#C5C9C5",subtext0:"#A6A69C",red:"#C4746E",green:"#87A987",yellow:"#E6C384",blue:"#8BA4B0",mauve:"#938AA9",teal:"#7AA89F",peach:"#FFA066",accent:"#8BA4B0"}),catppuccinLatte:u({bg:"#EFF1F5",surface0:"#CCD0DA",surface1:"#BCC0CC",surfaceDim:"#E6E9EF",overlay0:"#9CA0B0",text:"#4C4F69",subtext0:"#6C6F85",red:"#D20F39",green:"#40A02B",yellow:"#DF8E1D",blue:"#1E66F5",mauve:"#8839EF",teal:"#179299",peach:"#FE640B",accent:"#1E66F5"}),gruvboxLight:u({bg:"#FBF1C7",surface0:"#EBDBB2",surface1:"#D5C4A1",surfaceDim:"#F2E5BC",overlay0:"#928374",text:"#3C3836",subtext0:"#504945",red:"#9D0006",green:"#79740E",yellow:"#B57614",blue:"#076678",mauve:"#8F3F71",teal:"#427B58",peach:"#AF3A03",accent:"#B57614"}),githubLight:u({bg:"#FFFFFF",surface0:"#F6F8FA",surface1:"#EAEEF2",surfaceDim:"#EFF2F5",overlay0:"#8C959F",text:"#24292F",subtext0:"#57606A",red:"#CF222E",green:"#1A7F37",yellow:"#9A6700",blue:"#0969DA",mauve:"#8250DF",teal:"#1B7C83",peach:"#BC4C00",accent:"#0969DA"}),everforestLight:u({bg:"#FDF6E3",surface0:"#F4F0D9",surface1:"#EFEBD4",surfaceDim:"#E6E2CC",overlay0:"#9DA9A0",text:"#5C6A72",subtext0:"#7A8478",red:"#F85552",green:"#8DA101",yellow:"#DFA000",blue:"#3A94C5",mauve:"#DF69BA",teal:"#35A77C",peach:"#F57D3A",accent:"#8DA101"}),ayuLight:u({bg:"#FCFCFC",surface0:"#F3F3F3",surface1:"#E8E8E8",surfaceDim:"#F7F7F7",overlay0:"#C1C1C1",text:"#5C6166",subtext0:"#8A8F94",red:"#E7666A",green:"#80AB24",yellow:"#EBA54D",blue:"#4196DF",mauve:"#9870C3",teal:"#51B891",peach:"#E78F4D",accent:"#FF8552"}),tokyoDay:u({bg:"#D6D8DF",surface0:"#C8CBD4",surface1:"#B5B8C5",surfaceDim:"#E1E3EA",overlay0:"#9699AE",text:"#343B58",subtext0:"#565C70",red:"#C24242",green:"#41A6B5",yellow:"#8F5E15",blue:"#2959AA",mauve:"#7B43BA",teal:"#006C86",peach:"#D68910",accent:"#2959AA"}),roseDawn:u({bg:"#FAF4ED",surface0:"#F2E9E1",surface1:"#E9DDD2",surfaceDim:"#F5EBE0",overlay0:"#9893A5",text:"#576279",subtext0:"#797593",red:"#B4637A",green:"#618774",yellow:"#EA9D34",blue:"#286983",mauve:"#907AA9",teal:"#56949F",peach:"#D7827E",accent:"#D7827E"}),lavenderMist:u({bg:"#F6F3FB",surface0:"#EAE5F5",surface1:"#DDD6EE",surfaceDim:"#F0ECF8",overlay0:"#9B95B8",text:"#4A4467",subtext0:"#6B6491",red:"#C95D77",green:"#5FA17A",yellow:"#D9A441",blue:"#5B7FBE",mauve:"#8B7AB8",teal:"#5FA6A8",peach:"#D08A66",accent:"#8B7AB8"}),mintCream:u({bg:"#ECF6F0",surface0:"#DCEEE3",surface1:"#C9E3D2",surfaceDim:"#E2F1E9",overlay0:"#7FA396",text:"#2F4A40",subtext0:"#4E6B5F",red:"#C76B6B",green:"#3FA17A",yellow:"#C9A93E",blue:"#4A8DB8",mauve:"#9B6FA8",teal:"#3FA17A",peach:"#D58560",accent:"#3FA17A"})},A=[{key:"catppuccinMocha",label:"Catppuccin Mocha",mode:"dark"},{key:"monokaiPro",label:"Monokai Pro",mode:"dark"},{key:"dracula",label:"Dracula",mode:"dark"},{key:"everforest",label:"Everforest",mode:"dark"},{key:"gruvboxMaterial",label:"Gruvbox Material",mode:"dark"},{key:"linear",label:"Linear",mode:"dark"},{key:"synthwave",label:"Synthwave '84",mode:"dark"},{key:"poimandres",label:"Poimandres",mode:"dark"},{key:"ayuMirage",label:"Ayu Mirage",mode:"dark"},{key:"githubDarkDimmed",label:"GitHub Dimmed",mode:"dark"},{key:"palenight",label:"Palenight",mode:"dark"},{key:"nordDark",label:"Nord",mode:"dark"},{key:"horizon",label:"Horizon",mode:"dark"},{key:"kanagawaDragon",label:"Kanagawa Dragon",mode:"dark"},{key:"catppuccinLatte",label:"Catppuccin Latte",mode:"light"},{key:"gruvboxLight",label:"Gruvbox Light",mode:"light"},{key:"githubLight",label:"GitHub Light",mode:"light"},{key:"everforestLight",label:"Everforest Light",mode:"light"},{key:"ayuLight",label:"Ayu Light",mode:"light"},{key:"tokyoDay",label:"Tokyo Day",mode:"light"},{key:"roseDawn",label:"Rose Dawn",mode:"light"},{key:"lavenderMist",label:"Lavender Mist",mode:"light"},{key:"mintCream",label:"Mint Cream",mode:"light"}];function i(e,a){let t="light"===e?o.everforestLight:o.palenight;return a&&"default"!==a&&A.find(t=>t.key===a&&t.mode===e)&&o[a]||t}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[925],{30925:(e,n,t)=>{t.r(n),t.d(n,{default:()=>a});let a={common:{statusIdle:"Idle",statusWorking:"Working",statusBlocked:"Needs input",statusDone:"Your turn",loading:"Laden...",cancel:"Annuleren",confirm:"Bevestigen",save:"Opslaan",delete:"Verwijderen",close:"Sluiten",back:"Terug",edit:"Bewerken",rename:"Hernoemen",remove:"Verwijderen",open:"Openen",yes:"Ja",no:"Nee",ok:"OK",error:"Fout",success:"Gelukt",failed:"Mislukt",retry:"Opnieuw proberen",refresh:"Vernieuwen",clipboard:"Clipboard",clipboardCopy:"Copy",clipboardEmpty:"Clipboard is empty",search:"Zoeken",create:"Aanmaken",new:"Nieuw",add:"Toevoegen",copy:"Kopi\xebren",copied:"Gekopieerd",download:"Downloaden",upload:"Uploaden",enabled:"Ingeschakeld",disabled:"Uitgeschakeld",on:"aan",off:"uit",minute:"min",hour:"u",day:"d",minutesAgo:"{n} min geleden",hoursAgo:"{n} uur geleden",daysAgo:"{n} dagen geleden"},login:{tagline:"Toegang tot uw terminal vanaf elke locatie",heroLine1:"Any machine.",heroLine2:"One terminal.",heroLine3:"In your pocket.",featureTerminal:"Terminal",featureDesktop:"Desktop",featureFiles:"Files",termConnected:"host connected",termTunnel:"tunnel established",termReady:"ready",accessKey:"Toegangssleutel",placeholder:"sk-xxx... of eenmalige sleutel (ABC123)",rememberKey:"Onthoud deze sleutel",connect:"Verbinden",connecting:"Verbinden...",authenticating:"Authenticeren met token...",invalidKeyTail:"Wrong access key — check the last characters and try again.",scanQr:"Scan QR to login",qrScanTitle:"Scan QR Code",qrHint:"Point the camera at the QR code shown on the machine running 9Remote.",qrDetected:"QR Code detected!",qrAuthenticating:"Authenticating...",qrPleaseWait:"Please wait...",qrLibFail:"Failed to load the QR scanner library.",qrInitFail:"Could not start the scanner.",qrCamDenied:"Camera permission denied. Allow camera access and try again.",qrNoCamera:"No camera found on this device.",qrCamBusy:"Camera is in use by another app.",qrCamError:"Could not open the camera.",savedKeys:"Opgeslagen sleutels",login:"Inloggen",lastLogin:"Laatste login",namePlaceholder:"Name this key (optional)",rename:"Rename",deleteKeyTitle:"Delete key",deleteKeyConfirm:'Are you sure you want to delete "{name}"?',justNow:"Zojuist",minutesAgo:"{n}m geleden",hoursAgo:"{n}u geleden",daysAgo:"{n}d geleden",tapToScan:"Tik om te scannen",orEnterManually:"of voer de sleutel handmatig in",addKey:"Add Key",secureTitle:"Secure & Encrypted",secureDesc:"All connections are end-to-end encrypted and secure.",featAccessTitle:"Access Anywhere",featAccessDesc:"Connect from any device, anywhere.",featSecureTitle:"Secure Connection",featSecureDesc:"End-to-end encryption keeps you safe.",featFastTitle:"Fast & Reliable",featFastDesc:"Low latency and high performance.",featSessionsTitle:"Multiple Sessions",featSessionsDesc:"Manage and switch between sessions.",home:"Home",docs:"Documentatie"},menu:{reloadRestart:"Reload & Restart",restartHost:"Restart 9remote host",restartConfirmTitle:"Restart 9remote host?",restartConfirmMessage:"This restarts the host process (no reinstall). Terminal sessions are preserved. It takes a few seconds.",restartStarting:"Restarting host…",restartRestarting:"Restarting 9remote…",restartDone:"Restarted! Reconnecting…",restartTimeout:"Restart is taking too long",restartTimeoutHint:"Reconnect manually if it doesn't recover.",title:"Menu",language:"Taal",theme:"Thema",notifications:"Meldingen",webgl:"GPU Render (Faster)",webglHint:"Schakel uit als tekst verkeerd lijkt",notificationsHint:"Notify when agent finishes",files:"File Explorer",downloading:"Downloading",copying:"Copying",conflictTitle:"File already exists",conflictMessage:"{name} already exists. Replace or skip?",skip:"Skip",skipAll:"Skip all",replace:"Replace",replaceAll:"Replace all",sites:"Sites",commandNotes:"Commando-notities",community:"Community",installApp:"App installeren",codespace:"Codespace",logout:"Uitloggen",settingsGeneral:"General",settingsAppearance:"Appearance",settingsTerminalTab:"Terminal",settingsMcp:"Plugins",mcpIntro:"Extra abilities you can give your AI coding tools.",mcpTools:"Allow",mcpRestartHint:"Turning it off applies at once. Turning it on needs the AI tool restarted.",mcpUnavailable:"Update this host to use MCP.",artifactFormats:"Formats it can show",mcpClients:"Works with",settingsWorkspace:"Workspace",settingsApplication:"Application",settingsAccount:"Account",themeLight:"Light",themeDark:"Dark",reload:"App herladen",remoteDesktop:"Extern bureaublad",settings:"Instellingen",enablePush:"Pushmeldingen inschakelen",disablePush:"Pushmeldingen uitschakelen",pushHint:"Schakel pushmeldingen in om gewaarschuwd te worden wanneer AI taken voltooit",pushActiveHint:"Push notifications are on for this device. You'll be alerted when AI completes tasks.",versionMismatch:"Host {version} is verouderd",versionMismatchHint:"Sommige functies werken mogelijk niet. Voer uit:",updateNow:"Update now",updating:"Updating… reconnecting",webReloadTitle:"New web version available",webReloadHint:"Reload to get the latest interface.",reloadWeb:"Reload",updateAvailableTitle:"9Remote host update available",updateStarting:"Starting update…",updateInstalling:"Installing new version…",updateTimeout:"Update is taking too long",updateTimeoutHint:"Reload manually if it doesn't recover.",updateRestarting:"Restarting host…",updateReconnecting:"Reconnecting…",updateDone:"Updated! Reloading…",version:"Versie"},workspace:{loading:"Laden...",logoutTitle:"Uitloggen",logoutMessage:"Weet u zeker dat u wilt uitloggen?",failedCreateSession:"Sessie aanmaken mislukt: {error}",failedRenameSession:"Sessie hernoemen mislukt: {error}"},sessions:{headerTitle:"9remote.cc",connected:"Verbonden",disconnected:"Verbinding verbroken",codespaceStopped:"Codespace gestopt",placeholder:"Terminalnaam (optioneel)",newButton:"+ Nieuw",empty:"Geen actieve sessies",emptyHint:"Maak een nieuwe sessie aan om te beginnen",created:"Aangemaakt {time}",deleteTitle:"Sessie verwijderen",deleteMessage:'Weet u zeker dat u "{name}" wilt verwijderen?',editName:"Naam bewerken",newTerminal:"Nieuwe terminal",options:"Options"},workspaces:{title:"Groups",newWorkspace:"Group",newWorkspacePrompt:"Group name",defaultName:"New Group",ungrouped:"Ungrouped",addTerminal:"Add terminal to group",moveToWorkspace:"Move to group",rename:"Rename group",delete:"Delete group",emptyWorkspace:"No terminals in this group",deleteTitle:"Delete Group",deleteMessage:'Delete group "{name}"? Terminals move to Ungrouped.'},terminal:{quotaNoData:"No quota data",quotaUsageTitle:"usage",back:"Terug",menu:"Menu",newTerminal:"Nieuwe terminal",remoteDesktop:"Extern bureaublad",defaultName:"Term"},files:{selectWorkspace:"Werkruimte selecteren",recentWorkspaces:"Recente werkruimten",home:"Home",root:"Root",drive:"Schijf {letter}",codespaces:"Codespaces",removeRecent:"Verwijderen uit recent",removeTitle:"Werkruimte verwijderen",removeMessage:'"{name}" verwijderen uit recente werkruimten?',setAsWorkspace:"Instellen als werkruimte",openFolder:"Map openen",newFile:"Nieuw bestand",newFolder:"Nieuwe map",rename:"Hernoemen",delete:"Verwijderen",deleteFile:"Bestand verwijderen",deleteFolder:"Map verwijderen",deleteFileMessage:'"{name}" verwijderen?',deleteFolderMessage:'Map "{name}" en alle inhoud verwijderen?',emptyFolder:"Lege map",git:"Git",parent:"Bovenliggende map",workspace:"Werkruimte",failedLoad:"Laden mislukt: {error}",failedDelete:"Verwijderen mislukt: {error}",failedCreate:"Aanmaken mislukt: {error}",failedRename:"Hernoemen mislukt: {error}",enterName:"Voer naam in",confirmRename:"Hernoemen naar:",setWorkspace:"Werkruimte instellen",setAsWorkspaceTitle:"Instellen als werkruimte",switchWorkspace:"Werkruimte wisselen",searchFiles:"Bestanden zoeken",toggleHidden:"Verborgen bestanden wisselen",searchPlaceholder:"Bestanden zoeken...",searching:"Zoeken...",noFilesFound:"Geen bestanden gevonden",noGitRepo:"Geen Git-repository",cannotOpenBinary:"Kan binair bestand niet openen",createNew:"Nieuw aanmaken",file:"Bestand",folder:"Map",placeholderFile:"bestandsnaam.js",placeholderFolder:"map-naam",pickFile:"Choose files",pickFolder:"Choose folder",copyPath:"Pad kopi\xebren",copyRelPath:"Copy Relative Path",copyName:"Copy Filename",delete:"Verwijderen",rename:"Hernoemen",deleteConfirmTitle:"Verwijderen",deleteConfirmMessage:'"{name}" verwijderen?'},editor:{save:"Opslaan",saving:"Opslaan...",saved:"Opgeslagen",unsaved:"Niet-opgeslagen wijzigingen",close:"Sluiten",discard:"Verwerpen",discardTitle:"Wijzigingen verwerpen",discardMessage:"U heeft niet-opgeslagen wijzigingen. Verwerpen?",unsavedTitle:"Save changes to {name}?",unsavedBody:"Your changes will be lost if you don't save them.",failedLoad:"Bestand laden mislukt: {error}",failedSave:"Opslaan mislukt: {error}",openFull:"Open in full editor",artifact:"Artifact",readOnly:"Alleen-lezen",line:"Regel",column:"Kolom",gitDiff:"Git Diff",typeText:"Tekst typen en invoegen...",insert:"Invoegen",statusModified:"Gewijzigd",statusAdded:"Toegevoegd",statusUntracked:"Niet bijgehouden"},git:{title:"Git",branch:"Branch",changes:"Wijzigingen",staged:"Staged",unstaged:"Unstaged",untracked:"Niet bijgehouden",commit:"Commit",commitAndPush:"Commit & Push",commitSuccess:"Commit successful",pushSuccess:"Push successful",stageFailed:"Failed to stage changes",commitFailed:"Commit failed",pushFailed:"Push failed",pullSuccess:"Pull successful",pullFailed:"Pull failed",stageAllConfirmTitle:"Stage All & Commit",stageAllConfirmMessage:"No changes are staged. Stage all changes and commit?",stageAndCommit:"Stage & Commit",gitActions:"Git actions",commitPlaceholder:"Commit message…",stageAllNote:"Stage all \xb7 {count}",upToDate:"Everything up-to-date",commitMessage:"Commit-bericht",push:"Push",pull:"Pull",fetch:"Fetch",stage:"Stage",stageAll:"Alles stagen",unstage:"Unstage",discard:"Verwerpen",discardChanges:"Wijzigingen verwerpen",discardMessage:'Wijzigingen aan "{name}" verwerpen?',noChanges:"Geen wijzigingen",diff:"Diff",pushing:"Pushen...",pulling:"Pullen...",committing:"Committen...",failedCommit:"Commit mislukt: {error}",failedPush:"Push mislukt: {error}",failedPull:"Pull mislukt: {error}",status:"Status",diffTab:"Diff",modified:"Gewijzigd",added:"Toegevoegd",deleted:"Verwijderd",untrackedTitle:"Niet bijgehouden",openFile:"Bestand openen",discardChangesTitle:"Wijzigingen verwerpen",discardConfirmTitle:"Wijzigingen verwerpen",discardConfirmDelete:'Weet u zeker dat u "{name}" wilt verwijderen? Dit kan niet ongedaan worden gemaakt.',discardConfirmDiscard:'Weet u zeker dat u wijzigingen in "{name}" wilt verwerpen? Dit kan niet ongedaan worden gemaakt.'},remote:{title:"Extern bureaublad",connecting:"Verbinden...",disconnected:"Verbinding verbroken",fullscreen:"Volledig scherm",exitFullscreen:"Volledig scherm verlaten",receivingImage:"Receiving screen…",keyboard:"Toetsenbord",mouse:"Muis",quality:"Kwaliteit",fps:"FPS",debug:"Debug",help:"Help",close:"Sluiten",sendKey:"Toets verzenden",helpTitle:"Hulp extern bureaublad",notAvailable:"Extern bureaublad is niet beschikbaar",customizeKeys:"Toetsen aanpassen",back:"Terug",resetZoom:"Zoom resetten",refresh:"Vernieuwen",rectangleSelection:"Rechthoekige selectie",handMode:"Handmodus",toggleKeyboard:"Native toetsenbord wisselen",hideControls:"Hide controls",showControls:"Show controls",textBatchInput:"Tekst-batchinvoer",extraKeys:"Extra toetsen",customizeRemoteKeys:"Externe toetsen aanpassen",exitRemote:"Extern bureaublad verlaten",debugTitle:"Debug-statistieken",minimize:"Minimaliseren",transport:"Transport",latency:"Latentie",tilesPerSec:"Tegels/sec",bandwidth:"Bandbreedte",clearStats:"Statistieken wissen",lockTitle:"Windows is vergrendeld",lockGrantDesc:'Schakel "PC op afstand ontgrendelen" in 9remote host op deze PC in.',lockDesc:"Voer de Windows-PIN of het wachtwoord in voor deze computer",lockPlaceholder:"Windows-PIN of wachtwoord",unlock:"Ontgrendel",unlocking:"Ontgrendelen…",unlockFailed:"Ontgrendelen mislukt — controleer je PIN/wachtwoord en probeer opnieuw."},remoteHelp:{modePc:"PC / Muis",modeTrackpad:"Touch \xb7 Trackpad",modeDirect:"Touch \xb7 Direct",mouseTitle:"Muis",keyboardTitle:"Toetsenbord",gesturesTrackpadTitle:"Gebaren (Trackpad ✋)",gesturesDirectTitle:"Gebaren (Direct)",toolbarTitle:"Werkbalk",mouseClickKey:"Klik / Sleep",mouseClickDesc:"Linkermuisklik, slepen om te selecteren/verplaatsen",mouseRightKey:"Rechtermuisklik",mouseRightDesc:"Contextmenu op extern systeem",mouseWheelKey:"Wieltje",mouseWheelDesc:"Scrollen op extern systeem (Shift + wieltje = horizontaal)",mouseDoubleKey:"Dubbelklik",mouseDoubleDesc:"Dubbelklik op extern systeem",keyPhysicalKey:"Fysieke toetsen",keyPhysicalDesc:"Direct verzonden (Tab, F-toetsen, etc. opgevangen)",keyModifierKey:"Ctrl / Alt / Shift / ⌘",keyModifierDesc:"Plakkende modifier — combineer met volgende toets",trackpadSwipeKey:"1 vinger vegen",trackpadSwipeDesc:"Virtuele cursor verplaatsen",trackpadTapKey:"1 vinger tikken",trackpadTapDesc:"Linkermuisklik op cursor",trackpad2TapKey:"2 vingers tikken",trackpad2TapDesc:"Rechtermuisklik op cursor",trackpad2SwipeKey:"2 vingers vegen",trackpad2SwipeDesc:"Scrollen op cursorpositie",trackpadPinchKey:"2 vingers knijpen",trackpadPinchDesc:"Canvas zoomen",trackpadScrollLockKey:"Vasthouden + slepen",trackpadScrollLockDesc:"Houd vast om scrollen te vergrendelen, sleep in elke richting",directTapKey:"1 vinger tikken",directTapDesc:"Klikken op tikpositie",directLongKey:"1 vinger lang indrukken",directLongDesc:"Rechtermuisklik",directDoubleKey:"1 vinger dubbeltik",directDoubleDesc:"Dubbelklik",directScrollKey:"2 vingers vegen",directScrollDesc:"Scrollen op extern systeem",directPinchKey:"2 vingers knijpen",directPinchDesc:"Canvas zoomen",directPanKey:"1 vinger slepen (zoom>1)",directPanDesc:"Canvas pannen",toolbarHandDesc:"Linkermuisklik vasthouden (sleepmodus) — opnieuw tikken om los te laten",toolbarMouseDirectDesc:"Wisselen naar Direct-modus",toolbarMouseTrackpadDesc:"Wisselen naar Trackpad (virtuele cursor)",toolbarKeyboardDesc:"Native toetsenbord / tekst-batchinvoer",toolbarRectDesc:"Rechthoekige selectiemodus"},remoteControls:{enterToSend:"Tab / Ctrl+Num om van tabblad te wisselen",typeToSend:"Typ tekst om te verzenden...",send:"Verzenden",trackpadMode:"Trackpad-modus",directMode:"Direct-modus",bottomRow:"Onderste rij",extraPanel:"Extra paneel",exitConfirmMessage:"Weet u zeker dat u de huidige sessie van het externe bureaublad wilt verlaten?"},connection:{retrying:"Opnieuw verbinden...",waitingApproval:"Wachten op goedkeuring",approvalDescription:"De 9Remote host moet dit apparaat goedkeuren voordat u verbinding kunt maken.",approvalHint:"Controleer de terminal op uw machine.",rejectedTitle:"Apparaat geweigerd",rejectedDescription:"Dit apparaat is niet goedgekeurd door de 9Remote host.",backToLogin:"Terug naar login",failed:"Verbinding mislukt",failedDescription:"Kan geen verbinding maken na {n} pogingen",attemptOf:"Poging {n} van {total}",exit:"Afsluiten",cancel:"Annuleren",retry:"Nu opnieuw proberen"},notifications:{claudeCode:"Claude Code",codex:"Codex",geminiCli:"Gemini CLI",openCode:"OpenCode",needsInput:"needs input",badgeTitle:"{blocked} needs input, {done} your turn",replied:"replied",agent:"Agent"},sites:{title:"Sites",localSites:"Lokale sites",selectSitePreview:"Selecteer een site om te bekijken",browserNewTab:"New tab",browserAddressPlaceholder:"localhost:3000 or /path",browserNotConnected:"Connect to your host first",portPlaceholder:"poort",loadingSites:"Sites laden...",notConnected:"Not connected to the host",noSitesFound:"Geen sites gevonden",startServerHint:"Start een lokale dev-server om hier te verschijnen",siteNamePlaceholder:"Sitenaam",saveTitle:"Opslaan",editNameTitle:"Naam bewerken",removeTitle:"Verwijderen",removePortTitle:"Poort verwijderen",removePortMessage:"Poort {port} verwijderen uit opgeslagen lijst?",popupBlocked:"Pop-up geblokkeerd! Sta pop-ups toe voor deze site.",startProxyFailed:"Proxy-sessie starten mislukt voor {name}",foundCount:"{n} site{suffix} gevonden",focusOpenedTab:"Geopende tab focussen",openInNewTab:"Openen in nieuw tabblad",goBack:"Terug",goForward:"Vooruit",loadingSite:"Laden...",empty:"Geen actieve sites",emptyHint:"Voer een lokale server uit om hier te verschijnen",open:"Openen",refresh:"Vernieuwen"},commandNotes:{title:"Commando-notities",noSavedCommands:"Geen opgeslagen commando's",addFirstBelow:"Voeg hieronder uw eerste commando toe",clickToCopy:"Klik om te kopi\xebren",copiedBang:"Gekopieerd!",copy:"Kopi\xebren",edit:"Bewerken",delete:"Verwijderen",editCommandPlaceholder:"Commando bewerken...",addCommandPlaceholder:"Commando toevoegen...",update:"Bijwerken",add:"Toevoegen",empty:"Nog geen notities",emptyHint:"Sla commando's op voor snelle toegang",add:"Notitie toevoegen",edit:"Notitie bewerken",delete:"Notitie verwijderen",deleteMessage:"Deze notitie verwijderen?",name:"Naam",command:"Commando",save:"Opslaan",placeholderName:"bijv. Dev-server starten",placeholderCommand:"bijv. npm run dev"},mobileKeyboard:{pasteHere:"Hier plakken (Cmd+V)",enterToSend:"Tab / Ctrl+Num om van tabblad te wisselen",typeCommand:"Typ commando en verzend...",send:"Verzenden",toggleExtraKeys:"Extra toetsen wisselen",toggleTextInput:"Tekstinvoer wisselen",customizeTerminalKeys:"Terminaltoetsen aanpassen",mainBar:"Hoofdbalk",extraPanel:"Extra paneel",fileTooLarge:"Bestand te groot (max 5MB)",readFileFailed:"Bestand lezen mislukt",uploadFailed:"Bestand uploaden mislukt: {error}"},terminalPane:{scrollToBottom:"Scroll naar beneden",changedFiles:"Changed files",pasteOrType:"Plak of typ hier",paste:"Plakken"},pwaGuide:{copyYourKey:"Kopieer uw sleutel",copyKeyHint:"Tik op de sleutel hieronder om te kopi\xebren — u heeft deze nodig om in te loggen na installatie",tapToCopyApiKey:"Tik om API-sleutel te kopi\xebren",copiedBang:"Gekopieerd!",copy:"Kopi\xebren",tapShareButton:"Tik op de deelknop",tapShareHint:"Tik op de deelknop onderaan iOS Safari",addToHome:"Toevoegen aan beginscherm",addToHomeHint:'Scroll naar beneden en tik op "Toevoegen aan beginscherm"',openAppPasteKey:"Open app & plak sleutel",openAppPasteKeyHint:"Open de ge\xefnstalleerde app en plak uw sleutel om in te loggen",openMenu:"Menu openen",openMenuHint:"Tik op de menuknop (drie puntjes) in Android Chrome",installApp:"App installeren",installAppHint:'Tik op "App installeren" of "Toevoegen aan beginscherm"',lookInstallIcon:"Zoek het installatiepictogram",lookInstallIconHint:"Zoek het installatiepictogram in de adresbalk",clickInstallPaste:"Klik op installeren & plak sleutel",installNow:"Install Now",installNowHint:"Install 9Remote as an app for quick access",installing:"Installing...",clickInstallPasteHint:"Klik op installeren, open de app en plak uw sleutel om in te loggen",alternativeHint:'Alternatief: open browsermenu → "9Remote installeren" of "Snelkoppeling maken"',loadingPlatform:"Platformdetectie laden...",iosPlatform:"iOS (iPhone/iPad)",androidPlatform:"Android",macosPlatform:"macOS",windowsPlatform:"Windows",desktopPlatform:"Desktop",alreadyInstalled:"Al ge\xefnstalleerd!",alreadyInstalledHint:"U gebruikt 9Remote al als ge\xefnstalleerde app",installationGuide:"Installatiegids",installationSteps:"Installatiestappen:"},community:{title:"Community",description:"Word lid van de 9Remote-community"},pwa:{title:"Installeren als app",description:"Installeer 9Remote op uw apparaat voor de beste ervaring",iosTitle:"iOS Safari",androidTitle:"Android Chrome",desktopTitle:"Desktop"},codespace:{title:"Codespace",name:"Naam",status:"Status",running:"Actief",autoStart:"9Remote automatisch starten",autoStartHint:"Start 9Remote wanneer codespace opent",stop:"Codespace stoppen",stopHint:"Stop om gebruik te besparen",restartHint:"Om opnieuw te starten, ga naar GitHub",unknown:"Onbekend"}}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9259],{9259:(e,a,o)=>{o.r(a),o.d(a,{default:()=>r});let r={common:{statusIdle:"Idle",statusWorking:"Working",statusBlocked:"Needs input",statusDone:"Your turn",loading:"Cargando...",cancel:"Cancelar",confirm:"Confirmar",save:"Guardar",delete:"Eliminar",close:"Cerrar",back:"Atr\xe1s",edit:"Editar",rename:"Renombrar",remove:"Quitar",open:"Abrir",yes:"S\xed",no:"No",ok:"OK",error:"Error",success:"\xc9xito",failed:"Fall\xf3",retry:"Reintentar",refresh:"Actualizar",clipboard:"Clipboard",clipboardCopy:"Copy",clipboardEmpty:"Clipboard is empty",search:"Buscar",create:"Crear",new:"Nuevo",add:"A\xf1adir",copy:"Copiar",copied:"Copiado",download:"Descargar",upload:"Subir",enabled:"Activado",disabled:"Desactivado",on:"activado",off:"desactivado",minute:"min",hour:"h",day:"d",minutesAgo:"Hace {n} min",hoursAgo:"Hace {n} horas",daysAgo:"Hace {n} d\xedas"},login:{tagline:"Accede a tu terminal desde cualquier lugar",heroLine1:"Any machine.",heroLine2:"One terminal.",heroLine3:"In your pocket.",featureTerminal:"Terminal",featureDesktop:"Desktop",featureFiles:"Files",termConnected:"host connected",termTunnel:"tunnel established",termReady:"ready",accessKey:"Clave de acceso",placeholder:"sk-xxx... o clave de un solo uso (ABC123)",rememberKey:"Recordar esta clave",connect:"Conectar",connecting:"Conectando...",authenticating:"Autenticando con token...",invalidKeyTail:"Wrong access key — check the last characters and try again.",scanQr:"Scan QR to login",qrScanTitle:"Scan QR Code",qrHint:"Point the camera at the QR code shown on the machine running 9Remote.",qrDetected:"QR Code detected!",qrAuthenticating:"Authenticating...",qrPleaseWait:"Please wait...",qrLibFail:"Failed to load the QR scanner library.",qrInitFail:"Could not start the scanner.",qrCamDenied:"Camera permission denied. Allow camera access and try again.",qrNoCamera:"No camera found on this device.",qrCamBusy:"Camera is in use by another app.",qrCamError:"Could not open the camera.",savedKeys:"Claves guardadas",login:"Iniciar sesi\xf3n",lastLogin:"\xdaltimo inicio de sesi\xf3n",namePlaceholder:"Name this key (optional)",rename:"Rename",deleteKeyTitle:"Delete key",deleteKeyConfirm:'Are you sure you want to delete "{name}"?',justNow:"Ahora mismo",minutesAgo:"Hace {n}m",hoursAgo:"Hace {n}h",daysAgo:"Hace {n}d",tapToScan:"Toca para escanear",orEnterManually:"o introduce la clave manualmente",addKey:"Add Key",secureTitle:"Secure & Encrypted",secureDesc:"All connections are end-to-end encrypted and secure.",featAccessTitle:"Access Anywhere",featAccessDesc:"Connect from any device, anywhere.",featSecureTitle:"Secure Connection",featSecureDesc:"End-to-end encryption keeps you safe.",featFastTitle:"Fast & Reliable",featFastDesc:"Low latency and high performance.",featSessionsTitle:"Multiple Sessions",featSessionsDesc:"Manage and switch between sessions.",home:"Inicio",docs:"Documentaci\xf3n"},menu:{reloadRestart:"Reload & Restart",restartHost:"Restart 9remote host",restartConfirmTitle:"Restart 9remote host?",restartConfirmMessage:"This restarts the host process (no reinstall). Terminal sessions are preserved. It takes a few seconds.",restartStarting:"Restarting host…",restartRestarting:"Restarting 9remote…",restartDone:"Restarted! Reconnecting…",restartTimeout:"Restart is taking too long",restartTimeoutHint:"Reconnect manually if it doesn't recover.",title:"Men\xfa",language:"Idioma",theme:"Tema",notifications:"Notificaciones",webgl:"GPU Render (Faster)",webglHint:"Desact\xedvalo si el texto se ve mal",notificationsHint:"Notify when agent finishes",files:"File Explorer",downloading:"Downloading",copying:"Copying",conflictTitle:"File already exists",conflictMessage:"{name} already exists. Replace or skip?",skip:"Skip",skipAll:"Skip all",replace:"Replace",replaceAll:"Replace all",sites:"Sitios",commandNotes:"Notas de comandos",community:"Comunidad",installApp:"Instalar aplicaci\xf3n",codespace:"Codespace",logout:"Cerrar sesi\xf3n",settingsGeneral:"General",settingsAppearance:"Appearance",settingsTerminalTab:"Terminal",settingsMcp:"Plugins",mcpIntro:"Extra abilities you can give your AI coding tools.",mcpTools:"Allow",mcpRestartHint:"Turning it off applies at once. Turning it on needs the AI tool restarted.",mcpUnavailable:"Update this host to use MCP.",artifactFormats:"Formats it can show",mcpClients:"Works with",settingsWorkspace:"Workspace",settingsApplication:"Application",settingsAccount:"Account",themeLight:"Light",themeDark:"Dark",reload:"Recargar app",remoteDesktop:"Escritorio remoto",settings:"Configuraci\xf3n",enablePush:"Activar notificaciones push",disablePush:"Desactivar notificaciones push",pushHint:"Activa las notificaciones push para recibir alertas cuando la IA complete tareas",pushActiveHint:"Push notifications are on for this device. You'll be alerted when AI completes tasks.",versionMismatch:"El agente {version} est\xe1 desactualizado",versionMismatchHint:"Algunas funciones pueden no funcionar. Ejecuta:",updateNow:"Update now",updating:"Updating… reconnecting",webReloadTitle:"New web version available",webReloadHint:"Reload to get the latest interface.",reloadWeb:"Reload",updateAvailableTitle:"9Remote host update available",updateStarting:"Starting update…",updateInstalling:"Installing new version…",updateTimeout:"Update is taking too long",updateTimeoutHint:"Reload manually if it doesn't recover.",updateRestarting:"Restarting host…",updateReconnecting:"Reconnecting…",updateDone:"Updated! Reloading…",version:"Versi\xf3n"},workspace:{loading:"Cargando...",logoutTitle:"Cerrar sesi\xf3n",logoutMessage:"\xbfSeguro que quieres cerrar sesi\xf3n?",failedCreateSession:"Error al crear la sesi\xf3n: {error}",failedRenameSession:"Error al renombrar la sesi\xf3n: {error}"},sessions:{headerTitle:"9remote.cc",connected:"Conectado",disconnected:"Desconectado",codespaceStopped:"Codespace detenido",placeholder:"Nombre del terminal (opcional)",newButton:"+ Nuevo",empty:"No hay sesiones activas",emptyHint:"Crea una nueva sesi\xf3n para empezar",created:"Creado {time}",deleteTitle:"Eliminar sesi\xf3n",deleteMessage:'\xbfSeguro que quieres eliminar "{name}"?',editName:"Editar nombre",newTerminal:"Nuevo terminal",options:"Options"},workspaces:{title:"Groups",newWorkspace:"Group",newWorkspacePrompt:"Group name",defaultName:"New Group",ungrouped:"Ungrouped",addTerminal:"Add terminal to group",moveToWorkspace:"Move to group",rename:"Rename group",delete:"Delete group",emptyWorkspace:"No terminals in this group",deleteTitle:"Delete Group",deleteMessage:'Delete group "{name}"? Terminals move to Ungrouped.'},terminal:{quotaNoData:"No quota data",quotaUsageTitle:"usage",back:"Atr\xe1s",menu:"Men\xfa",newTerminal:"Nuevo terminal",remoteDesktop:"Escritorio remoto",defaultName:"Term"},files:{selectWorkspace:"Seleccionar espacio de trabajo",recentWorkspaces:"Espacios de trabajo recientes",home:"Inicio",root:"Ra\xedz",drive:"Unidad {letter}",codespaces:"Codespaces",removeRecent:"Quitar de recientes",removeTitle:"Quitar espacio de trabajo",removeMessage:'\xbfQuitar "{name}" de los espacios de trabajo recientes?',setAsWorkspace:"Establecer como espacio de trabajo",openFolder:"Abrir carpeta",newFile:"Nuevo archivo",newFolder:"Nueva carpeta",rename:"Renombrar",delete:"Eliminar",deleteFile:"Eliminar archivo",deleteFolder:"Eliminar carpeta",deleteFileMessage:'\xbfEliminar "{name}"?',deleteFolderMessage:'\xbfEliminar la carpeta "{name}" y todo su contenido?',emptyFolder:"Carpeta vac\xeda",git:"Git",parent:"Carpeta superior",workspace:"Espacio de trabajo",failedLoad:"Error al cargar: {error}",failedDelete:"Error al eliminar: {error}",failedCreate:"Error al crear: {error}",failedRename:"Error al renombrar: {error}",enterName:"Introduce el nombre",confirmRename:"Renombrar a:",setWorkspace:"Establecer espacio de trabajo",setAsWorkspaceTitle:"Establecer como espacio de trabajo",switchWorkspace:"Cambiar espacio de trabajo",searchFiles:"Buscar archivos",toggleHidden:"Mostrar/ocultar archivos ocultos",searchPlaceholder:"Buscar archivos...",searching:"Buscando...",noFilesFound:"No se encontraron archivos",noGitRepo:"No hay repositorio Git",cannotOpenBinary:"No se puede abrir el archivo binario",createNew:"Crear nuevo",file:"Archivo",folder:"Carpeta",placeholderFile:"filename.js",placeholderFolder:"nombre-carpeta",pickFile:"Choose files",pickFolder:"Choose folder",copyPath:"Copiar ruta",copyRelPath:"Copy Relative Path",copyName:"Copy Filename",delete:"Eliminar",rename:"Renombrar",deleteConfirmTitle:"Eliminar",deleteConfirmMessage:'\xbfEliminar "{name}"?'},editor:{save:"Guardar",saving:"Guardando...",saved:"Guardado",unsaved:"Cambios sin guardar",close:"Cerrar",discard:"Descartar",discardTitle:"Descartar cambios",discardMessage:"Tienes cambios sin guardar. \xbfDescartarlos?",unsavedTitle:"Save changes to {name}?",unsavedBody:"Your changes will be lost if you don't save them.",failedLoad:"Error al cargar el archivo: {error}",failedSave:"Error al guardar: {error}",openFull:"Open in full editor",artifact:"Artifact",readOnly:"Solo lectura",line:"L\xednea",column:"Columna",gitDiff:"Git Diff",typeText:"Escribe el texto e inserta...",insert:"Insertar",statusModified:"Modificado",statusAdded:"A\xf1adido",statusUntracked:"Sin seguimiento"},git:{title:"Git",branch:"Rama",changes:"Cambios",staged:"Preparados",unstaged:"Sin preparar",untracked:"Sin seguimiento",commit:"Confirmar",commitAndPush:"Commit & Push",commitSuccess:"Commit successful",pushSuccess:"Push successful",stageFailed:"Failed to stage changes",commitFailed:"Commit failed",pushFailed:"Push failed",pullSuccess:"Pull successful",pullFailed:"Pull failed",stageAllConfirmTitle:"Stage All & Commit",stageAllConfirmMessage:"No changes are staged. Stage all changes and commit?",stageAndCommit:"Stage & Commit",gitActions:"Git actions",commitPlaceholder:"Commit message…",stageAllNote:"Stage all \xb7 {count}",upToDate:"Everything up-to-date",commitMessage:"Mensaje del commit",push:"Push",pull:"Pull",fetch:"Fetch",stage:"Preparar",stageAll:"Preparar todo",unstage:"Quitar de preparados",discard:"Descartar",discardChanges:"Descartar cambios",discardMessage:'\xbfDescartar los cambios en "{name}"?',noChanges:"Sin cambios",diff:"Diff",pushing:"Enviando...",pulling:"Obteniendo...",committing:"Confirmando...",failedCommit:"Error al confirmar: {error}",failedPush:"Error en push: {error}",failedPull:"Error en pull: {error}",status:"Estado",diffTab:"Diff",modified:"Modificado",added:"A\xf1adido",deleted:"Eliminado",untrackedTitle:"Sin seguimiento",openFile:"Abrir archivo",discardChangesTitle:"Descartar cambios",discardConfirmTitle:"Descartar cambios",discardConfirmDelete:'\xbfSeguro que quieres eliminar "{name}"? Esto no se puede deshacer.',discardConfirmDiscard:'\xbfSeguro que quieres descartar los cambios en "{name}"? Esto no se puede deshacer.'},remote:{title:"Escritorio remoto",connecting:"Conectando...",disconnected:"Desconectado",fullscreen:"Pantalla completa",exitFullscreen:"Salir de pantalla completa",receivingImage:"Receiving screen…",keyboard:"Teclado",mouse:"Rat\xf3n",quality:"Calidad",fps:"FPS",debug:"Depurar",help:"Ayuda",close:"Cerrar",sendKey:"Enviar tecla",helpTitle:"Ayuda del escritorio remoto",notAvailable:"El escritorio remoto no est\xe1 disponible",customizeKeys:"Personalizar teclas",back:"Atr\xe1s",resetZoom:"Restablecer zoom",refresh:"Actualizar",rectangleSelection:"Selecci\xf3n rectangular",handMode:"Modo mano",toggleKeyboard:"Alternar teclado nativo",hideControls:"Hide controls",showControls:"Show controls",textBatchInput:"Entrada de texto por lotes",extraKeys:"Teclas extra",customizeRemoteKeys:"Personalizar teclas remotas",exitRemote:"Salir del escritorio remoto",debugTitle:"Estad\xedsticas de depuraci\xf3n",minimize:"Minimizar",transport:"Transporte",latency:"Latencia",tilesPerSec:"Mosaicos/s",bandwidth:"Ancho de banda",clearStats:"Borrar estad\xedsticas",lockTitle:"Windows est\xe1 bloqueado",lockGrantDesc:'Activa "Desbloquear PC remotamente" en 9remote host de este PC.',lockDesc:"Introduce el PIN o la contrase\xf1a de Windows para este equipo",lockPlaceholder:"PIN o contrase\xf1a de Windows",unlock:"Desbloquear",unlocking:"Desbloqueando…",unlockFailed:"Error al desbloquear — revisa tu PIN/contrase\xf1a e int\xe9ntalo de nuevo."},remoteHelp:{modePc:"PC / Rat\xf3n",modeTrackpad:"T\xe1ctil \xb7 Trackpad",modeDirect:"T\xe1ctil \xb7 Directo",mouseTitle:"Rat\xf3n",keyboardTitle:"Teclado",gesturesTrackpadTitle:"Gestos (Trackpad ✋)",gesturesDirectTitle:"Gestos (Directo)",toolbarTitle:"Barra de herramientas",mouseClickKey:"Clic / Arrastrar",mouseClickDesc:"Clic izquierdo, arrastrar para seleccionar/mover",mouseRightKey:"Clic derecho",mouseRightDesc:"Men\xfa contextual en remoto",mouseWheelKey:"Rueda",mouseWheelDesc:"Desplazar remoto (Shift + Rueda = horizontal)",mouseDoubleKey:"Doble clic",mouseDoubleDesc:"Doble clic en remoto",keyPhysicalKey:"Teclas f\xedsicas",keyPhysicalDesc:"Enviadas directamente (Tab, teclas F, etc. capturadas)",keyModifierKey:"Ctrl / Alt / Shift / ⌘",keyModifierDesc:"Modificador persistente — combina con la siguiente tecla",trackpadSwipeKey:"Deslizar 1 dedo",trackpadSwipeDesc:"Mover cursor virtual",trackpadTapKey:"Toque con 1 dedo",trackpadTapDesc:"Clic izquierdo en el cursor",trackpad2TapKey:"Toque con 2 dedos",trackpad2TapDesc:"Clic derecho en el cursor",trackpad2SwipeKey:"Deslizar 2 dedos",trackpad2SwipeDesc:"Desplazar en la posici\xf3n del cursor",trackpadPinchKey:"Pellizco con 2 dedos",trackpadPinchDesc:"Zoom del lienzo",trackpadScrollLockKey:"Mantener + arrastrar",trackpadScrollLockDesc:"Mant\xe9n para fijar el scroll, arrastra en cualquier direcci\xf3n",directTapKey:"Toque con 1 dedo",directTapDesc:"Clic en la posici\xf3n del toque",directLongKey:"Pulsaci\xf3n larga 1 dedo",directLongDesc:"Clic derecho",directDoubleKey:"Doble toque 1 dedo",directDoubleDesc:"Doble clic",directScrollKey:"Deslizar 2 dedos",directScrollDesc:"Desplazar remoto",directPinchKey:"Pellizco con 2 dedos",directPinchDesc:"Zoom del lienzo",directPanKey:"Arrastrar 1 dedo (zoom>1)",directPanDesc:"Desplazar lienzo",toolbarHandDesc:"Mantener clic izquierdo (modo arrastre) — toca de nuevo para soltar",toolbarMouseDirectDesc:"Cambiar a modo directo",toolbarMouseTrackpadDesc:"Cambiar a Trackpad (cursor virtual)",toolbarKeyboardDesc:"Teclado nativo / entrada de texto por lotes",toolbarRectDesc:"Modo de selecci\xf3n rectangular"},remoteControls:{enterToSend:"Tab / Ctrl+Num para cambiar de pesta\xf1a",typeToSend:"Escribe el texto a enviar...",send:"Enviar",trackpadMode:"Modo trackpad",directMode:"Modo directo",bottomRow:"Fila inferior",extraPanel:"Panel extra",exitConfirmMessage:"\xbfSeguro que quieres salir de la sesi\xf3n actual del escritorio remoto?"},connection:{retrying:"Reconectando...",waitingApproval:"Esperando aprobaci\xf3n",approvalDescription:"El 9Remote host debe aprobar este dispositivo antes de poder conectarte.",approvalHint:"Revisa el terminal en tu m\xe1quina.",rejectedTitle:"Dispositivo rechazado",rejectedDescription:"Este dispositivo no fue aprobado por el 9Remote host.",backToLogin:"Volver al inicio de sesi\xf3n",failed:"Conexi\xf3n fallida",failedDescription:"No se pudo conectar tras {n} intentos",attemptOf:"Intento {n} de {total}",exit:"Salir",cancel:"Cancelar",retry:"Reintentar ahora"},notifications:{claudeCode:"Claude Code",codex:"Codex",geminiCli:"Gemini CLI",openCode:"OpenCode",needsInput:"needs input",badgeTitle:"{blocked} needs input, {done} your turn",replied:"replied",agent:"Agent"},sites:{title:"Sitios",localSites:"Sitios locales",selectSitePreview:"Selecciona un sitio para previsualizar",browserNewTab:"New tab",browserAddressPlaceholder:"localhost:3000 or /path",browserNotConnected:"Connect to your host first",portPlaceholder:"puerto",loadingSites:"Cargando sitios...",notConnected:"Not connected to the host",noSitesFound:"No se encontraron sitios",startServerHint:"Inicia un servidor de desarrollo local para verlo aqu\xed",siteNamePlaceholder:"Nombre del sitio",saveTitle:"Guardar",editNameTitle:"Editar nombre",removeTitle:"Quitar",removePortTitle:"Quitar puerto",removePortMessage:"\xbfQuitar el puerto {port} de la lista guardada?",popupBlocked:"\xa1Ventana emergente bloqueada! Permite las ventanas emergentes para este sitio.",startProxyFailed:"Error al iniciar la sesi\xf3n de proxy para {name}",foundCount:"{n} sitio{suffix} encontrado",focusOpenedTab:"Enfocar pesta\xf1a abierta",openInNewTab:"Abrir en nueva pesta\xf1a",goBack:"Atr\xe1s",goForward:"Adelante",loadingSite:"Cargando...",empty:"No hay sitios activos",emptyHint:"Ejecuta un servidor local para verlo aqu\xed",open:"Abrir",refresh:"Actualizar"},commandNotes:{title:"Notas de comandos",noSavedCommands:"No hay comandos guardados",addFirstBelow:"A\xf1ade tu primer comando abajo",clickToCopy:"Clic para copiar",copiedBang:"\xa1Copiado!",copy:"Copiar",edit:"Editar",delete:"Eliminar",editCommandPlaceholder:"Editar comando...",addCommandPlaceholder:"A\xf1adir comando...",update:"Actualizar",add:"A\xf1adir",empty:"A\xfan no hay notas",emptyHint:"Guarda comandos para acceso r\xe1pido",add:"A\xf1adir nota",edit:"Editar nota",delete:"Eliminar nota",deleteMessage:"\xbfEliminar esta nota?",name:"Nombre",command:"Comando",save:"Guardar",placeholderName:"ej. Iniciar servidor de desarrollo",placeholderCommand:"ej. npm run dev"},mobileKeyboard:{pasteHere:"Pega aqu\xed (Cmd+V)",enterToSend:"Tab / Ctrl+Num para cambiar de pesta\xf1a",typeCommand:"Escribe un comando y env\xeda...",send:"Enviar",toggleExtraKeys:"Alternar teclas extra",toggleTextInput:"Alternar entrada de texto",customizeTerminalKeys:"Personalizar teclas del terminal",mainBar:"Barra principal",extraPanel:"Panel extra",fileTooLarge:"Archivo demasiado grande (m\xe1x. 5MB)",readFileFailed:"Error al leer el archivo",uploadFailed:"Error al subir el archivo: {error}"},terminalPane:{scrollToBottom:"Desplazar al final",changedFiles:"Changed files",pasteOrType:"Pega o escribe aqu\xed",paste:"Pegar"},pwaGuide:{copyYourKey:"Copia tu clave",copyKeyHint:"Toca la clave de abajo para copiarla — la necesitar\xe1s para iniciar sesi\xf3n tras instalar",tapToCopyApiKey:"Toca para copiar la clave API",copiedBang:"\xa1Copiado!",copy:"Copiar",tapShareButton:"Toca el bot\xf3n Compartir",tapShareHint:"Toca el bot\xf3n compartir en la parte inferior de iOS Safari",addToHome:"A\xf1adir a la pantalla de inicio",addToHomeHint:'Despl\xe1zate hacia abajo y toca "A\xf1adir a la pantalla de inicio"',openAppPasteKey:"Abre la app y pega la clave",openAppPasteKeyHint:"Abre la aplicaci\xf3n instalada y pega tu clave para iniciar sesi\xf3n",openMenu:"Abrir men\xfa",openMenuHint:"Toca el bot\xf3n de men\xfa (tres puntos) en Android Chrome",installApp:"Instalar aplicaci\xf3n",installAppHint:'Toca "Instalar aplicaci\xf3n" o "A\xf1adir a la pantalla de inicio"',lookInstallIcon:"Busca el icono de instalaci\xf3n",lookInstallIconHint:"Busca el icono de instalaci\xf3n en la barra de direcciones",clickInstallPaste:"Haz clic en Instalar y pega la clave",installNow:"Install Now",installNowHint:"Install 9Remote as an app for quick access",installing:"Installing...",clickInstallPasteHint:"Haz clic en instalar, abre la aplicaci\xf3n y pega tu clave para iniciar sesi\xf3n",alternativeHint:'Alternativa: Abre el men\xfa del navegador → "Instalar 9Remote" o "Crear acceso directo"',loadingPlatform:"Cargando detecci\xf3n de plataforma...",iosPlatform:"iOS (iPhone/iPad)",androidPlatform:"Android",macosPlatform:"macOS",windowsPlatform:"Windows",desktopPlatform:"Escritorio",alreadyInstalled:"\xa1Ya est\xe1 instalada!",alreadyInstalledHint:"Ya est\xe1s usando 9Remote como aplicaci\xf3n instalada",installationGuide:"Gu\xeda de instalaci\xf3n",installationSteps:"Pasos de instalaci\xf3n:"},community:{title:"Comunidad",description:"\xdanete a la comunidad de 9Remote"},pwa:{title:"Instalar como app",description:"Instala 9Remote en tu dispositivo para la mejor experiencia",iosTitle:"iOS Safari",androidTitle:"Android Chrome",desktopTitle:"Escritorio"},codespace:{title:"Codespace",name:"Nombre",status:"Estado",running:"En ejecuci\xf3n",autoStart:"Iniciar 9Remote autom\xe1ticamente",autoStartHint:"Inicia 9Remote cuando se abra el codespace",stop:"Detener Codespace",stopHint:"Det\xe9n para ahorrar uso",restartHint:"Para reiniciar, ve a GitHub",unknown:"Desconocido"}}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9299],{29299:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});let o={common:{statusIdle:"Idle",statusWorking:"Working",statusBlocked:"Needs input",statusDone:"Your turn",loading:"Завантаження...",cancel:"Скасувати",confirm:"Підтвердити",save:"Зберегти",delete:"Видалити",close:"Закрити",back:"Назад",edit:"Редагувати",rename:"Перейменувати",remove:"Видалити",open:"Відкрити",yes:"Так",no:"Ні",ok:"OK",error:"Помилка",success:"Успіх",failed:"Не вдалося",retry:"Повторити",refresh:"Оновити",clipboard:"Clipboard",clipboardCopy:"Copy",clipboardEmpty:"Clipboard is empty",search:"Пошук",create:"Створити",new:"Новий",add:"Додати",copy:"Копіювати",copied:"Скопійовано",download:"Завантажити",upload:"Вивантажити",enabled:"Увімкнено",disabled:"Вимкнено",on:"увімк.",off:"вимк.",minute:"хв",hour:"год",day:"д",minutesAgo:"{n} хв тому",hoursAgo:"{n} год тому",daysAgo:"{n} д тому"},login:{tagline:"Доступ до вашого терміналу звідусіль",heroLine1:"Any machine.",heroLine2:"One terminal.",heroLine3:"In your pocket.",featureTerminal:"Terminal",featureDesktop:"Desktop",featureFiles:"Files",termConnected:"host connected",termTunnel:"tunnel established",termReady:"ready",accessKey:"Ключ доступу",placeholder:"sk-xxx... або одноразовий ключ (ABC123)",rememberKey:"Запам'ятати цей ключ",connect:"Підключитися",connecting:"Підключення...",authenticating:"Автентифікація з токеном...",invalidKeyTail:"Wrong access key — check the last characters and try again.",scanQr:"Scan QR to login",qrScanTitle:"Scan QR Code",qrHint:"Point the camera at the QR code shown on the machine running 9Remote.",qrDetected:"QR Code detected!",qrAuthenticating:"Authenticating...",qrPleaseWait:"Please wait...",qrLibFail:"Failed to load the QR scanner library.",qrInitFail:"Could not start the scanner.",qrCamDenied:"Camera permission denied. Allow camera access and try again.",qrNoCamera:"No camera found on this device.",qrCamBusy:"Camera is in use by another app.",qrCamError:"Could not open the camera.",savedKeys:"Збережені ключі",login:"Увійти",lastLogin:"Останній вхід",namePlaceholder:"Name this key (optional)",rename:"Rename",deleteKeyTitle:"Delete key",deleteKeyConfirm:'Are you sure you want to delete "{name}"?',justNow:"Щойно",minutesAgo:"{n} хв тому",hoursAgo:"{n} год тому",daysAgo:"{n} д тому",tapToScan:"Натисніть для сканування",orEnterManually:"або введіть ключ вручну",addKey:"Add Key",secureTitle:"Secure & Encrypted",secureDesc:"All connections are end-to-end encrypted and secure.",featAccessTitle:"Access Anywhere",featAccessDesc:"Connect from any device, anywhere.",featSecureTitle:"Secure Connection",featSecureDesc:"End-to-end encryption keeps you safe.",featFastTitle:"Fast & Reliable",featFastDesc:"Low latency and high performance.",featSessionsTitle:"Multiple Sessions",featSessionsDesc:"Manage and switch between sessions.",home:"Головна",docs:"Документи"},menu:{reloadRestart:"Reload & Restart",restartHost:"Restart 9remote host",restartConfirmTitle:"Restart 9remote host?",restartConfirmMessage:"This restarts the host process (no reinstall). Terminal sessions are preserved. It takes a few seconds.",restartStarting:"Restarting host…",restartRestarting:"Restarting 9remote…",restartDone:"Restarted! Reconnecting…",restartTimeout:"Restart is taking too long",restartTimeoutHint:"Reconnect manually if it doesn't recover.",title:"Меню",language:"Мова",theme:"Тема",notifications:"Сповіщення",webgl:"GPU Render (Faster)",webglHint:"Вимкніть, якщо текст виглядає неправильно",notificationsHint:"Notify when agent finishes",files:"File Explorer",downloading:"Downloading",copying:"Copying",conflictTitle:"File already exists",conflictMessage:"{name} already exists. Replace or skip?",skip:"Skip",skipAll:"Skip all",replace:"Replace",replaceAll:"Replace all",sites:"Сайти",commandNotes:"Нотатки команд",community:"Спільнота",installApp:"Встановити застосунок",codespace:"Codespace",logout:"Вийти",settingsGeneral:"General",settingsAppearance:"Appearance",settingsTerminalTab:"Terminal",settingsMcp:"Plugins",mcpIntro:"Extra abilities you can give your AI coding tools.",mcpTools:"Allow",mcpRestartHint:"Turning it off applies at once. Turning it on needs the AI tool restarted.",mcpUnavailable:"Update this host to use MCP.",artifactFormats:"Formats it can show",mcpClients:"Works with",settingsWorkspace:"Workspace",settingsApplication:"Application",settingsAccount:"Account",themeLight:"Light",themeDark:"Dark",reload:"Перезавантажити застосунок",remoteDesktop:"Віддалений робочий стіл",settings:"Налаштування",enablePush:"Увімкнути push-сповіщення",disablePush:"Вимкнути push-сповіщення",pushHint:"Увімкніть push-сповіщення, щоб отримувати повідомлення, коли ШІ завершує завдання",pushActiveHint:"Push notifications are on for this device. You'll be alerted when AI completes tasks.",versionMismatch:"Агент {version} застарів",versionMismatchHint:"Деякі функції можуть не працювати. Виконайте:",updateNow:"Update now",updating:"Updating… reconnecting",webReloadTitle:"New web version available",webReloadHint:"Reload to get the latest interface.",reloadWeb:"Reload",updateAvailableTitle:"9Remote host update available",updateStarting:"Starting update…",updateInstalling:"Installing new version…",updateTimeout:"Update is taking too long",updateTimeoutHint:"Reload manually if it doesn't recover.",updateRestarting:"Restarting host…",updateReconnecting:"Reconnecting…",updateDone:"Updated! Reloading…",version:"Версія"},workspace:{loading:"Завантаження...",logoutTitle:"Вихід",logoutMessage:"Ви впевнені, що хочете вийти?",failedCreateSession:"Не вдалося створити сесію: {error}",failedRenameSession:"Не вдалося перейменувати сесію: {error}"},sessions:{headerTitle:"9remote.cc",connected:"Підключено",disconnected:"Відключено",codespaceStopped:"Codespace зупинено",placeholder:"Назва терміналу (необов'язково)",newButton:"+ Новий",empty:"Немає активних сесій",emptyHint:"Створіть нову сесію, щоб почати",created:"Створено {time}",deleteTitle:"Видалити сесію",deleteMessage:'Ви впевнені, що хочете видалити "{name}"?',editName:"Редагувати назву",newTerminal:"Новий термінал",options:"Options"},workspaces:{title:"Groups",newWorkspace:"Group",newWorkspacePrompt:"Group name",defaultName:"New Group",ungrouped:"Ungrouped",addTerminal:"Add terminal to group",moveToWorkspace:"Move to group",rename:"Rename group",delete:"Delete group",emptyWorkspace:"No terminals in this group",deleteTitle:"Delete Group",deleteMessage:'Delete group "{name}"? Terminals move to Ungrouped.'},terminal:{quotaNoData:"No quota data",quotaUsageTitle:"usage",back:"Назад",menu:"Меню",newTerminal:"Новий термінал",remoteDesktop:"Віддалений робочий стіл",defaultName:"Терм"},files:{selectWorkspace:"Виберіть робочу область",recentWorkspaces:"Останні робочі області",home:"Домашня",root:"Корінь",drive:"Диск {letter}",codespaces:"Codespaces",removeRecent:"Видалити з останніх",removeTitle:"Видалити робочу область",removeMessage:'Видалити "{name}" з останніх робочих областей?',setAsWorkspace:"Встановити як робочу область",openFolder:"Відкрити папку",newFile:"Новий файл",newFolder:"Нова папка",rename:"Перейменувати",delete:"Видалити",deleteFile:"Видалити файл",deleteFolder:"Видалити папку",deleteFileMessage:'Видалити "{name}"?',deleteFolderMessage:'Видалити папку "{name}" та весь її вміст?',emptyFolder:"Порожня папка",git:"Git",parent:"Батьківська папка",workspace:"Робоча область",failedLoad:"Не вдалося завантажити: {error}",failedDelete:"Не вдалося видалити: {error}",failedCreate:"Не вдалося створити: {error}",failedRename:"Не вдалося перейменувати: {error}",enterName:"Введіть назву",confirmRename:"Перейменувати на:",setWorkspace:"Встановити робочу область",setAsWorkspaceTitle:"Встановити як робочу область",switchWorkspace:"Змінити робочу область",searchFiles:"Пошук файлів",toggleHidden:"Перемкнути приховані файли",searchPlaceholder:"Пошук файлів...",searching:"Пошук...",noFilesFound:"Файли не знайдено",noGitRepo:"Немає Git-репозиторію",cannotOpenBinary:"Неможливо відкрити двійковий файл",createNew:"Створити новий",file:"Файл",folder:"Папка",placeholderFile:"ім'я-файлу.js",placeholderFolder:"назва-папки",pickFile:"Choose files",pickFolder:"Choose folder",copyPath:"Копіювати шлях",copyRelPath:"Copy Relative Path",copyName:"Copy Filename",delete:"Видалити",rename:"Перейменувати",deleteConfirmTitle:"Видалити",deleteConfirmMessage:'Видалити "{name}"?'},editor:{save:"Зберегти",saving:"Збереження...",saved:"Збережено",unsaved:"Незбережені зміни",close:"Закрити",discard:"Відхилити",discardTitle:"Відхилити зміни",discardMessage:"У вас є незбережені зміни. Відхилити їх?",unsavedTitle:"Save changes to {name}?",unsavedBody:"Your changes will be lost if you don't save them.",failedLoad:"Не вдалося завантажити файл: {error}",failedSave:"Не вдалося зберегти: {error}",openFull:"Open in full editor",artifact:"Artifact",readOnly:"Лише для читання",line:"Рядок",column:"Стовпець",gitDiff:"Git Diff",typeText:"Введіть текст і вставте...",insert:"Вставити",statusModified:"Змінено",statusAdded:"Додано",statusUntracked:"Невідстежуваний"},git:{title:"Git",branch:"Гілка",changes:"Зміни",staged:"У стейджі",unstaged:"Поза стейджем",untracked:"Невідстежувані",commit:"Коміт",commitAndPush:"Commit & Push",commitSuccess:"Commit successful",pushSuccess:"Push successful",stageFailed:"Failed to stage changes",commitFailed:"Commit failed",pushFailed:"Push failed",pullSuccess:"Pull successful",pullFailed:"Pull failed",stageAllConfirmTitle:"Stage All & Commit",stageAllConfirmMessage:"No changes are staged. Stage all changes and commit?",stageAndCommit:"Stage & Commit",gitActions:"Git actions",commitPlaceholder:"Commit message…",stageAllNote:"Stage all \xb7 {count}",upToDate:"Everything up-to-date",commitMessage:"Повідомлення коміту",push:"Push",pull:"Pull",fetch:"Fetch",stage:"У стейдж",stageAll:"Усе у стейдж",unstage:"Зі стейджу",discard:"Відхилити",discardChanges:"Відхилити зміни",discardMessage:'Відхилити зміни в "{name}"?',noChanges:"Немає змін",diff:"Diff",pushing:"Виконується push...",pulling:"Виконується pull...",committing:"Створення коміту...",failedCommit:"Не вдалося закомітити: {error}",failedPush:"Не вдалося виконати push: {error}",failedPull:"Не вдалося виконати pull: {error}",status:"Статус",diffTab:"Diff",modified:"Змінено",added:"Додано",deleted:"Видалено",untrackedTitle:"Невідстежувані",openFile:"Відкрити файл",discardChangesTitle:"Відхилити зміни",discardConfirmTitle:"Відхилити зміни",discardConfirmDelete:'Ви впевнені, що хочете видалити "{name}"? Цю дію неможливо скасувати.',discardConfirmDiscard:'Ви впевнені, що хочете відхилити зміни в "{name}"? Цю дію неможливо скасувати.'},remote:{title:"Віддалений робочий стіл",connecting:"Підключення...",disconnected:"Відключено",fullscreen:"Повний екран",exitFullscreen:"Вийти з повного екрана",receivingImage:"Receiving screen…",keyboard:"Клавіатура",mouse:"Миша",quality:"Якість",fps:"FPS",debug:"Налагодження",help:"Довідка",close:"Закрити",sendKey:"Надіслати клавішу",helpTitle:"Довідка віддаленого робочого столу",notAvailable:"Віддалений робочий стіл недоступний",customizeKeys:"Налаштувати клавіші",back:"Назад",resetZoom:"Скинути масштаб",refresh:"Оновити",rectangleSelection:"Прямокутне виділення",handMode:"Режим руки",toggleKeyboard:"Перемкнути нативну клавіатуру",hideControls:"Hide controls",showControls:"Show controls",textBatchInput:"Пакетне введення тексту",extraKeys:"Додаткові клавіші",customizeRemoteKeys:"Налаштувати клавіші віддаленого керування",exitRemote:"Вийти з віддаленого робочого столу",debugTitle:"Статистика налагодження",minimize:"Згорнути",transport:"Транспорт",latency:"Затримка",tilesPerSec:"Плиток/сек",bandwidth:"Пропускна здатність",clearStats:"Очистити статистику",lockTitle:"Windows заблоковано",lockGrantDesc:"Увімкніть \xabВіддалене розблокування ПК\xbb у 9remote host на цьому ПК.",lockDesc:"Введіть PIN-код або пароль Windows для цього комп'ютера",lockPlaceholder:"PIN-код або пароль Windows",unlock:"Розблокувати",unlocking:"Розблокування…",unlockFailed:"Не вдалося розблокувати — перевірте PIN-код/пароль і спробуйте знову."},remoteHelp:{modePc:"PC / Миша",modeTrackpad:"Дотик \xb7 Trackpad",modeDirect:"Дотик \xb7 Прямий",mouseTitle:"Миша",keyboardTitle:"Клавіатура",gesturesTrackpadTitle:"Жести (Trackpad ✋)",gesturesDirectTitle:"Жести (Прямий)",toolbarTitle:"Панель інструментів",mouseClickKey:"Клік / Перетягування",mouseClickDesc:"Лівий клік, перетягуйте для виділення/переміщення",mouseRightKey:"Правий клік",mouseRightDesc:"Контекстне меню на віддаленому пристрої",mouseWheelKey:"Колесо",mouseWheelDesc:"Прокрутка віддалено (Shift + Колесо = горизонтально)",mouseDoubleKey:"Подвійний клік",mouseDoubleDesc:"Подвійний клік на віддаленому пристрої",keyPhysicalKey:"Фізичні клавіші",keyPhysicalDesc:"Надсилаються напряму (Tab, F-клавіші тощо перехоплюються)",keyModifierKey:"Ctrl / Alt / Shift / ⌘",keyModifierDesc:"Закріплений модифікатор — комбінується з наступною клавішею",trackpadSwipeKey:"Свайп 1 пальцем",trackpadSwipeDesc:"Переміщення віртуального курсора",trackpadTapKey:"Дотик 1 пальцем",trackpadTapDesc:"Лівий клік у позиції курсора",trackpad2TapKey:"Дотик 2 пальцями",trackpad2TapDesc:"Правий клік у позиції курсора",trackpad2SwipeKey:"Свайп 2 пальцями",trackpad2SwipeDesc:"Прокрутка в позиції курсора",trackpadPinchKey:"Щипок 2 пальцями",trackpadPinchDesc:"Масштабування полотна",trackpadScrollLockKey:"Утримувати + тягнути",trackpadScrollLockDesc:"Утримуйте, щоб зафіксувати прокручування, тягніть у будь-якому напрямку",directTapKey:"Дотик 1 пальцем",directTapDesc:"Клік у позиції дотику",directLongKey:"Довге натискання 1 пальцем",directLongDesc:"Правий клік",directDoubleKey:"Подвійний дотик 1 пальцем",directDoubleDesc:"Подвійний клік",directScrollKey:"Свайп 2 пальцями",directScrollDesc:"Прокрутка віддалено",directPinchKey:"Щипок 2 пальцями",directPinchDesc:"Масштабування полотна",directPanKey:"Перетягування 1 пальцем (zoom>1)",directPanDesc:"Панорамування полотна",toolbarHandDesc:"Утримувати лівий клік (режим перетягування) — натисніть знову, щоб відпустити",toolbarMouseDirectDesc:"Перейти в Прямий режим",toolbarMouseTrackpadDesc:"Перейти в Trackpad (віртуальний курсор)",toolbarKeyboardDesc:"Нативна клавіатура / пакетне введення тексту",toolbarRectDesc:"Режим прямокутного виділення"},remoteControls:{enterToSend:"Tab / Ctrl+Num для перемикання вкладок",typeToSend:"Введіть текст для надсилання...",send:"Надіслати",trackpadMode:"Режим Trackpad",directMode:"Прямий режим",bottomRow:"Нижній ряд",extraPanel:"Додаткова панель",exitConfirmMessage:"Ви впевнені, що хочете вийти з поточної сесії віддаленого робочого столу?"},connection:{retrying:"Перепідключення...",waitingApproval:"Очікування підтвердження",approvalDescription:"9Remote host повинен схвалити цей пристрій, перш ніж ви зможете підключитися.",approvalHint:"Перевірте термінал на вашій машині.",rejectedTitle:"Пристрій відхилено",rejectedDescription:"Цей пристрій не був схвалений 9Remote host.",backToLogin:"Назад до входу",failed:"Не вдалося підключитися",failedDescription:"Не вдалося підключитися після {n} спроб",attemptOf:"Спроба {n} з {total}",exit:"Вийти",cancel:"Скасувати",retry:"Повторити зараз"},notifications:{claudeCode:"Claude Code",codex:"Codex",geminiCli:"Gemini CLI",openCode:"OpenCode",needsInput:"needs input",badgeTitle:"{blocked} needs input, {done} your turn",replied:"replied",agent:"Agent"},sites:{title:"Сайти",localSites:"Локальні сайти",selectSitePreview:"Виберіть сайт для попереднього перегляду",browserNewTab:"New tab",browserAddressPlaceholder:"localhost:3000 or /path",browserNotConnected:"Connect to your host first",portPlaceholder:"порт",loadingSites:"Завантаження сайтів...",notConnected:"Not connected to the host",noSitesFound:"Сайти не знайдено",startServerHint:"Запустіть локальний dev-сервер, щоб побачити його тут",siteNamePlaceholder:"Назва сайту",saveTitle:"Зберегти",editNameTitle:"Редагувати назву",removeTitle:"Видалити",removePortTitle:"Видалити порт",removePortMessage:"Видалити порт {port} зі збереженого списку?",popupBlocked:"Спливаюче вікно заблоковано! Будь ласка, дозвольте спливаючі вікна для цього сайту.",startProxyFailed:"Не вдалося запустити проксі-сесію для {name}",foundCount:"Знайдено {n} сайт{suffix}",focusOpenedTab:"Фокус на відкритій вкладці",openInNewTab:"Відкрити в новій вкладці",goBack:"Назад",goForward:"Вперед",loadingSite:"Завантаження...",empty:"Немає активних сайтів",emptyHint:"Запустіть локальний сервер, щоб побачити його тут",open:"Відкрити",refresh:"Оновити"},commandNotes:{title:"Нотатки команд",noSavedCommands:"Немає збережених команд",addFirstBelow:"Додайте свою першу команду нижче",clickToCopy:"Натисніть, щоб скопіювати",copiedBang:"Скопійовано!",copy:"Копіювати",edit:"Редагувати",delete:"Видалити",editCommandPlaceholder:"Редагувати команду...",addCommandPlaceholder:"Додати команду...",update:"Оновити",add:"Додати",empty:"Поки немає нотаток",emptyHint:"Зберігайте команди для швидкого доступу",add:"Додати нотатку",edit:"Редагувати нотатку",delete:"Видалити нотатку",deleteMessage:"Видалити цю нотатку?",name:"Назва",command:"Команда",save:"Зберегти",placeholderName:"напр. Запустити dev-сервер",placeholderCommand:"напр. npm run dev"},mobileKeyboard:{pasteHere:"Вставте тут (Cmd+V)",enterToSend:"Tab / Ctrl+Num для перемикання вкладок",typeCommand:"Введіть команду та надішліть...",send:"Надіслати",toggleExtraKeys:"Перемкнути додаткові клавіші",toggleTextInput:"Перемкнути введення тексту",customizeTerminalKeys:"Налаштувати клавіші терміналу",mainBar:"Основна панель",extraPanel:"Додаткова панель",fileTooLarge:"Файл занадто великий (макс. 5МБ)",readFileFailed:"Не вдалося прочитати файл",uploadFailed:"Не вдалося вивантажити файл: {error}"},terminalPane:{scrollToBottom:"Прокрутити донизу",changedFiles:"Changed files",pasteOrType:"Вставте або введіть тут",paste:"Вставити"},pwaGuide:{copyYourKey:"Скопіюйте свій ключ",copyKeyHint:"Натисніть на ключ нижче, щоб скопіювати — він знадобиться для входу після встановлення",tapToCopyApiKey:"Натисніть, щоб скопіювати API-ключ",copiedBang:"Скопійовано!",copy:"Копіювати",tapShareButton:"Натисніть кнопку \xabПоділитися\xbb",tapShareHint:"Натисніть кнопку \xabПоділитися\xbb внизу iOS Safari",addToHome:"Додати на головний екран",addToHomeHint:"Прокрутіть донизу та натисніть \xabДодати на головний екран\xbb",openAppPasteKey:"Відкрийте застосунок і вставте ключ",openAppPasteKeyHint:"Відкрийте встановлений застосунок і вставте свій ключ для входу",openMenu:"Відкрити меню",openMenuHint:"Натисніть кнопку меню (три крапки) в Android Chrome",installApp:"Встановити застосунок",installAppHint:"Натисніть \xabВстановити застосунок\xbb або \xabДодати на головний екран\xbb",lookInstallIcon:"Шукайте іконку встановлення",lookInstallIconHint:"Шукайте іконку встановлення в адресному рядку",clickInstallPaste:"Натисніть \xabВстановити\xbb та вставте ключ",installNow:"Install Now",installNowHint:"Install 9Remote as an app for quick access",installing:"Installing...",clickInstallPasteHint:"Натисніть встановити, відкрийте застосунок і вставте свій ключ для входу",alternativeHint:"Альтернатива: Відкрийте меню браузера → \xabВстановити 9Remote\xbb або \xabСтворити ярлик\xbb",loadingPlatform:"Завантаження визначення платформи...",iosPlatform:"iOS (iPhone/iPad)",androidPlatform:"Android",macosPlatform:"macOS",windowsPlatform:"Windows",desktopPlatform:"Робочий стіл",alreadyInstalled:"Вже встановлено!",alreadyInstalledHint:"Ви вже використовуєте 9Remote як встановлений застосунок",installationGuide:"Посібник зі встановлення",installationSteps:"Кроки встановлення:"},community:{title:"Спільнота",description:"Приєднуйтесь до спільноти 9Remote"},pwa:{title:"Встановити як застосунок",description:"Встановіть 9Remote на свій пристрій для найкращого досвіду",iosTitle:"iOS Safari",androidTitle:"Android Chrome",desktopTitle:"Робочий стіл"},codespace:{title:"Codespace",name:"Назва",status:"Статус",running:"Працює",autoStart:"Автозапуск 9Remote",autoStartHint:"Запускати 9Remote при відкритті codespace",stop:"Зупинити Codespace",stopHint:"Зупиніть, щоб заощадити використання",restartHint:"Щоб перезапустити, перейдіть на GitHub",unknown:"Невідомо"}}}}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9871],{1988:(e,t,r)=>{"use strict";var n=r(70636);r(67497);var i=r(1521),s=i&&"object"==typeof i&&"default"in i?i:{default:i},o=void 0!==n&&n.env&&!0,l=function(e){return"[object String]"===Object.prototype.toString.call(e)},a=function(){function e(e){var t=void 0===e?{}:e,r=t.name,n=void 0===r?"stylesheet":r,i=t.optimizeForSpeed,s=void 0===i?o:i;u(l(n),"`name` must be a string"),this._name=n,this._deletedRulePlaceholder="#"+n+"-deleted-rule____{}",u("boolean"==typeof s,"`optimizeForSpeed` must be a boolean"),this._optimizeForSpeed=s,this._serverSheet=void 0,this._tags=[],this._injected=!1,this._rulesCount=0;var a=document.querySelector('meta[property="csp-nonce"]');this._nonce=a?a.getAttribute("content"):null}var t,r=e.prototype;return r.setOptimizeForSpeed=function(e){u("boolean"==typeof e,"`setOptimizeForSpeed` accepts a boolean"),u(0===this._rulesCount,"optimizeForSpeed cannot be when rules have already been inserted"),this.flush(),this._optimizeForSpeed=e,this.inject()},r.isOptimizeForSpeed=function(){return this._optimizeForSpeed},r.inject=function(){var e=this;if(u(!this._injected,"sheet already injected"),this._injected=!0,this._optimizeForSpeed){this._tags[0]=this.makeStyleTag(this._name),this._optimizeForSpeed="insertRule"in this.getSheet(),this._optimizeForSpeed||(o||console.warn("StyleSheet: optimizeForSpeed mode not supported falling back to standard mode."),this.flush(),this._injected=!0);return}this._serverSheet={cssRules:[],insertRule:function(t,r){return"number"==typeof r?e._serverSheet.cssRules[r]={cssText:t}:e._serverSheet.cssRules.push({cssText:t}),r},deleteRule:function(t){e._serverSheet.cssRules[t]=null}}},r.getSheetForTag=function(e){if(e.sheet)return e.sheet;for(var t=0;t<document.styleSheets.length;t++)if(document.styleSheets[t].ownerNode===e)return document.styleSheets[t]},r.getSheet=function(){return this.getSheetForTag(this._tags[this._tags.length-1])},r.insertRule=function(e,t){if(u(l(e),"`insertRule` accepts only strings"),this._optimizeForSpeed){var r=this.getSheet();"number"!=typeof t&&(t=r.cssRules.length);try{r.insertRule(e,t)}catch(t){return o||console.warn("StyleSheet: illegal rule: \n\n"+e+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),-1}}else{var n=this._tags[t];this._tags.push(this.makeStyleTag(this._name,e,n))}return this._rulesCount++},r.replaceRule=function(e,t){if(this._optimizeForSpeed){var r=this.getSheet();if(t.trim()||(t=this._deletedRulePlaceholder),!r.cssRules[e])return e;r.deleteRule(e);try{r.insertRule(t,e)}catch(n){o||console.warn("StyleSheet: illegal rule: \n\n"+t+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),r.insertRule(this._deletedRulePlaceholder,e)}}else{var n=this._tags[e];u(n,"old rule at index `"+e+"` not found"),n.textContent=t}return e},r.deleteRule=function(e){if(this._optimizeForSpeed)this.replaceRule(e,"");else{var t=this._tags[e];u(t,"rule at index `"+e+"` not found"),t.parentNode.removeChild(t),this._tags[e]=null}},r.flush=function(){this._injected=!1,this._rulesCount=0,this._tags.forEach(function(e){return e&&e.parentNode.removeChild(e)}),this._tags=[]},r.cssRules=function(){var e=this;return this._tags.reduce(function(t,r){return r?t=t.concat(Array.prototype.map.call(e.getSheetForTag(r).cssRules,function(t){return t.cssText===e._deletedRulePlaceholder?null:t})):t.push(null),t},[])},r.makeStyleTag=function(e,t,r){t&&u(l(t),"makeStyleTag accepts only strings as second parameter");var n=document.createElement("style");this._nonce&&n.setAttribute("nonce",this._nonce),n.type="text/css",n.setAttribute("data-"+e,""),t&&n.appendChild(document.createTextNode(t));var i=document.head||document.getElementsByTagName("head")[0];return r?i.insertBefore(n,r):i.appendChild(n),n},t=[{key:"length",get:function(){return this._rulesCount}}],function(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}(e.prototype,t),e}();function u(e,t){if(!e)throw Error("StyleSheet: "+t+".")}var A=function(e){for(var t=5381,r=e.length;r;)t=33*t^e.charCodeAt(--r);return t>>>0},c={};function h(e,t){if(!t)return"jsx-"+e;var r=String(t),n=e+r;return c[n]||(c[n]="jsx-"+A(e+"-"+r)),c[n]}function d(e,t){var r=e+t;return c[r]||(c[r]=t.replace(/__jsx-style-dynamic-selector/g,e)),c[r]}var p=function(){function e(e){var t=void 0===e?{}:e,r=t.styleSheet,n=void 0===r?null:r,i=t.optimizeForSpeed,s=void 0!==i&&i;this._sheet=n||new a({name:"styled-jsx",optimizeForSpeed:s}),this._sheet.inject(),n&&"boolean"==typeof s&&(this._sheet.setOptimizeForSpeed(s),this._optimizeForSpeed=this._sheet.isOptimizeForSpeed()),this._fromServer=void 0,this._indices={},this._instancesCounts={}}var t=e.prototype;return t.add=function(e){var t=this;void 0===this._optimizeForSpeed&&(this._optimizeForSpeed=Array.isArray(e.children),this._sheet.setOptimizeForSpeed(this._optimizeForSpeed),this._optimizeForSpeed=this._sheet.isOptimizeForSpeed()),this._fromServer||(this._fromServer=this.selectFromServer(),this._instancesCounts=Object.keys(this._fromServer).reduce(function(e,t){return e[t]=0,e},{}));var r=this.getIdAndRules(e),n=r.styleId,i=r.rules;if(n in this._instancesCounts){this._instancesCounts[n]+=1;return}var s=i.map(function(e){return t._sheet.insertRule(e)}).filter(function(e){return -1!==e});this._indices[n]=s,this._instancesCounts[n]=1},t.remove=function(e){var t=this,r=this.getIdAndRules(e).styleId;if(function(e,t){if(!e)throw Error("StyleSheetRegistry: "+t+".")}(r in this._instancesCounts,"styleId: `"+r+"` not found"),this._instancesCounts[r]-=1,this._instancesCounts[r]<1){var n=this._fromServer&&this._fromServer[r];n?(n.parentNode.removeChild(n),delete this._fromServer[r]):(this._indices[r].forEach(function(e){return t._sheet.deleteRule(e)}),delete this._indices[r]),delete this._instancesCounts[r]}},t.update=function(e,t){this.add(t),this.remove(e)},t.flush=function(){this._sheet.flush(),this._sheet.inject(),this._fromServer=void 0,this._indices={},this._instancesCounts={}},t.cssRules=function(){var e=this,t=this._fromServer?Object.keys(this._fromServer).map(function(t){return[t,e._fromServer[t]]}):[],r=this._sheet.cssRules();return t.concat(Object.keys(this._indices).map(function(t){return[t,e._indices[t].map(function(e){return r[e].cssText}).join(e._optimizeForSpeed?"":"\n")]}).filter(function(e){return!!e[1]}))},t.styles=function(e){var t,r;return t=this.cssRules(),void 0===(r=e)&&(r={}),t.map(function(e){var t=e[0],n=e[1];return s.default.createElement("style",{id:"__"+t,key:"__"+t,nonce:r.nonce?r.nonce:void 0,dangerouslySetInnerHTML:{__html:n}})})},t.getIdAndRules=function(e){var t=e.children,r=e.dynamic,n=e.id;if(r){var i=h(n,r);return{styleId:i,rules:Array.isArray(t)?t.map(function(e){return d(i,e)}):[d(i,t)]}}return{styleId:h(n),rules:Array.isArray(t)?t:[t]}},t.selectFromServer=function(){return Array.prototype.slice.call(document.querySelectorAll('[id^="__jsx-"]')).reduce(function(e,t){return e[t.id.slice(2)]=t,e},{})},e}(),f=i.createContext(null);f.displayName="StyleSheetContext";var m=s.default.useInsertionEffect||s.default.useLayoutEffect,_=new p;function v(e){var t=_||i.useContext(f);return t&&m(function(){return t.add(e),function(){t.remove(e)}},[e.id,String(e.dynamic)]),null}v.dynamic=function(e){return e.map(function(e){return h(e[0],e[1])}).join(" ")},t.style=v},28913:(e,t,r)=>{"use strict";e.exports=r(1988).style},64683:(e,t,r)=>{"use strict";r.d(t,{$o:()=>eI.A,AX:()=>ev.A,Ay:()=>tl,BK:()=>e4.A,BZ:()=>$.A,Bm:()=>G.A,Cp:()=>V.A,Do:()=>l.A,F1:()=>a.A,FE:()=>e1.A,FW:()=>eT.A,Fc:()=>eO.A,GD:()=>T.A,GO:()=>ef.A,Gr:()=>w.A,Gv:()=>ey.A,Hx:()=>es.A,Ir:()=>A.A,J4:()=>eY.A,JG:()=>m.A,JU:()=>H.A,Jl:()=>p.A,Kq:()=>ts.A,LM:()=>eu.A,Lt:()=>b.A,M6:()=>e$.A,MA:()=>u.A,Mr:()=>eE.A,P6:()=>et.A,QR:()=>R.A,Qp:()=>o.A,RI:()=>i.A,TB:()=>e7.A,Ud:()=>Z.A,VA:()=>e_.A,Vn:()=>eq.A,W1:()=>ep.A,WE:()=>S.A,We:()=>e9.A,Wn:()=>k.A,X:()=>ti.A,X_:()=>M.A,ZH:()=>O.A,ZU:()=>e8.A,Ze:()=>eM.A,Zr:()=>W.A,_O:()=>e5.A,_V:()=>ee.A,a4:()=>eS.A,aJ:()=>d.A,ak:()=>K.A,bE:()=>e6.A,bd:()=>e2.A,cC:()=>c.A,c_:()=>_.A,dJ:()=>N.A,de:()=>tn.A,dx:()=>q.A,e6:()=>ek.A,e9:()=>eB.A,eM:()=>eG.A,ek:()=>eZ.A,es:()=>eF.A,f2:()=>X.A,f5:()=>z.A,gH:()=>ew.A,h1:()=>eh.A,iU:()=>U.A,jG:()=>eL.A,jj:()=>em.A,jl:()=>y.A,jz:()=>ej.A,kU:()=>P.A,kV:()=>er.A,kr:()=>ea.A,kt:()=>eD.A,lM:()=>e3.A,lP:()=>eC.A,m0:()=>g.A,mN:()=>Q.A,nU:()=>ec.A,qz:()=>J.A,rX:()=>v.A,s3:()=>en.A,sU:()=>eQ.A,sv:()=>B.A,ue:()=>eR.A,vR:()=>ez.A,vW:()=>eU.A,vd:()=>D.A,vj:()=>eW.A,vv:()=>eo.A,wB:()=>eJ.A,wO:()=>eK.A,ww:()=>Y.A,xq:()=>ed.A,xv:()=>ex.A,y8:()=>el.A,yQ:()=>f.A,yU:()=>eP.A,yd:()=>s.A,zP:()=>h.A,zW:()=>te.A});var n=r(73365),i=r(87821),s=r(21878),o=r(79376),l=r(61659),a=r(6504),u=r(19307),A=r(74739),c=r(29967),h=r(17836),d=r(67494),p=r(66687),f=r(95188),m=r(54453),_=r(34582),v=r(70453),S=r(10949),y=r(64570),g=r(31258),C=r(59907),F=r(13374),k=r(17406),R=r(46431),b=r(29260),j=r(88433),x=r(49553),z=r(20478),w=r(17568),P=r(87831),M=r(1916),L=r(29418),O=r(18272),T=r(10550),E=r(9271),I=r(14251),U=r(50068),B=r(98173),N=r(10194),D=r(70362),G=r(17909),H=r(59437),W=r(33109),q=r(48433),V=r(86877),J=r(34271),X=r(60919),Z=r(35723),K=r(41046),Q=r(64629),$=r(6534),Y=r(5370),ee=r(59711),et=r(39831),er=r(9560),en=r(44159),ei=r(41098),es=r(20021),eo=r(14797),el=r(15504),ea=r(93292),eu=r(92165),eA=r(94304),ec=r(40789),eh=r(64871),ed=r(31805),ep=r(19621),ef=r(40081),em=r(38781),e_=r(88768),ev=r(68395),eS=r(88793),ey=r(25406),eg=r(10998),eC=r(64446),eF=r(12925),ek=r(93354),eR=r(73243),eb=r(89317),ej=r(12283),ex=r(1578),ez=r(90612),ew=r(43959),eP=r(76621),eM=r(59833),eL=r(67236),eO=r(37266),eT=r(97038),eE=r(72147),eI=r(68859),eU=r(93285),eB=r(20178),eN=r(65062),eD=r(87030),eG=r(67519),eH=r(457),eW=r(58450),eq=r(48088),eV=r(56023),eJ=r(59311),eX=r(38177),eZ=r(60659),eK=r(1838),eQ=r(34969),e$=r(42685),eY=r(99707),e1=r(6830),e0=r(20248),e2=r(11384),e9=r(50211),e4=r(64342),e7=r(60151),e3=r(81610),e8=r(11990),e6=r(52715),e5=r(49387),te=r(894),tt=r(2031),tr=r(58573),tn=r(51328),ti=r(3382),ts=r(57717);let to={AlertCircle:i.A,ArrowDown:s.A,ArrowRight:o.A,ArrowUp:l.A,ArrowUpRight:a.A,Ban:u.A,Bell:A.A,Bot:c.A,Bug:h.A,Check:d.A,CheckCircle2:p.A,ChevronDown:f.A,ChevronLeft:m.A,ChevronRight:_.A,ChevronUp:v.A,ChevronsDownUp:S.A,Circle:y.A,ClipboardPaste:g.A,Command:C.A,Compass:F.A,Columns2:k.A,Copy:R.A,CornerDownLeft:b.A,Crown:j.A,Delete:x.A,Download:z.A,ExternalLink:w.A,Eye:P.A,EyeOff:M.A,Facebook:L.A,File:O.A,FileCode:T.A,FileJson:E.A,FilePlus:I.A,FileText:U.A,Files:B.A,Filter:N.A,Folder:D.A,FolderOpen:G.A,FolderPlus:H.A,GitBranch:W.A,GitFork:q.A,Github:V.A,Globe:J.A,GripVertical:X.A,Hand:Z.A,HardDrive:K.A,HelpCircle:Q.A,History:$.A,Home:Y.A,Image:ee.A,ImageOff:et.A,KeyRound:er.A,Keyboard:en.A,Laptop:ei.A,LayoutDashboard:es.A,Link2:eo.A,ListChecks:el.A,Loader2:ea.A,Lock:eu.A,LogIn:eA.A,LogOut:ec.A,Maximize2:eh.A,Minimize2:ed.A,Menu:ep.A,Mic:ef.A,MicOff:em.A,Monitor:e_.A,Moon:ev.A,MoreHorizontal:eS.A,MoreVertical:ey.A,MousePointer2:eg.A,Package:eC.A,Palette:eF.A,PanelLeft:ek.A,PanelLeftClose:eR.A,PanelLeftOpen:eb.A,PanelRight:ej.A,Paperclip:ex.A,Pause:ez.A,Pencil:ew.A,Pin:eP.A,PinOff:eM.A,Play:eL.A,Plug:eO.A,Plus:eT.A,Power:eE.A,PowerOff:eI.A,QrCode:eU.A,RefreshCw:eB.A,Replace:eN.A,RotateCw:eD.A,Save:eG.A,Scissors:eH.A,Search:eW.A,Send:eq.A,SendHorizontal:eV.A,Settings:eJ.A,Share:eX.A,Shield:eZ.A,Smartphone:eK.A,Sparkles:eQ.A,Square:e$.A,SquarePen:eY.A,Star:e1.A,StickyNote:e0.A,Sun:e2.A,Target:e9.A,Terminal:e4.A,Trash2:e7.A,Triangle:e3.A,Type:e8.A,Undo2:e6.A,Upload:e5.A,Users:te.A,Volume2:tt.A,VolumeX:tr.A,Wallpaper:tn.A,X:ti.A,Zap:ts.A};function tl({name:e,size:t=20,className:r="",...i}){let s=to[e];return s?(0,n.jsx)(s,{size:t,className:r,strokeWidth:2,...i}):(console.warn(`Icon "${e}" not found in the icon registry`),null)}},67497:()=>{},90753:(e,t,r)=>{"use strict";r.d(t,{A:()=>a});var n=r(73365),i=r(44976),s=r(8910);let o=({size:e=18})=>(0,n.jsxs)("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,n.jsx)("circle",{cx:"12",cy:"12",r:"4"}),(0,n.jsx)("path",{d:"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"})]}),l=({size:e=18})=>(0,n.jsx)("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,n.jsx)("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})});function a({className:e="",size:t=18}){let{theme:r,toggleTheme:u}=(0,i.D)(),A="dark"===r;return(0,n.jsx)("button",{type:"button",onClick:()=>{(0,s.e)(),u()},"aria-label":A?"Switch to light theme":"Switch to dark theme",title:A?"Light mode":"Dark mode",className:`p-1.5 rounded-brand transition-colors text-[var(--color-text-muted)] hover:text-[var(--color-text)] hover:bg-[var(--color-surface-2)] ${e}`,children:A?(0,n.jsx)(o,{size:t}):(0,n.jsx)(l,{size:t})})}}}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1447,4896,5348,5711,6364,6399,6819,6913,6988,7427,7711,7851,8167,8655,8983,9603],{95659:()=>{}},_=>{_.O(0,[2347,5158,7358],()=>_(_.s=95659)),_N_E=_.O()}]);
@@ -0,0 +1,5 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1125],{24945:(e,s,t)=>{"use strict";t.d(s,{b:()=>l});var a=t(1521),r=t(29717),n=t(57042),i=t(39457);function l({redirectIfUnauthed:e=!0}={}){let s=(0,r.useRouter)(),{get:t,post:d}=(0,i.Z)(),[c,o]=(0,a.useState)(null),[x,m]=(0,a.useState)(!0),u=(0,a.useCallback)(async()=>{try{let e=await t(n.lb.me);o(e)}catch{o(null),e&&s.replace("/admin/login")}finally{m(!1)}},[t,e,s]);(0,a.useEffect)(()=>{u()},[u]);let p=(0,a.useCallback)(async()=>{await d(n.lb.logout,{}),s.replace("/admin/login")},[d,s]),b=(0,a.useCallback)(e=>Array.isArray(c?.permissions)&&c.permissions.includes(e),[c]);return{me:c,loading:x,logout:p,can:b,refresh:u}}},29717:(e,s,t)=>{"use strict";var a=t(21505);t.o(a,"usePathname")&&t.d(s,{usePathname:function(){return a.usePathname}}),t.o(a,"useRouter")&&t.d(s,{useRouter:function(){return a.useRouter}}),t.o(a,"useSearchParams")&&t.d(s,{useSearchParams:function(){return a.useSearchParams}})},38334:(e,s,t)=>{"use strict";t.d(s,{A:()=>b});var a=t(73365),r=t(28913),n=t(1521),i=t(99568),l=t(29717),d=t(45111),c=t(59893),o=t(90753),x=t(30240),m=t(64683),u=t(24945);let p=[{href:"/admin",label:"Dashboard",icon:m.Hx,exact:!0},{href:"/admin/access",label:"Access",icon:m.zW},{href:"/admin/ota",label:"OTA Updates",icon:m.lP,needsOta:!0},{href:"/admin/turn",label:"TURN Keys",icon:m.kV}];function b({children:e}){let s=(0,l.usePathname)(),{me:t,loading:h,logout:g}=(0,u.b)(),[f,j]=(0,n.useState)(!1);if(h||!t)return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(x.A,{}),(0,a.jsx)(c.A,{children:(0,a.jsx)("div",{className:"card-glass p-8 max-w-sm w-full flex flex-col items-center justify-center",children:(0,a.jsx)(d.A,{size:"lg",text:"Loading admin..."})})})]});let N=(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"p-4 border-b border-border-subtle flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2.5 min-w-0",children:[(0,a.jsx)("div",{className:"w-6 h-6 shrink-0 rounded-md flex items-center justify-center font-bold text-sm bg-brand-500 text-white",children:"9"}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("h1",{className:"text-sm font-bold tracking-tight text-text truncate",children:"9Remote Admin"}),(0,a.jsxs)("div",{className:"flex items-center gap-1.5 mt-0.5",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted truncate",children:t.username}),(0,a.jsx)("span",{className:"text-[10px] font-mono px-1.5 py-0.5 rounded-full bg-surface-2 text-text-muted border border-border-subtle",children:t.modeName||t.modeId})]})]})]}),(0,a.jsx)("button",{onClick:()=>j(!1),className:"md:hidden p-1.5 -mr-1.5 text-text-muted hover:text-text rounded-[6px] hover:bg-surface-2 transition-colors","aria-label":"Close menu",children:(0,a.jsx)(m.X,{size:18})})]}),(0,a.jsxs)("nav",{className:"flex-1 px-3.5 py-3 space-y-0.5 overflow-y-auto",children:[(0,a.jsx)("div",{className:"pl-[3.5px] py-1.5 text-[10px] font-mono uppercase tracking-wider text-text-subtle",children:"Navigation"}),p.filter(e=>!e.needsOta||t.otaEnabled).map(e=>{let t=e.icon,r=e.exact?s===e.href:s.startsWith(e.href);return(0,a.jsxs)(i,{href:e.href,onClick:()=>j(!1),className:`
2
+ flex items-center gap-2.5 -ml-3.5 w-[calc(100%+0.875rem)] pl-[17px] pr-3 py-1.5
3
+ rounded-[6px] text-xs font-medium text-left transition-colors duration-150
4
+ ${r?"bg-surface-3 text-text font-semibold":"text-text-muted hover:bg-surface-2 hover:text-text"}
5
+ `,children:[(0,a.jsx)(t,{size:15,className:r?"text-text":"text-text-subtle"}),(0,a.jsx)("span",{className:"flex-1",children:e.label}),r&&(0,a.jsx)("span",{className:"w-1 h-1 rounded-full bg-text-muted"})]},e.href)})]}),(0,a.jsx)("div",{className:"p-3.5 border-t border-border-subtle",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(o.A,{className:"border border-border-subtle hover:bg-surface-2 rounded-[6px]"}),(0,a.jsxs)("button",{onClick:g,className:"flex-1 flex items-center justify-center gap-2 px-3 py-1.5 rounded-[6px] text-xs font-medium text-text-muted hover:bg-red-500/10 hover:text-danger transition-colors",children:[(0,a.jsx)(m.nU,{size:15}),"Logout"]})]})})]});return(0,a.jsxs)("div",{className:"jsx-b56c084163c9c8c1 min-h-screen text-text relative selection:bg-brand-500/20",children:[(0,a.jsx)(x.A,{}),(0,a.jsxs)("header",{className:"jsx-b56c084163c9c8c1 md:hidden sticky top-0 z-30 flex items-center justify-between px-4 py-2.5 bg-surface/80 backdrop-blur-md border-b border-border-subtle",children:[(0,a.jsx)("button",{onClick:()=>j(!0),"aria-label":"Open menu",className:"jsx-b56c084163c9c8c1 p-1.5 -ml-1.5 text-text-muted hover:text-text rounded-[6px] hover:bg-surface-2",children:(0,a.jsx)(m.W1,{size:20})}),(0,a.jsxs)("div",{className:"jsx-b56c084163c9c8c1 flex items-center gap-2",children:[(0,a.jsx)("div",{className:"jsx-b56c084163c9c8c1 w-6 h-6 rounded-md flex items-center justify-center font-bold text-xs bg-brand-500 text-white",children:"9"}),(0,a.jsx)("h1",{className:"jsx-b56c084163c9c8c1 text-sm font-semibold tracking-tight",children:"9Remote Admin"})]}),(0,a.jsx)(o.A,{className:"rounded-[6px]"})]}),(0,a.jsx)("aside",{className:"jsx-b56c084163c9c8c1 hidden md:flex fixed inset-y-0 left-0 w-60 border-r border-border-subtle bg-surface/80 backdrop-blur-xl flex-col z-20",children:N}),f&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{onClick:()=>j(!1),className:"jsx-b56c084163c9c8c1 md:hidden fixed inset-0 z-40 bg-black/60 backdrop-blur-[2px] fade-in"}),(0,a.jsx)("aside",{style:{animation:"slideInFromLeft 0.22s cubic-bezier(0.22, 1, 0.36, 1) forwards"},className:"jsx-b56c084163c9c8c1 md:hidden fixed inset-y-0 left-0 z-50 w-72 max-w-[85%] bg-surface/95 backdrop-blur-2xl border-r border-border-subtle flex flex-col slide-in-right",children:N})]}),(0,a.jsx)("main",{className:"jsx-b56c084163c9c8c1 md:ml-60 p-4 sm:p-6 lg:p-8 min-h-screen relative z-10 max-w-7xl",children:e}),(0,a.jsx)(r,{id:"b56c084163c9c8c1",children:"@keyframes slideInFromLeft{from{transform:translatex(-100%);opacity:0}to{transform:translatex(0);opacity:1}}"})]})}},39457:(e,s,t)=>{"use strict";t.d(s,{Z:()=>n});var a=t(1521);async function r(e,s={}){let t=await fetch(e,{...s,headers:{"Content-Type":"application/json",...s.headers||{}},credentials:"include"}),a=await t.json().catch(()=>({}));if(!t.ok)throw Error(a?.error||`Request failed (${t.status})`);return a}function n(){let e=(0,a.useCallback)(e=>r(e),[]),s=(0,a.useCallback)((e,s)=>r(e,{method:"POST",body:JSON.stringify(s||{})}),[]);return{get:e,post:s,patch:(0,a.useCallback)((e,s)=>r(e,{method:"PATCH",body:JSON.stringify(s||{})}),[]),del:(0,a.useCallback)(e=>r(e,{method:"DELETE"}),[])}}},40441:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>g});var a=t(73365),r=t(1521),n=t(38334),i=t(80186),l=t(96042),d=t(64683);let c={ok:"Success",badPassword:"Wrong password",unknownUser:"Unknown user",turnstile:"Captcha failed",locked:"Locked out"};function o({items:e}){return(0,a.jsxs)("section",{className:"space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(d.ek,{size:16,className:"text-brand-500"}),(0,a.jsx)("h2",{className:"text-base font-semibold tracking-tight text-text",children:"Login Activity"}),(0,a.jsxs)("span",{className:"text-xs text-text-subtle font-mono",children:["last ",e.length]})]}),(0,a.jsx)("div",{className:"card-glass overflow-hidden",children:(0,a.jsx)("div",{className:"max-h-64 overflow-y-auto",children:(0,a.jsxs)("table",{className:"w-full text-sm text-left",children:[(0,a.jsx)("thead",{className:"bg-surface-2/60 border-b border-border-subtle text-[11px] font-mono uppercase tracking-wider text-text-muted",children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{className:"px-4 py-2.5",children:"Time"}),(0,a.jsx)("th",{className:"px-4 py-2.5",children:"User"}),(0,a.jsx)("th",{className:"px-4 py-2.5",children:"IP"}),(0,a.jsx)("th",{className:"px-4 py-2.5 text-right",children:"Result"})]})}),(0,a.jsxs)("tbody",{className:"divide-y divide-border-subtle/50",children:[0===e.length&&(0,a.jsx)("tr",{children:(0,a.jsx)("td",{colSpan:4,className:"px-4 py-8 text-center text-text-muted",children:"No login attempts recorded yet"})}),e.map((e,s)=>(0,a.jsxs)("tr",{className:"hover:bg-surface-2/40 transition-colors",children:[(0,a.jsx)("td",{className:"px-4 py-2.5 text-xs text-text-muted whitespace-nowrap",children:function(e){try{return new Date(e+"Z").toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}(e.createdAt)}),(0,a.jsx)("td",{className:"px-4 py-2.5 font-mono text-xs text-text",children:e.username}),(0,a.jsx)("td",{className:"px-4 py-2.5 font-mono text-xs text-text-muted",children:e.ip}),(0,a.jsx)("td",{className:"px-4 py-2.5 text-right",children:e.ok?(0,a.jsxs)("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[11px] font-medium border bg-emerald-500/10 text-emerald-500 border-emerald-500/20",children:[(0,a.jsx)(d.ek,{size:11})," OK"]}):(0,a.jsxs)("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[11px] font-medium border bg-red-500/10 text-danger border-red-500/20",children:[(0,a.jsx)(d.RI,{size:11})," ",c[e.reason]||e.reason]})})]},s))]})]})})})]})}var x=t(39457),m=t(24945),u=t(57042);let p={username:"",password:"",modeId:""},b={id:"",name:"",permissions:[]};function h(e){if(!e)return"-";try{return new Date(e+"Z").toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}function g(){let{me:e,can:s,loading:t}=(0,m.b)(),{get:c,post:g,patch:f,del:j}=(0,x.Z)(),[N,y]=(0,r.useState)([]),[v,w]=(0,r.useState)([]),[k,A]=(0,r.useState)([]),[C,S]=(0,r.useState)(p),[z,$]=(0,r.useState)(null),[I,M]=(0,r.useState)(b),[D,P]=(0,r.useState)(null),[L,O]=(0,r.useState)(""),R=s(u.Jj.adminManage),T=s(u.Jj.modeManage),V=s(u.Jj.logView),E=[{key:"admins",label:"Admins"},{key:"modes",label:"Modes & Permissions"},...V?[{key:"logins",label:"Login Activity"}]:[]],[U,F]=(0,r.useState)("admins"),W=(0,r.useCallback)(async()=>{let e=[c(u.lb.admins),c(u.lb.modes)];s(u.Jj.logView)&&e.push(c(u.lb.logins));let[t,a,r]=await Promise.all(e);y(t.items||[]),w(a.items||[]),r&&A(r.items||[]),S(e=>({...e,modeId:e.modeId||(a.items||[])[0]?.id||""}))},[s,c]);(0,r.useEffect)(()=>{!t&&e&&W()},[t,e,W]);let J=()=>{$(null),S({...p,modeId:v[0]?.id||""}),O("")},_=async()=>{O("");try{if(z)await f(`${u.lb.admins}/${z}`,{modeId:C.modeId,...C.password?{password:C.password}:{}});else{if(!C.username||!C.password||!C.modeId)return void O("All fields are required");await g(u.lb.admins,C)}J(),W()}catch(e){O(e.message)}},q=async e=>{if(confirm("Delete this admin account?"))try{await j(`${u.lb.admins}/${e}`),W()}catch(e){alert(e.message)}},Z=()=>{P(null),M(b),O("")},K=async()=>{O("");try{if(D)await f(`${u.lb.modes}/${D}`,{name:I.name,permissions:I.permissions});else{if(!I.id||!I.name)return void O("ID and name are required");await g(u.lb.modes,I)}Z(),W()}catch(e){O(e.message)}},X=async e=>{if(confirm(`Delete mode ${e}?`))try{await j(`${u.lb.modes}/${e}`),W()}catch(e){alert(e.message)}},B=(0,a.jsxs)("section",{className:"space-y-4",children:[R&&(0,a.jsxs)("div",{className:"card-glass p-5 sm:p-6 space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between border-b border-border-subtle/60 pb-3",children:[(0,a.jsx)("h2",{className:"text-sm font-semibold tracking-tight text-text flex items-center gap-2",children:z?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Edit admin:"}),(0,a.jsx)("span",{className:"font-mono text-brand-500 font-bold",children:C.username})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(d.FW,{size:16,className:"text-brand-500"}),(0,a.jsx)("span",{children:"Create Administrator Account"})]})}),z&&(0,a.jsxs)("button",{onClick:J,className:"text-xs text-text-muted hover:text-text flex items-center gap-1",children:[(0,a.jsx)(d.X,{size:14})," Cancel"]})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[(0,a.jsx)(l.A,{label:"Username",value:C.username,onChange:e=>S({...C,username:e.target.value}),disabled:!!z,placeholder:"operator username"}),(0,a.jsx)(l.A,{label:z?"New Password (optional)":"Password",type:"password",value:C.password,onChange:e=>S({...C,password:e.target.value}),placeholder:z?"Leave blank to keep":"••••••••"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-xs font-mono uppercase tracking-wider text-text-muted mb-2",children:"Assigned Mode"}),(0,a.jsx)("select",{value:C.modeId,onChange:e=>S({...C,modeId:e.target.value}),className:"w-full px-3 py-2.5 bg-surface-2 border border-border-subtle rounded-xl text-text text-sm focus:outline-none focus:ring-2 focus:ring-brand-500/30 transition-all",children:v.map(e=>(0,a.jsxs)("option",{value:e.id,children:[e.name," (",e.id,")"]},e.id))})]})]}),L&&null!==z&&(0,a.jsx)("p",{className:"text-xs text-danger bg-red-500/10 p-2.5 rounded-lg border border-red-500/20",children:L}),(0,a.jsxs)("div",{className:"flex gap-2 pt-2",children:[(0,a.jsx)(i.A,{variant:"primary",onClick:_,className:"rounded-xl px-4 py-2",children:(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5 text-xs font-semibold",children:[(0,a.jsx)(d.eM,{size:14}),(0,a.jsx)("span",{children:z?"Update Account":"Create Administrator"})]})}),z&&(0,a.jsx)(i.A,{variant:"secondary",onClick:J,className:"rounded-xl px-4 py-2 text-xs",children:"Cancel"})]})]}),(0,a.jsx)("div",{className:"card-glass overflow-hidden",children:(0,a.jsxs)("table",{className:"w-full text-sm text-left",children:[(0,a.jsx)("thead",{className:"bg-surface-2/60 border-b border-border-subtle text-[11px] font-mono uppercase tracking-wider text-text-muted",children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{className:"px-4 py-3",children:"Username"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Security Role"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Created"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Last Login"}),R&&(0,a.jsx)("th",{className:"px-4 py-3 text-right",children:"Actions"})]})}),(0,a.jsx)("tbody",{className:"divide-y divide-border-subtle/50",children:N.map(s=>{let t=s.id===e?.id;return(0,a.jsxs)("tr",{className:"hover:bg-surface-2/40 transition-colors",children:[(0,a.jsx)("td",{className:"px-4 py-3.5 font-medium text-text",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"font-mono text-xs",children:s.username}),t&&(0,a.jsx)("span",{className:"text-[10px] font-mono px-1.5 py-0.5 rounded-full bg-brand-500/10 text-brand-500 border border-brand-500/25",children:"you"})]})}),(0,a.jsx)("td",{className:"px-4 py-3.5",children:(0,a.jsx)("span",{className:"px-2 py-0.5 rounded-full text-xs font-medium bg-surface-2 border border-border-subtle text-text",children:s.modeName||s.modeId})}),(0,a.jsx)("td",{className:"px-4 py-3.5 text-xs text-text-muted",children:h(s.createdAt)}),(0,a.jsx)("td",{className:"px-4 py-3.5 text-xs text-text font-medium",children:h(s.lastLoginAt)}),R&&(0,a.jsx)("td",{className:"px-4 py-3.5 text-right",children:(0,a.jsxs)("div",{className:"inline-flex items-center gap-2",children:[(0,a.jsx)("button",{onClick:()=>{$(s.id),S({username:s.username,password:"",modeId:s.modeId}),O("")},className:"text-xs text-brand-500 hover:text-brand-400 font-medium px-2 py-1 rounded hover:bg-brand-500/10 transition-colors",children:"Edit"}),!t&&(0,a.jsx)("button",{onClick:()=>q(s.id),className:"text-text-muted hover:text-danger p-1 rounded hover:bg-red-500/10 transition-colors",title:"Delete admin",children:(0,a.jsx)(d.TB,{size:15})})]})})]},s.id)})})]})})]}),H=(0,a.jsxs)("section",{className:"space-y-4",children:[T&&(0,a.jsxs)("div",{className:"card-glass p-5 sm:p-6 space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between border-b border-border-subtle/60 pb-3",children:[(0,a.jsx)("h2",{className:"text-sm font-semibold tracking-tight text-text flex items-center gap-2",children:D?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Edit role:"}),(0,a.jsx)("span",{className:"font-mono text-brand-500 font-bold",children:D})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(d.FW,{size:16,className:"text-brand-500"}),(0,a.jsx)("span",{children:"Create New Security Mode"})]})}),D&&(0,a.jsxs)("button",{onClick:Z,className:"text-xs text-text-muted hover:text-text flex items-center gap-1",children:[(0,a.jsx)(d.X,{size:14})," Cancel"]})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[(0,a.jsx)(l.A,{label:"Mode ID",value:I.id,onChange:e=>M({...I,id:e.target.value}),disabled:!!D,placeholder:"e.g. support-lead"}),(0,a.jsx)(l.A,{label:"Display Name",value:I.name,onChange:e=>M({...I,name:e.target.value}),placeholder:"e.g. Support Team Lead"})]}),(0,a.jsx)("div",{className:"space-y-3",children:u.vq.map(e=>(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"text-[10px] font-mono uppercase tracking-wider text-text-subtle mb-1.5",children:e.label}),(0,a.jsx)("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-2",children:e.keys.map(e=>{let s=I.permissions.includes(e);return(0,a.jsxs)("button",{type:"button",onClick:()=>{M(s=>({...s,permissions:s.permissions.includes(e)?s.permissions.filter(s=>s!==e):[...s.permissions,e]}))},title:e,className:`flex items-center justify-between px-3 py-2 rounded-[6px] text-xs border transition-colors text-left ${s?"bg-brand-500/12 text-brand-500 border-brand-500/30":"bg-surface-2/60 text-text-muted border-border-subtle hover:bg-surface-2 hover:text-text"}`,children:[(0,a.jsx)("span",{className:"truncate",children:u.WD[e]||e}),s?(0,a.jsx)(d.aJ,{size:13,className:"text-brand-500 shrink-0 ml-1.5"}):null]},e)})})]},e.label))}),L&&null===D&&(0,a.jsx)("p",{className:"text-xs text-danger bg-red-500/10 p-2.5 rounded-lg border border-red-500/20",children:L}),(0,a.jsxs)("div",{className:"flex gap-2 pt-2",children:[(0,a.jsx)(i.A,{variant:"primary",onClick:K,className:"rounded-xl px-4 py-2",children:(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5 text-xs font-semibold",children:[(0,a.jsx)(d.eM,{size:14}),(0,a.jsx)("span",{children:D?"Save Changes":"Create Mode"})]})}),D&&(0,a.jsx)(i.A,{variant:"secondary",onClick:Z,className:"rounded-xl px-4 py-2 text-xs",children:"Cancel"})]})]}),(0,a.jsx)("div",{className:"card-glass overflow-hidden",children:(0,a.jsxs)("table",{className:"w-full text-sm text-left",children:[(0,a.jsx)("thead",{className:"bg-surface-2/60 border-b border-border-subtle text-[11px] font-mono uppercase tracking-wider text-text-muted",children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{className:"px-4 py-3",children:"ID"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Role Name"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Assigned Permissions"}),T&&(0,a.jsx)("th",{className:"px-4 py-3 text-right",children:"Actions"})]})}),(0,a.jsx)("tbody",{className:"divide-y divide-border-subtle/50",children:v.map(e=>{let s=function(e){try{return"string"==typeof e.permissions?JSON.parse(e.permissions):e.permissions}catch{return[]}}(e);return(0,a.jsxs)("tr",{className:"hover:bg-surface-2/40 transition-colors",children:[(0,a.jsx)("td",{className:"px-4 py-3.5 font-mono text-xs font-semibold text-text",children:e.id}),(0,a.jsxs)("td",{className:"px-4 py-3.5 font-medium text-text",children:[e.name,(0,a.jsxs)("span",{className:"block text-[11px] text-text-muted font-normal",children:[s.length," permissions"]})]}),(0,a.jsx)("td",{className:"px-4 py-3.5",children:(0,a.jsx)("div",{className:"flex flex-wrap gap-1 max-w-md",children:s.map(e=>(0,a.jsx)("span",{title:e,className:"px-2 py-0.5 rounded-[4px] bg-surface-2 border border-border-subtle text-[11px] text-text-muted",children:u.WD[e]||e},e))})}),T&&(0,a.jsx)("td",{className:"px-4 py-3.5 text-right",children:(0,a.jsxs)("div",{className:"inline-flex items-center gap-2",children:[(0,a.jsx)("button",{onClick:()=>{P(e.id),M({id:e.id,name:e.name,permissions:s}),O("")},className:"text-xs text-brand-500 hover:text-brand-400 font-medium px-2 py-1 rounded hover:bg-brand-500/10 transition-colors",children:"Edit"}),(0,a.jsx)("button",{onClick:()=>X(e.id),className:"text-text-muted hover:text-danger p-1 rounded hover:bg-red-500/10 transition-colors",title:"Delete mode",children:(0,a.jsx)(d.TB,{size:15})})]})})]},e.id)})})]})})]});return(0,a.jsx)(n.A,{children:(0,a.jsxs)("div",{className:"space-y-6 max-w-5xl",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"text-xl font-bold tracking-tight text-text",children:"Access Control"}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-1",children:"Operator accounts, security roles and login audit"})]}),(0,a.jsx)("div",{className:"flex items-stretch border-b border-border-subtle overflow-x-auto scrollbar-none -mb-px",children:E.map(e=>(0,a.jsxs)("button",{onClick:()=>F(e.key),className:`term-tab flex items-center gap-1.5 px-3 py-2 text-xs font-medium whitespace-nowrap cursor-pointer ${U===e.key?"term-tab-active":""}`,children:[U===e.key&&(0,a.jsx)("span",{className:"w-1 h-1 rounded-full bg-text-muted"}),(0,a.jsx)("span",{children:e.label})]},e.key))}),"admins"===U&&B,"modes"===U&&H,"logins"===U&&V&&(0,a.jsx)(o,{items:k})]})})}},45111:(e,s,t)=>{"use strict";t.d(s,{A:()=>r});var a=t(73365);function r({size:e="md",text:s,className:t=""}){return(0,a.jsxs)("div",{className:`flex flex-col items-center justify-center gap-3 ${t}`,children:[(0,a.jsx)("div",{className:`animate-spin rounded-full border-brand-500 border-t-transparent ${{sm:"h-4 w-4 border-2",md:"h-8 w-8 border-2",lg:"h-12 w-12 border-b-2"}[e]}`}),s&&(0,a.jsx)("p",{className:"text-brand-500 text-sm font-medium",children:s})]})}},57042:(e,s,t)=>{"use strict";t.d(s,{GS:()=>c,Jj:()=>a,Qh:()=>i,WD:()=>r,Wm:()=>l,lb:()=>x,rK:()=>o,vq:()=>n,xp:()=>d});let a={sessionView:"session.view",sessionDelete:"session.delete",modeView:"mode.view",modeManage:"mode.manage",adminView:"admin.view",adminManage:"admin.manage",otaView:"ota.view",otaManage:"ota.manage",turnView:"turn.view",turnManage:"turn.manage",logView:"log.view"};Object.values(a);let r={"session.view":"View sessions","session.delete":"Delete sessions","admin.view":"View admins","admin.manage":"Create/edit admins","mode.view":"View modes","mode.manage":"Create/edit modes","ota.view":"View OTA updates","ota.manage":"Manage OTA updates","turn.view":"View TURN keys","turn.manage":"Manage TURN keys","log.view":"View login audit"},n=[{label:"Sessions",keys:["session.view","session.delete"]},{label:"Admins",keys:["admin.view","admin.manage"]},{label:"Modes",keys:["mode.view","mode.manage"]},{label:"OTA & TURN",keys:["ota.view","ota.manage","turn.view","turn.manage"]},{label:"Audit",keys:["log.view"]}],i=18e5,l=20,d=[10,20,50,100],c=["createdAt","lastAccessAt","expiresAt","machineId"],o=[{key:"loyal",label:"Loyal",minMs:6048e5,color:"text-success"},{key:"returning",label:"Returning",minMs:864e5,color:"text-brand-500"},{key:"active",label:"Active",minMs:3e5,color:"text-brand-400"},{key:"new",label:"New",minMs:0,color:"text-text-muted"}],x={login:"/api/admin/login",logout:"/api/admin/logout",me:"/api/admin/me",sessions:"/api/admin/sessions",stats:"/api/admin/stats",modes:"/api/admin/modes",admins:"/api/admin/admins",ota:"/api/admin/ota",turn:"/api/admin/turn",logins:"/api/admin/logins",turnstile:"/api/admin/turnstile"}},59893:(e,s,t)=>{"use strict";t.d(s,{A:()=>r});var a=t(73365);function r({children:e,centered:s=!0,className:t=""}){return(0,a.jsx)("div",{className:`min-h-screen ${s?"flex items-center justify-center p-4":""} ${t}`,children:e})}},60598:(e,s,t)=>{Promise.resolve().then(t.bind(t,40441))},80186:(e,s,t)=>{"use strict";t.d(s,{A:()=>r});var a=t(73365);function r({children:e,variant:s="primary",size:t="md",disabled:n=!1,loading:i=!1,onClick:l,className:d="",...c}){let o=`font-semibold rounded-brand transition-all duration-150 ease-out transform active:scale-[0.97] ${{primary:"bg-brand-500 hover:bg-brand-600 disabled:bg-surface-3 disabled:text-text-muted text-white shadow-sm",secondary:"bg-surface-2 hover:bg-surface-3 disabled:bg-surface disabled:text-text-muted text-text",danger:"bg-red-500 hover:bg-red-600 disabled:bg-surface-3 disabled:text-text-muted text-white",success:"bg-green-600 hover:bg-green-700 disabled:bg-surface-3 disabled:text-text-muted text-white"}[s]} ${{sm:"px-3 py-1.5 text-sm",md:"px-4 py-2 text-base",lg:"px-6 py-3 text-lg"}[t]} ${n||i?"cursor-not-allowed":""} ${d}`;return(0,a.jsx)("button",{onClick:l,disabled:n||i,className:o,...c,children:i?(0,a.jsxs)("span",{className:"flex items-center justify-center gap-2",children:[(0,a.jsx)("span",{className:"animate-spin rounded-full h-4 w-4 border-b-2 border-white"}),e]}):e})}},96042:(e,s,t)=>{"use strict";t.d(s,{A:()=>r});var a=t(73365);function r({label:e,type:s="text",value:t,onChange:n,onKeyDown:i,placeholder:l,disabled:d=!1,error:c,className:o="",...x}){let m=c?"ring-1 ring-red-500 focus:ring-2 focus:ring-red-500":"focus:ring-2 focus:ring-brand-500/40",u=`w-full px-4 py-3 bg-surface-2 rounded-brand text-text placeholder-text-muted focus:outline-none transition-all duration-150 ease-out ${m} ${d?"opacity-50 cursor-not-allowed":""} ${o}`;return(0,a.jsxs)("div",{className:"w-full",children:[e&&(0,a.jsx)("label",{className:"block text-sm font-medium text-text mb-2",children:e}),(0,a.jsx)("input",{type:s,value:t,onChange:n,onKeyDown:i,placeholder:l,disabled:d,className:u,...x}),c&&(0,a.jsx)("p",{className:"mt-1 text-sm text-red-400",children:c})]})}}},e=>{e.O(0,[6669,9568,8922,9871,2347,5158,7358],()=>e(e.s=60598)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2116],{29717:(e,t,s)=>{"use strict";var a=s(21505);s.o(a,"usePathname")&&s.d(t,{usePathname:function(){return a.usePathname}}),s.o(a,"useRouter")&&s.d(t,{useRouter:function(){return a.useRouter}}),s.o(a,"useSearchParams")&&s.d(t,{useSearchParams:function(){return a.useSearchParams}})},57042:(e,t,s)=>{"use strict";s.d(t,{GS:()=>d,Jj:()=>a,Qh:()=>i,WD:()=>n,Wm:()=>l,lb:()=>c,rK:()=>A,vq:()=>r,xp:()=>o});let a={sessionView:"session.view",sessionDelete:"session.delete",modeView:"mode.view",modeManage:"mode.manage",adminView:"admin.view",adminManage:"admin.manage",otaView:"ota.view",otaManage:"ota.manage",turnView:"turn.view",turnManage:"turn.manage",logView:"log.view"};Object.values(a);let n={"session.view":"View sessions","session.delete":"Delete sessions","admin.view":"View admins","admin.manage":"Create/edit admins","mode.view":"View modes","mode.manage":"Create/edit modes","ota.view":"View OTA updates","ota.manage":"Manage OTA updates","turn.view":"View TURN keys","turn.manage":"Manage TURN keys","log.view":"View login audit"},r=[{label:"Sessions",keys:["session.view","session.delete"]},{label:"Admins",keys:["admin.view","admin.manage"]},{label:"Modes",keys:["mode.view","mode.manage"]},{label:"OTA & TURN",keys:["ota.view","ota.manage","turn.view","turn.manage"]},{label:"Audit",keys:["log.view"]}],i=18e5,l=20,o=[10,20,50,100],d=["createdAt","lastAccessAt","expiresAt","machineId"],A=[{key:"loyal",label:"Loyal",minMs:6048e5,color:"text-success"},{key:"returning",label:"Returning",minMs:864e5,color:"text-brand-500"},{key:"active",label:"Active",minMs:3e5,color:"text-brand-400"},{key:"new",label:"New",minMs:0,color:"text-text-muted"}],c={login:"/api/admin/login",logout:"/api/admin/logout",me:"/api/admin/me",sessions:"/api/admin/sessions",stats:"/api/admin/stats",modes:"/api/admin/modes",admins:"/api/admin/admins",ota:"/api/admin/ota",turn:"/api/admin/turn",logins:"/api/admin/logins",turnstile:"/api/admin/turnstile"}},59893:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});var a=s(73365);function n({children:e,centered:t=!0,className:s=""}){return(0,a.jsx)("div",{className:`min-h-screen ${t?"flex items-center justify-center p-4":""} ${s}`,children:e})}},64683:(e,t,s)=>{"use strict";s.d(t,{$o:()=>e_.A,AX:()=>eb.A,Ay:()=>tl,BK:()=>e3.A,BZ:()=>Z.A,Bm:()=>B.A,Cp:()=>K.A,Do:()=>l.A,F1:()=>o.A,FE:()=>e0.A,FW:()=>eD.A,Fc:()=>eO.A,GD:()=>D.A,GO:()=>eh.A,Gr:()=>L.A,Gv:()=>ew.A,Hx:()=>er.A,Ir:()=>A.A,J4:()=>eY.A,JG:()=>g.A,JU:()=>G.A,Jl:()=>x.A,Kq:()=>tr.A,LM:()=>ed.A,Lt:()=>N.A,M6:()=>eZ.A,MA:()=>d.A,Mr:()=>eF.A,P6:()=>et.A,QR:()=>C.A,Qp:()=>i.A,RI:()=>n.A,TB:()=>e4.A,Ud:()=>q.A,VA:()=>ep.A,Vn:()=>eH.A,W1:()=>ex.A,WE:()=>f.A,We:()=>e5.A,Wn:()=>k.A,X:()=>tn.A,X_:()=>U.A,ZH:()=>O.A,ZU:()=>e9.A,Ze:()=>eU.A,Zr:()=>$.A,_O:()=>e7.A,_V:()=>ee.A,a4:()=>ef.A,aJ:()=>m.A,ak:()=>Q.A,bE:()=>e8.A,bd:()=>e2.A,cC:()=>c.A,c_:()=>p.A,dJ:()=>z.A,de:()=>ta.A,dx:()=>H.A,e6:()=>ek.A,e9:()=>eT.A,eM:()=>eB.A,ek:()=>eq.A,es:()=>ey.A,f2:()=>I.A,f5:()=>S.A,gH:()=>eL.A,h1:()=>eu.A,iU:()=>E.A,jG:()=>eV.A,jj:()=>eg.A,jl:()=>w.A,jz:()=>eM.A,kU:()=>R.A,kV:()=>es.A,kr:()=>eo.A,kt:()=>eW.A,lM:()=>e6.A,lP:()=>ej.A,m0:()=>v.A,mN:()=>X.A,nU:()=>ec.A,qz:()=>J.A,rX:()=>b.A,s3:()=>ea.A,sU:()=>eX.A,sv:()=>T.A,ue:()=>eC.A,vR:()=>eS.A,vW:()=>eE.A,vd:()=>W.A,vj:()=>e$.A,vv:()=>ei.A,wB:()=>eJ.A,wO:()=>eQ.A,ww:()=>Y.A,xq:()=>em.A,xv:()=>eP.A,y8:()=>el.A,yQ:()=>h.A,yU:()=>eR.A,yd:()=>r.A,zP:()=>u.A,zW:()=>te.A});var a=s(73365),n=s(87821),r=s(21878),i=s(79376),l=s(61659),o=s(6504),d=s(19307),A=s(74739),c=s(29967),u=s(17836),m=s(67494),x=s(66687),h=s(95188),g=s(54453),p=s(34582),b=s(70453),f=s(10949),w=s(64570),v=s(31258),j=s(59907),y=s(13374),k=s(17406),C=s(46431),N=s(29260),M=s(88433),P=s(49553),S=s(20478),L=s(17568),R=s(87831),U=s(1916),V=s(29418),O=s(18272),D=s(10550),F=s(9271),_=s(14251),E=s(50068),T=s(98173),z=s(10194),W=s(70362),B=s(17909),G=s(59437),$=s(33109),H=s(48433),K=s(86877),J=s(34271),I=s(60919),q=s(35723),Q=s(41046),X=s(64629),Z=s(6534),Y=s(5370),ee=s(59711),et=s(39831),es=s(9560),ea=s(44159),en=s(41098),er=s(20021),ei=s(14797),el=s(15504),eo=s(93292),ed=s(92165),eA=s(94304),ec=s(40789),eu=s(64871),em=s(31805),ex=s(19621),eh=s(40081),eg=s(38781),ep=s(88768),eb=s(68395),ef=s(88793),ew=s(25406),ev=s(10998),ej=s(64446),ey=s(12925),ek=s(93354),eC=s(73243),eN=s(89317),eM=s(12283),eP=s(1578),eS=s(90612),eL=s(43959),eR=s(76621),eU=s(59833),eV=s(67236),eO=s(37266),eD=s(97038),eF=s(72147),e_=s(68859),eE=s(93285),eT=s(20178),ez=s(65062),eW=s(87030),eB=s(67519),eG=s(457),e$=s(58450),eH=s(48088),eK=s(56023),eJ=s(59311),eI=s(38177),eq=s(60659),eQ=s(1838),eX=s(34969),eZ=s(42685),eY=s(99707),e0=s(6830),e1=s(20248),e2=s(11384),e5=s(50211),e3=s(64342),e4=s(60151),e6=s(81610),e9=s(11990),e8=s(52715),e7=s(49387),te=s(894),tt=s(2031),ts=s(58573),ta=s(51328),tn=s(3382),tr=s(57717);let ti={AlertCircle:n.A,ArrowDown:r.A,ArrowRight:i.A,ArrowUp:l.A,ArrowUpRight:o.A,Ban:d.A,Bell:A.A,Bot:c.A,Bug:u.A,Check:m.A,CheckCircle2:x.A,ChevronDown:h.A,ChevronLeft:g.A,ChevronRight:p.A,ChevronUp:b.A,ChevronsDownUp:f.A,Circle:w.A,ClipboardPaste:v.A,Command:j.A,Compass:y.A,Columns2:k.A,Copy:C.A,CornerDownLeft:N.A,Crown:M.A,Delete:P.A,Download:S.A,ExternalLink:L.A,Eye:R.A,EyeOff:U.A,Facebook:V.A,File:O.A,FileCode:D.A,FileJson:F.A,FilePlus:_.A,FileText:E.A,Files:T.A,Filter:z.A,Folder:W.A,FolderOpen:B.A,FolderPlus:G.A,GitBranch:$.A,GitFork:H.A,Github:K.A,Globe:J.A,GripVertical:I.A,Hand:q.A,HardDrive:Q.A,HelpCircle:X.A,History:Z.A,Home:Y.A,Image:ee.A,ImageOff:et.A,KeyRound:es.A,Keyboard:ea.A,Laptop:en.A,LayoutDashboard:er.A,Link2:ei.A,ListChecks:el.A,Loader2:eo.A,Lock:ed.A,LogIn:eA.A,LogOut:ec.A,Maximize2:eu.A,Minimize2:em.A,Menu:ex.A,Mic:eh.A,MicOff:eg.A,Monitor:ep.A,Moon:eb.A,MoreHorizontal:ef.A,MoreVertical:ew.A,MousePointer2:ev.A,Package:ej.A,Palette:ey.A,PanelLeft:ek.A,PanelLeftClose:eC.A,PanelLeftOpen:eN.A,PanelRight:eM.A,Paperclip:eP.A,Pause:eS.A,Pencil:eL.A,Pin:eR.A,PinOff:eU.A,Play:eV.A,Plug:eO.A,Plus:eD.A,Power:eF.A,PowerOff:e_.A,QrCode:eE.A,RefreshCw:eT.A,Replace:ez.A,RotateCw:eW.A,Save:eB.A,Scissors:eG.A,Search:e$.A,Send:eH.A,SendHorizontal:eK.A,Settings:eJ.A,Share:eI.A,Shield:eq.A,Smartphone:eQ.A,Sparkles:eX.A,Square:eZ.A,SquarePen:eY.A,Star:e0.A,StickyNote:e1.A,Sun:e2.A,Target:e5.A,Terminal:e3.A,Trash2:e4.A,Triangle:e6.A,Type:e9.A,Undo2:e8.A,Upload:e7.A,Users:te.A,Volume2:tt.A,VolumeX:ts.A,Wallpaper:ta.A,X:tn.A,Zap:tr.A};function tl({name:e,size:t=20,className:s="",...n}){let r=ti[e];return r?(0,a.jsx)(r,{size:t,className:s,strokeWidth:2,...n}):(console.warn(`Icon "${e}" not found in the icon registry`),null)}},73249:(e,t,s)=>{Promise.resolve().then(s.bind(s,79365))},79365:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>h});var a=s(73365),n=s(1521),r=s(29717),i=s(99568),l=s(59893),o=s(80186),d=s(96042),A=s(90753),c=s(30240);function u({siteKey:e,onToken:t}){let s=(0,n.useRef)(null),r=(0,n.useRef)(t);return((0,n.useEffect)(()=>{r.current=t},[t]),(0,n.useEffect)(()=>{if(!e||!s.current)return;let t=null,a=()=>{window.turnstile?.render&&s.current&&(t=window.turnstile.render(s.current,{sitekey:e,callback:e=>r.current(e),"expired-callback":()=>r.current(""),"error-callback":()=>r.current("")}))};if(window.turnstile?.render)a();else{let e=document.createElement("script");e.src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit",e.async=!0,e.onload=a,document.head.appendChild(e)}return()=>{null!=t&&window.turnstile?.remove?.(t)}},[e]),e)?(0,a.jsx)("div",{ref:s,className:"flex justify-center min-h-[33px]","aria-label":"Captcha"}):null}var m=s(64683),x=s(57042);function h(){let e=(0,r.useRouter)(),[t,s]=(0,n.useState)(""),[h,g]=(0,n.useState)(""),[p,b]=(0,n.useState)(""),[f,w]=(0,n.useState)(!1),[v,j]=(0,n.useState)(""),[y,k]=(0,n.useState)("");(0,n.useEffect)(()=>{fetch(x.lb.turnstile).then(e=>e.json()).then(e=>j(e?.siteKey||"")).catch(()=>j(""))},[]);let C=async()=>{if(t&&h){w(!0),b("");try{let s=await fetch(x.lb.login,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t,password:h,turnstileToken:y}),credentials:"include"}),a=await s.json();if(!s.ok)throw Error(a?.error||"Login failed");e.replace("/admin")}catch(e){b(e.message),k(""),window.turnstile?.reset?.()}finally{w(!1)}}};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(c.A,{}),(0,a.jsx)(l.A,{children:(0,a.jsxs)("div",{className:"card-glass p-8 sm:p-10 max-w-md w-full relative overflow-hidden",children:[(0,a.jsx)("div",{className:"absolute top-0 left-1/2 -translate-x-1/2 w-48 h-1 bg-brand-500/80 rounded-full blur-sm"}),(0,a.jsxs)("div",{className:"flex items-center justify-between mb-8",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:"w-10 h-10 rounded-xl flex items-center justify-center font-bold text-lg bg-brand-500 text-white shadow-[0_8px_24px_-6px_rgba(255,87,10,0.5)] ring-1 ring-white/20",children:"9"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-[11px] font-mono tracking-wider uppercase text-brand-500 font-semibold block",children:"Console"}),(0,a.jsx)("h1",{className:"text-xl font-bold tracking-tight text-text",children:"9Remote Admin"})]})]}),(0,a.jsx)(A.A,{className:"rounded-xl border border-border-subtle"})]}),(0,a.jsxs)("div",{className:"mb-6",children:[(0,a.jsx)("h2",{className:"text-2xl font-bold tracking-tight text-text login-hero-grad",children:"Welcome back"}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-1",children:"Sign in with administrator credentials to manage node instances"})]}),p&&(0,a.jsxs)("div",{className:"mb-5 p-3 rounded-xl bg-red-500/10 border border-red-500/20 text-danger text-xs flex items-center gap-2",children:[(0,a.jsx)(m.RI,{size:15,className:"shrink-0"}),(0,a.jsx)("span",{children:p})]}),(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsx)(d.A,{label:"Admin Username",value:t,onChange:e=>s(e.target.value),placeholder:"e.g. root",autoFocus:!0,onKeyDown:e=>"Enter"===e.key&&C()}),(0,a.jsx)(d.A,{label:"Password",type:"password",value:h,onChange:e=>g(e.target.value),placeholder:"••••••••",onKeyDown:e=>"Enter"===e.key&&C()}),(0,a.jsx)(u,{siteKey:v,onToken:k}),(0,a.jsx)(o.A,{variant:"primary",onClick:C,disabled:!t||!h||v&&!y,loading:f,className:"w-full py-2.5 rounded-xl shadow-[0_8px_20px_-6px_rgba(255,87,10,0.45)] font-semibold",children:(0,a.jsxs)("span",{className:"inline-flex items-center justify-center gap-2",children:[(0,a.jsx)("span",{children:"Authenticate"}),(0,a.jsx)(m.Qp,{size:16})]})})]}),(0,a.jsxs)("div",{className:"mt-8 pt-5 border-t border-border-subtle flex items-center justify-between text-xs text-text-subtle",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,a.jsx)(m.ek,{size:13,className:"text-brand-500"}),(0,a.jsx)("span",{children:"Restricted access"})]}),(0,a.jsx)(i,{href:"/login",className:"hover:text-brand-500 transition-colors",children:"User Login →"})]})]})})]})}},80186:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});var a=s(73365);function n({children:e,variant:t="primary",size:s="md",disabled:r=!1,loading:i=!1,onClick:l,className:o="",...d}){let A=`font-semibold rounded-brand transition-all duration-150 ease-out transform active:scale-[0.97] ${{primary:"bg-brand-500 hover:bg-brand-600 disabled:bg-surface-3 disabled:text-text-muted text-white shadow-sm",secondary:"bg-surface-2 hover:bg-surface-3 disabled:bg-surface disabled:text-text-muted text-text",danger:"bg-red-500 hover:bg-red-600 disabled:bg-surface-3 disabled:text-text-muted text-white",success:"bg-green-600 hover:bg-green-700 disabled:bg-surface-3 disabled:text-text-muted text-white"}[t]} ${{sm:"px-3 py-1.5 text-sm",md:"px-4 py-2 text-base",lg:"px-6 py-3 text-lg"}[s]} ${r||i?"cursor-not-allowed":""} ${o}`;return(0,a.jsx)("button",{onClick:l,disabled:r||i,className:A,...d,children:i?(0,a.jsxs)("span",{className:"flex items-center justify-center gap-2",children:[(0,a.jsx)("span",{className:"animate-spin rounded-full h-4 w-4 border-b-2 border-white"}),e]}):e})}},90753:(e,t,s)=>{"use strict";s.d(t,{A:()=>o});var a=s(73365),n=s(44976),r=s(8910);let i=({size:e=18})=>(0,a.jsxs)("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,a.jsx)("circle",{cx:"12",cy:"12",r:"4"}),(0,a.jsx)("path",{d:"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"})]}),l=({size:e=18})=>(0,a.jsx)("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,a.jsx)("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})});function o({className:e="",size:t=18}){let{theme:s,toggleTheme:d}=(0,n.D)(),A="dark"===s;return(0,a.jsx)("button",{type:"button",onClick:()=>{(0,r.e)(),d()},"aria-label":A?"Switch to light theme":"Switch to dark theme",title:A?"Light mode":"Dark mode",className:`p-1.5 rounded-brand transition-colors text-[var(--color-text-muted)] hover:text-[var(--color-text)] hover:bg-[var(--color-surface-2)] ${e}`,children:A?(0,a.jsx)(i,{size:t}):(0,a.jsx)(l,{size:t})})}},96042:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});var a=s(73365);function n({label:e,type:t="text",value:s,onChange:r,onKeyDown:i,placeholder:l,disabled:o=!1,error:d,className:A="",...c}){let u=d?"ring-1 ring-red-500 focus:ring-2 focus:ring-red-500":"focus:ring-2 focus:ring-brand-500/40",m=`w-full px-4 py-3 bg-surface-2 rounded-brand text-text placeholder-text-muted focus:outline-none transition-all duration-150 ease-out ${u} ${o?"opacity-50 cursor-not-allowed":""} ${A}`;return(0,a.jsxs)("div",{className:"w-full",children:[e&&(0,a.jsx)("label",{className:"block text-sm font-medium text-text mb-2",children:e}),(0,a.jsx)("input",{type:t,value:s,onChange:r,onKeyDown:i,placeholder:l,disabled:o,className:m,...c}),d&&(0,a.jsx)("p",{className:"mt-1 text-sm text-red-400",children:d})]})}}},e=>{e.O(0,[6669,9568,8922,2347,5158,7358],()=>e(e.s=73249)),_N_E=e.O()}]);
@@ -0,0 +1,5 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8535],{24945:(e,t,s)=>{"use strict";s.d(t,{b:()=>i});var a=s(1521),r=s(29717),n=s(57042),l=s(39457);function i({redirectIfUnauthed:e=!0}={}){let t=(0,r.useRouter)(),{get:s,post:d}=(0,l.Z)(),[c,o]=(0,a.useState)(null),[x,m]=(0,a.useState)(!0),u=(0,a.useCallback)(async()=>{try{let e=await s(n.lb.me);o(e)}catch{o(null),e&&t.replace("/admin/login")}finally{m(!1)}},[s,e,t]);(0,a.useEffect)(()=>{u()},[u]);let b=(0,a.useCallback)(async()=>{await d(n.lb.logout,{}),t.replace("/admin/login")},[d,t]),p=(0,a.useCallback)(e=>Array.isArray(c?.permissions)&&c.permissions.includes(e),[c]);return{me:c,loading:x,logout:b,can:p,refresh:u}}},29717:(e,t,s)=>{"use strict";var a=s(21505);s.o(a,"usePathname")&&s.d(t,{usePathname:function(){return a.usePathname}}),s.o(a,"useRouter")&&s.d(t,{useRouter:function(){return a.useRouter}}),s.o(a,"useSearchParams")&&s.d(t,{useSearchParams:function(){return a.useSearchParams}})},38334:(e,t,s)=>{"use strict";s.d(t,{A:()=>p});var a=s(73365),r=s(28913),n=s(1521),l=s(99568),i=s(29717),d=s(45111),c=s(59893),o=s(90753),x=s(30240),m=s(64683),u=s(24945);let b=[{href:"/admin",label:"Dashboard",icon:m.Hx,exact:!0},{href:"/admin/access",label:"Access",icon:m.zW},{href:"/admin/ota",label:"OTA Updates",icon:m.lP,needsOta:!0},{href:"/admin/turn",label:"TURN Keys",icon:m.kV}];function p({children:e}){let t=(0,i.usePathname)(),{me:s,loading:h,logout:f}=(0,u.b)(),[g,j]=(0,n.useState)(!1);if(h||!s)return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(x.A,{}),(0,a.jsx)(c.A,{children:(0,a.jsx)("div",{className:"card-glass p-8 max-w-sm w-full flex flex-col items-center justify-center",children:(0,a.jsx)(d.A,{size:"lg",text:"Loading admin..."})})})]});let N=(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"p-4 border-b border-border-subtle flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2.5 min-w-0",children:[(0,a.jsx)("div",{className:"w-6 h-6 shrink-0 rounded-md flex items-center justify-center font-bold text-sm bg-brand-500 text-white",children:"9"}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("h1",{className:"text-sm font-bold tracking-tight text-text truncate",children:"9Remote Admin"}),(0,a.jsxs)("div",{className:"flex items-center gap-1.5 mt-0.5",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted truncate",children:s.username}),(0,a.jsx)("span",{className:"text-[10px] font-mono px-1.5 py-0.5 rounded-full bg-surface-2 text-text-muted border border-border-subtle",children:s.modeName||s.modeId})]})]})]}),(0,a.jsx)("button",{onClick:()=>j(!1),className:"md:hidden p-1.5 -mr-1.5 text-text-muted hover:text-text rounded-[6px] hover:bg-surface-2 transition-colors","aria-label":"Close menu",children:(0,a.jsx)(m.X,{size:18})})]}),(0,a.jsxs)("nav",{className:"flex-1 px-3.5 py-3 space-y-0.5 overflow-y-auto",children:[(0,a.jsx)("div",{className:"pl-[3.5px] py-1.5 text-[10px] font-mono uppercase tracking-wider text-text-subtle",children:"Navigation"}),b.filter(e=>!e.needsOta||s.otaEnabled).map(e=>{let s=e.icon,r=e.exact?t===e.href:t.startsWith(e.href);return(0,a.jsxs)(l,{href:e.href,onClick:()=>j(!1),className:`
2
+ flex items-center gap-2.5 -ml-3.5 w-[calc(100%+0.875rem)] pl-[17px] pr-3 py-1.5
3
+ rounded-[6px] text-xs font-medium text-left transition-colors duration-150
4
+ ${r?"bg-surface-3 text-text font-semibold":"text-text-muted hover:bg-surface-2 hover:text-text"}
5
+ `,children:[(0,a.jsx)(s,{size:15,className:r?"text-text":"text-text-subtle"}),(0,a.jsx)("span",{className:"flex-1",children:e.label}),r&&(0,a.jsx)("span",{className:"w-1 h-1 rounded-full bg-text-muted"})]},e.href)})]}),(0,a.jsx)("div",{className:"p-3.5 border-t border-border-subtle",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(o.A,{className:"border border-border-subtle hover:bg-surface-2 rounded-[6px]"}),(0,a.jsxs)("button",{onClick:f,className:"flex-1 flex items-center justify-center gap-2 px-3 py-1.5 rounded-[6px] text-xs font-medium text-text-muted hover:bg-red-500/10 hover:text-danger transition-colors",children:[(0,a.jsx)(m.nU,{size:15}),"Logout"]})]})})]});return(0,a.jsxs)("div",{className:"jsx-b56c084163c9c8c1 min-h-screen text-text relative selection:bg-brand-500/20",children:[(0,a.jsx)(x.A,{}),(0,a.jsxs)("header",{className:"jsx-b56c084163c9c8c1 md:hidden sticky top-0 z-30 flex items-center justify-between px-4 py-2.5 bg-surface/80 backdrop-blur-md border-b border-border-subtle",children:[(0,a.jsx)("button",{onClick:()=>j(!0),"aria-label":"Open menu",className:"jsx-b56c084163c9c8c1 p-1.5 -ml-1.5 text-text-muted hover:text-text rounded-[6px] hover:bg-surface-2",children:(0,a.jsx)(m.W1,{size:20})}),(0,a.jsxs)("div",{className:"jsx-b56c084163c9c8c1 flex items-center gap-2",children:[(0,a.jsx)("div",{className:"jsx-b56c084163c9c8c1 w-6 h-6 rounded-md flex items-center justify-center font-bold text-xs bg-brand-500 text-white",children:"9"}),(0,a.jsx)("h1",{className:"jsx-b56c084163c9c8c1 text-sm font-semibold tracking-tight",children:"9Remote Admin"})]}),(0,a.jsx)(o.A,{className:"rounded-[6px]"})]}),(0,a.jsx)("aside",{className:"jsx-b56c084163c9c8c1 hidden md:flex fixed inset-y-0 left-0 w-60 border-r border-border-subtle bg-surface/80 backdrop-blur-xl flex-col z-20",children:N}),g&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{onClick:()=>j(!1),className:"jsx-b56c084163c9c8c1 md:hidden fixed inset-0 z-40 bg-black/60 backdrop-blur-[2px] fade-in"}),(0,a.jsx)("aside",{style:{animation:"slideInFromLeft 0.22s cubic-bezier(0.22, 1, 0.36, 1) forwards"},className:"jsx-b56c084163c9c8c1 md:hidden fixed inset-y-0 left-0 z-50 w-72 max-w-[85%] bg-surface/95 backdrop-blur-2xl border-r border-border-subtle flex flex-col slide-in-right",children:N})]}),(0,a.jsx)("main",{className:"jsx-b56c084163c9c8c1 md:ml-60 p-4 sm:p-6 lg:p-8 min-h-screen relative z-10 max-w-7xl",children:e}),(0,a.jsx)(r,{id:"b56c084163c9c8c1",children:"@keyframes slideInFromLeft{from{transform:translatex(-100%);opacity:0}to{transform:translatex(0);opacity:1}}"})]})}},39457:(e,t,s)=>{"use strict";s.d(t,{Z:()=>n});var a=s(1521);async function r(e,t={}){let s=await fetch(e,{...t,headers:{"Content-Type":"application/json",...t.headers||{}},credentials:"include"}),a=await s.json().catch(()=>({}));if(!s.ok)throw Error(a?.error||`Request failed (${s.status})`);return a}function n(){let e=(0,a.useCallback)(e=>r(e),[]),t=(0,a.useCallback)((e,t)=>r(e,{method:"POST",body:JSON.stringify(t||{})}),[]);return{get:e,post:t,patch:(0,a.useCallback)((e,t)=>r(e,{method:"PATCH",body:JSON.stringify(t||{})}),[]),del:(0,a.useCallback)(e=>r(e,{method:"DELETE"}),[])}}},45111:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});var a=s(73365);function r({size:e="md",text:t,className:s=""}){return(0,a.jsxs)("div",{className:`flex flex-col items-center justify-center gap-3 ${s}`,children:[(0,a.jsx)("div",{className:`animate-spin rounded-full border-brand-500 border-t-transparent ${{sm:"h-4 w-4 border-2",md:"h-8 w-8 border-2",lg:"h-12 w-12 border-b-2"}[e]}`}),t&&(0,a.jsx)("p",{className:"text-brand-500 text-sm font-medium",children:t})]})}},52840:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>x});var a=s(73365),r=s(1521),n=s(38334),l=s(39457),i=s(24945),d=s(57042),c=s(64683);let o=["","ios","android"];function x(){let{can:e,me:t,loading:s}=(0,i.b)(),{get:x,post:m}=(0,l.Z)(),[u,b]=(0,r.useState)([]),[p,h]=(0,r.useState)(!0),[f,g]=(0,r.useState)(""),[j,N]=(0,r.useState)({runtimeVersion:"",platform:"",channel:""}),[y,v]=(0,r.useState)(null),w=e(d.Jj.otaManage),k=(0,r.useCallback)(async()=>{h(!0),g("");try{let e=new URLSearchParams;j.runtimeVersion&&e.set("runtimeVersion",j.runtimeVersion),j.platform&&e.set("platform",j.platform),j.channel&&e.set("channel",j.channel);let t=await x(`${d.lb.ota}?${e}`);b(t.items||[])}catch(e){g(e.message)}finally{h(!1)}},[x,j.runtimeVersion,j.platform,j.channel]);(0,r.useEffect)(()=>{!s&&t&&k()},[s,t]);let A=async e=>{if(confirm(`Promote #${e.buildNumber} to serving for channel "${e.channel}" (${e.platform}, ${e.runtimeVersion})?`)){v(e.id);try{await m(`${d.lb.ota}/${e.id}/promote`),await k()}catch(e){g(e.message)}finally{v(null)}}};return(0,a.jsx)(n.A,{children:(0,a.jsxs)("div",{className:"space-y-8 max-w-5xl",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("h1",{className:"text-2xl font-bold tracking-tight text-text login-hero-grad flex items-center gap-2.5",children:[(0,a.jsx)(c.lP,{size:24,className:"text-brand-500"}),(0,a.jsx)("span",{children:"OTA Updates"})]}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-1",children:"Publish, promote and rollback mobile application bundles"})]}),(0,a.jsxs)("button",{onClick:k,disabled:p,className:"inline-flex items-center gap-2 px-3.5 py-1.5 rounded-xl bg-surface-2 hover:bg-surface-3 border border-border-subtle text-xs font-medium text-text transition-colors disabled:opacity-50",children:[(0,a.jsx)(c.e9,{size:13,className:p?"animate-spin text-brand-500":""}),(0,a.jsx)("span",{children:"Refresh"})]})]}),(0,a.jsxs)("div",{className:"card-glass p-4 grid grid-cols-1 sm:grid-cols-4 gap-3",children:[(0,a.jsx)("input",{className:"px-3 py-2 text-xs border border-border-subtle rounded-xl bg-surface-2/80 text-text placeholder:text-text-subtle focus:outline-none focus:ring-2 focus:ring-brand-500/30 font-mono",placeholder:"Runtime (e.g. 0.1.7)",value:j.runtimeVersion,onChange:e=>N({...j,runtimeVersion:e.target.value})}),(0,a.jsx)("select",{className:"px-3 py-2 text-xs border border-border-subtle rounded-xl bg-surface-2/80 text-text focus:outline-none focus:ring-2 focus:ring-brand-500/30",value:j.platform,onChange:e=>N({...j,platform:e.target.value}),children:o.map(e=>(0,a.jsx)("option",{value:e,children:e?e.toUpperCase():"All platforms"},e))}),(0,a.jsx)("input",{className:"px-3 py-2 text-xs border border-border-subtle rounded-xl bg-surface-2/80 text-text placeholder:text-text-subtle focus:outline-none focus:ring-2 focus:ring-brand-500/30 font-mono",placeholder:"Channel (e.g. production)",value:j.channel,onChange:e=>N({...j,channel:e.target.value})}),(0,a.jsx)("button",{onClick:k,className:"px-4 py-2 text-xs font-semibold bg-brand-500 text-white rounded-xl hover:bg-brand-600 shadow-[0_4px_12px_-4px_rgba(255,87,10,0.5)] transition-all",children:"Filter Bundles"})]}),f&&(0,a.jsx)("p",{className:"text-xs text-danger bg-red-500/10 p-3 rounded-xl border border-red-500/20",children:f}),p?(0,a.jsxs)("div",{className:"card-glass p-12 text-center text-text-muted text-xs",children:[(0,a.jsx)(c.e9,{size:20,className:"mx-auto mb-2 animate-spin text-brand-500"}),"Loading updates catalog..."]}):0===u.length?(0,a.jsxs)("div",{className:"card-glass p-12 text-center",children:[(0,a.jsx)("div",{className:"w-12 h-12 rounded-2xl bg-surface-2 flex items-center justify-center mx-auto mb-3 text-text-subtle",children:(0,a.jsx)(c.lP,{size:24})}),(0,a.jsx)("h3",{className:"text-sm font-semibold text-text",children:"No updates published"}),(0,a.jsxs)("p",{className:"text-text-muted text-xs mt-1",children:["Publish an OTA update package with ",(0,a.jsx)("code",{className:"text-brand-500 font-mono px-1.5 py-0.5 rounded bg-surface-2",children:"npm run update"})]})]}):(0,a.jsx)("div",{className:"card-glass overflow-hidden",children:(0,a.jsxs)("table",{className:"w-full text-sm text-left",children:[(0,a.jsx)("thead",{className:"bg-surface-2/60 border-b border-border-subtle text-[11px] font-mono uppercase tracking-wider text-text-muted",children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{className:"px-4 py-3",children:"Build"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Runtime"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Platform"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Channel"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Published"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Status"}),w&&(0,a.jsx)("th",{className:"px-4 py-3 text-right",children:"Actions"})]})}),(0,a.jsx)("tbody",{className:"divide-y divide-border-subtle/50",children:u.map(e=>(0,a.jsxs)("tr",{className:"hover:bg-surface-2/40 transition-colors",children:[(0,a.jsxs)("td",{className:"px-4 py-3.5",children:[(0,a.jsxs)("div",{className:"font-medium text-text",children:[(0,a.jsxs)("span",{className:"text-brand-500 font-mono font-bold mr-2",children:["#",e.buildNumber]}),(0,a.jsx)("span",{children:e.message||"(no message)"})]}),(0,a.jsx)("div",{className:"text-[10px] text-text-subtle font-mono mt-0.5",children:e.id.slice(0,8)})]}),(0,a.jsx)("td",{className:"px-4 py-3.5 text-xs font-mono text-text-muted",children:e.runtimeVersion}),(0,a.jsx)("td",{className:"px-4 py-3.5",children:(0,a.jsx)("span",{className:`px-2 py-0.5 rounded-md text-[10px] font-mono font-bold uppercase tracking-wider border ${"ios"===e.platform?"bg-sky-500/10 text-sky-500 border-sky-500/20":"bg-emerald-500/10 text-emerald-500 border-emerald-500/20"}`,children:e.platform})}),(0,a.jsx)("td",{className:"px-4 py-3.5",children:(0,a.jsx)("span",{className:"px-2 py-0.5 rounded-full text-xs font-mono bg-surface-2 border border-border-subtle text-text",children:e.channel})}),(0,a.jsx)("td",{className:"px-4 py-3.5 text-xs text-text-muted font-mono",children:(e=>{if(!e)return"-";try{return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}})(e.publishedAt||e.createdAt)}),(0,a.jsx)("td",{className:"px-4 py-3.5",children:e.isServing?(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-500 border border-emerald-500/20",children:[(0,a.jsx)(c.Jl,{size:13}),(0,a.jsx)("span",{children:"Serving"})]}):(0,a.jsx)("span",{className:"text-xs font-mono text-text-subtle px-2 py-0.5 rounded bg-surface-2",children:e.status})}),w&&(0,a.jsx)("td",{className:"px-4 py-3.5 text-right",children:!e.isServing&&(0,a.jsxs)("button",{onClick:()=>A(e),disabled:y===e.id,className:"inline-flex items-center gap-1 text-xs font-semibold text-brand-500 hover:text-brand-400 px-2.5 py-1 rounded-lg hover:bg-brand-500/10 transition-colors disabled:opacity-50",children:[(0,a.jsx)("span",{children:y===e.id?"Promoting...":"Promote"}),(0,a.jsx)(c.F1,{size:13})]})})]},e.id))})]})})]})})}},57042:(e,t,s)=>{"use strict";s.d(t,{GS:()=>c,Jj:()=>a,Qh:()=>l,WD:()=>r,Wm:()=>i,lb:()=>x,rK:()=>o,vq:()=>n,xp:()=>d});let a={sessionView:"session.view",sessionDelete:"session.delete",modeView:"mode.view",modeManage:"mode.manage",adminView:"admin.view",adminManage:"admin.manage",otaView:"ota.view",otaManage:"ota.manage",turnView:"turn.view",turnManage:"turn.manage",logView:"log.view"};Object.values(a);let r={"session.view":"View sessions","session.delete":"Delete sessions","admin.view":"View admins","admin.manage":"Create/edit admins","mode.view":"View modes","mode.manage":"Create/edit modes","ota.view":"View OTA updates","ota.manage":"Manage OTA updates","turn.view":"View TURN keys","turn.manage":"Manage TURN keys","log.view":"View login audit"},n=[{label:"Sessions",keys:["session.view","session.delete"]},{label:"Admins",keys:["admin.view","admin.manage"]},{label:"Modes",keys:["mode.view","mode.manage"]},{label:"OTA & TURN",keys:["ota.view","ota.manage","turn.view","turn.manage"]},{label:"Audit",keys:["log.view"]}],l=18e5,i=20,d=[10,20,50,100],c=["createdAt","lastAccessAt","expiresAt","machineId"],o=[{key:"loyal",label:"Loyal",minMs:6048e5,color:"text-success"},{key:"returning",label:"Returning",minMs:864e5,color:"text-brand-500"},{key:"active",label:"Active",minMs:3e5,color:"text-brand-400"},{key:"new",label:"New",minMs:0,color:"text-text-muted"}],x={login:"/api/admin/login",logout:"/api/admin/logout",me:"/api/admin/me",sessions:"/api/admin/sessions",stats:"/api/admin/stats",modes:"/api/admin/modes",admins:"/api/admin/admins",ota:"/api/admin/ota",turn:"/api/admin/turn",logins:"/api/admin/logins",turnstile:"/api/admin/turnstile"}},59893:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});var a=s(73365);function r({children:e,centered:t=!0,className:s=""}){return(0,a.jsx)("div",{className:`min-h-screen ${t?"flex items-center justify-center p-4":""} ${s}`,children:e})}},62554:(e,t,s)=>{Promise.resolve().then(s.bind(s,52840))}},e=>{e.O(0,[6669,9568,8922,9871,2347,5158,7358],()=>e(e.s=62554)),_N_E=e.O()}]);
@@ -0,0 +1,5 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3698],{24945:(e,t,s)=>{"use strict";s.d(t,{b:()=>i});var a=s(1521),l=s(29717),r=s(57042),n=s(39457);function i({redirectIfUnauthed:e=!0}={}){let t=(0,l.useRouter)(),{get:s,post:c}=(0,n.Z)(),[d,o]=(0,a.useState)(null),[x,m]=(0,a.useState)(!0),u=(0,a.useCallback)(async()=>{try{let e=await s(r.lb.me);o(e)}catch{o(null),e&&t.replace("/admin/login")}finally{m(!1)}},[s,e,t]);(0,a.useEffect)(()=>{u()},[u]);let b=(0,a.useCallback)(async()=>{await c(r.lb.logout,{}),t.replace("/admin/login")},[c,t]),h=(0,a.useCallback)(e=>Array.isArray(d?.permissions)&&d.permissions.includes(e),[d]);return{me:d,loading:x,logout:b,can:h,refresh:u}}},29479:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>j});var a=s(73365),l=s(1521),r=s(38334),n=s(64683);let i=[{key:"total",label:"Total",icon:n.BK,color:"text-text",iconColor:"text-text-muted bg-surface-2"},{key:"online",label:"Online (30m)",icon:n.Kq,color:"text-success",iconColor:"text-success bg-emerald-500/10",pulse:!0},{key:"newToday",label:"New (24h)",icon:n.sU,color:"text-brand-500",iconColor:"text-brand-500 bg-brand-500/10"},{key:"retention7d",label:"Retention 7d",icon:n.BZ,color:"text-text",iconColor:"text-text-muted bg-surface-2",suffix:"%"},{key:"stickiness",label:"Stickiness",icon:n.FE,color:"text-amber-500",iconColor:"text-amber-500 bg-amber-500/10",suffix:"%"},{key:"avgLifespanDays",label:"Avg Lifespan",icon:n.kt,color:"text-text",iconColor:"text-text-muted bg-surface-2",suffix:"d"}];function c({stats:e}){return(0,a.jsx)("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3 sm:gap-4",children:i.map(t=>{let s=t.icon,l=e?.[t.key];return(0,a.jsxs)("div",{className:"card-glass p-4 relative overflow-hidden",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("span",{className:"text-[11px] font-mono tracking-wider uppercase text-text-muted truncate",children:t.label}),(0,a.jsx)("div",{className:`w-7 h-7 rounded-lg flex items-center justify-center ${t.iconColor}`,children:(0,a.jsx)(s,{size:14})})]}),(0,a.jsxs)("div",{className:"flex items-baseline gap-1.5 mt-1",children:[(0,a.jsx)("div",{className:`text-xl sm:text-2xl font-bold tracking-tight font-mono ${t.color}`,children:l??"-"}),null!=l&&t.suffix&&(0,a.jsx)("span",{className:"text-xs font-mono text-text-subtle font-semibold",children:t.suffix})]}),t.pulse&&(0,a.jsxs)("div",{className:"absolute bottom-2 right-2 flex items-center gap-1.5",children:[(0,a.jsxs)("span",{className:"relative flex h-2 w-2",children:[(0,a.jsx)("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75"}),(0,a.jsx)("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-emerald-500"})]}),(0,a.jsx)("span",{className:"text-[10px] font-mono text-emerald-500 font-medium",children:"live"})]})]},t.key)})})}var d=s(57042);let o=[{key:"machineId",label:"Machine ID",sortable:!0},{key:"publicIp",label:"Public IP",sortable:!1},{key:"localIp",label:"Local IP",sortable:!1},{key:"createdAt",label:"Created",sortable:!0},{key:"lastAccessAt",label:"Last Access",sortable:!0},{key:"expiresAt",label:"Expires",sortable:!0}],x=o.filter(e=>e.sortable);function m(e){let t=e?.lastAccessAt||e?.createdAt;return!!t&&Date.now()-new Date(t+"Z").getTime()<d.Qh}function u(e){if(!e)return"-";try{return new Date(e+"Z").toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}function b({session:e}){let{tier:t,ageMs:s}=function(e){let t={tier:d.rK[d.rK.length-1],ageMs:null};if(!e?.createdAt||!e?.lastAccessAt)return t;let s=new Date(e.lastAccessAt+"Z").getTime()-new Date(e.createdAt+"Z").getTime();return{tier:d.rK.find(e=>s>=e.minMs)||t.tier,ageMs:s}}(e),l="loyal"===t.key?"bg-emerald-500/10 text-emerald-500 border-emerald-500/20":"returning"===t.key?"bg-brand-500/10 text-brand-500 border-brand-500/20":"active"===t.key?"bg-amber-500/10 text-amber-500 border-amber-500/20":"bg-surface-2 text-text-muted border-border-subtle";return(0,a.jsxs)("div",{className:"inline-flex items-center gap-1.5",children:[(0,a.jsx)("span",{className:`px-2 py-0.5 rounded-full text-[11px] font-medium border ${l}`,children:t.label}),null!=s&&(0,a.jsx)("span",{className:"text-text-subtle text-[11px] font-mono",children:function(e){if(null==e||e<0)return"-";let t=Math.floor(e/6e4);if(t<1)return"<1m";let s=Math.floor(t/1440),a=Math.floor(t%1440/60),l=t%60;return s>0?`${s}d ${a}h`:a>0?`${a}h ${l}m`:`${l}m`}(s)})]})}function h({items:e,sortBy:t,order:s,onSortChange:l,onDelete:r,canDelete:i}){return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"md:hidden flex items-center justify-between mb-3 text-xs",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Sort by:"}),(0,a.jsx)("select",{value:t,onChange:e=>l(e.target.value,s),className:"bg-surface-2 border border-border-subtle rounded-lg px-2.5 py-1.5 text-text focus:outline-none",children:x.map(e=>(0,a.jsx)("option",{value:e.key,children:e.label},e.key))})]}),(0,a.jsxs)("button",{onClick:()=>l(t,"asc"===s?"desc":"asc"),className:"flex items-center gap-1 bg-surface-2 hover:bg-surface-3 border border-border-subtle rounded-lg px-2.5 py-1.5 text-text transition-colors","aria-label":"Toggle order",children:[(0,a.jsx)("span",{className:"font-mono uppercase",children:s}),"asc"===s?(0,a.jsx)(n.Do,{size:13}):(0,a.jsx)(n.yd,{size:13})]})]}),(0,a.jsxs)("div",{className:"md:hidden space-y-3",children:[0===e.length&&(0,a.jsxs)("div",{className:"card-glass p-8 text-center text-text-muted flex flex-col items-center justify-center",children:[(0,a.jsx)(n.BK,{size:24,className:"mb-2 text-text-subtle"}),(0,a.jsx)("p",{className:"text-sm",children:"No active sessions found"})]}),e.map(e=>{let t=m(e);return(0,a.jsxs)("div",{className:"card-glass overflow-hidden text-sm",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between px-3.5 py-2.5 bg-surface-2/60 border-b border-border-subtle",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,a.jsx)("span",{className:"relative flex h-2 w-2",children:t?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75"}),(0,a.jsx)("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-emerald-500"})]}):(0,a.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-neutral-500/40"})}),(0,a.jsx)("span",{className:"font-mono text-xs font-semibold tracking-tight text-text truncate",children:e.machineId})]}),i&&(0,a.jsx)("button",{onClick:()=>r(e.machineId),className:"text-text-muted hover:text-danger p-1 rounded hover:bg-red-500/10 transition-colors",title:"Delete session",children:(0,a.jsx)(n.TB,{size:15})})]}),(0,a.jsxs)("div",{className:"p-3.5 space-y-2 text-xs",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Loyalty"}),(0,a.jsx)(b,{session:e})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-2 pt-1 border-t border-border-subtle/40",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-[10px] uppercase font-mono text-text-subtle block",children:"Public IP"}),(0,a.jsx)("span",{className:"font-mono text-text truncate block",children:e.publicIp||"-"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-[10px] uppercase font-mono text-text-subtle block",children:"Local IP"}),(0,a.jsx)("span",{className:"font-mono text-text truncate block",children:e.localIp||"-"})]})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-2 pt-1 border-t border-border-subtle/40 text-[11px] text-text-muted",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-subtle block",children:"Created"}),(0,a.jsx)("span",{children:u(e.createdAt)})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-subtle block",children:"Last Access"}),(0,a.jsx)("span",{className:"text-text",children:u(e.lastAccessAt)})]})]})]})]},e.machineId)})]}),(0,a.jsx)("div",{className:"hidden md:block card-glass overflow-hidden",children:(0,a.jsxs)("table",{className:"w-full text-sm text-left",children:[(0,a.jsx)("thead",{className:"bg-surface-2/60 border-b border-border-subtle text-[11px] font-mono uppercase tracking-wider text-text-muted",children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{className:"px-4 py-3 w-12 text-center",children:"Live"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Loyalty"}),o.map(e=>(0,a.jsx)("th",{onClick:()=>{var a;return e.sortable&&(a=e.key,void(d.GS.includes(a)&&(t===a?l(a,"asc"===s?"desc":"asc"):l(a,"desc"))))},className:`px-4 py-3 ${e.sortable?"cursor-pointer hover:text-text select-none group":""}`,children:(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[e.label,e.sortable&&(0,a.jsx)("span",{className:t===e.key?"text-brand-500":"text-text-subtle opacity-40 group-hover:opacity-100",children:t===e.key&&"asc"===s?(0,a.jsx)(n.Do,{size:12}):(0,a.jsx)(n.yd,{size:12})})]})},e.key)),i&&(0,a.jsx)("th",{className:"px-4 py-3 text-right",children:"Action"})]})}),(0,a.jsxs)("tbody",{className:"divide-y divide-border-subtle/50",children:[0===e.length&&(0,a.jsx)("tr",{children:(0,a.jsxs)("td",{colSpan:o.length+3,className:"px-4 py-12 text-center text-text-muted",children:[(0,a.jsx)(n.BK,{size:28,className:"mx-auto mb-2 text-text-subtle"}),(0,a.jsx)("p",{children:"No active sessions found"})]})}),e.map(e=>{let t=m(e);return(0,a.jsxs)("tr",{className:"hover:bg-surface-2/40 transition-colors",children:[(0,a.jsx)("td",{className:"px-4 py-3 text-center",children:(0,a.jsx)("span",{className:"relative inline-flex h-2 w-2",children:t?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75"}),(0,a.jsx)("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-emerald-500"})]}):(0,a.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-neutral-500/40"})})}),(0,a.jsx)("td",{className:"px-4 py-3",children:(0,a.jsx)(b,{session:e})}),(0,a.jsx)("td",{className:"px-4 py-3 font-mono text-xs font-medium text-text",children:e.machineId}),(0,a.jsx)("td",{className:"px-4 py-3 font-mono text-xs text-text-muted",children:e.publicIp||"-"}),(0,a.jsx)("td",{className:"px-4 py-3 font-mono text-xs text-text-muted",children:e.localIp||"-"}),(0,a.jsx)("td",{className:"px-4 py-3 text-xs text-text-muted",children:u(e.createdAt)}),(0,a.jsx)("td",{className:"px-4 py-3 text-xs text-text font-medium",children:u(e.lastAccessAt)}),(0,a.jsx)("td",{className:"px-4 py-3 text-xs text-text-muted",children:u(e.expiresAt)}),i&&(0,a.jsx)("td",{className:"px-4 py-3 text-right",children:(0,a.jsx)("button",{onClick:()=>r(e.machineId),className:"text-text-muted hover:text-danger p-1.5 rounded-lg hover:bg-red-500/10 transition-colors",title:"Delete session",children:(0,a.jsx)(n.TB,{size:15})})})]},e.machineId)})]})]})})]})}function p({page:e,pageSize:t,total:s,onPageChange:l,onPageSizeChange:r}){let i=Math.max(1,Math.ceil(s/t));return(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3 mt-4 text-xs text-text-muted",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1.5 font-mono",children:[(0,a.jsx)("span",{children:"Total:"}),(0,a.jsx)("span",{className:"text-text font-semibold px-1.5 py-0.5 rounded bg-surface-2 border border-border-subtle",children:s})]}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsx)("select",{value:t,onChange:e=>r(parseInt(e.target.value,10)),className:"bg-surface-2 border border-border-subtle rounded-lg px-2.5 py-1 text-text text-xs focus:outline-none",children:d.xp.map(e=>(0,a.jsxs)("option",{value:e,children:[e," / page"]},e))}),(0,a.jsxs)("div",{className:"flex items-center gap-1",children:[(0,a.jsx)("button",{onClick:()=>l(Math.max(1,e-1)),disabled:e<=1,className:"p-1.5 rounded-lg bg-surface-2 hover:bg-surface-3 border border-border-subtle text-text disabled:opacity-30 disabled:cursor-not-allowed transition-colors","aria-label":"Previous page",children:(0,a.jsx)(n.JG,{size:14})}),(0,a.jsxs)("span",{className:"px-2.5 py-1 font-mono text-xs text-text",children:[e," / ",i]}),(0,a.jsx)("button",{onClick:()=>l(Math.min(i,e+1)),disabled:e>=i,className:"p-1.5 rounded-lg bg-surface-2 hover:bg-surface-3 border border-border-subtle text-text disabled:opacity-30 disabled:cursor-not-allowed transition-colors","aria-label":"Next page",children:(0,a.jsx)(n.c_,{size:14})})]})]})]})}var f=s(39457),g=s(24945);function j(){let{can:e,me:t,loading:s}=(0,g.b)(),{get:i,del:o}=(0,f.Z)(),[x,m]=(0,l.useState)(null),[u,b]=(0,l.useState)([]),[j,N]=(0,l.useState)(0),[v,y]=(0,l.useState)(""),[w,k]=(0,l.useState)("lastAccessAt"),[A,C]=(0,l.useState)("desc"),[S,z]=(0,l.useState)(1),[I,P]=(0,l.useState)(d.Wm),[M,T]=(0,l.useState)(!1),D=(0,l.useCallback)(async()=>{T(!0);try{let e=new URLSearchParams({search:v,sortBy:w,order:A,page:String(S),pageSize:String(I)}),[t,s]=await Promise.all([i(`${d.lb.sessions}?${e.toString()}`),i(d.lb.stats)]);b(t.items||[]),N(t.total||0),m(s)}catch(e){console.error(e)}finally{T(!1)}},[i,v,w,A,S,I]);(0,l.useEffect)(()=>{!s&&t&&D()},[s,t,D]);let $=async e=>{confirm(`Delete session ${e}?`)&&(await o(`${d.lb.sessions}/${e}`),D())};return(0,a.jsx)(r.A,{children:(0,a.jsxs)("div",{className:"space-y-8",children:[(0,a.jsxs)("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"text-xl font-bold tracking-tight text-text",children:"System Overview"}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-1",children:"Real-time telemetry and active host instances"})]}),(0,a.jsxs)("button",{onClick:D,disabled:M,className:"self-start sm:self-auto inline-flex items-center gap-2 px-3.5 py-1.5 rounded-xl bg-surface-2 hover:bg-surface-3 border border-border-subtle text-xs font-medium text-text transition-colors disabled:opacity-50",children:[(0,a.jsx)(n.e9,{size:13,className:M?"animate-spin text-brand-500":""}),(0,a.jsx)("span",{children:"Refresh"})]})]}),(0,a.jsx)("section",{children:(0,a.jsx)(c,{stats:x})}),(0,a.jsxs)("section",{className:"space-y-4",children:[(0,a.jsxs)("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-base font-bold tracking-tight text-text",children:"User Activity"}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"Connected and registered client sessions"})]}),(0,a.jsxs)("div",{className:"relative w-full sm:w-80",children:[(0,a.jsx)(n.vj,{size:15,className:"absolute left-3.5 top-1/2 -translate-y-1/2 text-text-muted"}),(0,a.jsx)("input",{value:v,onChange:e=>{y(e.target.value),z(1)},placeholder:"Search machineId, IP address...",className:"w-full pl-9 pr-3.5 py-2 bg-surface-2/80 border border-border-subtle rounded-xl text-text text-xs placeholder:text-text-subtle focus:outline-none focus:ring-2 focus:ring-brand-500/30 focus:border-brand-500/40 transition-all font-mono"})]})]}),(0,a.jsx)(h,{items:u,sortBy:w,order:A,onSortChange:(e,t)=>{k(e),C(t),z(1)},onDelete:$,canDelete:e(d.Jj.sessionDelete)}),(0,a.jsx)(p,{page:S,pageSize:I,total:j,onPageChange:z,onPageSizeChange:e=>{P(e),z(1)}})]})]})})}},29717:(e,t,s)=>{"use strict";var a=s(21505);s.o(a,"usePathname")&&s.d(t,{usePathname:function(){return a.usePathname}}),s.o(a,"useRouter")&&s.d(t,{useRouter:function(){return a.useRouter}}),s.o(a,"useSearchParams")&&s.d(t,{useSearchParams:function(){return a.useSearchParams}})},38334:(e,t,s)=>{"use strict";s.d(t,{A:()=>h});var a=s(73365),l=s(28913),r=s(1521),n=s(99568),i=s(29717),c=s(45111),d=s(59893),o=s(90753),x=s(30240),m=s(64683),u=s(24945);let b=[{href:"/admin",label:"Dashboard",icon:m.Hx,exact:!0},{href:"/admin/access",label:"Access",icon:m.zW},{href:"/admin/ota",label:"OTA Updates",icon:m.lP,needsOta:!0},{href:"/admin/turn",label:"TURN Keys",icon:m.kV}];function h({children:e}){let t=(0,i.usePathname)(),{me:s,loading:p,logout:f}=(0,u.b)(),[g,j]=(0,r.useState)(!1);if(p||!s)return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(x.A,{}),(0,a.jsx)(d.A,{children:(0,a.jsx)("div",{className:"card-glass p-8 max-w-sm w-full flex flex-col items-center justify-center",children:(0,a.jsx)(c.A,{size:"lg",text:"Loading admin..."})})})]});let N=(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"p-4 border-b border-border-subtle flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2.5 min-w-0",children:[(0,a.jsx)("div",{className:"w-6 h-6 shrink-0 rounded-md flex items-center justify-center font-bold text-sm bg-brand-500 text-white",children:"9"}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("h1",{className:"text-sm font-bold tracking-tight text-text truncate",children:"9Remote Admin"}),(0,a.jsxs)("div",{className:"flex items-center gap-1.5 mt-0.5",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted truncate",children:s.username}),(0,a.jsx)("span",{className:"text-[10px] font-mono px-1.5 py-0.5 rounded-full bg-surface-2 text-text-muted border border-border-subtle",children:s.modeName||s.modeId})]})]})]}),(0,a.jsx)("button",{onClick:()=>j(!1),className:"md:hidden p-1.5 -mr-1.5 text-text-muted hover:text-text rounded-[6px] hover:bg-surface-2 transition-colors","aria-label":"Close menu",children:(0,a.jsx)(m.X,{size:18})})]}),(0,a.jsxs)("nav",{className:"flex-1 px-3.5 py-3 space-y-0.5 overflow-y-auto",children:[(0,a.jsx)("div",{className:"pl-[3.5px] py-1.5 text-[10px] font-mono uppercase tracking-wider text-text-subtle",children:"Navigation"}),b.filter(e=>!e.needsOta||s.otaEnabled).map(e=>{let s=e.icon,l=e.exact?t===e.href:t.startsWith(e.href);return(0,a.jsxs)(n,{href:e.href,onClick:()=>j(!1),className:`
2
+ flex items-center gap-2.5 -ml-3.5 w-[calc(100%+0.875rem)] pl-[17px] pr-3 py-1.5
3
+ rounded-[6px] text-xs font-medium text-left transition-colors duration-150
4
+ ${l?"bg-surface-3 text-text font-semibold":"text-text-muted hover:bg-surface-2 hover:text-text"}
5
+ `,children:[(0,a.jsx)(s,{size:15,className:l?"text-text":"text-text-subtle"}),(0,a.jsx)("span",{className:"flex-1",children:e.label}),l&&(0,a.jsx)("span",{className:"w-1 h-1 rounded-full bg-text-muted"})]},e.href)})]}),(0,a.jsx)("div",{className:"p-3.5 border-t border-border-subtle",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(o.A,{className:"border border-border-subtle hover:bg-surface-2 rounded-[6px]"}),(0,a.jsxs)("button",{onClick:f,className:"flex-1 flex items-center justify-center gap-2 px-3 py-1.5 rounded-[6px] text-xs font-medium text-text-muted hover:bg-red-500/10 hover:text-danger transition-colors",children:[(0,a.jsx)(m.nU,{size:15}),"Logout"]})]})})]});return(0,a.jsxs)("div",{className:"jsx-b56c084163c9c8c1 min-h-screen text-text relative selection:bg-brand-500/20",children:[(0,a.jsx)(x.A,{}),(0,a.jsxs)("header",{className:"jsx-b56c084163c9c8c1 md:hidden sticky top-0 z-30 flex items-center justify-between px-4 py-2.5 bg-surface/80 backdrop-blur-md border-b border-border-subtle",children:[(0,a.jsx)("button",{onClick:()=>j(!0),"aria-label":"Open menu",className:"jsx-b56c084163c9c8c1 p-1.5 -ml-1.5 text-text-muted hover:text-text rounded-[6px] hover:bg-surface-2",children:(0,a.jsx)(m.W1,{size:20})}),(0,a.jsxs)("div",{className:"jsx-b56c084163c9c8c1 flex items-center gap-2",children:[(0,a.jsx)("div",{className:"jsx-b56c084163c9c8c1 w-6 h-6 rounded-md flex items-center justify-center font-bold text-xs bg-brand-500 text-white",children:"9"}),(0,a.jsx)("h1",{className:"jsx-b56c084163c9c8c1 text-sm font-semibold tracking-tight",children:"9Remote Admin"})]}),(0,a.jsx)(o.A,{className:"rounded-[6px]"})]}),(0,a.jsx)("aside",{className:"jsx-b56c084163c9c8c1 hidden md:flex fixed inset-y-0 left-0 w-60 border-r border-border-subtle bg-surface/80 backdrop-blur-xl flex-col z-20",children:N}),g&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{onClick:()=>j(!1),className:"jsx-b56c084163c9c8c1 md:hidden fixed inset-0 z-40 bg-black/60 backdrop-blur-[2px] fade-in"}),(0,a.jsx)("aside",{style:{animation:"slideInFromLeft 0.22s cubic-bezier(0.22, 1, 0.36, 1) forwards"},className:"jsx-b56c084163c9c8c1 md:hidden fixed inset-y-0 left-0 z-50 w-72 max-w-[85%] bg-surface/95 backdrop-blur-2xl border-r border-border-subtle flex flex-col slide-in-right",children:N})]}),(0,a.jsx)("main",{className:"jsx-b56c084163c9c8c1 md:ml-60 p-4 sm:p-6 lg:p-8 min-h-screen relative z-10 max-w-7xl",children:e}),(0,a.jsx)(l,{id:"b56c084163c9c8c1",children:"@keyframes slideInFromLeft{from{transform:translatex(-100%);opacity:0}to{transform:translatex(0);opacity:1}}"})]})}},39457:(e,t,s)=>{"use strict";s.d(t,{Z:()=>r});var a=s(1521);async function l(e,t={}){let s=await fetch(e,{...t,headers:{"Content-Type":"application/json",...t.headers||{}},credentials:"include"}),a=await s.json().catch(()=>({}));if(!s.ok)throw Error(a?.error||`Request failed (${s.status})`);return a}function r(){let e=(0,a.useCallback)(e=>l(e),[]),t=(0,a.useCallback)((e,t)=>l(e,{method:"POST",body:JSON.stringify(t||{})}),[]);return{get:e,post:t,patch:(0,a.useCallback)((e,t)=>l(e,{method:"PATCH",body:JSON.stringify(t||{})}),[]),del:(0,a.useCallback)(e=>l(e,{method:"DELETE"}),[])}}},42761:(e,t,s)=>{Promise.resolve().then(s.bind(s,29479))},45111:(e,t,s)=>{"use strict";s.d(t,{A:()=>l});var a=s(73365);function l({size:e="md",text:t,className:s=""}){return(0,a.jsxs)("div",{className:`flex flex-col items-center justify-center gap-3 ${s}`,children:[(0,a.jsx)("div",{className:`animate-spin rounded-full border-brand-500 border-t-transparent ${{sm:"h-4 w-4 border-2",md:"h-8 w-8 border-2",lg:"h-12 w-12 border-b-2"}[e]}`}),t&&(0,a.jsx)("p",{className:"text-brand-500 text-sm font-medium",children:t})]})}},57042:(e,t,s)=>{"use strict";s.d(t,{GS:()=>d,Jj:()=>a,Qh:()=>n,WD:()=>l,Wm:()=>i,lb:()=>x,rK:()=>o,vq:()=>r,xp:()=>c});let a={sessionView:"session.view",sessionDelete:"session.delete",modeView:"mode.view",modeManage:"mode.manage",adminView:"admin.view",adminManage:"admin.manage",otaView:"ota.view",otaManage:"ota.manage",turnView:"turn.view",turnManage:"turn.manage",logView:"log.view"};Object.values(a);let l={"session.view":"View sessions","session.delete":"Delete sessions","admin.view":"View admins","admin.manage":"Create/edit admins","mode.view":"View modes","mode.manage":"Create/edit modes","ota.view":"View OTA updates","ota.manage":"Manage OTA updates","turn.view":"View TURN keys","turn.manage":"Manage TURN keys","log.view":"View login audit"},r=[{label:"Sessions",keys:["session.view","session.delete"]},{label:"Admins",keys:["admin.view","admin.manage"]},{label:"Modes",keys:["mode.view","mode.manage"]},{label:"OTA & TURN",keys:["ota.view","ota.manage","turn.view","turn.manage"]},{label:"Audit",keys:["log.view"]}],n=18e5,i=20,c=[10,20,50,100],d=["createdAt","lastAccessAt","expiresAt","machineId"],o=[{key:"loyal",label:"Loyal",minMs:6048e5,color:"text-success"},{key:"returning",label:"Returning",minMs:864e5,color:"text-brand-500"},{key:"active",label:"Active",minMs:3e5,color:"text-brand-400"},{key:"new",label:"New",minMs:0,color:"text-text-muted"}],x={login:"/api/admin/login",logout:"/api/admin/logout",me:"/api/admin/me",sessions:"/api/admin/sessions",stats:"/api/admin/stats",modes:"/api/admin/modes",admins:"/api/admin/admins",ota:"/api/admin/ota",turn:"/api/admin/turn",logins:"/api/admin/logins",turnstile:"/api/admin/turnstile"}},59893:(e,t,s)=>{"use strict";s.d(t,{A:()=>l});var a=s(73365);function l({children:e,centered:t=!0,className:s=""}){return(0,a.jsx)("div",{className:`min-h-screen ${t?"flex items-center justify-center p-4":""} ${s}`,children:e})}}},e=>{e.O(0,[6669,9568,8922,9871,2347,5158,7358],()=>e(e.s=42761)),_N_E=e.O()}]);
@@ -0,0 +1,5 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[540],{7116:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>b});var a=s(73365),r=s(1521),l=s(38334),n=s(80186),d=s(96042),i=s(64683),c=s(39457),o=s(24945),x=s(57042);let m={keyId:"",secret:"",label:"",scope:"both"},u=["both","dev","prod"];function b(){let{can:e,me:t,loading:s}=(0,o.b)(),{get:b,post:h,patch:p,del:f}=(0,c.Z)(),[g,j]=(0,r.useState)([]),[y,N]=(0,r.useState)(m),[v,w]=(0,r.useState)(!0),[k,C]=(0,r.useState)(!1),[A,S]=(0,r.useState)(""),[T,z]=(0,r.useState)(null),R=e(x.Jj.turnManage),$=(0,r.useCallback)(async()=>{w(!0);try{let e=await b(x.lb.turn);j(e.items||[])}catch(e){S(e.message)}finally{w(!1)}},[b]);(0,r.useEffect)(()=>{!s&&t&&$()},[s,t,$]);let U=async()=>{S(""),C(!0),z(null);try{await h(x.lb.turn,y),z(y.secret),N(m),await $()}catch(e){S(e.message)}finally{C(!1)}},V=async e=>{try{await p(`${x.lb.turn}/${e.id}`,{enabled:!e.enabled}),$()}catch(e){S(e.message)}},D=async(e,t)=>{try{await p(`${x.lb.turn}/${e.id}`,{scope:t}),$()}catch(e){S(e.message)}},O=async e=>{if(confirm("Delete this TURN key? Clients using it fall back to STUN-only."))try{await f(`${x.lb.turn}/${e}`),$()}catch(e){S(e.message)}};return(0,a.jsx)(l.A,{children:(0,a.jsxs)("div",{className:"space-y-8 max-w-5xl",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("h1",{className:"text-2xl font-bold tracking-tight text-text login-hero-grad flex items-center gap-2.5",children:[(0,a.jsx)(i.kV,{size:24,className:"text-brand-500"}),(0,a.jsx)("span",{children:"TURN Keys"})]}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-1",children:"Rotate Cloudflare TURN credentials for cross-network WebRTC relay"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("a",{href:"https://dash.cloudflare.com/?to=/:account/realtime/turn",target:"_blank",rel:"noreferrer noopener",className:"inline-flex items-center gap-2 px-3.5 py-1.5 rounded-xl bg-brand-500 hover:bg-brand-600 text-white text-xs font-semibold transition-colors shadow-[0_4px_12px_-4px_rgba(255,87,10,0.5)]",children:[(0,a.jsx)(i.Gr,{size:13}),(0,a.jsx)("span",{children:"Create on Cloudflare"})]}),(0,a.jsxs)("button",{onClick:$,disabled:v,className:"inline-flex items-center gap-2 px-3.5 py-1.5 rounded-xl bg-surface-2 hover:bg-surface-3 border border-border-subtle text-xs font-medium text-text transition-colors disabled:opacity-50",children:[(0,a.jsx)(i.e9,{size:13,className:v?"animate-spin text-brand-500":""}),(0,a.jsx)("span",{children:"Refresh"})]})]})]}),(0,a.jsx)("p",{className:"text-xs text-text-muted bg-surface-2/60 border border-border-subtle rounded-xl p-3",children:"Up to 1,000 keys. 1,000 GB/month free per Cloudflare account (shared with SFU) — more keys do not add quota."}),A&&(0,a.jsx)("p",{className:"text-xs text-danger bg-red-500/10 p-3 rounded-xl border border-red-500/20",children:A}),T&&(0,a.jsxs)("div",{className:"card-glass p-4 space-y-2 border border-brand-500/30",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsx)("span",{className:"text-xs font-semibold text-text",children:"Key added — secret stored. Copy it if you need it elsewhere:"}),(0,a.jsx)("button",{onClick:()=>z(null),className:"text-text-muted hover:text-text",children:(0,a.jsx)(i.X,{size:14})})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("code",{className:"flex-1 text-[11px] font-mono text-text-muted bg-surface-2 rounded-lg px-3 py-2 break-all",children:T}),(0,a.jsx)("button",{onClick:()=>navigator.clipboard?.writeText(T),className:"p-2 rounded-lg bg-surface-2 hover:bg-surface-3 text-text-muted hover:text-text transition-colors","aria-label":"Copy secret",children:(0,a.jsx)(i.QR,{size:14})})]})]}),R&&(0,a.jsxs)("div",{className:"card-glass p-5 sm:p-6 space-y-4",children:[(0,a.jsxs)("h2",{className:"text-sm font-semibold tracking-tight text-text flex items-center gap-2 border-b border-border-subtle/60 pb-3",children:[(0,a.jsx)(i.FW,{size:16,className:"text-brand-500"}),(0,a.jsx)("span",{children:"Add TURN Key"})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[(0,a.jsx)(d.A,{label:"Key ID",value:y.keyId,onChange:e=>N({...y,keyId:e.target.value.trim()}),placeholder:"32-char hex from Cloudflare dashboard"}),(0,a.jsx)(d.A,{label:"API Token / Secret",type:"password",value:y.secret,onChange:e=>N({...y,secret:e.target.value.trim()}),placeholder:"Bearer secret"}),(0,a.jsx)(d.A,{label:"Label",value:y.label,onChange:e=>N({...y,label:e.target.value}),placeholder:"e.g. acc-1 (which Cloudflare account)"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-xs font-mono uppercase tracking-wider text-text-muted mb-1.5",children:"Scope"}),(0,a.jsx)("select",{className:"w-full px-3 py-2 text-xs border border-border-subtle rounded-xl bg-surface-2/80 text-text focus:outline-none focus:ring-2 focus:ring-brand-500/30",value:y.scope,onChange:e=>N({...y,scope:e.target.value}),children:u.map(e=>(0,a.jsx)("option",{value:e,children:e},e))})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)(n.A,{onClick:U,disabled:k||!y.keyId||!y.secret,children:k?"Validating with Cloudflare...":"Add Key"}),(0,a.jsxs)("span",{className:"text-xs text-text-muted",children:["Scope ",(0,a.jsx)("span",{className:"font-mono",children:"dev"})," = credentials for pages on dev.9remote.cc only."]})]})]}),v?(0,a.jsxs)("div",{className:"card-glass p-12 text-center text-text-muted text-xs",children:[(0,a.jsx)(i.e9,{size:20,className:"mx-auto mb-2 animate-spin text-brand-500"}),"Loading keys..."]}):0===g.length?(0,a.jsxs)("div",{className:"card-glass p-12 text-center",children:[(0,a.jsx)("div",{className:"w-12 h-12 rounded-2xl bg-surface-2 flex items-center justify-center mx-auto mb-3 text-text-subtle",children:(0,a.jsx)(i.kV,{size:24})}),(0,a.jsx)("h3",{className:"text-sm font-semibold text-text",children:"No TURN keys configured"}),(0,a.jsxs)("p",{className:"text-text-muted text-xs mt-1",children:["Clients fall back to the deployed ",(0,a.jsx)("code",{className:"font-mono text-brand-500",children:"TURN_KEY_ID"})," secret, or STUN-only if that is gone."]})]}):(0,a.jsx)("div",{className:"card-glass overflow-x-auto",children:(0,a.jsxs)("table",{className:"w-full text-sm text-left",children:[(0,a.jsx)("thead",{className:"bg-surface-2/60 border-b border-border-subtle text-[11px] font-mono uppercase tracking-wider text-text-muted",children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{className:"px-4 py-3",children:"Key"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Scope"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Last Used"}),(0,a.jsx)("th",{className:"px-4 py-3",children:"Status"}),R&&(0,a.jsx)("th",{className:"px-4 py-3 text-right",children:"Actions"})]})}),(0,a.jsx)("tbody",{className:"divide-y divide-border-subtle/50",children:g.map(e=>(0,a.jsxs)("tr",{className:"hover:bg-surface-2/40 transition-colors",children:[(0,a.jsxs)("td",{className:"px-4 py-3.5",children:[(0,a.jsxs)("div",{className:"font-mono text-xs text-text",children:[e.keyId.slice(0,12),"…"]}),(0,a.jsxs)("div",{className:"text-[10px] text-text-subtle font-mono mt-0.5",children:[e.label||"(no label)"," \xb7 secret ",e.secretTail]})]}),(0,a.jsx)("td",{className:"px-4 py-3.5",children:R?(0,a.jsx)("select",{className:"px-2 py-1 text-[11px] font-mono border border-border-subtle rounded-lg bg-surface-2/80 text-text focus:outline-none",value:e.scope,onChange:t=>D(e,t.target.value),children:u.map(e=>(0,a.jsx)("option",{value:e,children:e},e))}):(0,a.jsx)("span",{className:"px-2 py-0.5 rounded-full text-xs font-mono bg-surface-2 border border-border-subtle text-text",children:e.scope})}),(0,a.jsx)("td",{className:"px-4 py-3.5 text-xs text-text-muted font-mono",children:(e=>{if(!e)return"never";try{return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}})(e.lastUsedAt)}),(0,a.jsx)("td",{className:"px-4 py-3.5",children:e.enabled?(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-500 border border-emerald-500/20",children:[(0,a.jsx)(i.aJ,{size:13}),(0,a.jsx)("span",{children:"Active"})]}):(0,a.jsx)("span",{className:"text-xs font-mono text-text-subtle px-2 py-0.5 rounded bg-surface-2",children:"Disabled"})}),R&&(0,a.jsxs)("td",{className:"px-4 py-3.5 text-right whitespace-nowrap",children:[(0,a.jsx)("button",{onClick:()=>V(e),className:"text-xs font-semibold text-brand-500 hover:text-brand-400 px-2.5 py-1 rounded-lg hover:bg-brand-500/10 transition-colors",children:e.enabled?"Disable":"Enable"}),(0,a.jsx)("button",{onClick:()=>O(e.id),className:"ml-1 p-1.5 rounded-lg text-text-muted hover:text-danger hover:bg-red-500/10 transition-colors","aria-label":"Delete key",children:(0,a.jsx)(i.TB,{size:14})})]})]},e.id))})]})})]})})}},24945:(e,t,s)=>{"use strict";s.d(t,{b:()=>d});var a=s(1521),r=s(29717),l=s(57042),n=s(39457);function d({redirectIfUnauthed:e=!0}={}){let t=(0,r.useRouter)(),{get:s,post:i}=(0,n.Z)(),[c,o]=(0,a.useState)(null),[x,m]=(0,a.useState)(!0),u=(0,a.useCallback)(async()=>{try{let e=await s(l.lb.me);o(e)}catch{o(null),e&&t.replace("/admin/login")}finally{m(!1)}},[s,e,t]);(0,a.useEffect)(()=>{u()},[u]);let b=(0,a.useCallback)(async()=>{await i(l.lb.logout,{}),t.replace("/admin/login")},[i,t]),h=(0,a.useCallback)(e=>Array.isArray(c?.permissions)&&c.permissions.includes(e),[c]);return{me:c,loading:x,logout:b,can:h,refresh:u}}},29717:(e,t,s)=>{"use strict";var a=s(21505);s.o(a,"usePathname")&&s.d(t,{usePathname:function(){return a.usePathname}}),s.o(a,"useRouter")&&s.d(t,{useRouter:function(){return a.useRouter}}),s.o(a,"useSearchParams")&&s.d(t,{useSearchParams:function(){return a.useSearchParams}})},38334:(e,t,s)=>{"use strict";s.d(t,{A:()=>h});var a=s(73365),r=s(28913),l=s(1521),n=s(99568),d=s(29717),i=s(45111),c=s(59893),o=s(90753),x=s(30240),m=s(64683),u=s(24945);let b=[{href:"/admin",label:"Dashboard",icon:m.Hx,exact:!0},{href:"/admin/access",label:"Access",icon:m.zW},{href:"/admin/ota",label:"OTA Updates",icon:m.lP,needsOta:!0},{href:"/admin/turn",label:"TURN Keys",icon:m.kV}];function h({children:e}){let t=(0,d.usePathname)(),{me:s,loading:p,logout:f}=(0,u.b)(),[g,j]=(0,l.useState)(!1);if(p||!s)return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(x.A,{}),(0,a.jsx)(c.A,{children:(0,a.jsx)("div",{className:"card-glass p-8 max-w-sm w-full flex flex-col items-center justify-center",children:(0,a.jsx)(i.A,{size:"lg",text:"Loading admin..."})})})]});let y=(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"p-4 border-b border-border-subtle flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2.5 min-w-0",children:[(0,a.jsx)("div",{className:"w-6 h-6 shrink-0 rounded-md flex items-center justify-center font-bold text-sm bg-brand-500 text-white",children:"9"}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("h1",{className:"text-sm font-bold tracking-tight text-text truncate",children:"9Remote Admin"}),(0,a.jsxs)("div",{className:"flex items-center gap-1.5 mt-0.5",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted truncate",children:s.username}),(0,a.jsx)("span",{className:"text-[10px] font-mono px-1.5 py-0.5 rounded-full bg-surface-2 text-text-muted border border-border-subtle",children:s.modeName||s.modeId})]})]})]}),(0,a.jsx)("button",{onClick:()=>j(!1),className:"md:hidden p-1.5 -mr-1.5 text-text-muted hover:text-text rounded-[6px] hover:bg-surface-2 transition-colors","aria-label":"Close menu",children:(0,a.jsx)(m.X,{size:18})})]}),(0,a.jsxs)("nav",{className:"flex-1 px-3.5 py-3 space-y-0.5 overflow-y-auto",children:[(0,a.jsx)("div",{className:"pl-[3.5px] py-1.5 text-[10px] font-mono uppercase tracking-wider text-text-subtle",children:"Navigation"}),b.filter(e=>!e.needsOta||s.otaEnabled).map(e=>{let s=e.icon,r=e.exact?t===e.href:t.startsWith(e.href);return(0,a.jsxs)(n,{href:e.href,onClick:()=>j(!1),className:`
2
+ flex items-center gap-2.5 -ml-3.5 w-[calc(100%+0.875rem)] pl-[17px] pr-3 py-1.5
3
+ rounded-[6px] text-xs font-medium text-left transition-colors duration-150
4
+ ${r?"bg-surface-3 text-text font-semibold":"text-text-muted hover:bg-surface-2 hover:text-text"}
5
+ `,children:[(0,a.jsx)(s,{size:15,className:r?"text-text":"text-text-subtle"}),(0,a.jsx)("span",{className:"flex-1",children:e.label}),r&&(0,a.jsx)("span",{className:"w-1 h-1 rounded-full bg-text-muted"})]},e.href)})]}),(0,a.jsx)("div",{className:"p-3.5 border-t border-border-subtle",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(o.A,{className:"border border-border-subtle hover:bg-surface-2 rounded-[6px]"}),(0,a.jsxs)("button",{onClick:f,className:"flex-1 flex items-center justify-center gap-2 px-3 py-1.5 rounded-[6px] text-xs font-medium text-text-muted hover:bg-red-500/10 hover:text-danger transition-colors",children:[(0,a.jsx)(m.nU,{size:15}),"Logout"]})]})})]});return(0,a.jsxs)("div",{className:"jsx-b56c084163c9c8c1 min-h-screen text-text relative selection:bg-brand-500/20",children:[(0,a.jsx)(x.A,{}),(0,a.jsxs)("header",{className:"jsx-b56c084163c9c8c1 md:hidden sticky top-0 z-30 flex items-center justify-between px-4 py-2.5 bg-surface/80 backdrop-blur-md border-b border-border-subtle",children:[(0,a.jsx)("button",{onClick:()=>j(!0),"aria-label":"Open menu",className:"jsx-b56c084163c9c8c1 p-1.5 -ml-1.5 text-text-muted hover:text-text rounded-[6px] hover:bg-surface-2",children:(0,a.jsx)(m.W1,{size:20})}),(0,a.jsxs)("div",{className:"jsx-b56c084163c9c8c1 flex items-center gap-2",children:[(0,a.jsx)("div",{className:"jsx-b56c084163c9c8c1 w-6 h-6 rounded-md flex items-center justify-center font-bold text-xs bg-brand-500 text-white",children:"9"}),(0,a.jsx)("h1",{className:"jsx-b56c084163c9c8c1 text-sm font-semibold tracking-tight",children:"9Remote Admin"})]}),(0,a.jsx)(o.A,{className:"rounded-[6px]"})]}),(0,a.jsx)("aside",{className:"jsx-b56c084163c9c8c1 hidden md:flex fixed inset-y-0 left-0 w-60 border-r border-border-subtle bg-surface/80 backdrop-blur-xl flex-col z-20",children:y}),g&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{onClick:()=>j(!1),className:"jsx-b56c084163c9c8c1 md:hidden fixed inset-0 z-40 bg-black/60 backdrop-blur-[2px] fade-in"}),(0,a.jsx)("aside",{style:{animation:"slideInFromLeft 0.22s cubic-bezier(0.22, 1, 0.36, 1) forwards"},className:"jsx-b56c084163c9c8c1 md:hidden fixed inset-y-0 left-0 z-50 w-72 max-w-[85%] bg-surface/95 backdrop-blur-2xl border-r border-border-subtle flex flex-col slide-in-right",children:y})]}),(0,a.jsx)("main",{className:"jsx-b56c084163c9c8c1 md:ml-60 p-4 sm:p-6 lg:p-8 min-h-screen relative z-10 max-w-7xl",children:e}),(0,a.jsx)(r,{id:"b56c084163c9c8c1",children:"@keyframes slideInFromLeft{from{transform:translatex(-100%);opacity:0}to{transform:translatex(0);opacity:1}}"})]})}},39457:(e,t,s)=>{"use strict";s.d(t,{Z:()=>l});var a=s(1521);async function r(e,t={}){let s=await fetch(e,{...t,headers:{"Content-Type":"application/json",...t.headers||{}},credentials:"include"}),a=await s.json().catch(()=>({}));if(!s.ok)throw Error(a?.error||`Request failed (${s.status})`);return a}function l(){let e=(0,a.useCallback)(e=>r(e),[]),t=(0,a.useCallback)((e,t)=>r(e,{method:"POST",body:JSON.stringify(t||{})}),[]);return{get:e,post:t,patch:(0,a.useCallback)((e,t)=>r(e,{method:"PATCH",body:JSON.stringify(t||{})}),[]),del:(0,a.useCallback)(e=>r(e,{method:"DELETE"}),[])}}},45111:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});var a=s(73365);function r({size:e="md",text:t,className:s=""}){return(0,a.jsxs)("div",{className:`flex flex-col items-center justify-center gap-3 ${s}`,children:[(0,a.jsx)("div",{className:`animate-spin rounded-full border-brand-500 border-t-transparent ${{sm:"h-4 w-4 border-2",md:"h-8 w-8 border-2",lg:"h-12 w-12 border-b-2"}[e]}`}),t&&(0,a.jsx)("p",{className:"text-brand-500 text-sm font-medium",children:t})]})}},56631:(e,t,s)=>{Promise.resolve().then(s.bind(s,7116))},57042:(e,t,s)=>{"use strict";s.d(t,{GS:()=>c,Jj:()=>a,Qh:()=>n,WD:()=>r,Wm:()=>d,lb:()=>x,rK:()=>o,vq:()=>l,xp:()=>i});let a={sessionView:"session.view",sessionDelete:"session.delete",modeView:"mode.view",modeManage:"mode.manage",adminView:"admin.view",adminManage:"admin.manage",otaView:"ota.view",otaManage:"ota.manage",turnView:"turn.view",turnManage:"turn.manage",logView:"log.view"};Object.values(a);let r={"session.view":"View sessions","session.delete":"Delete sessions","admin.view":"View admins","admin.manage":"Create/edit admins","mode.view":"View modes","mode.manage":"Create/edit modes","ota.view":"View OTA updates","ota.manage":"Manage OTA updates","turn.view":"View TURN keys","turn.manage":"Manage TURN keys","log.view":"View login audit"},l=[{label:"Sessions",keys:["session.view","session.delete"]},{label:"Admins",keys:["admin.view","admin.manage"]},{label:"Modes",keys:["mode.view","mode.manage"]},{label:"OTA & TURN",keys:["ota.view","ota.manage","turn.view","turn.manage"]},{label:"Audit",keys:["log.view"]}],n=18e5,d=20,i=[10,20,50,100],c=["createdAt","lastAccessAt","expiresAt","machineId"],o=[{key:"loyal",label:"Loyal",minMs:6048e5,color:"text-success"},{key:"returning",label:"Returning",minMs:864e5,color:"text-brand-500"},{key:"active",label:"Active",minMs:3e5,color:"text-brand-400"},{key:"new",label:"New",minMs:0,color:"text-text-muted"}],x={login:"/api/admin/login",logout:"/api/admin/logout",me:"/api/admin/me",sessions:"/api/admin/sessions",stats:"/api/admin/stats",modes:"/api/admin/modes",admins:"/api/admin/admins",ota:"/api/admin/ota",turn:"/api/admin/turn",logins:"/api/admin/logins",turnstile:"/api/admin/turnstile"}},59893:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});var a=s(73365);function r({children:e,centered:t=!0,className:s=""}){return(0,a.jsx)("div",{className:`min-h-screen ${t?"flex items-center justify-center p-4":""} ${s}`,children:e})}},80186:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});var a=s(73365);function r({children:e,variant:t="primary",size:s="md",disabled:l=!1,loading:n=!1,onClick:d,className:i="",...c}){let o=`font-semibold rounded-brand transition-all duration-150 ease-out transform active:scale-[0.97] ${{primary:"bg-brand-500 hover:bg-brand-600 disabled:bg-surface-3 disabled:text-text-muted text-white shadow-sm",secondary:"bg-surface-2 hover:bg-surface-3 disabled:bg-surface disabled:text-text-muted text-text",danger:"bg-red-500 hover:bg-red-600 disabled:bg-surface-3 disabled:text-text-muted text-white",success:"bg-green-600 hover:bg-green-700 disabled:bg-surface-3 disabled:text-text-muted text-white"}[t]} ${{sm:"px-3 py-1.5 text-sm",md:"px-4 py-2 text-base",lg:"px-6 py-3 text-lg"}[s]} ${l||n?"cursor-not-allowed":""} ${i}`;return(0,a.jsx)("button",{onClick:d,disabled:l||n,className:o,...c,children:n?(0,a.jsxs)("span",{className:"flex items-center justify-center gap-2",children:[(0,a.jsx)("span",{className:"animate-spin rounded-full h-4 w-4 border-b-2 border-white"}),e]}):e})}},96042:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});var a=s(73365);function r({label:e,type:t="text",value:s,onChange:l,onKeyDown:n,placeholder:d,disabled:i=!1,error:c,className:o="",...x}){let m=c?"ring-1 ring-red-500 focus:ring-2 focus:ring-red-500":"focus:ring-2 focus:ring-brand-500/40",u=`w-full px-4 py-3 bg-surface-2 rounded-brand text-text placeholder-text-muted focus:outline-none transition-all duration-150 ease-out ${m} ${i?"opacity-50 cursor-not-allowed":""} ${o}`;return(0,a.jsxs)("div",{className:"w-full",children:[e&&(0,a.jsx)("label",{className:"block text-sm font-medium text-text mb-2",children:e}),(0,a.jsx)("input",{type:t,value:s,onChange:l,onKeyDown:n,placeholder:d,disabled:i,className:u,...x}),c&&(0,a.jsx)("p",{className:"mt-1 text-sm text-red-400",children:c})]})}}},e=>{e.O(0,[6669,9568,8922,9871,2347,5158,7358],()=>e(e.s=56631)),_N_E=e.O()}]);