9remote 3.0.27 → 3.0.32
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.
- package/README.md +16 -12
- package/dist/bin/desktop-bridge.cs +5 -5
- package/dist/bin/desktop-elevate.cs +1 -1
- package/dist/cli.cjs +128 -108
- package/dist/ptyDaemon.cjs +10 -10
- package/dist/server.cjs +496 -206
- package/dist/ui/assets/index--4F7rf4t.js +8 -0
- package/dist/ui/index.html +1 -1
- package/dist/web/404.html +1 -1
- package/dist/web/__next.__PAGE__.txt +2 -2
- package/dist/web/__next._full.txt +21 -19
- package/dist/web/__next._head.txt +1 -1
- package/dist/web/__next._index.txt +8 -6
- package/dist/web/__next._tree.txt +3 -2
- package/dist/web/_next/static/chunks/{8669-9e059733295a6fc1.js → 1050-b9af41e8856b58c0.js} +1 -1
- package/dist/web/_next/static/chunks/1222.a2ce7d7f04241e2a.js +1 -0
- package/dist/web/_next/static/chunks/1228.046ad5fd038f5192.js +1 -0
- package/dist/web/_next/static/chunks/1243.1d11020940b8a88b.js +1 -0
- package/dist/web/_next/static/chunks/132.1ed2fce3a4b6f7ee.js +1 -0
- package/dist/web/_next/static/chunks/1750.2cbe0f722b879a3b.js +1 -0
- package/dist/web/_next/static/chunks/2038.b7c72b442a1b2d92.js +1 -0
- package/dist/web/_next/static/chunks/213.f07a816120a320ba.js +1 -0
- package/dist/web/_next/static/chunks/2180.23585bd3f3308f3a.js +1 -0
- package/dist/web/_next/static/chunks/2849.360e2c64521fa795.js +1 -0
- package/dist/web/_next/static/chunks/3429.98d7e79ff6d2a6ce.js +1 -0
- package/dist/web/_next/static/chunks/3514.9079bf49bb3e05c9.js +1 -0
- package/dist/web/_next/static/chunks/4300-fb55814d743e1313.js +1 -0
- package/dist/web/_next/static/chunks/4643.ddf3ea3a760e73a5.js +1 -0
- package/dist/web/_next/static/chunks/5788-d574869f0879e799.js +1 -0
- package/dist/web/_next/static/chunks/6276.aa48f74970f7ef3d.js +1 -0
- package/dist/web/_next/static/chunks/6419.99aa173d83f20370.js +1 -0
- package/dist/web/_next/static/chunks/6552-f908d82b4c4161ed.js +1 -0
- package/dist/web/_next/static/chunks/674.97a7237f011fb986.js +1 -0
- package/dist/web/_next/static/chunks/6742.bc3783b9784ead96.js +1 -0
- package/dist/web/_next/static/chunks/7507.28a3807b5d02a5c1.js +1 -0
- package/dist/web/_next/static/chunks/7960.026e07028dd25edb.js +1 -0
- package/dist/web/_next/static/chunks/8467.290e9bde34b58e7c.js +1 -0
- package/dist/web/_next/static/chunks/8638.237712645dcdcb8a.js +1 -0
- package/dist/web/_next/static/chunks/8669-8d1fb8dce08c886d.js +11 -0
- package/dist/web/_next/static/chunks/8762-62e9a4a001d3e204.js +1 -0
- package/dist/web/_next/static/chunks/8922-6961d48ca52e1c93.js +1 -0
- package/dist/web/_next/static/chunks/925.fe600c6039a3201d.js +1 -0
- package/dist/web/_next/static/chunks/9259.c450f561db04037d.js +1 -0
- package/dist/web/_next/static/chunks/9299.83236781dfa74eb0.js +1 -0
- package/dist/web/_next/static/chunks/9871-9cd97efc98617c33.js +1 -0
- package/dist/web/_next/static/chunks/app/_global-error/page-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/app/admin/access/page-3a49e3c597eea658.js +5 -0
- package/dist/web/_next/static/chunks/app/admin/login/page-c7bdfdfbcc763df4.js +1 -0
- package/dist/web/_next/static/chunks/app/admin/ota/page-406ff48a5882efa4.js +5 -0
- package/dist/web/_next/static/chunks/app/admin/page-434461c255fd088a.js +5 -0
- package/dist/web/_next/static/chunks/app/admin/turn/page-dd7552f387e08b36.js +5 -0
- package/dist/web/_next/static/chunks/app/dev/question/page-ab488886d05baea5.js +1 -0
- package/dist/web/_next/static/chunks/app/download/page-2811ea822a1e586a.js +1 -0
- package/dist/web/_next/static/chunks/app/layout-444afebe5b95afff.js +1 -0
- package/dist/web/_next/static/chunks/app/login/page-80cc1994a494dfed.js +1 -0
- package/dist/web/_next/static/chunks/app/page-f416e79015c32480.js +22 -0
- package/dist/web/_next/static/chunks/app/workspace/browse/page-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/app/workspace/editor/page-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/app/workspace/files/page-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/app/workspace/git/page-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/app/workspace/layout-a1024034aa67994d.js +15 -0
- package/dist/web/_next/static/chunks/app/workspace/mobile/page-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/app/workspace/page-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/app/workspace/pair/page-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/app/workspace/remote/page-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/app/workspace/terminal/[sessionId]/page-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/app/workspace/welcome/page-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/app/workspace/workspaces/page-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/next/dist/client/components/builtin/app-error-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/next/dist/client/components/builtin/forbidden-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/next/dist/client/components/builtin/not-found-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/next/dist/client/components/builtin/unauthorized-e656bb9bc0f3fd3d.js +1 -0
- package/dist/web/_next/static/chunks/webpack-b56d3361b185b0cb.js +1 -0
- package/dist/web/_next/static/css/630ce3b502aeea55.css +1 -0
- package/dist/web/_next/static/css/{56adcd4d72bf2d84.css → adc0ee53b89bee3c.css} +1 -1
- package/dist/web/_next/static/nx78GyCTuW2V1ns5cZIT_/_buildManifest.js +1 -0
- package/dist/web/_not-found/__next._full.txt +19 -17
- package/dist/web/_not-found/__next._head.txt +1 -1
- package/dist/web/_not-found/__next._index.txt +8 -6
- package/dist/web/_not-found/__next._not-found.__PAGE__.txt +1 -1
- package/dist/web/_not-found/__next._not-found.txt +1 -1
- package/dist/web/_not-found/__next._tree.txt +3 -2
- package/dist/web/_not-found.html +1 -1
- package/dist/web/_not-found.txt +19 -17
- package/dist/web/admin/__next._full.txt +23 -21
- package/dist/web/admin/__next._head.txt +1 -1
- package/dist/web/admin/__next._index.txt +8 -6
- package/dist/web/admin/__next._tree.txt +3 -2
- package/dist/web/admin/__next.admin.__PAGE__.txt +2 -2
- package/dist/web/admin/__next.admin.txt +1 -1
- package/dist/web/admin/access/__next._full.txt +29 -0
- package/dist/web/admin/{admins → access}/__next._head.txt +1 -1
- package/dist/web/admin/access/__next._index.txt +12 -0
- package/dist/web/admin/{admins → access}/__next._tree.txt +3 -2
- package/dist/web/admin/{admins/__next.admin.admins.__PAGE__.txt → access/__next.admin.access.__PAGE__.txt} +2 -2
- package/dist/web/admin/{admins/__next.admin.admins.txt → access/__next.admin.access.txt} +1 -1
- package/dist/web/admin/{admins → access}/__next.admin.txt +1 -1
- package/dist/web/admin/access.html +1 -0
- package/dist/web/admin/access.txt +29 -0
- package/dist/web/admin/login/__next._full.txt +23 -21
- package/dist/web/admin/login/__next._head.txt +1 -1
- package/dist/web/admin/login/__next._index.txt +8 -6
- package/dist/web/admin/login/__next._tree.txt +3 -2
- package/dist/web/admin/login/__next.admin.login.__PAGE__.txt +2 -2
- package/dist/web/admin/login/__next.admin.login.txt +1 -1
- package/dist/web/admin/login/__next.admin.txt +1 -1
- package/dist/web/admin/login.html +1 -1
- package/dist/web/admin/login.txt +23 -21
- package/dist/web/admin/ota/__next._full.txt +23 -21
- package/dist/web/admin/ota/__next._head.txt +1 -1
- package/dist/web/admin/ota/__next._index.txt +8 -6
- package/dist/web/admin/ota/__next._tree.txt +3 -2
- package/dist/web/admin/ota/__next.admin.ota.__PAGE__.txt +2 -2
- package/dist/web/admin/ota/__next.admin.ota.txt +1 -1
- package/dist/web/admin/ota/__next.admin.txt +1 -1
- package/dist/web/admin/ota.html +1 -1
- package/dist/web/admin/ota.txt +23 -21
- package/dist/web/admin/turn/__next._full.txt +23 -21
- package/dist/web/admin/turn/__next._head.txt +1 -1
- package/dist/web/admin/turn/__next._index.txt +8 -6
- package/dist/web/admin/turn/__next._tree.txt +3 -2
- package/dist/web/admin/turn/__next.admin.turn.__PAGE__.txt +2 -2
- package/dist/web/admin/turn/__next.admin.turn.txt +1 -1
- package/dist/web/admin/turn/__next.admin.txt +1 -1
- package/dist/web/admin/turn.html +1 -1
- package/dist/web/admin/turn.txt +23 -21
- package/dist/web/admin.html +1 -1
- package/dist/web/admin.txt +23 -21
- package/dist/web/dev/question/__next._full.txt +23 -21
- package/dist/web/dev/question/__next._head.txt +1 -1
- package/dist/web/dev/question/__next._index.txt +8 -6
- package/dist/web/dev/question/__next._tree.txt +3 -2
- package/dist/web/dev/question/__next.dev.question.__PAGE__.txt +2 -2
- package/dist/web/dev/question/__next.dev.question.txt +1 -1
- package/dist/web/dev/question/__next.dev.txt +1 -1
- package/dist/web/dev/question.html +1 -1
- package/dist/web/dev/question.txt +23 -21
- package/dist/web/download/__next._full.txt +26 -0
- package/dist/web/download/__next._head.txt +6 -0
- package/dist/web/download/__next._index.txt +12 -0
- package/dist/web/{admin/modes → download}/__next._tree.txt +3 -2
- package/dist/web/download/__next.download.__PAGE__.txt +6 -0
- package/dist/web/{admin/modes/__next.admin.modes.txt → download/__next.download.txt} +1 -1
- package/dist/web/download.html +1 -0
- package/dist/web/download.txt +26 -0
- package/dist/web/index.html +1 -1
- package/dist/web/index.txt +21 -19
- package/dist/web/login/__next._full.txt +23 -21
- package/dist/web/login/__next._head.txt +1 -1
- package/dist/web/login/__next._index.txt +8 -6
- package/dist/web/login/__next._tree.txt +3 -2
- package/dist/web/login/__next.login.__PAGE__.txt +2 -2
- package/dist/web/login/__next.login.txt +1 -1
- package/dist/web/login.html +1 -1
- package/dist/web/login.txt +23 -21
- package/dist/web/workspace/__next._full.txt +21 -19
- package/dist/web/workspace/__next._head.txt +1 -1
- package/dist/web/workspace/__next._index.txt +8 -6
- package/dist/web/workspace/__next._tree.txt +4 -3
- package/dist/web/workspace/__next.workspace.__PAGE__.txt +1 -1
- package/dist/web/workspace/__next.workspace.txt +3 -3
- package/dist/web/workspace/browse/__next._full.txt +23 -21
- package/dist/web/workspace/browse/__next._head.txt +1 -1
- package/dist/web/workspace/browse/__next._index.txt +8 -6
- package/dist/web/workspace/browse/__next._tree.txt +4 -3
- package/dist/web/workspace/browse/__next.workspace.browse.__PAGE__.txt +1 -1
- package/dist/web/workspace/browse/__next.workspace.browse.txt +1 -1
- package/dist/web/workspace/browse/__next.workspace.txt +3 -3
- package/dist/web/workspace/browse.html +1 -1
- package/dist/web/workspace/browse.txt +23 -21
- package/dist/web/workspace/editor/__next._full.txt +23 -21
- package/dist/web/workspace/editor/__next._head.txt +1 -1
- package/dist/web/workspace/editor/__next._index.txt +8 -6
- package/dist/web/workspace/editor/__next._tree.txt +4 -3
- package/dist/web/workspace/editor/__next.workspace.editor.__PAGE__.txt +1 -1
- package/dist/web/workspace/editor/__next.workspace.editor.txt +1 -1
- package/dist/web/workspace/editor/__next.workspace.txt +3 -3
- package/dist/web/workspace/editor.html +1 -1
- package/dist/web/workspace/editor.txt +23 -21
- package/dist/web/workspace/files/__next._full.txt +23 -21
- package/dist/web/workspace/files/__next._head.txt +1 -1
- package/dist/web/workspace/files/__next._index.txt +8 -6
- package/dist/web/workspace/files/__next._tree.txt +4 -3
- package/dist/web/workspace/files/__next.workspace.files.__PAGE__.txt +1 -1
- package/dist/web/workspace/files/__next.workspace.files.txt +1 -1
- package/dist/web/workspace/files/__next.workspace.txt +3 -3
- package/dist/web/workspace/files.html +1 -1
- package/dist/web/workspace/files.txt +23 -21
- package/dist/web/workspace/git/__next._full.txt +23 -21
- package/dist/web/workspace/git/__next._head.txt +1 -1
- package/dist/web/workspace/git/__next._index.txt +8 -6
- package/dist/web/workspace/git/__next._tree.txt +4 -3
- package/dist/web/workspace/git/__next.workspace.git.__PAGE__.txt +1 -1
- package/dist/web/workspace/git/__next.workspace.git.txt +1 -1
- package/dist/web/workspace/git/__next.workspace.txt +3 -3
- package/dist/web/workspace/git.html +1 -1
- package/dist/web/workspace/git.txt +23 -21
- package/dist/web/workspace/mobile/__next._full.txt +23 -21
- package/dist/web/workspace/mobile/__next._head.txt +1 -1
- package/dist/web/workspace/mobile/__next._index.txt +8 -6
- package/dist/web/workspace/mobile/__next._tree.txt +4 -3
- package/dist/web/workspace/mobile/__next.workspace.mobile.__PAGE__.txt +1 -1
- package/dist/web/workspace/mobile/__next.workspace.mobile.txt +1 -1
- package/dist/web/workspace/mobile/__next.workspace.txt +3 -3
- package/dist/web/workspace/mobile.html +1 -1
- package/dist/web/workspace/mobile.txt +23 -21
- package/dist/web/workspace/pair/__next._full.txt +29 -0
- package/dist/web/{admin/modes → workspace/pair}/__next._head.txt +1 -1
- package/dist/web/workspace/pair/__next._index.txt +12 -0
- package/dist/web/workspace/pair/__next._tree.txt +7 -0
- package/dist/web/workspace/pair/__next.workspace.pair.__PAGE__.txt +5 -0
- package/dist/web/{admin/modes/__next.admin.txt → workspace/pair/__next.workspace.pair.txt} +1 -1
- package/dist/web/workspace/pair/__next.workspace.txt +8 -0
- package/dist/web/workspace/pair.html +1 -0
- package/dist/web/workspace/pair.txt +29 -0
- package/dist/web/workspace/remote/__next._full.txt +23 -21
- package/dist/web/workspace/remote/__next._head.txt +1 -1
- package/dist/web/workspace/remote/__next._index.txt +8 -6
- package/dist/web/workspace/remote/__next._tree.txt +4 -3
- package/dist/web/workspace/remote/__next.workspace.remote.__PAGE__.txt +1 -1
- package/dist/web/workspace/remote/__next.workspace.remote.txt +1 -1
- package/dist/web/workspace/remote/__next.workspace.txt +3 -3
- package/dist/web/workspace/remote.html +1 -1
- package/dist/web/workspace/remote.txt +23 -21
- package/dist/web/workspace/terminal/default/__next._full.txt +25 -21
- package/dist/web/workspace/terminal/default/__next._head.txt +1 -1
- package/dist/web/workspace/terminal/default/__next._index.txt +8 -6
- package/dist/web/workspace/terminal/default/__next._tree.txt +4 -3
- package/dist/web/workspace/terminal/default/__next.workspace.terminal.$d$sessionId.__PAGE__.txt +1 -1
- package/dist/web/workspace/terminal/default/__next.workspace.terminal.$d$sessionId.txt +1 -1
- package/dist/web/workspace/terminal/default/__next.workspace.terminal.txt +1 -1
- package/dist/web/workspace/terminal/default/__next.workspace.txt +3 -3
- package/dist/web/workspace/terminal/default.html +1 -1
- package/dist/web/workspace/terminal/default.txt +25 -21
- package/dist/web/workspace/welcome/__next._full.txt +29 -0
- package/dist/web/workspace/welcome/__next._head.txt +6 -0
- package/dist/web/workspace/welcome/__next._index.txt +12 -0
- package/dist/web/workspace/welcome/__next._tree.txt +7 -0
- package/dist/web/workspace/welcome/__next.workspace.txt +8 -0
- package/dist/web/workspace/welcome/__next.workspace.welcome.__PAGE__.txt +5 -0
- package/dist/web/workspace/welcome/__next.workspace.welcome.txt +5 -0
- package/dist/web/workspace/welcome.html +1 -0
- package/dist/web/workspace/welcome.txt +29 -0
- package/dist/web/workspace/workspaces/__next._full.txt +23 -21
- package/dist/web/workspace/workspaces/__next._head.txt +1 -1
- package/dist/web/workspace/workspaces/__next._index.txt +8 -6
- package/dist/web/workspace/workspaces/__next._tree.txt +4 -3
- package/dist/web/workspace/workspaces/__next.workspace.txt +3 -3
- package/dist/web/workspace/workspaces/__next.workspace.workspaces.__PAGE__.txt +1 -1
- package/dist/web/workspace/workspaces/__next.workspace.workspaces.txt +1 -1
- package/dist/web/workspace/workspaces.html +1 -1
- package/dist/web/workspace/workspaces.txt +23 -21
- package/dist/web/workspace.html +1 -1
- package/dist/web/workspace.txt +21 -19
- package/package.json +3 -3
- package/dist/ui/assets/index-I2Ik1Uxe.js +0 -8
- package/dist/web/_next/static/chunks/1222.aa4f7f7f397533e9.js +0 -1
- package/dist/web/_next/static/chunks/1228.d291278320bca9ca.js +0 -1
- package/dist/web/_next/static/chunks/1243.f35c2e6494079e05.js +0 -1
- package/dist/web/_next/static/chunks/132.6032826021079bce.js +0 -1
- package/dist/web/_next/static/chunks/1750.2278b084cb33e817.js +0 -1
- package/dist/web/_next/static/chunks/2038.640b672702093b24.js +0 -1
- package/dist/web/_next/static/chunks/213.68ce1361aee3281a.js +0 -1
- package/dist/web/_next/static/chunks/2180.e6bad8186f52ff89.js +0 -1
- package/dist/web/_next/static/chunks/2849.f2bcad51c68e44b5.js +0 -1
- package/dist/web/_next/static/chunks/2881-71aed16f0b88cb34.js +0 -1
- package/dist/web/_next/static/chunks/3429.436b229808b33e81.js +0 -1
- package/dist/web/_next/static/chunks/3514.9643e815d690f2fb.js +0 -1
- package/dist/web/_next/static/chunks/4643.dbb152682d076617.js +0 -1
- package/dist/web/_next/static/chunks/4732-76a574510722b2c3.js +0 -11
- package/dist/web/_next/static/chunks/5788-f631bcbc039b4da2.js +0 -1
- package/dist/web/_next/static/chunks/6419.842467d9a877e770.js +0 -1
- package/dist/web/_next/static/chunks/6552-1ddf0600fddfd553.js +0 -1
- package/dist/web/_next/static/chunks/674.2b5ffad0676aedbe.js +0 -1
- package/dist/web/_next/static/chunks/6742.8e137138a5d1c9e1.js +0 -1
- package/dist/web/_next/static/chunks/7507.1204ae29f46e3f01.js +0 -1
- package/dist/web/_next/static/chunks/7960.3b1c77b882ba4bb1.js +0 -1
- package/dist/web/_next/static/chunks/8467.f34d938a32d40325.js +0 -1
- package/dist/web/_next/static/chunks/8638.03c6480d4aaeb5b3.js +0 -1
- package/dist/web/_next/static/chunks/925.7ef504ee39f11840.js +0 -1
- package/dist/web/_next/static/chunks/9259.f4337cbb56e2e0b6.js +0 -1
- package/dist/web/_next/static/chunks/9299.af2a95f6ece07482.js +0 -1
- package/dist/web/_next/static/chunks/9958-8030d12d1aa9659a.js +0 -1
- package/dist/web/_next/static/chunks/app/_global-error/page-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/app/admin/admins/page-306d339ee530b5f6.js +0 -1
- package/dist/web/_next/static/chunks/app/admin/login/page-691eef7459d86ee3.js +0 -1
- package/dist/web/_next/static/chunks/app/admin/modes/page-6e1277223ac77414.js +0 -1
- package/dist/web/_next/static/chunks/app/admin/ota/page-3a2b0ecbedd59e35.js +0 -1
- package/dist/web/_next/static/chunks/app/admin/page-1fca731dbc8d61d3.js +0 -1
- package/dist/web/_next/static/chunks/app/admin/turn/page-7df8fb088cf7ccda.js +0 -1
- package/dist/web/_next/static/chunks/app/dev/question/page-92c77506bb59e639.js +0 -1
- package/dist/web/_next/static/chunks/app/layout-ec53a1a0c4b3e99e.js +0 -1
- package/dist/web/_next/static/chunks/app/login/page-55e34ebc40a79798.js +0 -1
- package/dist/web/_next/static/chunks/app/page-f0bf05d73d9e99d4.js +0 -22
- package/dist/web/_next/static/chunks/app/workspace/browse/page-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/app/workspace/editor/page-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/app/workspace/files/page-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/app/workspace/git/page-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/app/workspace/layout-03eff77b255b25d6.js +0 -15
- package/dist/web/_next/static/chunks/app/workspace/mobile/page-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/app/workspace/page-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/app/workspace/remote/page-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/app/workspace/terminal/[sessionId]/page-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/app/workspace/workspaces/page-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/next/dist/client/components/builtin/app-error-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/next/dist/client/components/builtin/forbidden-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/next/dist/client/components/builtin/not-found-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/next/dist/client/components/builtin/unauthorized-1105b0cfd58cfb3c.js +0 -1
- package/dist/web/_next/static/chunks/webpack-6c9c0816af64073a.js +0 -1
- package/dist/web/_next/static/css/be666ba38225da3a.css +0 -1
- package/dist/web/_next/static/ojB5LsquXLz4Tz9PU1iGl/_buildManifest.js +0 -1
- package/dist/web/admin/admins/__next._full.txt +0 -27
- package/dist/web/admin/admins/__next._index.txt +0 -10
- package/dist/web/admin/admins.html +0 -1
- package/dist/web/admin/admins.txt +0 -27
- package/dist/web/admin/modes/__next._full.txt +0 -27
- package/dist/web/admin/modes/__next._index.txt +0 -10
- package/dist/web/admin/modes/__next.admin.modes.__PAGE__.txt +0 -9
- package/dist/web/admin/modes.html +0 -1
- package/dist/web/admin/modes.txt +0 -27
- package/dist/web/file.svg +0 -1
- package/dist/web/globe.svg +0 -1
- package/dist/web/next.svg +0 -1
- package/dist/web/vercel.svg +0 -1
- package/dist/web/window.svg +0 -1
- /package/dist/web/_next/static/{ojB5LsquXLz4Tz9PU1iGl → nx78GyCTuW2V1ns5cZIT_}/_ssgManifest.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
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:"agent 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 agent 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 agent…",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 agent first",portPlaceholder:"puerto",loadingSites:"Cargando sitios...",notConnected:"Not connected to the agent",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"}}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
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:"agent 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 agent 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 agent…",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 agent first",portPlaceholder:"порт",loadingSites:"Завантаження сайтів...",notConnected:"Not connected to the agent",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:"Невідомо"}}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9958],{8910:(e,a,t)=>{t.d(a,{e:()=>A});function A(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:()=>r});var A=t(73365);function r(){return(0,A.jsxs)("div",{className:"fixed inset-0 -z-10 overflow-hidden pointer-events-none landing-bg",children:[(0,A.jsx)("div",{className:"absolute inset-0 landing-grid"}),(0,A.jsx)("div",{className:"absolute inset-0 landing-vignette"})]})}},44976:(e,a,t)=>{t.d(a,{D:()=>i,ThemeProvider:()=>n});var A=t(73365),r=t(1521),l=t(79063);let o=(0,r.createContext)({theme:l.SS,setTheme:()=>{},toggleTheme:()=>{}}),c=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{}},u=e=>{if(window.ReactNativeWebView)try{window.ReactNativeWebView.postMessage(JSON.stringify({type:"THEME_CHANGE",theme:e}))}catch(e){}};function n({children:e}){let[a,t]=(0,r.useState)(l.SS);(0,r.useEffect)(()=>{let e=localStorage.getItem(l.AQ)||localStorage.getItem("9remote-theme"),a=l.$.includes(e)?e:l.SS;t(a),c(a),u(a)},[]);let i=(0,r.useCallback)(e=>{l.$.includes(e)&&(t(e),c(e),u(e),localStorage.setItem(l.AQ,e),localStorage.setItem("9remote-theme",e))},[]),F=(0,r.useCallback)(()=>{i("dark"===a?"light":"dark")},[a,i]);return(0,A.jsx)(o.Provider,{value:{theme:a,setTheme:i,toggleTheme:F},children:e})}let i=()=>(0,r.useContext)(o)},64683:(e,a,t)=>{t.d(a,{$o:()=>eU.A,AX:()=>eb.A,Ay:()=>ac,BK:()=>e6.A,BZ:()=>K.A,Bm:()=>W.A,Cp:()=>J.A,Do:()=>c.A,F1:()=>u.A,FE:()=>e0.A,FW:()=>eH.A,Fc:()=>eT.A,GD:()=>H.A,GO:()=>ed.A,Gr:()=>M.A,Gv:()=>eB.A,Hx:()=>el.A,Ir:()=>i.A,J4:()=>eY.A,JG:()=>E.A,JU:()=>z.A,Jl:()=>C.A,Kq:()=>al.A,LM:()=>en.A,Lt:()=>k.A,M6:()=>eK.A,MA:()=>n.A,Mr:()=>eR.A,P6:()=>ea.A,QR:()=>p.A,Qp:()=>o.A,RI:()=>r.A,TB:()=>e3.A,Ud:()=>q.A,VA:()=>eg.A,Vn:()=>eV.A,W1:()=>eC.A,WE:()=>m.A,We:()=>e1.A,Wn:()=>v.A,X:()=>ar.A,X_:()=>S.A,ZH:()=>T.A,ZU:()=>e2.A,Ze:()=>eS.A,Zr:()=>j.A,_O:()=>e4.A,_V:()=>ee.A,a4:()=>em.A,aJ:()=>D.A,ak:()=>X.A,bE:()=>e5.A,bd:()=>e9.A,cC:()=>F.A,c_:()=>g.A,dJ:()=>N.A,de:()=>aA.A,dx:()=>V.A,e6:()=>ev.A,e9:()=>eI.A,eM:()=>eW.A,ek:()=>eq.A,es:()=>ey.A,f2:()=>$.A,f5:()=>L.A,gH:()=>eM.A,h1:()=>es.A,iU:()=>_.A,jG:()=>eG.A,jj:()=>eE.A,jl:()=>B.A,jz:()=>ex.A,kU:()=>P.A,kV:()=>et.A,kr:()=>eu.A,kt:()=>eO.A,lM:()=>e7.A,lP:()=>eh.A,m0:()=>f.A,mN:()=>Z.A,nU:()=>eF.A,qz:()=>Q.A,rX:()=>b.A,s3:()=>eA.A,sU:()=>eZ.A,sv:()=>I.A,ue:()=>ep.A,vR:()=>eL.A,vW:()=>e_.A,vd:()=>O.A,vj:()=>ej.A,vv:()=>eo.A,wB:()=>eQ.A,wO:()=>eX.A,ww:()=>Y.A,xq:()=>eD.A,xv:()=>ew.A,y8:()=>ec.A,yQ:()=>d.A,yU:()=>eP.A,yd:()=>l.A,zW:()=>ae.A});var A=t(73365),r=t(87821),l=t(21878),o=t(79376),c=t(61659),u=t(6504),n=t(19307),i=t(74739),F=t(29967),s=t(17836),D=t(67494),C=t(66687),d=t(95188),E=t(54453),g=t(34582),b=t(70453),m=t(10949),B=t(64570),f=t(31258),h=t(59907),y=t(13374),v=t(17406),p=t(46431),k=t(29260),x=t(88433),w=t(49553),L=t(20478),M=t(17568),P=t(87831),S=t(1916),G=t(29418),T=t(18272),H=t(10550),R=t(9271),U=t(14251),_=t(50068),I=t(98173),N=t(10194),O=t(70362),W=t(17909),z=t(59437),j=t(33109),V=t(48433),J=t(86877),Q=t(34271),$=t(60919),q=t(35723),X=t(41046),Z=t(64629),K=t(6534),Y=t(5370),ee=t(59711),ea=t(39831),et=t(9560),eA=t(44159),er=t(41098),el=t(20021),eo=t(14797),ec=t(15504),eu=t(93292),en=t(92165),ei=t(94304),eF=t(40789),es=t(64871),eD=t(31805),eC=t(19621),ed=t(40081),eE=t(38781),eg=t(88768),eb=t(68395),em=t(88793),eB=t(25406),ef=t(10998),eh=t(64446),ey=t(12925),ev=t(93354),ep=t(73243),ek=t(89317),ex=t(12283),ew=t(1578),eL=t(90612),eM=t(43959),eP=t(76621),eS=t(59833),eG=t(67236),eT=t(37266),eH=t(97038),eR=t(72147),eU=t(68859),e_=t(93285),eI=t(20178),eN=t(65062),eO=t(87030),eW=t(67519),ez=t(457),ej=t(58450),eV=t(48088),eJ=t(56023),eQ=t(59311),e$=t(38177),eq=t(60659),eX=t(1838),eZ=t(34969),eK=t(42685),eY=t(99707),e0=t(6830),e8=t(20248),e9=t(11384),e1=t(50211),e6=t(64342),e3=t(60151),e7=t(81610),e2=t(11990),e5=t(52715),e4=t(49387),ae=t(894),aa=t(2031),at=t(58573),aA=t(51328),ar=t(3382),al=t(57717);let ao={AlertCircle:r.A,ArrowDown:l.A,ArrowRight:o.A,ArrowUp:c.A,ArrowUpRight:u.A,Ban:n.A,Bell:i.A,Bot:F.A,Bug:s.A,Check:D.A,CheckCircle2:C.A,ChevronDown:d.A,ChevronLeft:E.A,ChevronRight:g.A,ChevronUp:b.A,ChevronsDownUp:m.A,Circle:B.A,ClipboardPaste:f.A,Command:h.A,Compass:y.A,Columns2:v.A,Copy:p.A,CornerDownLeft:k.A,Crown:x.A,Delete:w.A,Download:L.A,ExternalLink:M.A,Eye:P.A,EyeOff:S.A,Facebook:G.A,File:T.A,FileCode:H.A,FileJson:R.A,FilePlus:U.A,FileText:_.A,Files:I.A,Filter:N.A,Folder:O.A,FolderOpen:W.A,FolderPlus:z.A,GitBranch:j.A,GitFork:V.A,Github:J.A,Globe:Q.A,GripVertical:$.A,Hand:q.A,HardDrive:X.A,HelpCircle:Z.A,History:K.A,Home:Y.A,Image:ee.A,ImageOff:ea.A,KeyRound:et.A,Keyboard:eA.A,Laptop:er.A,LayoutDashboard:el.A,Link2:eo.A,ListChecks:ec.A,Loader2:eu.A,Lock:en.A,LogIn:ei.A,LogOut:eF.A,Maximize2:es.A,Minimize2:eD.A,Menu:eC.A,Mic:ed.A,MicOff:eE.A,Monitor:eg.A,Moon:eb.A,MoreHorizontal:em.A,MoreVertical:eB.A,MousePointer2:ef.A,Package:eh.A,Palette:ey.A,PanelLeft:ev.A,PanelLeftClose:ep.A,PanelLeftOpen:ek.A,PanelRight:ex.A,Paperclip:ew.A,Pause:eL.A,Pencil:eM.A,Pin:eP.A,PinOff:eS.A,Play:eG.A,Plug:eT.A,Plus:eH.A,Power:eR.A,PowerOff:eU.A,QrCode:e_.A,RefreshCw:eI.A,Replace:eN.A,RotateCw:eO.A,Save:eW.A,Scissors:ez.A,Search:ej.A,Send:eV.A,SendHorizontal:eJ.A,Settings:eQ.A,Share:e$.A,Shield:eq.A,Smartphone:eX.A,Sparkles:eZ.A,Square:eK.A,SquarePen:eY.A,Star:e0.A,StickyNote:e8.A,Sun:e9.A,Target:e1.A,Terminal:e6.A,Trash2:e3.A,Triangle:e7.A,Type:e2.A,Undo2:e5.A,Upload:e4.A,Users:ae.A,Volume2:aa.A,VolumeX:at.A,Wallpaper:aA.A,X:ar.A,Zap:al.A};function ac({name:e,size:a=20,className:t="",...r}){let l=ao[e];return l?(0,A.jsx)(l,{size:a,className:t,strokeWidth:2,...r}):(console.warn(`Icon "${e}" not found in the icon registry`),null)}},79063:(e,a,t)=>{t.d(a,{$:()=>A,AQ:()=>l,In:()=>i,SS:()=>r,aC:()=>c,g4:()=>n});let A=["dark","light"],r="dark",l="app_theme_v2";function o(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 c={dark:o({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:o({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"})},u={catppuccinMocha:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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:o({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"})},n=[{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?u.everforestLight:u.palenight;return a&&"default"!==a&&n.find(t=>t.key===a&&t.mode===e)&&u[a]||t}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1447,4896,5348,5711,6364,6399,6819,6988,7427,7711,7851,8167,8983,9603],{95659:()=>{}},_=>{_.O(0,[2347,5158,7358],()=>_(_.s=95659)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4831],{24945:(e,t,s)=>{"use strict";s.d(t,{b:()=>l});var a=s(1521),r=s(29717),n=s(57042),d=s(39457);function l({redirectIfUnauthed:e=!0}={}){let t=(0,r.useRouter)(),{get:s,post:i}=(0,d.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 i(n.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}})},37380:(e,t,s)=>{Promise.resolve().then(s.bind(s,68566))},38334:(e,t,s)=>{"use strict";s.d(t,{A:()=>h});var a=s(73365),r=s(28913),n=s(1521),d=s(99568),l=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/modes",label:"Modes",icon:m.ek},{href:"/admin/admins",label:"Admins",icon:m.zW},{href:"/admin/ota",label:"OTA Updates",icon:m.lP},{href:"/admin/turn",label:"TURN Keys",icon:m.kV}];function h({children:e}){let t=(0,l.usePathname)(),{me:s,loading:p,logout:f}=(0,u.b)(),[g,j]=(0,n.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 N=(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"p-5 border-b border-border-subtle flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,a.jsx)("div",{className:"w-9 h-9 shrink-0 rounded-xl flex items-center justify-center font-bold text-lg bg-brand-500 text-white shadow-[0_8px_24px_-8px_rgba(255,87,10,0.6)] ring-1 ring-white/20",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-brand-500/10 text-brand-500 border border-brand-500/20",children:s.modeName||s.modeId})]})]})]}),(0,a.jsx)("button",{onClick:()=>j(!1),className:"md:hidden text-text-muted hover:text-text shrink-0 p-1.5 rounded-lg 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 p-3 space-y-1 overflow-y-auto",children:[(0,a.jsx)("div",{className:"px-3 py-1.5 text-[11px] font-mono uppercase tracking-wider text-text-subtle",children:"Navigation"}),b.map(e=>{let s=e.icon,r=e.exact?t===e.href:t.startsWith(e.href);return(0,a.jsxs)(d,{href:e.href,onClick:()=>j(!1),className:`flex items-center gap-3 px-3.5 py-2.5 rounded-xl text-sm font-medium transition-all ${r?"bg-brand-500/12 text-brand-500 border border-brand-500/25 shadow-[0_2px_12px_-4px_rgba(255,87,10,0.25)]":"text-text-muted hover:bg-surface-2/80 hover:text-text border border-transparent"}`,children:[(0,a.jsx)(s,{size:18,className:r?"text-brand-500":"text-text-subtle"}),(0,a.jsx)("span",{className:"flex-1",children:e.label}),r&&(0,a.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-brand-500"})]},e.href)})]}),(0,a.jsxs)("div",{className:"p-3 border-t border-border-subtle space-y-2",children:[(0,a.jsxs)(d,{href:"/workspace/",className:"flex items-center gap-2.5 px-3.5 py-2 rounded-xl text-xs text-text-muted hover:bg-surface-2 hover:text-text transition-colors border border-border-subtle/50",children:[(0,a.jsx)(m.BK,{size:15,className:"text-brand-500"}),(0,a.jsx)("span",{children:"Open Workspace"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 pt-1",children:[(0,a.jsx)(o.A,{className:"border border-border-subtle hover:bg-surface-2 rounded-xl"}),(0,a.jsxs)("button",{onClick:f,className:"flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-xl text-xs font-medium text-text-muted hover:bg-red-500/10 hover:text-danger hover:border-red-500/20 border border-transparent transition-all",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-3 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-lg 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-7 h-7 rounded-lg flex items-center justify-center font-bold text-sm bg-brand-500 text-white shadow-sm",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-lg"})]}),(0,a.jsx)("aside",{className:"jsx-b56c084163c9c8c1 hidden md:flex fixed inset-y-0 left-0 w-64 border-r border-border-subtle bg-surface/80 backdrop-blur-xl flex-col z-20 shadow-[4px_0_24px_-12px_rgba(0,0,0,0.2)]",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-sm 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-64 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})]})}},57042:(e,t,s)=>{"use strict";s.d(t,{GS:()=>i,Jj:()=>a,Qh:()=>n,Wm:()=>d,lb:()=>o,r6:()=>r,rK:()=>c,xp:()=>l});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"},r=Object.values(a),n=18e5,d=20,l=[10,20,50,100],i=["createdAt","lastAccessAt","expiresAt","machineId"],c=[{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"}],o={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})}},68566:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>u});var a=s(73365),r=s(1521),n=s(38334),d=s(80186),l=s(96042),i=s(64683),c=s(39457),o=s(24945),x=s(57042);let m={username:"",password:"",modeId:""};function u(){let{me:e,can:t}=(0,o.b)(),{get:s,post:u,patch:b,del:h}=(0,c.Z)(),[p,f]=(0,r.useState)([]),[g,j]=(0,r.useState)([]),[N,v]=(0,r.useState)(m),[y,w]=(0,r.useState)(null),[k,A]=(0,r.useState)(""),C=t(x.Jj.adminManage),z=(0,r.useCallback)(async()=>{let[e,t]=await Promise.all([s(x.lb.admins),s(x.lb.modes)]);f(e.items||[]),j(t.items||[]),!N.modeId&&(t.items||[]).length>0&&v(e=>({...e,modeId:t.items[0].id}))},[s]);(0,r.useEffect)(()=>{z()},[z]);let _=()=>{w(null),v({...m,modeId:g[0]?.id||""}),A("")},S=async()=>{A("");try{if(y)await b(`${x.lb.admins}/${y}`,{modeId:N.modeId,...N.password?{password:N.password}:{}});else{if(!N.username||!N.password||!N.modeId)return void A("All fields are required");await u(x.lb.admins,N)}_(),z()}catch(e){A(e.message)}},$=async e=>{if(confirm("Delete this admin account?"))try{await h(`${x.lb.admins}/${e}`),z()}catch(e){alert(e.message)}},I=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}};return(0,a.jsx)(n.A,{children:(0,a.jsxs)("div",{className:"space-y-8 max-w-5xl",children:[(0,a.jsx)("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.zW,{size:24,className:"text-brand-500"}),(0,a.jsx)("span",{children:"Administrators"})]}),(0,a.jsx)("p",{className:"text-xs text-text-muted mt-1",children:"Manage team operator access and privileged accounts"})]})}),C&&(0,a.jsxs)("div",{className:"card-glass p-5 sm:p-6 space-y-4 relative overflow-hidden",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:y?(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:N.username})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.FW,{size:16,className:"text-brand-500"}),(0,a.jsx)("span",{children:"Create Administrator Account"})]})}),y&&(0,a.jsxs)("button",{onClick:_,className:"text-xs text-text-muted hover:text-text flex items-center gap-1",children:[(0,a.jsx)(i.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:N.username,onChange:e=>v({...N,username:e.target.value}),disabled:!!y,placeholder:"operator username"}),(0,a.jsx)(l.A,{label:y?"New Password (optional)":"Password",type:"password",value:N.password,onChange:e=>v({...N,password:e.target.value}),placeholder:y?"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:N.modeId,onChange:e=>v({...N,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:g.map(e=>(0,a.jsxs)("option",{value:e.id,children:[e.name," (",e.id,")"]},e.id))})]})]}),k&&(0,a.jsx)("p",{className:"text-xs text-danger bg-red-500/10 p-2.5 rounded-lg border border-red-500/20",children:k}),(0,a.jsxs)("div",{className:"flex gap-2 pt-2",children:[(0,a.jsx)(d.A,{variant:"primary",onClick:S,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)(i.eM,{size:14}),(0,a.jsx)("span",{children:y?"Update Account":"Create Administrator"})]})}),y&&(0,a.jsx)(d.A,{variant:"secondary",onClick:_,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"}),C&&(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:p.map(t=>{let s=t.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:t.username}),s&&(0,a.jsx)("span",{className:"text-[10px] font-mono px-1.5 py-0.2 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:t.modeName||t.modeId})}),(0,a.jsx)("td",{className:"px-4 py-3.5 text-xs text-text-muted",children:I(t.createdAt)}),(0,a.jsx)("td",{className:"px-4 py-3.5 text-xs text-text font-medium",children:I(t.lastLoginAt)}),C&&(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:()=>{w(t.id),v({username:t.username,password:"",modeId:t.modeId})},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"}),!s&&(0,a.jsx)("button",{onClick:()=>$(t.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)(i.TB,{size:15})})]})})]},t.id)})})]})})]})})}},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:n=!1,loading:d=!1,onClick:l,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]} ${n||d?"cursor-not-allowed":""} ${i}`;return(0,a.jsx)("button",{onClick:l,disabled:n||d,className:o,...c,children:d?(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:n,onKeyDown:d,placeholder:l,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:n,onKeyDown:d,placeholder:l,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,9958,2881,2347,5158,7358],()=>e(e.s=37380)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2116],{29717:(e,t,s)=>{"use strict";var r=s(21505);s.o(r,"usePathname")&&s.d(t,{usePathname:function(){return r.usePathname}}),s.o(r,"useRouter")&&s.d(t,{useRouter:function(){return r.useRouter}}),s.o(r,"useSearchParams")&&s.d(t,{useSearchParams:function(){return r.useSearchParams}})},57042:(e,t,s)=>{"use strict";s.d(t,{GS:()=>d,Jj:()=>r,Qh:()=>a,Wm:()=>i,lb:()=>c,r6:()=>n,rK:()=>o,xp:()=>l});let r={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"},n=Object.values(r),a=18e5,i=20,l=[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"}],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 r=s(73365);function n({children:e,centered:t=!0,className:s=""}){return(0,r.jsx)("div",{className:`min-h-screen ${t?"flex items-center justify-center p-4":""} ${s}`,children:e})}},73249:(e,t,s)=>{Promise.resolve().then(s.bind(s,79365))},79365:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>b});var r=s(73365),n=s(1521),a=s(29717),i=s(99568),l=s(59893),d=s(80186),o=s(96042),c=s(90753),u=s(30240);function x({siteKey:e,onToken:t}){let s=(0,n.useRef)(null),a=(0,n.useRef)(t);return((0,n.useEffect)(()=>{a.current=t},[t]),(0,n.useEffect)(()=>{if(!e||!s.current)return;let t=null,r=()=>{window.turnstile?.render&&s.current&&(t=window.turnstile.render(s.current,{sitekey:e,callback:e=>a.current(e),"expired-callback":()=>a.current(""),"error-callback":()=>a.current("")}))};if(window.turnstile?.render)r();else{let e=document.createElement("script");e.src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit",e.async=!0,e.onload=r,document.head.appendChild(e)}return()=>{null!=t&&window.turnstile?.remove?.(t)}},[e]),e)?(0,r.jsx)("div",{ref:s,className:"flex justify-center min-h-[33px]","aria-label":"Captcha"}):null}var m=s(64683),h=s(57042);function b(){let e=(0,a.useRouter)(),[t,s]=(0,n.useState)(""),[b,g]=(0,n.useState)(""),[p,f]=(0,n.useState)(""),[w,j]=(0,n.useState)(!1),[v,y]=(0,n.useState)(""),[k,N]=(0,n.useState)("");(0,n.useEffect)(()=>{fetch(h.lb.turnstile).then(e=>e.json()).then(e=>y(e?.siteKey||"")).catch(()=>y(""))},[]);let A=async()=>{if(t&&b){j(!0),f("");try{let s=await fetch(h.lb.login,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t,password:b,turnstileToken:k}),credentials:"include"}),r=await s.json();if(!s.ok)throw Error(r?.error||"Login failed");e.replace("/admin")}catch(e){f(e.message),N(""),window.turnstile?.reset?.()}finally{j(!1)}}};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(u.A,{}),(0,r.jsx)(l.A,{children:(0,r.jsxs)("div",{className:"card-glass p-8 sm:p-10 max-w-md w-full relative overflow-hidden",children:[(0,r.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,r.jsxs)("div",{className:"flex items-center justify-between mb-8",children:[(0,r.jsxs)("div",{className:"flex items-center gap-3",children:[(0,r.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,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"text-[11px] font-mono tracking-wider uppercase text-brand-500 font-semibold block",children:"Console"}),(0,r.jsx)("h1",{className:"text-xl font-bold tracking-tight text-text",children:"9Remote Admin"})]})]}),(0,r.jsx)(c.A,{className:"rounded-xl border border-border-subtle"})]}),(0,r.jsxs)("div",{className:"mb-6",children:[(0,r.jsx)("h2",{className:"text-2xl font-bold tracking-tight text-text login-hero-grad",children:"Welcome back"}),(0,r.jsx)("p",{className:"text-xs text-text-muted mt-1",children:"Sign in with administrator credentials to manage node instances"})]}),p&&(0,r.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,r.jsx)(m.RI,{size:15,className:"shrink-0"}),(0,r.jsx)("span",{children:p})]}),(0,r.jsxs)("div",{className:"space-y-4",children:[(0,r.jsx)(o.A,{label:"Admin Username",value:t,onChange:e=>s(e.target.value),placeholder:"e.g. root",autoFocus:!0,onKeyDown:e=>"Enter"===e.key&&A()}),(0,r.jsx)(o.A,{label:"Password",type:"password",value:b,onChange:e=>g(e.target.value),placeholder:"••••••••",onKeyDown:e=>"Enter"===e.key&&A()}),(0,r.jsx)(x,{siteKey:v,onToken:N}),(0,r.jsx)(d.A,{variant:"primary",onClick:A,disabled:!t||!b||v&&!k,loading:w,className:"w-full py-2.5 rounded-xl shadow-[0_8px_20px_-6px_rgba(255,87,10,0.45)] font-semibold",children:(0,r.jsxs)("span",{className:"inline-flex items-center justify-center gap-2",children:[(0,r.jsx)("span",{children:"Authenticate"}),(0,r.jsx)(m.Qp,{size:16})]})})]}),(0,r.jsxs)("div",{className:"mt-8 pt-5 border-t border-border-subtle flex items-center justify-between text-xs text-text-subtle",children:[(0,r.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,r.jsx)(m.ek,{size:13,className:"text-brand-500"}),(0,r.jsx)("span",{children:"Restricted access"})]}),(0,r.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 r=s(73365);function n({children:e,variant:t="primary",size:s="md",disabled:a=!1,loading:i=!1,onClick:l,className:d="",...o}){let c=`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]} ${a||i?"cursor-not-allowed":""} ${d}`;return(0,r.jsx)("button",{onClick:l,disabled:a||i,className:c,...o,children:i?(0,r.jsxs)("span",{className:"flex items-center justify-center gap-2",children:[(0,r.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:()=>d});var r=s(73365),n=s(44976),a=s(8910);let i=({size:e=18})=>(0,r.jsxs)("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,r.jsx)("circle",{cx:"12",cy:"12",r:"4"}),(0,r.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,r.jsx)("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,r.jsx)("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})});function d({className:e="",size:t=18}){let{theme:s,toggleTheme:o}=(0,n.D)(),c="dark"===s;return(0,r.jsx)("button",{type:"button",onClick:()=>{(0,a.e)(),o()},"aria-label":c?"Switch to light theme":"Switch to dark theme",title:c?"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:c?(0,r.jsx)(i,{size:t}):(0,r.jsx)(l,{size:t})})}},96042:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});var r=s(73365);function n({label:e,type:t="text",value:s,onChange:a,onKeyDown:i,placeholder:l,disabled:d=!1,error:o,className:c="",...u}){let x=o?"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 ${x} ${d?"opacity-50 cursor-not-allowed":""} ${c}`;return(0,r.jsxs)("div",{className:"w-full",children:[e&&(0,r.jsx)("label",{className:"block text-sm font-medium text-text mb-2",children:e}),(0,r.jsx)("input",{type:t,value:s,onChange:a,onKeyDown:i,placeholder:l,disabled:d,className:m,...u}),o&&(0,r.jsx)("p",{className:"mt-1 text-sm text-red-400",children:o})]})}}},e=>{e.O(0,[6669,9568,9958,2347,5158,7358],()=>e(e.s=73249)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[589],{16064:(e,s,t)=>{Promise.resolve().then(t.bind(t,91758))},24945:(e,s,t)=>{"use strict";t.d(s,{b:()=>l});var r=t(1521),a=t(29717),n=t(57042),i=t(39457);function l({redirectIfUnauthed:e=!0}={}){let s=(0,a.useRouter)(),{get:t,post:d}=(0,i.Z)(),[c,o]=(0,r.useState)(null),[x,m]=(0,r.useState)(!0),u=(0,r.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,r.useEffect)(()=>{u()},[u]);let b=(0,r.useCallback)(async()=>{await d(n.lb.logout,{}),s.replace("/admin/login")},[d,s]),h=(0,r.useCallback)(e=>Array.isArray(c?.permissions)&&c.permissions.includes(e),[c]);return{me:c,loading:x,logout:b,can:h,refresh:u}}},29717:(e,s,t)=>{"use strict";var r=t(21505);t.o(r,"usePathname")&&t.d(s,{usePathname:function(){return r.usePathname}}),t.o(r,"useRouter")&&t.d(s,{useRouter:function(){return r.useRouter}}),t.o(r,"useSearchParams")&&t.d(s,{useSearchParams:function(){return r.useSearchParams}})},38334:(e,s,t)=>{"use strict";t.d(s,{A:()=>h});var r=t(73365),a=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 b=[{href:"/admin",label:"Dashboard",icon:m.Hx,exact:!0},{href:"/admin/modes",label:"Modes",icon:m.ek},{href:"/admin/admins",label:"Admins",icon:m.zW},{href:"/admin/ota",label:"OTA Updates",icon:m.lP},{href:"/admin/turn",label:"TURN Keys",icon:m.kV}];function h({children:e}){let s=(0,l.usePathname)(),{me:t,loading:p,logout:f}=(0,u.b)(),[g,j]=(0,n.useState)(!1);if(p||!t)return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(x.A,{}),(0,r.jsx)(c.A,{children:(0,r.jsx)("div",{className:"card-glass p-8 max-w-sm w-full flex flex-col items-center justify-center",children:(0,r.jsx)(d.A,{size:"lg",text:"Loading admin..."})})})]});let N=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"p-5 border-b border-border-subtle flex items-center justify-between gap-3",children:[(0,r.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,r.jsx)("div",{className:"w-9 h-9 shrink-0 rounded-xl flex items-center justify-center font-bold text-lg bg-brand-500 text-white shadow-[0_8px_24px_-8px_rgba(255,87,10,0.6)] ring-1 ring-white/20",children:"9"}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("h1",{className:"text-sm font-bold tracking-tight text-text truncate",children:"9Remote Admin"}),(0,r.jsxs)("div",{className:"flex items-center gap-1.5 mt-0.5",children:[(0,r.jsx)("span",{className:"text-xs text-text-muted truncate",children:t.username}),(0,r.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/20",children:t.modeName||t.modeId})]})]})]}),(0,r.jsx)("button",{onClick:()=>j(!1),className:"md:hidden text-text-muted hover:text-text shrink-0 p-1.5 rounded-lg hover:bg-surface-2 transition-colors","aria-label":"Close menu",children:(0,r.jsx)(m.X,{size:18})})]}),(0,r.jsxs)("nav",{className:"flex-1 p-3 space-y-1 overflow-y-auto",children:[(0,r.jsx)("div",{className:"px-3 py-1.5 text-[11px] font-mono uppercase tracking-wider text-text-subtle",children:"Navigation"}),b.map(e=>{let t=e.icon,a=e.exact?s===e.href:s.startsWith(e.href);return(0,r.jsxs)(i,{href:e.href,onClick:()=>j(!1),className:`flex items-center gap-3 px-3.5 py-2.5 rounded-xl text-sm font-medium transition-all ${a?"bg-brand-500/12 text-brand-500 border border-brand-500/25 shadow-[0_2px_12px_-4px_rgba(255,87,10,0.25)]":"text-text-muted hover:bg-surface-2/80 hover:text-text border border-transparent"}`,children:[(0,r.jsx)(t,{size:18,className:a?"text-brand-500":"text-text-subtle"}),(0,r.jsx)("span",{className:"flex-1",children:e.label}),a&&(0,r.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-brand-500"})]},e.href)})]}),(0,r.jsxs)("div",{className:"p-3 border-t border-border-subtle space-y-2",children:[(0,r.jsxs)(i,{href:"/workspace/",className:"flex items-center gap-2.5 px-3.5 py-2 rounded-xl text-xs text-text-muted hover:bg-surface-2 hover:text-text transition-colors border border-border-subtle/50",children:[(0,r.jsx)(m.BK,{size:15,className:"text-brand-500"}),(0,r.jsx)("span",{children:"Open Workspace"})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2 pt-1",children:[(0,r.jsx)(o.A,{className:"border border-border-subtle hover:bg-surface-2 rounded-xl"}),(0,r.jsxs)("button",{onClick:f,className:"flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-xl text-xs font-medium text-text-muted hover:bg-red-500/10 hover:text-danger hover:border-red-500/20 border border-transparent transition-all",children:[(0,r.jsx)(m.nU,{size:15}),"Logout"]})]})]})]});return(0,r.jsxs)("div",{className:"jsx-b56c084163c9c8c1 min-h-screen text-text relative selection:bg-brand-500/20",children:[(0,r.jsx)(x.A,{}),(0,r.jsxs)("header",{className:"jsx-b56c084163c9c8c1 md:hidden sticky top-0 z-30 flex items-center justify-between px-4 py-3 bg-surface/80 backdrop-blur-md border-b border-border-subtle",children:[(0,r.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-lg hover:bg-surface-2",children:(0,r.jsx)(m.W1,{size:20})}),(0,r.jsxs)("div",{className:"jsx-b56c084163c9c8c1 flex items-center gap-2",children:[(0,r.jsx)("div",{className:"jsx-b56c084163c9c8c1 w-7 h-7 rounded-lg flex items-center justify-center font-bold text-sm bg-brand-500 text-white shadow-sm",children:"9"}),(0,r.jsx)("h1",{className:"jsx-b56c084163c9c8c1 text-sm font-semibold tracking-tight",children:"9Remote Admin"})]}),(0,r.jsx)(o.A,{className:"rounded-lg"})]}),(0,r.jsx)("aside",{className:"jsx-b56c084163c9c8c1 hidden md:flex fixed inset-y-0 left-0 w-64 border-r border-border-subtle bg-surface/80 backdrop-blur-xl flex-col z-20 shadow-[4px_0_24px_-12px_rgba(0,0,0,0.2)]",children:N}),g&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{onClick:()=>j(!1),className:"jsx-b56c084163c9c8c1 md:hidden fixed inset-0 z-40 bg-black/60 backdrop-blur-sm fade-in"}),(0,r.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,r.jsx)("main",{className:"jsx-b56c084163c9c8c1 md:ml-64 p-4 sm:p-6 lg:p-8 min-h-screen relative z-10 max-w-7xl",children:e}),(0,r.jsx)(a,{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 r=t(1521);async function a(e,s={}){let t=await fetch(e,{...s,headers:{"Content-Type":"application/json",...s.headers||{}},credentials:"include"}),r=await t.json().catch(()=>({}));if(!t.ok)throw Error(r?.error||`Request failed (${t.status})`);return r}function n(){let e=(0,r.useCallback)(e=>a(e),[]),s=(0,r.useCallback)((e,s)=>a(e,{method:"POST",body:JSON.stringify(s||{})}),[]);return{get:e,post:s,patch:(0,r.useCallback)((e,s)=>a(e,{method:"PATCH",body:JSON.stringify(s||{})}),[]),del:(0,r.useCallback)(e=>a(e,{method:"DELETE"}),[])}}},45111:(e,s,t)=>{"use strict";t.d(s,{A:()=>a});var r=t(73365);function a({size:e="md",text:s,className:t=""}){return(0,r.jsxs)("div",{className:`flex flex-col items-center justify-center gap-3 ${t}`,children:[(0,r.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,r.jsx)("p",{className:"text-brand-500 text-sm font-medium",children:s})]})}},57042:(e,s,t)=>{"use strict";t.d(s,{GS:()=>d,Jj:()=>r,Qh:()=>n,Wm:()=>i,lb:()=>o,r6:()=>a,rK:()=>c,xp:()=>l});let r={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"},a=Object.values(r),n=18e5,i=20,l=[10,20,50,100],d=["createdAt","lastAccessAt","expiresAt","machineId"],c=[{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"}],o={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:()=>a});var r=t(73365);function a({children:e,centered:s=!0,className:t=""}){return(0,r.jsx)("div",{className:`min-h-screen ${s?"flex items-center justify-center p-4":""} ${t}`,children:e})}},80186:(e,s,t)=>{"use strict";t.d(s,{A:()=>a});var r=t(73365);function a({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,r.jsx)("button",{onClick:l,disabled:n||i,className:o,...c,children:i?(0,r.jsxs)("span",{className:"flex items-center justify-center gap-2",children:[(0,r.jsx)("span",{className:"animate-spin rounded-full h-4 w-4 border-b-2 border-white"}),e]}):e})}},91758:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>u});var r=t(73365),a=t(1521),n=t(38334),i=t(80186),l=t(96042),d=t(64683),c=t(39457),o=t(24945),x=t(57042);let m={id:"",name:"",permissions:[]};function u(){let{can:e}=(0,o.b)(),{get:s,post:t,patch:u,del:b}=(0,c.Z)(),[h,p]=(0,a.useState)([]),[f,g]=(0,a.useState)(m),[j,N]=(0,a.useState)(null),[v,y]=(0,a.useState)(""),w=e(x.Jj.modeManage),k=(0,a.useCallback)(async()=>{p((await s(x.lb.modes)).items||[])},[s]);(0,a.useEffect)(()=>{k()},[k]);let C=()=>{N(null),g(m),y("")},A=async()=>{y("");try{if(j)await u(`${x.lb.modes}/${j}`,{name:f.name,permissions:f.permissions});else{if(!f.id||!f.name)return void y("ID and name are required");await t(x.lb.modes,f)}C(),k()}catch(e){y(e.message)}},_=async e=>{if(confirm(`Delete mode ${e}?`))try{await b(`${x.lb.modes}/${e}`),k()}catch(e){alert(e.message)}};return(0,r.jsx)(n.A,{children:(0,r.jsxs)("div",{className:"space-y-8 max-w-5xl",children:[(0,r.jsx)("div",{className:"flex items-center justify-between",children:(0,r.jsxs)("div",{children:[(0,r.jsxs)("h1",{className:"text-2xl font-bold tracking-tight text-text login-hero-grad flex items-center gap-2.5",children:[(0,r.jsx)(d.ek,{size:24,className:"text-brand-500"}),(0,r.jsx)("span",{children:"Modes & Permissions"})]}),(0,r.jsx)("p",{className:"text-xs text-text-muted mt-1",children:"Configure security roles and granular permission sets"})]})}),w&&(0,r.jsxs)("div",{className:"card-glass p-5 sm:p-6 space-y-4 relative overflow-hidden",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between border-b border-border-subtle/60 pb-3",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold tracking-tight text-text flex items-center gap-2",children:j?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("span",{className:"text-text-muted",children:"Edit role:"}),(0,r.jsx)("span",{className:"font-mono text-brand-500 font-bold",children:j})]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(d.FW,{size:16,className:"text-brand-500"}),(0,r.jsx)("span",{children:"Create New Security Mode"})]})}),j&&(0,r.jsxs)("button",{onClick:C,className:"text-xs text-text-muted hover:text-text flex items-center gap-1",children:[(0,r.jsx)(d.X,{size:14})," Cancel"]})]}),(0,r.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[(0,r.jsx)(l.A,{label:"Mode ID",value:f.id,onChange:e=>g({...f,id:e.target.value}),disabled:!!j,placeholder:"e.g. support-lead"}),(0,r.jsx)(l.A,{label:"Display Name",value:f.name,onChange:e=>g({...f,name:e.target.value}),placeholder:"e.g. Support Team Lead"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("label",{className:"block text-xs font-mono uppercase tracking-wider text-text-muted mb-2.5",children:"Permissions Granted"}),(0,r.jsx)("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-2",children:x.r6.map(e=>{let s=f.permissions.includes(e);return(0,r.jsxs)("button",{type:"button",onClick:()=>{g(s=>({...s,permissions:s.permissions.includes(e)?s.permissions.filter(s=>s!==e):[...s.permissions,e]}))},className:`flex items-center justify-between px-3 py-2 rounded-xl text-xs font-mono border transition-all text-left ${s?"bg-brand-500/12 text-brand-500 border-brand-500/30 shadow-[0_2px_8px_-2px_rgba(255,87,10,0.2)]":"bg-surface-2/60 text-text-muted border-border-subtle hover:bg-surface-2 hover:text-text"}`,children:[(0,r.jsx)("span",{className:"truncate",children:e}),s?(0,r.jsx)(d.aJ,{size:13,className:"text-brand-500 shrink-0 ml-1.5"}):null]},e)})})]}),v&&(0,r.jsx)("p",{className:"text-xs text-danger bg-red-500/10 p-2.5 rounded-lg border border-red-500/20",children:v}),(0,r.jsxs)("div",{className:"flex gap-2 pt-2",children:[(0,r.jsx)(i.A,{variant:"primary",onClick:A,className:"rounded-xl px-4 py-2",children:(0,r.jsxs)("span",{className:"inline-flex items-center gap-1.5 text-xs font-semibold",children:[(0,r.jsx)(d.eM,{size:14}),(0,r.jsx)("span",{children:j?"Save Changes":"Create Mode"})]})}),j&&(0,r.jsx)(i.A,{variant:"secondary",onClick:C,className:"rounded-xl px-4 py-2 text-xs",children:"Cancel"})]})]}),(0,r.jsx)("div",{className:"card-glass overflow-hidden",children:(0,r.jsxs)("table",{className:"w-full text-sm text-left",children:[(0,r.jsx)("thead",{className:"bg-surface-2/60 border-b border-border-subtle text-[11px] font-mono uppercase tracking-wider text-text-muted",children:(0,r.jsxs)("tr",{children:[(0,r.jsx)("th",{className:"px-4 py-3",children:"ID"}),(0,r.jsx)("th",{className:"px-4 py-3",children:"Role Name"}),(0,r.jsx)("th",{className:"px-4 py-3",children:"Assigned Permissions"}),w&&(0,r.jsx)("th",{className:"px-4 py-3 text-right",children:"Actions"})]})}),(0,r.jsx)("tbody",{className:"divide-y divide-border-subtle/50",children:h.map(e=>{let s=[];try{s="string"==typeof e.permissions?JSON.parse(e.permissions):e.permissions}catch{s=[]}return(0,r.jsxs)("tr",{className:"hover:bg-surface-2/40 transition-colors",children:[(0,r.jsx)("td",{className:"px-4 py-3.5 font-mono text-xs font-semibold text-text",children:e.id}),(0,r.jsx)("td",{className:"px-4 py-3.5 font-medium text-text",children:e.name}),(0,r.jsx)("td",{className:"px-4 py-3.5",children:(0,r.jsx)("div",{className:"flex flex-wrap gap-1 max-w-md",children:s.map(e=>(0,r.jsx)("span",{className:"px-2 py-0.5 rounded-md bg-surface-2 border border-border-subtle text-[10px] font-mono text-text-muted",children:e},e))})}),w&&(0,r.jsx)("td",{className:"px-4 py-3.5 text-right",children:(0,r.jsxs)("div",{className:"inline-flex items-center gap-2",children:[(0,r.jsx)("button",{onClick:()=>(e=>{let s=[];try{s="string"==typeof e.permissions?JSON.parse(e.permissions):e.permissions}catch{s=[]}N(e.id),g({id:e.id,name:e.name,permissions:s})})(e),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,r.jsx)("button",{onClick:()=>_(e.id),className:"text-text-muted hover:text-danger p-1 rounded hover:bg-red-500/10 transition-colors",title:"Delete mode",children:(0,r.jsx)(d.TB,{size:15})})]})})]},e.id)})})]})})]})})}},96042:(e,s,t)=>{"use strict";t.d(s,{A:()=>a});var r=t(73365);function a({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,r.jsxs)("div",{className:"w-full",children:[e&&(0,r.jsx)("label",{className:"block text-sm font-medium text-text mb-2",children:e}),(0,r.jsx)("input",{type:s,value:t,onChange:n,onKeyDown:i,placeholder:l,disabled:d,className:u,...x}),c&&(0,r.jsx)("p",{className:"mt-1 text-sm text-red-400",children:c})]})}}},e=>{e.O(0,[6669,9568,9958,2881,2347,5158,7358],()=>e(e.s=16064)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8535],{24945:(e,t,s)=>{"use strict";s.d(t,{b:()=>i});var r=s(1521),a=s(29717),n=s(57042),l=s(39457);function i({redirectIfUnauthed:e=!0}={}){let t=(0,a.useRouter)(),{get:s,post:d}=(0,l.Z)(),[c,o]=(0,r.useState)(null),[x,m]=(0,r.useState)(!0),u=(0,r.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,r.useEffect)(()=>{u()},[u]);let b=(0,r.useCallback)(async()=>{await d(n.lb.logout,{}),t.replace("/admin/login")},[d,t]),h=(0,r.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 r=s(21505);s.o(r,"usePathname")&&s.d(t,{usePathname:function(){return r.usePathname}}),s.o(r,"useRouter")&&s.d(t,{useRouter:function(){return r.useRouter}}),s.o(r,"useSearchParams")&&s.d(t,{useSearchParams:function(){return r.useSearchParams}})},38334:(e,t,s)=>{"use strict";s.d(t,{A:()=>h});var r=s(73365),a=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/modes",label:"Modes",icon:m.ek},{href:"/admin/admins",label:"Admins",icon:m.zW},{href:"/admin/ota",label:"OTA Updates",icon:m.lP},{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,n.useState)(!1);if(p||!s)return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(x.A,{}),(0,r.jsx)(c.A,{children:(0,r.jsx)("div",{className:"card-glass p-8 max-w-sm w-full flex flex-col items-center justify-center",children:(0,r.jsx)(d.A,{size:"lg",text:"Loading admin..."})})})]});let N=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"p-5 border-b border-border-subtle flex items-center justify-between gap-3",children:[(0,r.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,r.jsx)("div",{className:"w-9 h-9 shrink-0 rounded-xl flex items-center justify-center font-bold text-lg bg-brand-500 text-white shadow-[0_8px_24px_-8px_rgba(255,87,10,0.6)] ring-1 ring-white/20",children:"9"}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("h1",{className:"text-sm font-bold tracking-tight text-text truncate",children:"9Remote Admin"}),(0,r.jsxs)("div",{className:"flex items-center gap-1.5 mt-0.5",children:[(0,r.jsx)("span",{className:"text-xs text-text-muted truncate",children:s.username}),(0,r.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/20",children:s.modeName||s.modeId})]})]})]}),(0,r.jsx)("button",{onClick:()=>j(!1),className:"md:hidden text-text-muted hover:text-text shrink-0 p-1.5 rounded-lg hover:bg-surface-2 transition-colors","aria-label":"Close menu",children:(0,r.jsx)(m.X,{size:18})})]}),(0,r.jsxs)("nav",{className:"flex-1 p-3 space-y-1 overflow-y-auto",children:[(0,r.jsx)("div",{className:"px-3 py-1.5 text-[11px] font-mono uppercase tracking-wider text-text-subtle",children:"Navigation"}),b.map(e=>{let s=e.icon,a=e.exact?t===e.href:t.startsWith(e.href);return(0,r.jsxs)(l,{href:e.href,onClick:()=>j(!1),className:`flex items-center gap-3 px-3.5 py-2.5 rounded-xl text-sm font-medium transition-all ${a?"bg-brand-500/12 text-brand-500 border border-brand-500/25 shadow-[0_2px_12px_-4px_rgba(255,87,10,0.25)]":"text-text-muted hover:bg-surface-2/80 hover:text-text border border-transparent"}`,children:[(0,r.jsx)(s,{size:18,className:a?"text-brand-500":"text-text-subtle"}),(0,r.jsx)("span",{className:"flex-1",children:e.label}),a&&(0,r.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-brand-500"})]},e.href)})]}),(0,r.jsxs)("div",{className:"p-3 border-t border-border-subtle space-y-2",children:[(0,r.jsxs)(l,{href:"/workspace/",className:"flex items-center gap-2.5 px-3.5 py-2 rounded-xl text-xs text-text-muted hover:bg-surface-2 hover:text-text transition-colors border border-border-subtle/50",children:[(0,r.jsx)(m.BK,{size:15,className:"text-brand-500"}),(0,r.jsx)("span",{children:"Open Workspace"})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2 pt-1",children:[(0,r.jsx)(o.A,{className:"border border-border-subtle hover:bg-surface-2 rounded-xl"}),(0,r.jsxs)("button",{onClick:f,className:"flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-xl text-xs font-medium text-text-muted hover:bg-red-500/10 hover:text-danger hover:border-red-500/20 border border-transparent transition-all",children:[(0,r.jsx)(m.nU,{size:15}),"Logout"]})]})]})]});return(0,r.jsxs)("div",{className:"jsx-b56c084163c9c8c1 min-h-screen text-text relative selection:bg-brand-500/20",children:[(0,r.jsx)(x.A,{}),(0,r.jsxs)("header",{className:"jsx-b56c084163c9c8c1 md:hidden sticky top-0 z-30 flex items-center justify-between px-4 py-3 bg-surface/80 backdrop-blur-md border-b border-border-subtle",children:[(0,r.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-lg hover:bg-surface-2",children:(0,r.jsx)(m.W1,{size:20})}),(0,r.jsxs)("div",{className:"jsx-b56c084163c9c8c1 flex items-center gap-2",children:[(0,r.jsx)("div",{className:"jsx-b56c084163c9c8c1 w-7 h-7 rounded-lg flex items-center justify-center font-bold text-sm bg-brand-500 text-white shadow-sm",children:"9"}),(0,r.jsx)("h1",{className:"jsx-b56c084163c9c8c1 text-sm font-semibold tracking-tight",children:"9Remote Admin"})]}),(0,r.jsx)(o.A,{className:"rounded-lg"})]}),(0,r.jsx)("aside",{className:"jsx-b56c084163c9c8c1 hidden md:flex fixed inset-y-0 left-0 w-64 border-r border-border-subtle bg-surface/80 backdrop-blur-xl flex-col z-20 shadow-[4px_0_24px_-12px_rgba(0,0,0,0.2)]",children:N}),g&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{onClick:()=>j(!1),className:"jsx-b56c084163c9c8c1 md:hidden fixed inset-0 z-40 bg-black/60 backdrop-blur-sm fade-in"}),(0,r.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,r.jsx)("main",{className:"jsx-b56c084163c9c8c1 md:ml-64 p-4 sm:p-6 lg:p-8 min-h-screen relative z-10 max-w-7xl",children:e}),(0,r.jsx)(a,{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 r=s(1521);async function a(e,t={}){let s=await fetch(e,{...t,headers:{"Content-Type":"application/json",...t.headers||{}},credentials:"include"}),r=await s.json().catch(()=>({}));if(!s.ok)throw Error(r?.error||`Request failed (${s.status})`);return r}function n(){let e=(0,r.useCallback)(e=>a(e),[]),t=(0,r.useCallback)((e,t)=>a(e,{method:"POST",body:JSON.stringify(t||{})}),[]);return{get:e,post:t,patch:(0,r.useCallback)((e,t)=>a(e,{method:"PATCH",body:JSON.stringify(t||{})}),[]),del:(0,r.useCallback)(e=>a(e,{method:"DELETE"}),[])}}},45111:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});var r=s(73365);function a({size:e="md",text:t,className:s=""}){return(0,r.jsxs)("div",{className:`flex flex-col items-center justify-center gap-3 ${s}`,children:[(0,r.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,r.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 r=s(73365),a=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}=(0,i.b)(),{get:t,post:s}=(0,l.Z)(),[x,m]=(0,a.useState)([]),[u,b]=(0,a.useState)(!0),[h,p]=(0,a.useState)(""),[f,g]=(0,a.useState)({runtimeVersion:"",platform:"",channel:""}),[j,N]=(0,a.useState)(null),y=e(d.Jj.otaManage),v=(0,a.useCallback)(async()=>{b(!0),p("");try{let e=new URLSearchParams;f.runtimeVersion&&e.set("runtimeVersion",f.runtimeVersion),f.platform&&e.set("platform",f.platform),f.channel&&e.set("channel",f.channel);let s=await t(`${d.lb.ota}?${e}`);m(s.items||[])}catch(e){p(e.message)}finally{b(!1)}},[t,f.runtimeVersion,f.platform,f.channel]);(0,a.useEffect)(()=>{v()},[]);let w=async e=>{if(confirm(`Promote #${e.buildNumber} to serving for channel "${e.channel}" (${e.platform}, ${e.runtimeVersion})?`)){N(e.id);try{await s(`${d.lb.ota}/${e.id}/promote`),await v()}catch(e){p(e.message)}finally{N(null)}}};return(0,r.jsx)(n.A,{children:(0,r.jsxs)("div",{className:"space-y-8 max-w-5xl",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{children:[(0,r.jsxs)("h1",{className:"text-2xl font-bold tracking-tight text-text login-hero-grad flex items-center gap-2.5",children:[(0,r.jsx)(c.lP,{size:24,className:"text-brand-500"}),(0,r.jsx)("span",{children:"OTA Updates"})]}),(0,r.jsx)("p",{className:"text-xs text-text-muted mt-1",children:"Publish, promote and rollback mobile application bundles"})]}),(0,r.jsxs)("button",{onClick:v,disabled:u,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,r.jsx)(c.e9,{size:13,className:u?"animate-spin text-brand-500":""}),(0,r.jsx)("span",{children:"Refresh"})]})]}),(0,r.jsxs)("div",{className:"card-glass p-4 grid grid-cols-1 sm:grid-cols-4 gap-3",children:[(0,r.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:f.runtimeVersion,onChange:e=>g({...f,runtimeVersion:e.target.value})}),(0,r.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:f.platform,onChange:e=>g({...f,platform:e.target.value}),children:o.map(e=>(0,r.jsx)("option",{value:e,children:e?e.toUpperCase():"All platforms"},e))}),(0,r.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:f.channel,onChange:e=>g({...f,channel:e.target.value})}),(0,r.jsx)("button",{onClick:v,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"})]}),h&&(0,r.jsx)("p",{className:"text-xs text-danger bg-red-500/10 p-3 rounded-xl border border-red-500/20",children:h}),u?(0,r.jsxs)("div",{className:"card-glass p-12 text-center text-text-muted text-xs",children:[(0,r.jsx)(c.e9,{size:20,className:"mx-auto mb-2 animate-spin text-brand-500"}),"Loading updates catalog..."]}):0===x.length?(0,r.jsxs)("div",{className:"card-glass p-12 text-center",children:[(0,r.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,r.jsx)(c.lP,{size:24})}),(0,r.jsx)("h3",{className:"text-sm font-semibold text-text",children:"No updates published"}),(0,r.jsxs)("p",{className:"text-text-muted text-xs mt-1",children:["Publish an OTA update package with ",(0,r.jsx)("code",{className:"text-brand-500 font-mono px-1.5 py-0.5 rounded bg-surface-2",children:"npm run update"})]})]}):(0,r.jsx)("div",{className:"card-glass overflow-hidden",children:(0,r.jsxs)("table",{className:"w-full text-sm text-left",children:[(0,r.jsx)("thead",{className:"bg-surface-2/60 border-b border-border-subtle text-[11px] font-mono uppercase tracking-wider text-text-muted",children:(0,r.jsxs)("tr",{children:[(0,r.jsx)("th",{className:"px-4 py-3",children:"Build"}),(0,r.jsx)("th",{className:"px-4 py-3",children:"Runtime"}),(0,r.jsx)("th",{className:"px-4 py-3",children:"Platform"}),(0,r.jsx)("th",{className:"px-4 py-3",children:"Channel"}),(0,r.jsx)("th",{className:"px-4 py-3",children:"Published"}),(0,r.jsx)("th",{className:"px-4 py-3",children:"Status"}),y&&(0,r.jsx)("th",{className:"px-4 py-3 text-right",children:"Actions"})]})}),(0,r.jsx)("tbody",{className:"divide-y divide-border-subtle/50",children:x.map(e=>(0,r.jsxs)("tr",{className:"hover:bg-surface-2/40 transition-colors",children:[(0,r.jsxs)("td",{className:"px-4 py-3.5",children:[(0,r.jsxs)("div",{className:"font-medium text-text",children:[(0,r.jsxs)("span",{className:"text-brand-500 font-mono font-bold mr-2",children:["#",e.buildNumber]}),(0,r.jsx)("span",{children:e.message||"(no message)"})]}),(0,r.jsx)("div",{className:"text-[10px] text-text-subtle font-mono mt-0.5",children:e.id.slice(0,8)})]}),(0,r.jsx)("td",{className:"px-4 py-3.5 text-xs font-mono text-text-muted",children:e.runtimeVersion}),(0,r.jsx)("td",{className:"px-4 py-3.5",children:(0,r.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,r.jsx)("td",{className:"px-4 py-3.5",children:(0,r.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,r.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,r.jsx)("td",{className:"px-4 py-3.5",children:e.isServing?(0,r.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,r.jsx)(c.Jl,{size:13}),(0,r.jsx)("span",{children:"Serving"})]}):(0,r.jsx)("span",{className:"text-xs font-mono text-text-subtle px-2 py-0.5 rounded bg-surface-2",children:e.status})}),y&&(0,r.jsx)("td",{className:"px-4 py-3.5 text-right",children:!e.isServing&&(0,r.jsxs)("button",{onClick:()=>w(e),disabled:j===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,r.jsx)("span",{children:j===e.id?"Promoting...":"Promote"}),(0,r.jsx)(c.F1,{size:13})]})})]},e.id))})]})})]})})}},57042:(e,t,s)=>{"use strict";s.d(t,{GS:()=>d,Jj:()=>r,Qh:()=>n,Wm:()=>l,lb:()=>o,r6:()=>a,rK:()=>c,xp:()=>i});let r={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"},a=Object.values(r),n=18e5,l=20,i=[10,20,50,100],d=["createdAt","lastAccessAt","expiresAt","machineId"],c=[{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"}],o={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:()=>a});var r=s(73365);function a({children:e,centered:t=!0,className:s=""}){return(0,r.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,9958,2881,2347,5158,7358],()=>e(e.s=62554)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
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),r=s(29717),l=s(57042),n=s(39457);function i({redirectIfUnauthed:e=!0}={}){let t=(0,r.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(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 c(l.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}}},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),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/modes",label:"Modes",icon:m.ek},{href:"/admin/admins",label:"Admins",icon:m.zW},{href:"/admin/ota",label:"OTA Updates",icon:m.lP},{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,l.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-5 border-b border-border-subtle flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,a.jsx)("div",{className:"w-9 h-9 shrink-0 rounded-xl flex items-center justify-center font-bold text-lg bg-brand-500 text-white shadow-[0_8px_24px_-8px_rgba(255,87,10,0.6)] ring-1 ring-white/20",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-brand-500/10 text-brand-500 border border-brand-500/20",children:s.modeName||s.modeId})]})]})]}),(0,a.jsx)("button",{onClick:()=>j(!1),className:"md:hidden text-text-muted hover:text-text shrink-0 p-1.5 rounded-lg 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 p-3 space-y-1 overflow-y-auto",children:[(0,a.jsx)("div",{className:"px-3 py-1.5 text-[11px] font-mono uppercase tracking-wider text-text-subtle",children:"Navigation"}),b.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:`flex items-center gap-3 px-3.5 py-2.5 rounded-xl text-sm font-medium transition-all ${r?"bg-brand-500/12 text-brand-500 border border-brand-500/25 shadow-[0_2px_12px_-4px_rgba(255,87,10,0.25)]":"text-text-muted hover:bg-surface-2/80 hover:text-text border border-transparent"}`,children:[(0,a.jsx)(s,{size:18,className:r?"text-brand-500":"text-text-subtle"}),(0,a.jsx)("span",{className:"flex-1",children:e.label}),r&&(0,a.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-brand-500"})]},e.href)})]}),(0,a.jsxs)("div",{className:"p-3 border-t border-border-subtle space-y-2",children:[(0,a.jsxs)(n,{href:"/workspace/",className:"flex items-center gap-2.5 px-3.5 py-2 rounded-xl text-xs text-text-muted hover:bg-surface-2 hover:text-text transition-colors border border-border-subtle/50",children:[(0,a.jsx)(m.BK,{size:15,className:"text-brand-500"}),(0,a.jsx)("span",{children:"Open Workspace"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 pt-1",children:[(0,a.jsx)(o.A,{className:"border border-border-subtle hover:bg-surface-2 rounded-xl"}),(0,a.jsxs)("button",{onClick:f,className:"flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-xl text-xs font-medium text-text-muted hover:bg-red-500/10 hover:text-danger hover:border-red-500/20 border border-transparent transition-all",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-3 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-lg 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-7 h-7 rounded-lg flex items-center justify-center font-bold text-sm bg-brand-500 text-white shadow-sm",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-lg"})]}),(0,a.jsx)("aside",{className:"jsx-b56c084163c9c8c1 hidden md:flex fixed inset-y-0 left-0 w-64 border-r border-border-subtle bg-surface/80 backdrop-blur-xl flex-col z-20 shadow-[4px_0_24px_-12px_rgba(0,0,0,0.2)]",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-sm 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-64 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"}),[])}}},42761:(e,t,s)=>{Promise.resolve().then(s.bind(s,68577))},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})]})}},57042:(e,t,s)=>{"use strict";s.d(t,{GS:()=>c,Jj:()=>a,Qh:()=>l,Wm:()=>n,lb:()=>o,r6:()=>r,rK:()=>d,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"},r=Object.values(a),l=18e5,n=20,i=[10,20,50,100],c=["createdAt","lastAccessAt","expiresAt","machineId"],d=[{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"}],o={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})}},68577:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>y});var a=s(73365),r=s(1521),l=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,r=e?.[t.key];return(0,a.jsxs)("div",{className:"card-glass p-4 relative overflow-hidden transition-all duration-200 hover:-translate-y-0.5 group",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} transition-transform group-hover:scale-110`,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-2xl sm:text-3xl font-bold tracking-tight font-mono ${t.color}`,children:r??"-"}),null!=r&&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),r="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 ${r}`,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),r=t%60;return s>0?`${s}d ${a}h`:a>0?`${a}h ${r}m`:`${r}m`}(s)})]})}function h({items:e,sortBy:t,order:s,onSortChange:r,onDelete:l,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=>r(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:()=>r(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:()=>l(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?r(a,"asc"===s?"desc":"asc"):r(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:()=>l(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:r,onPageSizeChange:l}){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=>l(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:()=>r(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:()=>r(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})})]})]})]})}let f={ok:"Success",badPassword:"Wrong password",unknownUser:"Unknown user",turnstile:"Captcha failed",locked:"Locked out"};function g({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)(n.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.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,t)=>(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)(n.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)(n.RI,{size:11})," ",f[e.reason]||e.reason]})})]},t))]})]})})]})}var j=s(39457),N=s(24945);function y(){let{can:e}=(0,N.b)(),{get:t,del:s}=(0,j.Z)(),[i,o]=(0,r.useState)(null),[x,m]=(0,r.useState)([]),[u,b]=(0,r.useState)([]),[f,y]=(0,r.useState)(0),[v,w]=(0,r.useState)(""),[k,A]=(0,r.useState)("lastAccessAt"),[C,S]=(0,r.useState)("desc"),[z,I]=(0,r.useState)(1),[P,L]=(0,r.useState)(d.Wm),[$,D]=(0,r.useState)(!1),M=(0,r.useCallback)(async()=>{D(!0);try{let s=new URLSearchParams({search:v,sortBy:k,order:C,page:String(z),pageSize:String(P)}),a=[t(`${d.lb.sessions}?${s.toString()}`),t(d.lb.stats)];e(d.Jj.logView)&&a.push(t(d.lb.logins));let[r,l,n]=await Promise.all(a);b(r.items||[]),y(r.total||0),o(l),n&&m(n.items||[])}catch(e){console.error(e)}finally{D(!1)}},[e,t,v,k,C,z,P]);(0,r.useEffect)(()=>{M()},[M]);let _=async e=>{confirm(`Delete session ${e}?`)&&(await s(`${d.lb.sessions}/${e}`),M())};return(0,a.jsx)(l.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-2xl font-bold tracking-tight text-text login-hero-grad",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:M,disabled:$,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:$?"animate-spin text-brand-500":""}),(0,a.jsx)("span",{children:"Refresh"})]})]}),(0,a.jsx)("section",{children:(0,a.jsx)(c,{stats:i})}),e(d.Jj.logView)&&(0,a.jsx)(g,{items: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-lg font-bold tracking-tight text-text",children:"Active Sessions"}),(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=>{w(e.target.value),I(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:k,order:C,onSortChange:(e,t)=>{A(e),S(t),I(1)},onDelete:_,canDelete:e(d.Jj.sessionDelete)}),(0,a.jsx)(p,{page:z,pageSize:P,total:f,onPageChange:I,onPageSizeChange:e=>{L(e),I(1)}})]})]})})}}},e=>{e.O(0,[6669,9568,9958,2881,2347,5158,7358],()=>e(e.s=42761)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
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}=(0,o.b)(),{get:t,post:s,patch:b,del:h}=(0,c.Z)(),[p,f]=(0,r.useState)([]),[g,j]=(0,r.useState)(m),[y,N]=(0,r.useState)(!0),[v,w]=(0,r.useState)(!1),[k,C]=(0,r.useState)(""),[A,S]=(0,r.useState)(null),_=e(x.Jj.turnManage),z=(0,r.useCallback)(async()=>{N(!0);try{let e=await t(x.lb.turn);f(e.items||[])}catch(e){C(e.message)}finally{N(!1)}},[t]);(0,r.useEffect)(()=>{z()},[z]);let R=async()=>{C(""),w(!0),S(null);try{await s(x.lb.turn,g),S(g.secret),j(m),await z()}catch(e){C(e.message)}finally{w(!1)}},T=async e=>{try{await b(`${x.lb.turn}/${e.id}`,{enabled:!e.enabled}),z()}catch(e){C(e.message)}},$=async(e,t)=>{try{await b(`${x.lb.turn}/${e.id}`,{scope:t}),z()}catch(e){C(e.message)}},U=async e=>{if(confirm("Delete this TURN key? Clients using it fall back to STUN-only."))try{await h(`${x.lb.turn}/${e}`),z()}catch(e){C(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:z,disabled:y,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:y?"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."}),k&&(0,a.jsx)("p",{className:"text-xs text-danger bg-red-500/10 p-3 rounded-xl border border-red-500/20",children:k}),A&&(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:()=>S(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:A}),(0,a.jsx)("button",{onClick:()=>navigator.clipboard?.writeText(A),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})})]})]}),_&&(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:g.keyId,onChange:e=>j({...g,keyId:e.target.value.trim()}),placeholder:"32-char hex from Cloudflare dashboard"}),(0,a.jsx)(d.A,{label:"API Token / Secret",type:"password",value:g.secret,onChange:e=>j({...g,secret:e.target.value.trim()}),placeholder:"Bearer secret"}),(0,a.jsx)(d.A,{label:"Label",value:g.label,onChange:e=>j({...g,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:g.scope,onChange:e=>j({...g,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:R,disabled:v||!g.keyId||!g.secret,children:v?"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."]})]})]}),y?(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===p.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"}),_&&(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:p.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:_?(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=>$(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"})}),_&&(0,a.jsxs)("td",{className:"px-4 py-3.5 text-right whitespace-nowrap",children:[(0,a.jsx)("button",{onClick:()=>T(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:()=>U(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/modes",label:"Modes",icon:m.ek},{href:"/admin/admins",label:"Admins",icon:m.zW},{href:"/admin/ota",label:"OTA Updates",icon:m.lP},{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-5 border-b border-border-subtle flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,a.jsx)("div",{className:"w-9 h-9 shrink-0 rounded-xl flex items-center justify-center font-bold text-lg bg-brand-500 text-white shadow-[0_8px_24px_-8px_rgba(255,87,10,0.6)] ring-1 ring-white/20",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-brand-500/10 text-brand-500 border border-brand-500/20",children:s.modeName||s.modeId})]})]})]}),(0,a.jsx)("button",{onClick:()=>j(!1),className:"md:hidden text-text-muted hover:text-text shrink-0 p-1.5 rounded-lg 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 p-3 space-y-1 overflow-y-auto",children:[(0,a.jsx)("div",{className:"px-3 py-1.5 text-[11px] font-mono uppercase tracking-wider text-text-subtle",children:"Navigation"}),b.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:`flex items-center gap-3 px-3.5 py-2.5 rounded-xl text-sm font-medium transition-all ${r?"bg-brand-500/12 text-brand-500 border border-brand-500/25 shadow-[0_2px_12px_-4px_rgba(255,87,10,0.25)]":"text-text-muted hover:bg-surface-2/80 hover:text-text border border-transparent"}`,children:[(0,a.jsx)(s,{size:18,className:r?"text-brand-500":"text-text-subtle"}),(0,a.jsx)("span",{className:"flex-1",children:e.label}),r&&(0,a.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-brand-500"})]},e.href)})]}),(0,a.jsxs)("div",{className:"p-3 border-t border-border-subtle space-y-2",children:[(0,a.jsxs)(n,{href:"/workspace/",className:"flex items-center gap-2.5 px-3.5 py-2 rounded-xl text-xs text-text-muted hover:bg-surface-2 hover:text-text transition-colors border border-border-subtle/50",children:[(0,a.jsx)(m.BK,{size:15,className:"text-brand-500"}),(0,a.jsx)("span",{children:"Open Workspace"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 pt-1",children:[(0,a.jsx)(o.A,{className:"border border-border-subtle hover:bg-surface-2 rounded-xl"}),(0,a.jsxs)("button",{onClick:f,className:"flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-xl text-xs font-medium text-text-muted hover:bg-red-500/10 hover:text-danger hover:border-red-500/20 border border-transparent transition-all",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-3 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-lg 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-7 h-7 rounded-lg flex items-center justify-center font-bold text-sm bg-brand-500 text-white shadow-sm",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-lg"})]}),(0,a.jsx)("aside",{className:"jsx-b56c084163c9c8c1 hidden md:flex fixed inset-y-0 left-0 w-64 border-r border-border-subtle bg-surface/80 backdrop-blur-xl flex-col z-20 shadow-[4px_0_24px_-12px_rgba(0,0,0,0.2)]",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-sm 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-64 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:()=>i,Jj:()=>a,Qh:()=>l,Wm:()=>n,lb:()=>o,r6:()=>r,rK:()=>c,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"},r=Object.values(a),l=18e5,n=20,d=[10,20,50,100],i=["createdAt","lastAccessAt","expiresAt","machineId"],c=[{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"}],o={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,9958,2881,2347,5158,7358],()=>e(e.s=56631)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[967],{8910:(e,A,o)=>{"use strict";function t(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)}}o.d(A,{e:()=>t})},58506:(e,A,o)=>{"use strict";o.r(A),o.d(A,{default:()=>a});var t=o(73365),n=o(6552);let i=[{question:"Which background should the pane use?",multiSelect:!1,options:[{label:"Keep the global pool",description:"Every pane follows the workspace setting."},{label:"Pin a wallpaper",description:"Only this session gets its own image."},{label:"Solid colour",description:"No image, just the theme surface."}]}],r=[{question:"Which panes should the new layout open?",multiSelect:!0,options:[{label:"Terminal",description:"A shell in the workspace root."},{label:"AI chat",description:"The agent pane for the active engine."},{label:"Files",description:"The explorer panel on the right."}]},{question:"Anything else to note?",options:[{label:"No",description:"Just open them."}]}];function a(){return(0,t.jsxs)("div",{className:"min-h-screen bg-bg p-6 flex flex-col gap-6 max-w-md",children:[(0,t.jsx)(n.J,{questions:i,onResolve:()=>{}}),(0,t.jsx)(n.J,{questions:r,onResolve:()=>{}}),(0,t.jsx)(n.J,{questions:i,answers:'User has answered your questions: "Which background should the pane use?"="Pin a wallpaper".'})]})}},61436:(e,A,o)=>{Promise.resolve().then(o.bind(o,58506))},64683:(e,A,o)=>{"use strict";o.d(A,{$o:()=>eW.A,AX:()=>ev.A,Ay:()=>Aa,BK:()=>e5.A,BZ:()=>$.A,Bm:()=>_.A,Cp:()=>V.A,Do:()=>a.A,F1:()=>l.A,FE:()=>e1.A,FW:()=>eT.A,Fc:()=>eR.A,GD:()=>T.A,GO:()=>em.A,Gr:()=>U.A,Gv:()=>eb.A,Hx:()=>ei.A,Ir:()=>c.A,J4:()=>eY.A,JG:()=>f.A,JU:()=>B.A,Jl:()=>h.A,Kq:()=>Ai.A,LM:()=>es.A,Lt:()=>M.A,M6:()=>e$.A,MA:()=>s.A,Mr:()=>ej.A,P6:()=>eA.A,QR:()=>S.A,Qp:()=>r.A,RI:()=>n.A,TB:()=>e9.A,Ud:()=>Z.A,VA:()=>eg.A,Vn:()=>eN.A,W1:()=>eh.A,WE:()=>w.A,We:()=>e8.A,Wn:()=>k.A,X:()=>An.A,X_:()=>q.A,ZH:()=>R.A,ZU:()=>e7.A,Ze:()=>eq.A,Zr:()=>I.A,_O:()=>e4.A,_V:()=>ee.A,a4:()=>ew.A,aJ:()=>d.A,ak:()=>K.A,bE:()=>e2.A,bd:()=>e3.A,cC:()=>p.A,c_:()=>g.A,dJ:()=>H.A,de:()=>At.A,dx:()=>N.A,e6:()=>ek.A,e9:()=>eG.A,eM:()=>e_.A,ek:()=>eZ.A,es:()=>eP.A,f2:()=>X.A,f5:()=>L.A,gH:()=>eU.A,h1:()=>eu.A,iU:()=>D.A,jG:()=>eE.A,jj:()=>ef.A,jl:()=>b.A,jz:()=>ex.A,kU:()=>O.A,kV:()=>eo.A,kr:()=>el.A,kt:()=>eJ.A,lM:()=>e0.A,lP:()=>eC.A,m0:()=>y.A,mN:()=>Q.A,nU:()=>ep.A,qz:()=>z.A,rX:()=>v.A,s3:()=>et.A,sU:()=>eQ.A,sv:()=>G.A,ue:()=>eS.A,vR:()=>eL.A,vW:()=>eD.A,vd:()=>J.A,vj:()=>eI.A,vv:()=>er.A,wB:()=>ez.A,wO:()=>eK.A,ww:()=>Y.A,xq:()=>ed.A,xv:()=>eF.A,y8:()=>ea.A,yQ:()=>m.A,yU:()=>eO.A,yd:()=>i.A,zW:()=>Ae.A});var t=o(73365),n=o(87821),i=o(21878),r=o(79376),a=o(61659),l=o(6504),s=o(19307),c=o(74739),p=o(29967),u=o(17836),d=o(67494),h=o(66687),m=o(95188),f=o(54453),g=o(34582),v=o(70453),w=o(10949),b=o(64570),y=o(31258),C=o(59907),P=o(13374),k=o(17406),S=o(46431),M=o(29260),x=o(88433),F=o(49553),L=o(20478),U=o(17568),O=o(87831),q=o(1916),E=o(29418),R=o(18272),T=o(10550),j=o(9271),W=o(14251),D=o(50068),G=o(98173),H=o(10194),J=o(70362),_=o(17909),B=o(59437),I=o(33109),N=o(48433),V=o(86877),z=o(34271),X=o(60919),Z=o(35723),K=o(41046),Q=o(64629),$=o(6534),Y=o(5370),ee=o(59711),eA=o(39831),eo=o(9560),et=o(44159),en=o(41098),ei=o(20021),er=o(14797),ea=o(15504),el=o(93292),es=o(92165),ec=o(94304),ep=o(40789),eu=o(64871),ed=o(31805),eh=o(19621),em=o(40081),ef=o(38781),eg=o(88768),ev=o(68395),ew=o(88793),eb=o(25406),ey=o(10998),eC=o(64446),eP=o(12925),ek=o(93354),eS=o(73243),eM=o(89317),ex=o(12283),eF=o(1578),eL=o(90612),eU=o(43959),eO=o(76621),eq=o(59833),eE=o(67236),eR=o(37266),eT=o(97038),ej=o(72147),eW=o(68859),eD=o(93285),eG=o(20178),eH=o(65062),eJ=o(87030),e_=o(67519),eB=o(457),eI=o(58450),eN=o(48088),eV=o(56023),ez=o(59311),eX=o(38177),eZ=o(60659),eK=o(1838),eQ=o(34969),e$=o(42685),eY=o(99707),e1=o(6830),e6=o(20248),e3=o(11384),e8=o(50211),e5=o(64342),e9=o(60151),e0=o(81610),e7=o(11990),e2=o(52715),e4=o(49387),Ae=o(894),AA=o(2031),Ao=o(58573),At=o(51328),An=o(3382),Ai=o(57717);let Ar={AlertCircle:n.A,ArrowDown:i.A,ArrowRight:r.A,ArrowUp:a.A,ArrowUpRight:l.A,Ban:s.A,Bell:c.A,Bot:p.A,Bug:u.A,Check:d.A,CheckCircle2:h.A,ChevronDown:m.A,ChevronLeft:f.A,ChevronRight:g.A,ChevronUp:v.A,ChevronsDownUp:w.A,Circle:b.A,ClipboardPaste:y.A,Command:C.A,Compass:P.A,Columns2:k.A,Copy:S.A,CornerDownLeft:M.A,Crown:x.A,Delete:F.A,Download:L.A,ExternalLink:U.A,Eye:O.A,EyeOff:q.A,Facebook:E.A,File:R.A,FileCode:T.A,FileJson:j.A,FilePlus:W.A,FileText:D.A,Files:G.A,Filter:H.A,Folder:J.A,FolderOpen:_.A,FolderPlus:B.A,GitBranch:I.A,GitFork:N.A,Github:V.A,Globe:z.A,GripVertical:X.A,Hand:Z.A,HardDrive:K.A,HelpCircle:Q.A,History:$.A,Home:Y.A,Image:ee.A,ImageOff:eA.A,KeyRound:eo.A,Keyboard:et.A,Laptop:en.A,LayoutDashboard:ei.A,Link2:er.A,ListChecks:ea.A,Loader2:el.A,Lock:es.A,LogIn:ec.A,LogOut:ep.A,Maximize2:eu.A,Minimize2:ed.A,Menu:eh.A,Mic:em.A,MicOff:ef.A,Monitor:eg.A,Moon:ev.A,MoreHorizontal:ew.A,MoreVertical:eb.A,MousePointer2:ey.A,Package:eC.A,Palette:eP.A,PanelLeft:ek.A,PanelLeftClose:eS.A,PanelLeftOpen:eM.A,PanelRight:ex.A,Paperclip:eF.A,Pause:eL.A,Pencil:eU.A,Pin:eO.A,PinOff:eq.A,Play:eE.A,Plug:eR.A,Plus:eT.A,Power:ej.A,PowerOff:eW.A,QrCode:eD.A,RefreshCw:eG.A,Replace:eH.A,RotateCw:eJ.A,Save:e_.A,Scissors:eB.A,Search:eI.A,Send:eN.A,SendHorizontal:eV.A,Settings:ez.A,Share:eX.A,Shield:eZ.A,Smartphone:eK.A,Sparkles:eQ.A,Square:e$.A,SquarePen:eY.A,Star:e1.A,StickyNote:e6.A,Sun:e3.A,Target:e8.A,Terminal:e5.A,Trash2:e9.A,Triangle:e0.A,Type:e7.A,Undo2:e2.A,Upload:e4.A,Users:Ae.A,Volume2:AA.A,VolumeX:Ao.A,Wallpaper:At.A,X:An.A,Zap:Ai.A};function Aa({name:e,size:A=20,className:o="",...n}){let i=Ar[e];return i?(0,t.jsx)(i,{size:A,className:o,strokeWidth:2,...n}):(console.warn(`Icon "${e}" not found in the icon registry`),null)}}},e=>{e.O(0,[6669,6552,2347,5158,7358],()=>e(e.s=61436)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7177],{20894:()=>{},44976:(e,a,t)=>{"use strict";t.d(a,{D:()=>s,ThemeProvider:()=>n});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 n({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 s=(0,l.useCallback)(e=>{c.$.includes(e)&&(t(e),F(e),o(e),localStorage.setItem(c.AQ,e),localStorage.setItem("9remote-theme",e))},[]),A=(0,l.useCallback)(()=>{s("dark"===a?"light":"dark")},[a,s]);return(0,r.jsx)(u.Provider,{value:{theme:a,setTheme:s,toggleTheme:A},children:e})}let s=()=>(0,l.useContext)(u)},59584:(e,a,t)=>{"use strict";t.d(a,{default:()=>u});var r=t(73365),l=t(1521);let c=()=>()=>{};function u({id:e,html:a}){return(0,l.useSyncExternalStore)(c,()=>!1,()=>!0)?(0,r.jsx)("script",{id:e,dangerouslySetInnerHTML:{__html:a}}):null}},75526:(e,a,t)=>{Promise.resolve().then(t.bind(t,72569)),Promise.resolve().then(t.bind(t,64457)),Promise.resolve().then(t.bind(t,24608)),Promise.resolve().then(t.t.bind(t,41453,23)),Promise.resolve().then(t.t.bind(t,45474,23)),Promise.resolve().then(t.t.bind(t,75550,23)),Promise.resolve().then(t.t.bind(t,20894,23)),Promise.resolve().then(t.bind(t,95223)),Promise.resolve().then(t.bind(t,59584)),Promise.resolve().then(t.bind(t,44976))},79063:(e,a,t)=>{"use strict";t.d(a,{$:()=>r,AQ:()=>c,In:()=>s,SS:()=>l,aC:()=>F,g4:()=>n});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"})},n=[{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 s(e,a){let t="light"===e?o.everforestLight:o.palenight;return a&&"default"!==a&&n.find(t=>t.key===a&&t.mode===e)&&o[a]||t}},95223:(e,a,t)=>{"use strict";t.d(a,{default:()=>l});var r=t(1521);function l(){let[e,a]=(0,r.useState)(!1),[t,l]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{let e=window.matchMedia("(pointer: coarse) and (max-width: 900px)"),t=window.matchMedia("(orientation: landscape)"),r=()=>{a(e.matches),l(t.matches)};return r(),e.addEventListener("change",r),t.addEventListener("change",r),()=>{e.removeEventListener("change",r),t.removeEventListener("change",r)}},[]),(0,r.useEffect)(()=>{let a=!!window.ReactNativeWebView||/9Remote-Mobile/i.test(navigator.userAgent);if(!e||a)return;let t=!1;return(async()=>{try{await window.screen?.orientation?.lock?.("portrait"),t=!0}catch{}})(),()=>{t&&window.screen?.orientation?.unlock?.()}},[e]),null}}},e=>{e.O(0,[3285,611,4732,2347,5158,7358],()=>e(e.s=75526)),_N_E=e.O()}]);
|