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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3429],{43429:(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:"确定",error:"错误",success:"成功",failed:"失败",retry:"重试",refresh:"刷新",clipboard:"Clipboard",clipboardCopy:"Copy",clipboardEmpty:"Clipboard is empty",search:"搜索",create:"创建",new:"新建",add:"添加",copy:"复制",copied:"已复制",download:"下载",upload:"上传",enabled:"已启用",disabled:"已禁用",on:"开",off:"关",minute:"分钟",hour:"小时",day:"天",minutesAgo:"{n} 分钟前",hoursAgo:"{n} 小时前",daysAgo:"{n} 天前"},login:{tagline:"随时随地访问您的终端",heroLine1:"Any machine.",heroLine2:"One terminal.",heroLine3:"In your pocket.",featureTerminal:"Terminal",featureDesktop:"Desktop",featureFiles:"Files",termConnected:"host connected",termTunnel:"tunnel established",termReady:"ready",accessKey:"访问密钥",placeholder:"sk-xxx... 或一次性密钥 (ABC123)",rememberKey:"记住此密钥",connect:"连接",connecting:"连接中...",authenticating:"正在使用令牌进行身份验证...",invalidKeyTail:"Wrong access key — check the last characters and try again.",scanQr:"Scan QR to login",qrScanTitle:"Scan QR Code",qrHint:"Point the camera at the QR code shown on the machine running 9Remote.",qrDetected:"QR Code detected!",qrAuthenticating:"Authenticating...",qrPleaseWait:"Please wait...",qrLibFail:"Failed to load the QR scanner library.",qrInitFail:"Could not start the scanner.",qrCamDenied:"Camera permission denied. Allow camera access and try again.",qrNoCamera:"No camera found on this device.",qrCamBusy:"Camera is in use by another app.",qrCamError:"Could not open the camera.",savedKeys:"已保存的密钥",login:"登录",lastLogin:"上次登录",namePlaceholder:"Name this key (optional)",rename:"Rename",deleteKeyTitle:"Delete key",deleteKeyConfirm:'Are you sure you want to delete "{name}"?',justNow:"刚刚",minutesAgo:"{n} 分钟前",hoursAgo:"{n} 小时前",daysAgo:"{n} 天前",tapToScan:"点击扫描",orEnterManually:"或手动输入密钥",addKey:"Add Key",secureTitle:"Secure & Encrypted",secureDesc:"All connections are end-to-end encrypted and secure.",featAccessTitle:"Access Anywhere",featAccessDesc:"Connect from any device, anywhere.",featSecureTitle:"Secure Connection",featSecureDesc:"End-to-end encryption keeps you safe.",featFastTitle:"Fast & Reliable",featFastDesc:"Low latency and high performance.",featSessionsTitle:"Multiple Sessions",featSessionsDesc:"Manage and switch between sessions.",home:"首页",docs:"文档"},menu:{reloadRestart:"Reload & Restart",restartHost:"Restart 9remote host",restartConfirmTitle:"Restart 9remote host?",restartConfirmMessage:"This restarts the host process (no reinstall). Terminal sessions are preserved. It takes a few seconds.",restartStarting:"Restarting host…",restartRestarting:"Restarting 9remote…",restartDone:"Restarted! Reconnecting…",restartTimeout:"Restart is taking too long",restartTimeoutHint:"Reconnect manually if it doesn't recover.",title:"菜单",language:"语言",theme:"主题",notifications:"通知",webgl:"GPU Render (Faster)",webglHint:"如果文字显示异常请关闭",notificationsHint:"Notify when agent finishes",files:"File Explorer",downloading:"Downloading",copying:"Copying",conflictTitle:"File already exists",conflictMessage:"{name} already exists. Replace or skip?",skip:"Skip",skipAll:"Skip all",replace:"Replace",replaceAll:"Replace all",sites:"站点",commandNotes:"命令笔记",community:"社区",installApp:"安装应用",codespace:"Codespace",logout:"退出登录",settingsGeneral:"General",settingsAppearance:"Appearance",settingsTerminalTab:"Terminal",settingsMcp:"Plugins",mcpIntro:"Extra abilities you can give your AI coding tools.",mcpTools:"Allow",mcpRestartHint:"Turning it off applies at once. Turning it on needs the AI tool restarted.",mcpUnavailable:"Update this host to use MCP.",artifactFormats:"Formats it can show",mcpClients:"Works with",settingsWorkspace:"Workspace",settingsApplication:"Application",settingsAccount:"Account",themeLight:"Light",themeDark:"Dark",reload:"重新加载应用",remoteDesktop:"远程桌面",settings:"设置",enablePush:"启用推送通知",disablePush:"禁用推送通知",pushHint:"启用推送通知,以便在 AI 完成任务时收到提醒",pushActiveHint:"Push notifications are on for this device. You'll be alerted when AI completes tasks.",versionMismatch:"Host {version} 已过时",versionMismatchHint:"部分功能可能无法使用。请运行:",updateNow:"Update now",updating:"Updating… reconnecting",webReloadTitle:"New web version available",webReloadHint:"Reload to get the latest interface.",reloadWeb:"Reload",updateAvailableTitle:"9Remote host update available",updateStarting:"Starting update…",updateInstalling:"Installing new version…",updateTimeout:"Update is taking too long",updateTimeoutHint:"Reload manually if it doesn't recover.",updateRestarting:"Restarting host…",updateReconnecting:"Reconnecting…",updateDone:"Updated! Reloading…",version:"版本"},workspace:{loading:"加载中...",logoutTitle:"退出登录",logoutMessage:"您确定要退出登录吗?",failedCreateSession:"创建会话失败:{error}",failedRenameSession:"重命名会话失败:{error}"},sessions:{headerTitle:"9remote.cc",connected:"已连接",disconnected:"已断开",codespaceStopped:"Codespace 已停止",placeholder:"终端名称(可选)",newButton:"+ 新建",empty:"没有活动会话",emptyHint:"创建一个新会话以开始",created:"创建于 {time}",deleteTitle:"删除会话",deleteMessage:'您确定要删除 "{name}" 吗?',editName:"编辑名称",newTerminal:"新建终端",options:"Options"},workspaces:{title:"Groups",newWorkspace:"Group",newWorkspacePrompt:"Group name",defaultName:"New Group",ungrouped:"Ungrouped",addTerminal:"Add terminal to group",moveToWorkspace:"Move to group",rename:"Rename group",delete:"Delete group",emptyWorkspace:"No terminals in this group",deleteTitle:"Delete Group",deleteMessage:'Delete group "{name}"? Terminals move to Ungrouped.'},terminal:{quotaNoData:"No quota data",quotaUsageTitle:"usage",back:"返回",menu:"菜单",newTerminal:"新建终端",remoteDesktop:"远程桌面",defaultName:"终端"},files:{selectWorkspace:"选择工作区",recentWorkspaces:"最近的工作区",home:"主目录",root:"根目录",drive:"驱动器 {letter}",codespaces:"Codespaces",removeRecent:"从最近移除",removeTitle:"移除工作区",removeMessage:'从最近的工作区中移除 "{name}"?',setAsWorkspace:"设为工作区",openFolder:"打开文件夹",newFile:"新建文件",newFolder:"新建文件夹",rename:"重命名",delete:"删除",deleteFile:"删除文件",deleteFolder:"删除文件夹",deleteFileMessage:'删除 "{name}"?',deleteFolderMessage:'删除文件夹 "{name}" 及其所有内容?',emptyFolder:"空文件夹",git:"Git",parent:"上级文件夹",workspace:"工作区",failedLoad:"加载失败:{error}",failedDelete:"删除失败:{error}",failedCreate:"创建失败:{error}",failedRename:"重命名失败:{error}",enterName:"输入名称",confirmRename:"重命名为:",setWorkspace:"设置工作区",setAsWorkspaceTitle:"设为工作区",switchWorkspace:"切换工作区",searchFiles:"搜索文件",toggleHidden:"切换隐藏文件",searchPlaceholder:"搜索文件...",searching:"搜索中...",noFilesFound:"未找到文件",noGitRepo:"没有 Git 仓库",cannotOpenBinary:"无法打开二进制文件",createNew:"新建",file:"文件",folder:"文件夹",placeholderFile:"filename.js",placeholderFolder:"folder-name",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 差异",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:"推送",pull:"拉取",fetch:"获取",stage:"暂存",stageAll:"全部暂存",unstage:"取消暂存",discard:"放弃",discardChanges:"放弃更改",discardMessage:'放弃对 "{name}" 的更改?',noChanges:"无更改",diff:"差异",pushing:"推送中...",pulling:"拉取中...",committing:"提交中...",failedCommit:"提交失败:{error}",failedPush:"推送失败:{error}",failedPull:"拉取失败:{error}",status:"状态",diffTab:"差异",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:'请先在此电脑的 9remote host 中开启"远程解锁"。',lockDesc:"输入此电脑的 Windows PIN 或密码",lockPlaceholder:"Windows PIN 或密码",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:"单指滑动",trackpadSwipeDesc:"移动虚拟光标",trackpadTapKey:"单指点按",trackpadTapDesc:"在光标位置左键点击",trackpad2TapKey:"双指点按",trackpad2TapDesc:"在光标位置右键点击",trackpad2SwipeKey:"双指滑动",trackpad2SwipeDesc:"在光标位置滚动",trackpadPinchKey:"双指捏合",trackpadPinchDesc:"缩放画布",trackpadScrollLockKey:"长按 + 拖动",trackpadScrollLockDesc:"长按锁定滚动,可向任意方向拖动",directTapKey:"单指点按",directTapDesc:"在点按位置点击",directLongKey:"单指长按",directLongDesc:"右键点击",directDoubleKey:"单指双击",directDoubleDesc:"双击",directScrollKey:"双指滑动",directScrollDesc:"滚动远程画面",directPinchKey:"双指捏合",directPinchDesc:"缩放画布",directPanKey:"单指拖动(缩放>1)",directPanDesc:"平移画布",toolbarHandDesc:"按住左键(拖动模式)— 再次点击释放",toolbarMouseDirectDesc:"切换到直接模式",toolbarMouseTrackpadDesc:"切换到 Trackpad(虚拟光标)",toolbarKeyboardDesc:"原生键盘 / 文本批量输入",toolbarRectDesc:"矩形选择模式"},remoteControls:{enterToSend:"Tab / Ctrl+数字 切换标签页",typeToSend:"输入要发送的文本...",send:"发送",trackpadMode:"Trackpad 模式",directMode:"直接模式",bottomRow:"底部行",extraPanel:"额外面板",exitConfirmMessage:"您确定要退出当前的远程桌面会话吗?"},connection:{retrying:"重新连接中...",waitingApproval:"等待批准",approvalDescription:"在您连接之前,9Remote host 需要批准此设备。",approvalHint:"请检查您计算机上的终端。",rejectedTitle:"设备被拒绝",rejectedDescription:"此设备未被 9Remote host 批准。",backToLogin:"返回登录",failed:"连接失败",failedDescription:"尝试 {n} 次后无法连接",attemptOf:"第 {n} 次,共 {total} 次",exit:"退出",cancel:"取消",retry:"立即重试"},notifications:{claudeCode:"Claude Code",codex:"Codex",geminiCli:"Gemini CLI",openCode:"OpenCode",needsInput:"needs input",badgeTitle:"{blocked} needs input, {done} your turn",replied:"replied",agent:"Agent"},sites:{title:"站点",localSites:"本地站点",selectSitePreview:"选择一个站点进行预览",browserNewTab:"New tab",browserAddressPlaceholder:"localhost:3000 or /path",browserNotConnected:"Connect to your host first",portPlaceholder:"端口",loadingSites:"加载站点中...",notConnected:"Not connected to the host",noSitesFound:"未找到站点",startServerHint:"启动本地开发服务器以在此处查看",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:"例如:启动开发服务器",placeholderCommand:"例如:npm run dev"},mobileKeyboard:{pasteHere:"在此粘贴 (Cmd+V)",enterToSend:"Tab / Ctrl+数字 切换标签页",typeCommand:"输入命令并发送...",send:"发送",toggleExtraKeys:"切换额外按键",toggleTextInput:"切换文本输入",customizeTerminalKeys:"自定义终端按键",mainBar:"主栏",extraPanel:"额外面板",fileTooLarge:"文件过大(最大 5MB)",readFileFailed:"读取文件失败",uploadFailed:"上传文件失败:{error}"},terminalPane:{scrollToBottom:"滚动到底部",changedFiles:"Changed files",pasteOrType:"在此粘贴或输入",paste:"粘贴"},pwaGuide:{copyYourKey:"复制您的密钥",copyKeyHint:"点击下方密钥进行复制 — 安装后您将需要它来登录",tapToCopyApiKey:"点击复制 API 密钥",copiedBang:"已复制!",copy:"复制",tapShareButton:"点击分享按钮",tapShareHint:"点击 iOS Safari 底部的分享按钮",addToHome:"添加到主屏幕",addToHomeHint:'向下滚动并点击 "添加到主屏幕"',openAppPasteKey:"打开应用并粘贴密钥",openAppPasteKeyHint:"打开已安装的应用并粘贴您的密钥进行登录",openMenu:"打开菜单",openMenuHint:"点击 Android Chrome 中的菜单按钮(三个点)",installApp:"安装应用",installAppHint:'点击 "安装应用" 或 "添加到主屏幕"',lookInstallIcon:"查找安装图标",lookInstallIconHint:"在地址栏中查找安装图标",clickInstallPaste:"点击安装并粘贴密钥",installNow:"Install Now",installNowHint:"Install 9Remote as an app for quick access",installing:"Installing...",clickInstallPasteHint:"点击安装,打开应用,然后粘贴您的密钥进行登录",alternativeHint:'或者:打开浏览器菜单 → "安装 9Remote" 或 "创建快捷方式"',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:"Codespace 打开时启动 9Remote",stop:"停止 Codespace",stopHint:"停止以节省用量",restartHint:"如需重新启动,请前往 GitHub",unknown:"未知"}}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3514],{83514:(e,a,t)=>{t.r(a),t.d(a,{default:()=>n});let n={common:{statusIdle:"Idle",statusWorking:"Working",statusBlocked:"Needs input",statusDone:"Your turn",loading:"Laddar...",cancel:"Avbryt",confirm:"Bekr\xe4fta",save:"Spara",delete:"Radera",close:"St\xe4ng",back:"Tillbaka",edit:"Redigera",rename:"Byt namn",remove:"Ta bort",open:"\xd6ppna",yes:"Ja",no:"Nej",ok:"OK",error:"Fel",success:"Lyckades",failed:"Misslyckades",retry:"F\xf6rs\xf6k igen",refresh:"Uppdatera",clipboard:"Clipboard",clipboardCopy:"Copy",clipboardEmpty:"Clipboard is empty",search:"S\xf6k",create:"Skapa",new:"Ny",add:"L\xe4gg till",copy:"Kopiera",copied:"Kopierad",download:"Ladda ner",upload:"Ladda upp",enabled:"Aktiverad",disabled:"Inaktiverad",on:"p\xe5",off:"av",minute:"min",hour:"tim",day:"d",minutesAgo:"{n} min sedan",hoursAgo:"{n} timmar sedan",daysAgo:"{n} dagar sedan"},login:{tagline:"F\xe5 \xe5tkomst till din terminal var som helst",heroLine1:"Any machine.",heroLine2:"One terminal.",heroLine3:"In your pocket.",featureTerminal:"Terminal",featureDesktop:"Desktop",featureFiles:"Files",termConnected:"host connected",termTunnel:"tunnel established",termReady:"ready",accessKey:"\xc5tkomstnyckel",placeholder:"sk-xxx... eller eng\xe5ngsnyckel (ABC123)",rememberKey:"Kom ih\xe5g den h\xe4r nyckeln",connect:"Anslut",connecting:"Ansluter...",authenticating:"Autentiserar med 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:"Sparade nycklar",login:"Logga in",lastLogin:"Senast inloggad",namePlaceholder:"Name this key (optional)",rename:"Rename",deleteKeyTitle:"Delete key",deleteKeyConfirm:'Are you sure you want to delete "{name}"?',justNow:"Just nu",minutesAgo:"{n}m sedan",hoursAgo:"{n}t sedan",daysAgo:"{n}d sedan",tapToScan:"Tryck f\xf6r att skanna",orEnterManually:"eller ange nyckel manuellt",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:"Hem",docs:"Dokumentation"},menu:{reloadRestart:"Reload & Restart",restartHost:"Restart 9remote host",restartConfirmTitle:"Restart 9remote host?",restartConfirmMessage:"This restarts the host process (no reinstall). Terminal sessions are preserved. It takes a few seconds.",restartStarting:"Restarting host…",restartRestarting:"Restarting 9remote…",restartDone:"Restarted! Reconnecting…",restartTimeout:"Restart is taking too long",restartTimeoutHint:"Reconnect manually if it doesn't recover.",title:"Meny",language:"Spr\xe5k",theme:"Tema",notifications:"Aviseringar",webgl:"GPU Render (Faster)",webglHint:"St\xe4ng av om texten ser fel ut",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:"Webbplatser",commandNotes:"Kommandoanteckningar",community:"Gemenskap",installApp:"Installera app",codespace:"Codespace",logout:"Logga ut",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:"Ladda om appen",remoteDesktop:"Fj\xe4rrskrivbord",settings:"Inst\xe4llningar",enablePush:"Aktivera push-aviseringar",disablePush:"Inaktivera push-aviseringar",pushHint:"Aktivera push-aviseringar f\xf6r att f\xe5 meddelanden n\xe4r AI slutf\xf6r uppgifter",pushActiveHint:"Push notifications are on for this device. You'll be alerted when AI completes tasks.",versionMismatch:"Host {version} \xe4r f\xf6r\xe5ldrad",versionMismatchHint:"Vissa funktioner kanske inte fungerar. K\xf6r:",updateNow:"Update now",updating:"Updating… reconnecting",webReloadTitle:"New web version available",webReloadHint:"Reload to get the latest interface.",reloadWeb:"Reload",updateAvailableTitle:"9Remote host update available",updateStarting:"Starting update…",updateInstalling:"Installing new version…",updateTimeout:"Update is taking too long",updateTimeoutHint:"Reload manually if it doesn't recover.",updateRestarting:"Restarting host…",updateReconnecting:"Reconnecting…",updateDone:"Updated! Reloading…",version:"Version"},workspace:{loading:"Laddar...",logoutTitle:"Logga ut",logoutMessage:"\xc4r du s\xe4ker p\xe5 att du vill logga ut?",failedCreateSession:"Det gick inte att skapa session: {error}",failedRenameSession:"Det gick inte att byta namn p\xe5 sessionen: {error}"},sessions:{headerTitle:"9remote.cc",connected:"Ansluten",disconnected:"Fr\xe5nkopplad",codespaceStopped:"Codespace stoppad",placeholder:"Terminalnamn (valfritt)",newButton:"+ Ny",empty:"Inga aktiva sessioner",emptyHint:"Skapa en ny session f\xf6r att komma ig\xe5ng",created:"Skapad {time}",deleteTitle:"Radera session",deleteMessage:'\xc4r du s\xe4ker p\xe5 att du vill radera "{name}"?',editName:"Redigera namn",newTerminal:"Ny 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:"Tillbaka",menu:"Meny",newTerminal:"Ny terminal",remoteDesktop:"Fj\xe4rrskrivbord",defaultName:"Term"},files:{selectWorkspace:"V\xe4lj arbetsyta",recentWorkspaces:"Senaste arbetsytor",home:"Hem",root:"Rot",drive:"Enhet {letter}",codespaces:"Codespaces",removeRecent:"Ta bort fr\xe5n senaste",removeTitle:"Ta bort arbetsyta",removeMessage:'Ta bort "{name}" fr\xe5n senaste arbetsytor?',setAsWorkspace:"Ange som arbetsyta",openFolder:"\xd6ppna mapp",newFile:"Ny fil",newFolder:"Ny mapp",rename:"Byt namn",delete:"Radera",deleteFile:"Radera fil",deleteFolder:"Radera mapp",deleteFileMessage:'Radera "{name}"?',deleteFolderMessage:'Radera mappen "{name}" och allt dess inneh\xe5ll?',emptyFolder:"Tom mapp",git:"Git",parent:"\xd6verordnad mapp",workspace:"Arbetsyta",failedLoad:"Det gick inte att l\xe4sa in: {error}",failedDelete:"Det gick inte att radera: {error}",failedCreate:"Det gick inte att skapa: {error}",failedRename:"Det gick inte att byta namn: {error}",enterName:"Ange namn",confirmRename:"Byt namn till:",setWorkspace:"Ange arbetsyta",setAsWorkspaceTitle:"Ange som arbetsyta",switchWorkspace:"Byt arbetsyta",searchFiles:"S\xf6k filer",toggleHidden:"V\xe4xla dolda filer",searchPlaceholder:"S\xf6k filer...",searching:"S\xf6ker...",noFilesFound:"Inga filer hittades",noGitRepo:"Inget Git-arkiv",cannotOpenBinary:"Kan inte \xf6ppna bin\xe4rfil",createNew:"Skapa ny",file:"Fil",folder:"Mapp",placeholderFile:"filnamn.js",placeholderFolder:"mappnamn",pickFile:"Choose files",pickFolder:"Choose folder",copyPath:"Kopiera s\xf6kv\xe4g",copyRelPath:"Copy Relative Path",copyName:"Copy Filename",delete:"Radera",rename:"Byt namn",deleteConfirmTitle:"Radera",deleteConfirmMessage:'Radera "{name}"?'},editor:{save:"Spara",saving:"Sparar...",saved:"Sparad",unsaved:"Osparade \xe4ndringar",close:"St\xe4ng",discard:"F\xf6rkasta",discardTitle:"F\xf6rkasta \xe4ndringar",discardMessage:"Du har osparade \xe4ndringar. F\xf6rkasta dem?",unsavedTitle:"Save changes to {name}?",unsavedBody:"Your changes will be lost if you don't save them.",failedLoad:"Det gick inte att l\xe4sa in filen: {error}",failedSave:"Det gick inte att spara: {error}",openFull:"Open in full editor",artifact:"Artifact",readOnly:"Endast l\xe4sning",line:"Rad",column:"Kolumn",gitDiff:"Git Diff",typeText:"Skriv text och infoga...",insert:"Infoga",statusModified:"Modifierad",statusAdded:"Tillagd",statusUntracked:"Osp\xe5rad"},git:{title:"Git",branch:"Gren",changes:"\xc4ndringar",staged:"Stagead",unstaged:"Ostagead",untracked:"Osp\xe5rad",commit:"Commit",commitAndPush:"Commit & Push",commitSuccess:"Commit successful",pushSuccess:"Push successful",stageFailed:"Failed to stage changes",commitFailed:"Commit failed",pushFailed:"Push failed",pullSuccess:"Pull successful",pullFailed:"Pull failed",stageAllConfirmTitle:"Stage All & Commit",stageAllConfirmMessage:"No changes are staged. Stage all changes and commit?",stageAndCommit:"Stage & Commit",gitActions:"Git actions",commitPlaceholder:"Commit message…",stageAllNote:"Stage all \xb7 {count}",upToDate:"Everything up-to-date",commitMessage:"Commit-meddelande",push:"Push",pull:"Pull",fetch:"Fetch",stage:"Stagea",stageAll:"Stagea alla",unstage:"Avstagea",discard:"F\xf6rkasta",discardChanges:"F\xf6rkasta \xe4ndringar",discardMessage:'F\xf6rkasta \xe4ndringar i "{name}"?',noChanges:"Inga \xe4ndringar",diff:"Diff",pushing:"Pushar...",pulling:"Pullar...",committing:"Committar...",failedCommit:"Det gick inte att committa: {error}",failedPush:"Det gick inte att pusha: {error}",failedPull:"Det gick inte att pulla: {error}",status:"Status",diffTab:"Diff",modified:"Modifierad",added:"Tillagd",deleted:"Raderad",untrackedTitle:"Osp\xe5rad",openFile:"\xd6ppna fil",discardChangesTitle:"F\xf6rkasta \xe4ndringar",discardConfirmTitle:"F\xf6rkasta \xe4ndringar",discardConfirmDelete:'\xc4r du s\xe4ker p\xe5 att du vill radera "{name}"? Detta kan inte \xe5ngras.',discardConfirmDiscard:'\xc4r du s\xe4ker p\xe5 att du vill f\xf6rkasta \xe4ndringar i "{name}"? Detta kan inte \xe5ngras.'},remote:{title:"Fj\xe4rrskrivbord",connecting:"Ansluter...",disconnected:"Fr\xe5nkopplad",fullscreen:"Helsk\xe4rm",exitFullscreen:"Avsluta helsk\xe4rm",receivingImage:"Receiving screen…",keyboard:"Tangentbord",mouse:"Mus",quality:"Kvalitet",fps:"FPS",debug:"Fels\xf6kning",help:"Hj\xe4lp",close:"St\xe4ng",sendKey:"Skicka tangent",helpTitle:"Hj\xe4lp f\xf6r fj\xe4rrskrivbord",notAvailable:"Fj\xe4rrskrivbord \xe4r inte tillg\xe4ngligt",customizeKeys:"Anpassa tangenter",back:"Tillbaka",resetZoom:"\xc5terst\xe4ll zoom",refresh:"Uppdatera",rectangleSelection:"Rektangelmarkering",handMode:"Handl\xe4ge",toggleKeyboard:"V\xe4xla inbyggt tangentbord",hideControls:"Hide controls",showControls:"Show controls",textBatchInput:"Textbatchinmatning",extraKeys:"Extra tangenter",customizeRemoteKeys:"Anpassa fj\xe4rrtangenter",exitRemote:"Avsluta fj\xe4rrskrivbord",debugTitle:"Fels\xf6kningsstatistik",minimize:"Minimera",transport:"Transport",latency:"Latens",tilesPerSec:"Tiles/sek",bandwidth:"Bandbredd",clearStats:"Rensa statistik",lockTitle:"Windows \xe4r l\xe5st",lockGrantDesc:'Aktivera "L\xe5s upp PC fj\xe4rrstyrt" i 9remote host p\xe5 denna PC.',lockDesc:"Ange Windows PIN-kod eller l\xf6senord f\xf6r denna dator",lockPlaceholder:"Windows PIN-kod eller l\xf6senord",unlock:"L\xe5s upp",unlocking:"L\xe5ser upp…",unlockFailed:"Uppl\xe5sning misslyckades — kontrollera din PIN-kod/l\xf6senord och f\xf6rs\xf6k igen."},remoteHelp:{modePc:"PC / Mus",modeTrackpad:"Peksk\xe4rm \xb7 Trackpad",modeDirect:"Peksk\xe4rm \xb7 Direkt",mouseTitle:"Mus",keyboardTitle:"Tangentbord",gesturesTrackpadTitle:"Gester (Trackpad ✋)",gesturesDirectTitle:"Gester (Direkt)",toolbarTitle:"Verktygsf\xe4lt",mouseClickKey:"Klicka / Dra",mouseClickDesc:"V\xe4nsterklicka, dra f\xf6r att markera/flytta",mouseRightKey:"H\xf6gerklick",mouseRightDesc:"Snabbmeny p\xe5 fj\xe4rr",mouseWheelKey:"Hjul",mouseWheelDesc:"Rulla fj\xe4rr (Shift + hjul = horisontellt)",mouseDoubleKey:"Dubbelklick",mouseDoubleDesc:"Dubbelklicka p\xe5 fj\xe4rr",keyPhysicalKey:"Fysiska tangenter",keyPhysicalDesc:"Skickas direkt (Tab, F-tangenter, etc. f\xe5ngas)",keyModifierKey:"Ctrl / Alt / Shift / ⌘",keyModifierDesc:"Klistrig modifierare — kombinera med n\xe4sta tangent",trackpadSwipeKey:"1 finger svep",trackpadSwipeDesc:"Flytta virtuell mark\xf6r",trackpadTapKey:"1 finger tryck",trackpadTapDesc:"V\xe4nsterklick vid mark\xf6r",trackpad2TapKey:"2 fingrar tryck",trackpad2TapDesc:"H\xf6gerklick vid mark\xf6r",trackpad2SwipeKey:"2 fingrar svep",trackpad2SwipeDesc:"Rulla vid mark\xf6rens position",trackpadPinchKey:"2 fingrar nyp",trackpadPinchDesc:"Zooma duk",trackpadScrollLockKey:"H\xe5ll + dra",trackpadScrollLockDesc:"H\xe5ll f\xf6r att l\xe5sa scroll, dra i valfri riktning",directTapKey:"1 finger tryck",directTapDesc:"Klicka vid tryckposition",directLongKey:"1 finger l\xe5ngtryck",directLongDesc:"H\xf6gerklick",directDoubleKey:"1 finger dubbeltryck",directDoubleDesc:"Dubbelklick",directScrollKey:"2 fingrar svep",directScrollDesc:"Rulla fj\xe4rr",directPinchKey:"2 fingrar nyp",directPinchDesc:"Zooma duk",directPanKey:"1 finger drag (zoom>1)",directPanDesc:"Panorera duk",toolbarHandDesc:"H\xe5ll v\xe4nsterklick (dragl\xe4ge) — tryck igen f\xf6r att sl\xe4ppa",toolbarMouseDirectDesc:"V\xe4xla till direktl\xe4ge",toolbarMouseTrackpadDesc:"V\xe4xla till Trackpad (virtuell mark\xf6r)",toolbarKeyboardDesc:"Inbyggt tangentbord / textbatchinmatning",toolbarRectDesc:"Rektangelmarkeringsl\xe4ge"},remoteControls:{enterToSend:"Tab / Ctrl+Num f\xf6r att byta flik",typeToSend:"Skriv text f\xf6r att skicka...",send:"Skicka",trackpadMode:"Trackpad-l\xe4ge",directMode:"Direktl\xe4ge",bottomRow:"Nedre rad",extraPanel:"Extra panel",exitConfirmMessage:"\xc4r du s\xe4ker p\xe5 att du vill avsluta den aktuella fj\xe4rrskrivbordssessionen?"},connection:{retrying:"\xc5teransluter...",waitingApproval:"V\xe4ntar p\xe5 godk\xe4nnande",approvalDescription:"9Remote host m\xe5ste godk\xe4nna den h\xe4r enheten innan du kan ansluta.",approvalHint:"Kontrollera terminalen p\xe5 din maskin.",rejectedTitle:"Enhet avvisad",rejectedDescription:"Den h\xe4r enheten godk\xe4ndes inte av 9Remote host.",backToLogin:"Tillbaka till inloggning",failed:"Anslutning misslyckades",failedDescription:"Det gick inte att ansluta efter {n} f\xf6rs\xf6k",attemptOf:"F\xf6rs\xf6k {n} av {total}",exit:"Avsluta",cancel:"Avbryt",retry:"F\xf6rs\xf6k igen nu"},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:"Webbplatser",localSites:"Lokala webbplatser",selectSitePreview:"V\xe4lj en webbplats att f\xf6rhandsgranska",browserNewTab:"New tab",browserAddressPlaceholder:"localhost:3000 or /path",browserNotConnected:"Connect to your host first",portPlaceholder:"port",loadingSites:"Laddar webbplatser...",notConnected:"Not connected to the host",noSitesFound:"Inga webbplatser hittades",startServerHint:"Starta en lokal utvecklingsserver f\xf6r att se den h\xe4r",siteNamePlaceholder:"Webbplatsnamn",saveTitle:"Spara",editNameTitle:"Redigera namn",removeTitle:"Ta bort",removePortTitle:"Ta bort port",removePortMessage:"Ta bort port {port} fr\xe5n sparad lista?",popupBlocked:"Popup blockerad! Till\xe5t popup-f\xf6nster f\xf6r den h\xe4r webbplatsen.",startProxyFailed:"Det gick inte att starta proxy-session f\xf6r {name}",foundCount:"{n} webbplats{suffix} hittades",focusOpenedTab:"Fokusera \xf6ppnad flik",openInNewTab:"\xd6ppna i ny flik",goBack:"G\xe5 tillbaka",goForward:"G\xe5 fram\xe5t",loadingSite:"Laddar...",empty:"Inga aktiva webbplatser",emptyHint:"K\xf6r en lokal server f\xf6r att se den h\xe4r",open:"\xd6ppna",refresh:"Uppdatera"},commandNotes:{title:"Kommandoanteckningar",noSavedCommands:"Inga sparade kommandon",addFirstBelow:"L\xe4gg till ditt f\xf6rsta kommando nedan",clickToCopy:"Klicka f\xf6r att kopiera",copiedBang:"Kopierad!",copy:"Kopiera",edit:"Redigera",delete:"Radera",editCommandPlaceholder:"Redigera kommando...",addCommandPlaceholder:"L\xe4gg till kommando...",update:"Uppdatera",add:"L\xe4gg till",empty:"Inga anteckningar \xe4n",emptyHint:"Spara kommandon f\xf6r snabb \xe5tkomst",add:"L\xe4gg till anteckning",edit:"Redigera anteckning",delete:"Radera anteckning",deleteMessage:"Radera den h\xe4r anteckningen?",name:"Namn",command:"Kommando",save:"Spara",placeholderName:"t.ex. Starta utvecklingsserver",placeholderCommand:"t.ex. npm run dev"},mobileKeyboard:{pasteHere:"Klistra in h\xe4r (Cmd+V)",enterToSend:"Tab / Ctrl+Num f\xf6r att byta flik",typeCommand:"Skriv kommando och skicka...",send:"Skicka",toggleExtraKeys:"V\xe4xla extra tangenter",toggleTextInput:"V\xe4xla textinmatning",customizeTerminalKeys:"Anpassa terminaltangenter",mainBar:"Huvudf\xe4lt",extraPanel:"Extra panel",fileTooLarge:"Filen \xe4r f\xf6r stor (max 5 MB)",readFileFailed:"Det gick inte att l\xe4sa filen",uploadFailed:"Det gick inte att ladda upp filen: {error}"},terminalPane:{scrollToBottom:"Rulla till botten",changedFiles:"Changed files",pasteOrType:"Klistra in eller skriv h\xe4r",paste:"Klistra in"},pwaGuide:{copyYourKey:"Kopiera din nyckel",copyKeyHint:"Tryck p\xe5 nyckeln nedan f\xf6r att kopiera — du beh\xf6ver den f\xf6r att logga in efter installation",tapToCopyApiKey:"Tryck f\xf6r att kopiera API-nyckel",copiedBang:"Kopierad!",copy:"Kopiera",tapShareButton:"Tryck p\xe5 dela-knappen",tapShareHint:"Tryck p\xe5 dela-knappen l\xe4ngst ner i Safari",addToHome:"L\xe4gg till p\xe5 hemsk\xe4rmen",addToHomeHint:'Rulla ner och tryck p\xe5 "L\xe4gg till p\xe5 hemsk\xe4rmen"',openAppPasteKey:"\xd6ppna app & klistra in nyckel",openAppPasteKeyHint:"\xd6ppna den installerade appen och klistra in din nyckel f\xf6r att logga in",openMenu:"\xd6ppna meny",openMenuHint:"Tryck p\xe5 menyknappen (tre prickar) i Chrome",installApp:"Installera app",installAppHint:'Tryck p\xe5 "Installera app" eller "L\xe4gg till p\xe5 hemsk\xe4rmen"',lookInstallIcon:"Leta efter installationsikon",lookInstallIconHint:"Leta efter installationsikonen i adressf\xe4ltet",clickInstallPaste:"Klicka installera & klistra in nyckel",installNow:"Install Now",installNowHint:"Install 9Remote as an app for quick access",installing:"Installing...",clickInstallPasteHint:"Klicka installera, \xf6ppna appen och klistra in din nyckel f\xf6r att logga in",alternativeHint:'Alternativ: \xd6ppna webbl\xe4sarmenyn → "Installera 9Remote" eller "Skapa genv\xe4g"',loadingPlatform:"Laddar plattformsdetektering...",iosPlatform:"iOS (iPhone/iPad)",androidPlatform:"Android",macosPlatform:"macOS",windowsPlatform:"Windows",desktopPlatform:"Skrivbord",alreadyInstalled:"Redan installerad!",alreadyInstalledHint:"Du anv\xe4nder redan 9Remote som en installerad app",installationGuide:"Installationsguide",installationSteps:"Installationssteg:"},community:{title:"Gemenskap",description:"G\xe5 med i 9Remote-gemenskapen"},pwa:{title:"Installera som app",description:"Installera 9Remote p\xe5 din enhet f\xf6r b\xe4sta upplevelse",iosTitle:"iOS Safari",androidTitle:"Android Chrome",desktopTitle:"Skrivbord"},codespace:{title:"Codespace",name:"Namn",status:"Status",running:"K\xf6rs",autoStart:"Starta 9Remote automatiskt",autoStartHint:"Starta 9Remote n\xe4r codespace \xf6ppnas",stop:"Stoppa Codespace",stopHint:"Stoppa f\xf6r att spara anv\xe4ndning",restartHint:"F\xf6r att starta om, g\xe5 till GitHub",unknown:"Ok\xe4nd"}}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4300],{38415:(e,t,r)=>{r.d(t,{Gf:()=>d,Gi:()=>x,Hu:()=>c,Nn:()=>m,O8:()=>l,cu:()=>i,el:()=>a,ij:()=>p,l7:()=>n,no:()=>u,pe:()=>o,rl:()=>s,xO:()=>b});let o="https://api.github.com",s="https://github.com/decolua/9remote",l=`${o}/repos/decolua/9remote`,a=`${l}/releases?per_page=100`,n=!1,c=".devcontainer/devcontainer.json",d="NREMOTE_API_KEY",i={name:"9Remote",image:"mcr.microsoft.com/devcontainers/universal:latest",postCreateCommand:"npm install -g 9remote@latest",postAttachCommand:"nohup 9remote start > /tmp/9remote.log 2>&1 &",forwardPorts:[2208],portsAttributes:{2208:{label:"9Remote Server",onAutoForward:"silent",visibility:"public"}}},m=3e3,p=60,x={available:"Available",starting:"Starting",shutdown:"Shutdown",unknown:"Unknown"},u={user:"/user",codespaces:"/user/codespaces",codespaceByName:e=>`/user/codespaces/${e}`,startCodespace:e=>`/user/codespaces/${e}/start`,userReposList:"/user/repos?per_page=100&sort=updated&affiliation=owner,collaborator",repoContents:(e,t,r)=>`/repos/${e}/${t}/contents/${r}`,createCodespaceForRepo:(e,t)=>`/repos/${e}/${t}/codespaces`,codespaceSecretsPublicKey:"/user/codespaces/secrets/public-key",codespaceSecret:e=>`/user/codespaces/secrets/${e}`,codespaceSecretRepos:(e,t)=>`/user/codespaces/secrets/${e}/repositories/${t}`};function b(e){return`https://${e}-2208.app.github.dev`}},48310:(e,t,r)=>{r.d(t,{w:()=>a});var o=r(1521),s=r(38415);let l="9remote_github_stars";function a(){let[e,t]=(0,o.useState)(null);return(0,o.useEffect)(()=>{try{let e=localStorage.getItem(l);if(e){let{count:r,timestamp:o}=JSON.parse(e);if("number"==typeof r&&t(r),Date.now()-o<36e5)return}}catch{}let e=!0;return fetch(s.O8).then(e=>e.ok?e.json():null).then(r=>{if(!e||"number"!=typeof r?.stargazers_count)return;let o=r.stargazers_count;t(o);try{localStorage.setItem(l,JSON.stringify({count:o,timestamp:Date.now()}))}catch{}}).catch(()=>{}),()=>{e=!1}},[]),{stars:e,formattedStars:null==e?"":e>=1e3?(e/1e3).toFixed(1).replace(/\.0$/,"")+"k":String(e)}}},59255:(e,t,r)=>{r.d(t,{CV:()=>o,E4:()=>u,Is:()=>p,JN:()=>a,Ji:()=>x,KC:()=>n,Kd:()=>b,UH:()=>d,UP:()=>i,Yu:()=>m,od:()=>l,rl:()=>c,uI:()=>h});let o={bg:"var(--color-bg)",bgElevated:"var(--color-surface)",bgPanel:"var(--color-surface-2)",border:"var(--color-border)",borderStrong:"var(--color-border)",borderAccent:"color-mix(in srgb, var(--color-accent) 35%, transparent)",text:"var(--color-text)",textDim:"var(--color-text-muted)",textMuted:"var(--color-text-subtle)",accent:"var(--color-accent)",accentGlow:"color-mix(in srgb, var(--color-accent) 40%, transparent)",accentSoft:"color-mix(in srgb, var(--color-accent) 12%, transparent)",success:"var(--color-success)",warn:"#F59E0B",err:"var(--color-danger)"},s="https://github.com/decolua/9remote",l="https://apps.apple.com/us/app/9remote/id6796664210",a="https://play.google.com/store/apps/details?id=cc.remote9.app&pli=1",n="/download",c=s;function d(){if("u"<typeof navigator)return"other";let e=navigator.userAgent;return/iPhone|iPad|iPod/.test(e)?"other":/Mac/.test(e)?"macos":/Win/.test(e)?"windows":"other"}let i=[{id:"dmg",os:"macOS",short:"macOS",label:"Universal \xb7 Intel + Apple silicon",ext:".dmg",asset:"9Remote-macos-universal.dmg"},{id:"setup",os:"Windows",short:"Win setup",label:"Installer \xb7 x64",ext:".exe",asset:"9Remote-windows-x64-setup.exe"},{id:"portable",os:"Windows",short:"Win portable",label:"Portable \xb7 no install",ext:".exe",asset:"9Remote-windows-x64-portable.exe"}],m=[{tag:"v3.0.31",date:"2026-09-28"},{tag:"v3.0.3",date:"2026-09-21"},{tag:"v3.0.0",date:"2026-09-20"},{tag:"v3.5.9",date:"2026-09-15"}],p=(e,t)=>`${s}/releases/download/${e}/${t}`,x={tag:"v3.0.31",assets:{dmg:`${s}/releases/download/v3.0.31/9Remote-macos-universal.dmg`,setup:`${s}/releases/download/v3.0.31/9Remote-windows-x64-setup.exe`,portable:`${s}/releases/download/v3.0.31/9Remote-windows-x64-portable.exe`,debAmd64:`${s}/releases/download/v3.0.30/9Remote-linux-amd64.deb`,debArm64:`${s}/releases/download/v3.0.30/9Remote-linux-arm64.deb`,appImageArm64:`${s}/releases/download/v3.0.30/9Remote-linux-arm64.AppImage`}},u=e=>e.replace(/^v/,""),b=e=>[...e].sort((e,t)=>t.date.localeCompare(e.date)),h=[{role:"Host",title:"On your machine",desc:"Serves your terminals, screen and files."},{role:"Client",title:"With you anywhere",desc:"Same session on any screen — nothing to sync."}]},69475:(e,t,r)=>{r.d(t,{A:()=>i});var o=r(73365),s=r(1521),l=r(99568),a=r(59255),n=r(90753),c=r(48310);let d=[{href:"#features",label:"Features"},{href:"#security",label:"Security"},{href:"#how-it-works",label:"How It Works"},{href:"https://docs.9remote.cc/",label:"Docs",external:!0},{href:"https://github.com/decolua/9remote",label:"GitHub",external:!0}];function i(){let[e,t]=(0,s.useState)(!1),[r,i]=(0,s.useState)(!1),{formattedStars:m}=(0,c.w)(),p="3.0.32";return(0,s.useEffect)(()=>{let e=()=>t(window.scrollY>20);return window.addEventListener("scroll",e),()=>window.removeEventListener("scroll",e)},[]),(0,o.jsxs)("nav",{className:"fixed top-0 left-0 right-0 z-50 transition-all duration-300",style:{background:e?"color-mix(in srgb, var(--color-bg) 75%, transparent)":"transparent",backdropFilter:e?"blur(16px)":"none",borderBottom:e?`1px solid ${a.CV.border}`:"1px solid transparent"},children:[(0,o.jsxs)("div",{className:"max-w-7xl mx-auto px-6 h-16 flex items-center justify-between",children:[(0,o.jsxs)(l,{href:"/",className:"flex items-center gap-3 group",children:[(0,o.jsx)("img",{src:"/icon-192.png",alt:"9Remote Logo",className:"w-8 h-8 rounded-lg object-contain shadow-md shadow-brand-500/20"}),(0,o.jsx)("span",{className:"text-xl font-bold tracking-tight",style:{color:a.CV.text},children:"9Remote"}),p&&(0,o.jsxs)("span",{className:"px-2 py-0.5 text-xs font-mono font-medium rounded-full bg-brand-500/10 text-brand-400 border border-brand-500/20",children:["v",p]})]}),(0,o.jsx)("div",{className:"hidden md:flex items-center gap-7",children:d.map(e=>(0,o.jsxs)("a",{href:e.href,target:e.external?"_blank":void 0,rel:e.external?"noopener noreferrer":void 0,className:"text-sm transition-colors flex items-center gap-1.5",style:{color:a.CV.textDim},onMouseEnter:e=>e.currentTarget.style.color=a.CV.text,onMouseLeave:e=>e.currentTarget.style.color=a.CV.textDim,children:[(0,o.jsx)("span",{children:e.label}),"GitHub"===e.label&&m&&(0,o.jsxs)("span",{className:"text-[11px] font-mono px-1.5 py-0.5 rounded-full border border-border-subtle bg-surface-2/80 text-text",children:["★ ",m]})]},e.label))}),(0,o.jsxs)("div",{className:"hidden md:flex items-center gap-3",children:[(0,o.jsx)(n.A,{}),(0,o.jsx)(l,{href:a.KC,className:"px-4 py-2 rounded-lg font-semibold text-sm border transition-transform hover:scale-[1.03]",style:{background:a.CV.bgPanel,borderColor:a.CV.border,color:a.CV.text},children:(0,o.jsx)("span",{children:"Download Host"})}),(0,o.jsx)(l,{href:"/login",className:"btn-cta px-5 py-2 rounded-lg font-semibold text-sm transition-transform hover:scale-[1.03]",style:{background:"var(--color-text)",color:"var(--color-bg)"},children:(0,o.jsx)("span",{children:"Remote"})})]}),(0,o.jsxs)("div",{className:"md:hidden flex items-center gap-1.5",children:[(0,o.jsx)(n.A,{}),(0,o.jsx)("button",{onClick:()=>i(!r),className:"p-2",style:{color:a.CV.text},children:(0,o.jsx)("svg",{className:"w-6 h-6",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:r?(0,o.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"}):(0,o.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 6h16M4 12h16M4 18h16"})})})]})]}),r&&(0,o.jsx)("div",{className:"md:hidden",style:{background:"color-mix(in srgb, var(--color-bg) 95%, transparent)",backdropFilter:"blur(16px)",borderTop:`1px solid ${a.CV.border}`},children:(0,o.jsxs)("div",{className:"flex flex-col gap-4 p-6",children:[d.map(e=>(0,o.jsxs)("a",{href:e.href,target:e.external?"_blank":void 0,rel:e.external?"noopener noreferrer":void 0,onClick:()=>i(!1),className:"text-sm flex items-center justify-between",style:{color:a.CV.textDim},children:[(0,o.jsx)("span",{children:e.label}),"GitHub"===e.label&&m&&(0,o.jsxs)("span",{className:"text-xs font-mono px-2 py-0.5 rounded-full border border-border-subtle bg-surface-2 text-text",children:["★ ",m]})]},e.label)),(0,o.jsx)(l,{href:a.KC,onClick:()=>i(!1),className:"px-6 py-2 rounded-lg font-semibold text-sm text-center border",style:{background:a.CV.bgPanel,borderColor:a.CV.border,color:a.CV.text},children:"Download Host"}),(0,o.jsx)(l,{href:"/login",className:"px-6 py-2 rounded-lg font-semibold text-sm text-center",style:{background:"var(--color-text)",color:"var(--color-bg)"},children:"Remote"})]})})]})}},83974:(e,t,r)=>{r.d(t,{A:()=>d});var o=r(73365),s=r(99568),l=r(59255);let a=[{href:"/login",label:"Remote",internal:!0},{href:"/workspace",label:"Terminal",internal:!0},{href:"/remote",label:"Remote Desktop",internal:!0},{href:"https://apps.apple.com/us/app/9remote/id6796664210",label:"iOS (App Store)"},{href:"https://play.google.com/store/apps/details?id=cc.remote9.app&pli=1",label:"Android (Google Play)"}],n=[{href:"https://github.com/decolua/9remote",label:"GitHub"},{href:"https://www.npmjs.com/package/9remote",label:"NPM"},{href:"https://docs.9remote.cc/",label:"Documentation"},{href:"https://www.facebook.com/groups/9teamvn",label:"Community"}];function c({href:e,label:t,internal:r}){return(0,o.jsx)(r?s:"a",{href:e,...r?{}:{target:"_blank",rel:"noopener noreferrer"},className:"text-sm transition-colors",style:{color:l.CV.textDim},onMouseEnter:e=>e.currentTarget.style.color=l.CV.accent,onMouseLeave:e=>e.currentTarget.style.color=l.CV.textDim,children:t})}function d(){let e="3.0.32";return(0,o.jsx)("footer",{className:"relative py-14 px-4 sm:px-6 lg:px-8 border-t",style:{background:l.CV.bg,borderColor:l.CV.border},children:(0,o.jsxs)("div",{className:"max-w-7xl mx-auto",children:[(0,o.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-8 mb-8",children:[(0,o.jsxs)("div",{className:"col-span-1 md:col-span-2",children:[(0,o.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,o.jsx)("img",{src:"/icon-192.png",alt:"9Remote Logo",className:"w-9 h-9 rounded-lg object-contain shadow-md shadow-brand-500/20"}),(0,o.jsx)("h3",{className:"text-xl font-bold",style:{color:l.CV.text},children:"9Remote"})]}),(0,o.jsx)("p",{className:"text-sm max-w-md mb-4",style:{color:l.CV.textDim},children:"Remote everything, everywhere. Remote IDE, 60fps desktop, files, emulator & vibe coding on any screen."}),(0,o.jsxs)("p",{className:"text-xs",style:{color:l.CV.textMuted},children:["\xa9 ",new Date().getFullYear()," 9Remote. All rights reserved.",e&&(0,o.jsxs)("span",{className:"ml-2",children:["v",e]})]})]}),(0,o.jsxs)("div",{children:[(0,o.jsx)("h4",{className:"font-semibold mb-4 text-sm",style:{color:l.CV.text},children:"Product"}),(0,o.jsx)("ul",{className:"space-y-2",children:a.map(e=>(0,o.jsx)("li",{children:(0,o.jsx)(c,{...e})},e.label))})]}),(0,o.jsxs)("div",{children:[(0,o.jsx)("h4",{className:"font-semibold mb-4 text-sm",style:{color:l.CV.text},children:"Resources"}),(0,o.jsx)("ul",{className:"space-y-2",children:n.map(e=>(0,o.jsx)("li",{children:(0,o.jsx)(c,{...e})},e.label))})]})]}),(0,o.jsxs)("div",{className:"pt-8 flex flex-col sm:flex-row justify-between items-center gap-4 border-t",style:{borderColor:l.CV.border},children:[(0,o.jsx)("p",{className:"text-xs",style:{color:l.CV.textMuted},children:"Built with Next.js, Socket.io, and Cloudflare Workers"}),(0,o.jsx)("div",{className:"flex gap-6",children:n.slice(0,3).map(e=>(0,o.jsx)("a",{href:e.href,target:"_blank",rel:"noopener noreferrer",className:"text-xs transition-colors",style:{color:l.CV.textMuted},onMouseEnter:e=>e.currentTarget.style.color=l.CV.accent,onMouseLeave:e=>e.currentTarget.style.color=l.CV.textMuted,children:e.label},e.label))})]})]})})}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4643],{24643:(e,a,o)=>{o.r(a),o.d(a,{default:()=>t});let t={common:{statusIdle:"Idle",statusWorking:"Working",statusBlocked:"Needs input",statusDone:"Your turn",loading:"Carregando...",cancel:"Cancelar",confirm:"Confirmar",save:"Salvar",delete:"Excluir",close:"Fechar",back:"Voltar",edit:"Editar",rename:"Renomear",remove:"Remover",open:"Abrir",yes:"Sim",no:"N\xe3o",ok:"OK",error:"Erro",success:"Sucesso",failed:"Falhou",retry:"Tentar novamente",refresh:"Atualizar",clipboard:"Clipboard",clipboardCopy:"Copy",clipboardEmpty:"Clipboard is empty",search:"Buscar",create:"Criar",new:"Novo",add:"Adicionar",copy:"Copiar",copied:"Copiado",download:"Baixar",upload:"Enviar",enabled:"Ativado",disabled:"Desativado",on:"ligado",off:"desligado",minute:"min",hour:"h",day:"d",minutesAgo:"{n} min atr\xe1s",hoursAgo:"{n} horas atr\xe1s",daysAgo:"{n} dias atr\xe1s"},login:{tagline:"Acesse seu terminal de qualquer lugar",heroLine1:"Any machine.",heroLine2:"One terminal.",heroLine3:"In your pocket.",featureTerminal:"Terminal",featureDesktop:"Desktop",featureFiles:"Files",termConnected:"host connected",termTunnel:"tunnel established",termReady:"ready",accessKey:"Chave de Acesso",placeholder:"sk-xxx... ou Chave \xdanica (ABC123)",rememberKey:"Lembrar esta chave",connect:"Conectar",connecting:"Conectando...",authenticating:"Autenticando com 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:"Chaves Salvas",login:"Entrar",lastLogin:"\xdaltimo login",namePlaceholder:"Name this key (optional)",rename:"Rename",deleteKeyTitle:"Delete key",deleteKeyConfirm:'Are you sure you want to delete "{name}"?',justNow:"Agora mesmo",minutesAgo:"{n}m atr\xe1s",hoursAgo:"{n}h atr\xe1s",daysAgo:"{n}d atr\xe1s",tapToScan:"Toque para escanear",orEnterManually:"ou insira a chave 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:"In\xedcio",docs:"Documenta\xe7\xe3o"},menu:{reloadRestart:"Reload & Restart",restartHost:"Restart 9remote host",restartConfirmTitle:"Restart 9remote host?",restartConfirmMessage:"This restarts the host process (no reinstall). Terminal sessions are preserved. It takes a few seconds.",restartStarting:"Restarting host…",restartRestarting:"Restarting 9remote…",restartDone:"Restarted! Reconnecting…",restartTimeout:"Restart is taking too long",restartTimeoutHint:"Reconnect manually if it doesn't recover.",title:"Menu",language:"Idioma",theme:"Tema",notifications:"Notifica\xe7\xf5es",webgl:"GPU Render (Faster)",webglHint:"Desative se o texto parecer errado",notificationsHint:"Notify when agent finishes",files:"File Explorer",downloading:"Downloading",copying:"Copying",conflictTitle:"File already exists",conflictMessage:"{name} already exists. Replace or skip?",skip:"Skip",skipAll:"Skip all",replace:"Replace",replaceAll:"Replace all",sites:"Sites",commandNotes:"Notas de Comandos",community:"Comunidade",installApp:"Instalar App",codespace:"Codespace",logout:"Sair",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:"Recarregar app",remoteDesktop:"\xc1rea de Trabalho Remota",settings:"Configura\xe7\xf5es",enablePush:"Ativar Notifica\xe7\xf5es Push",disablePush:"Desativar Notifica\xe7\xf5es Push",pushHint:"Ative as notifica\xe7\xf5es push para ser avisado quando a IA concluir tarefas",pushActiveHint:"Push notifications are on for this device. You'll be alerted when AI completes tasks.",versionMismatch:"Agente {version} est\xe1 desatualizado",versionMismatchHint:"Alguns recursos podem n\xe3o funcionar. Execute:",updateNow:"Update now",updating:"Updating… reconnecting",webReloadTitle:"New web version available",webReloadHint:"Reload to get the latest interface.",reloadWeb:"Reload",updateAvailableTitle:"9Remote host update available",updateStarting:"Starting update…",updateInstalling:"Installing new version…",updateTimeout:"Update is taking too long",updateTimeoutHint:"Reload manually if it doesn't recover.",updateRestarting:"Restarting host…",updateReconnecting:"Reconnecting…",updateDone:"Updated! Reloading…",version:"Vers\xe3o"},workspace:{loading:"Carregando...",logoutTitle:"Sair",logoutMessage:"Tem certeza de que deseja sair?",failedCreateSession:"Falha ao criar sess\xe3o: {error}",failedRenameSession:"Falha ao renomear sess\xe3o: {error}"},sessions:{headerTitle:"9remote.cc",connected:"Conectado",disconnected:"Desconectado",codespaceStopped:"Codespace parado",placeholder:"Nome do terminal (opcional)",newButton:"+ Novo",empty:"Nenhuma sess\xe3o ativa",emptyHint:"Crie uma nova sess\xe3o para come\xe7ar",created:"Criado {time}",deleteTitle:"Excluir Sess\xe3o",deleteMessage:'Tem certeza de que deseja excluir "{name}"?',editName:"Editar nome",newTerminal:"Novo 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:"Voltar",menu:"Menu",newTerminal:"Novo terminal",remoteDesktop:"\xc1rea de Trabalho Remota",defaultName:"Term"},files:{selectWorkspace:"Selecionar Workspace",recentWorkspaces:"Workspaces Recentes",home:"In\xedcio",root:"Raiz",drive:"Disco {letter}",codespaces:"Codespaces",removeRecent:"Remover dos recentes",removeTitle:"Remover Workspace",removeMessage:'Remover "{name}" dos workspaces recentes?',setAsWorkspace:"Definir como Workspace",openFolder:"Abrir Pasta",newFile:"Novo Arquivo",newFolder:"Nova Pasta",rename:"Renomear",delete:"Excluir",deleteFile:"Excluir Arquivo",deleteFolder:"Excluir Pasta",deleteFileMessage:'Excluir "{name}"?',deleteFolderMessage:'Excluir a pasta "{name}" e todo o seu conte\xfado?',emptyFolder:"Pasta vazia",git:"Git",parent:"Pasta superior",workspace:"Workspace",failedLoad:"Falha ao carregar: {error}",failedDelete:"Falha ao excluir: {error}",failedCreate:"Falha ao criar: {error}",failedRename:"Falha ao renomear: {error}",enterName:"Digite o nome",confirmRename:"Renomear para:",setWorkspace:"Definir Workspace",setAsWorkspaceTitle:"Definir como workspace",switchWorkspace:"Alternar workspace",searchFiles:"Buscar arquivos",toggleHidden:"Alternar arquivos ocultos",searchPlaceholder:"Buscar arquivos...",searching:"Buscando...",noFilesFound:"Nenhum arquivo encontrado",noGitRepo:"Nenhum reposit\xf3rio Git",cannotOpenBinary:"N\xe3o \xe9 poss\xedvel abrir arquivo bin\xe1rio",createNew:"Criar Novo",file:"Arquivo",folder:"Pasta",placeholderFile:"filename.js",placeholderFolder:"nome-da-pasta",pickFile:"Choose files",pickFolder:"Choose folder",copyPath:"Copiar caminho",copyRelPath:"Copy Relative Path",copyName:"Copy Filename",delete:"Excluir",rename:"Renomear",deleteConfirmTitle:"Excluir",deleteConfirmMessage:'Excluir "{name}"?'},editor:{save:"Salvar",saving:"Salvando...",saved:"Salvo",unsaved:"Altera\xe7\xf5es n\xe3o salvas",close:"Fechar",discard:"Descartar",discardTitle:"Descartar Altera\xe7\xf5es",discardMessage:"Voc\xea tem altera\xe7\xf5es n\xe3o salvas. Descart\xe1-las?",unsavedTitle:"Save changes to {name}?",unsavedBody:"Your changes will be lost if you don't save them.",failedLoad:"Falha ao carregar arquivo: {error}",failedSave:"Falha ao salvar: {error}",openFull:"Open in full editor",artifact:"Artifact",readOnly:"Somente leitura",line:"Linha",column:"Coluna",gitDiff:"Diff do Git",typeText:"Digite o texto e insira...",insert:"Inserir",statusModified:"Modificado",statusAdded:"Adicionado",statusUntracked:"N\xe3o rastreado"},git:{title:"Git",branch:"Branch",changes:"Altera\xe7\xf5es",staged:"Em stage",unstaged:"Fora do stage",untracked:"N\xe3o rastreado",commit:"Commit",commitAndPush:"Commit & Push",commitSuccess:"Commit successful",pushSuccess:"Push successful",stageFailed:"Failed to stage changes",commitFailed:"Commit failed",pushFailed:"Push failed",pullSuccess:"Pull successful",pullFailed:"Pull failed",stageAllConfirmTitle:"Stage All & Commit",stageAllConfirmMessage:"No changes are staged. Stage all changes and commit?",stageAndCommit:"Stage & Commit",gitActions:"Git actions",commitPlaceholder:"Commit message…",stageAllNote:"Stage all \xb7 {count}",upToDate:"Everything up-to-date",commitMessage:"Mensagem de commit",push:"Push",pull:"Pull",fetch:"Fetch",stage:"Stage",stageAll:"Adicionar tudo ao stage",unstage:"Remover do stage",discard:"Descartar",discardChanges:"Descartar Altera\xe7\xf5es",discardMessage:'Descartar altera\xe7\xf5es em "{name}"?',noChanges:"Nenhuma altera\xe7\xe3o",diff:"Diff",pushing:"Enviando...",pulling:"Baixando...",committing:"Realizando commit...",failedCommit:"Falha no commit: {error}",failedPush:"Falha no push: {error}",failedPull:"Falha no pull: {error}",status:"Status",diffTab:"Diff",modified:"Modificado",added:"Adicionado",deleted:"Exclu\xeddo",untrackedTitle:"N\xe3o rastreado",openFile:"Abrir arquivo",discardChangesTitle:"Descartar altera\xe7\xf5es",discardConfirmTitle:"Descartar Altera\xe7\xf5es",discardConfirmDelete:'Tem certeza de que deseja excluir "{name}"? Isso n\xe3o pode ser desfeito.',discardConfirmDiscard:'Tem certeza de que deseja descartar as altera\xe7\xf5es em "{name}"? Isso n\xe3o pode ser desfeito.'},remote:{title:"\xc1rea de Trabalho Remota",connecting:"Conectando...",disconnected:"Desconectado",fullscreen:"Tela Cheia",exitFullscreen:"Sair da Tela Cheia",receivingImage:"Receiving screen…",keyboard:"Teclado",mouse:"Mouse",quality:"Qualidade",fps:"FPS",debug:"Depurar",help:"Ajuda",close:"Fechar",sendKey:"Enviar Tecla",helpTitle:"Ajuda da \xc1rea de Trabalho Remota",notAvailable:"\xc1rea de trabalho remota n\xe3o dispon\xedvel",customizeKeys:"Personalizar teclas",back:"Voltar",resetZoom:"Redefinir zoom",refresh:"Atualizar",rectangleSelection:"Sele\xe7\xe3o retangular",handMode:"Modo m\xe3o",toggleKeyboard:"Alternar teclado nativo",hideControls:"Hide controls",showControls:"Show controls",textBatchInput:"Entrada de texto em lote",extraKeys:"Teclas extras",customizeRemoteKeys:"Personalizar Teclas Remotas",exitRemote:"Sair da \xe1rea de trabalho remota",debugTitle:"Estat\xedsticas de Depura\xe7\xe3o",minimize:"Minimizar",transport:"Transporte",latency:"Lat\xeancia",tilesPerSec:"Tiles/seg",bandwidth:"Largura de banda",clearStats:"Limpar Estat\xedsticas",lockTitle:"Windows est\xe1 bloqueado",lockGrantDesc:'Ative "Desbloquear PC remotamente" no 9remote host deste PC.',lockDesc:"Digite o PIN ou a senha do Windows para este computador",lockPlaceholder:"PIN ou senha do Windows",unlock:"Desbloquear",unlocking:"Desbloqueando…",unlockFailed:"Falha ao desbloquear — verifique seu PIN/senha e tente novamente."},remoteHelp:{modePc:"PC / Mouse",modeTrackpad:"Toque \xb7 Trackpad",modeDirect:"Toque \xb7 Direto",mouseTitle:"Mouse",keyboardTitle:"Teclado",gesturesTrackpadTitle:"Gestos (Trackpad ✋)",gesturesDirectTitle:"Gestos (Direto)",toolbarTitle:"Barra de ferramentas",mouseClickKey:"Clique / Arrastar",mouseClickDesc:"Clique esquerdo, arraste para selecionar/mover",mouseRightKey:"Clique direito",mouseRightDesc:"Menu de contexto no remoto",mouseWheelKey:"Roda",mouseWheelDesc:"Rolar remoto (Shift + Roda = horizontal)",mouseDoubleKey:"Clique duplo",mouseDoubleDesc:"Clique duplo no remoto",keyPhysicalKey:"Teclas f\xedsicas",keyPhysicalDesc:"Enviadas diretamente (Tab, teclas F, etc. capturadas)",keyModifierKey:"Ctrl / Alt / Shift / ⌘",keyModifierDesc:"Modificador fixo — combine com a pr\xf3xima tecla",trackpadSwipeKey:"Deslizar com 1 dedo",trackpadSwipeDesc:"Mover cursor virtual",trackpadTapKey:"Toque com 1 dedo",trackpadTapDesc:"Clique esquerdo no cursor",trackpad2TapKey:"Toque com 2 dedos",trackpad2TapDesc:"Clique direito no cursor",trackpad2SwipeKey:"Deslizar com 2 dedos",trackpad2SwipeDesc:"Rolar na posi\xe7\xe3o do cursor",trackpadPinchKey:"Pin\xe7ar com 2 dedos",trackpadPinchDesc:"Zoom no canvas",trackpadScrollLockKey:"Segurar + arrastar",trackpadScrollLockDesc:"Segure para travar a rolagem, arraste em qualquer dire\xe7\xe3o",directTapKey:"Toque com 1 dedo",directTapDesc:"Clique na posi\xe7\xe3o do toque",directLongKey:"Pressionar longo com 1 dedo",directLongDesc:"Clique direito",directDoubleKey:"Toque duplo com 1 dedo",directDoubleDesc:"Clique duplo",directScrollKey:"Deslizar com 2 dedos",directScrollDesc:"Rolar remoto",directPinchKey:"Pin\xe7ar com 2 dedos",directPinchDesc:"Zoom no canvas",directPanKey:"Arrastar com 1 dedo (zoom>1)",directPanDesc:"Mover canvas",toolbarHandDesc:"Manter clique esquerdo (modo arrastar) — toque novamente para soltar",toolbarMouseDirectDesc:"Mudar para modo Direto",toolbarMouseTrackpadDesc:"Mudar para Trackpad (cursor virtual)",toolbarKeyboardDesc:"Teclado nativo / entrada de texto em lote",toolbarRectDesc:"Modo sele\xe7\xe3o retangular"},remoteControls:{enterToSend:"Tab / Ctrl+Num para mudar de aba",typeToSend:"Digite o texto para enviar...",send:"Enviar",trackpadMode:"Modo trackpad",directMode:"Modo direto",bottomRow:"Linha Inferior",extraPanel:"Painel Extra",exitConfirmMessage:"Tem certeza de que deseja sair da sess\xe3o atual da \xe1rea de trabalho remota?"},connection:{retrying:"Reconectando...",waitingApproval:"Aguardando Aprova\xe7\xe3o",approvalDescription:"O 9Remote host precisa aprovar este dispositivo antes que voc\xea possa se conectar.",approvalHint:"Verifique o terminal na sua m\xe1quina.",rejectedTitle:"Dispositivo Rejeitado",rejectedDescription:"Este dispositivo n\xe3o foi aprovado pelo 9Remote host.",backToLogin:"Voltar ao Login",failed:"Falha na Conex\xe3o",failedDescription:"N\xe3o foi poss\xedvel conectar ap\xf3s {n} tentativas",attemptOf:"Tentativa {n} de {total}",exit:"Sair",cancel:"Cancelar",retry:"Tentar agora"},notifications:{claudeCode:"Claude Code",codex:"Codex",geminiCli:"Gemini CLI",openCode:"OpenCode",needsInput:"needs input",badgeTitle:"{blocked} needs input, {done} your turn",replied:"replied",agent:"Agent"},sites:{title:"Sites",localSites:"Sites Locais",selectSitePreview:"Selecione um site para visualizar",browserNewTab:"New tab",browserAddressPlaceholder:"localhost:3000 or /path",browserNotConnected:"Connect to your host first",portPlaceholder:"porta",loadingSites:"Carregando Sites...",notConnected:"Not connected to the host",noSitesFound:"Nenhum site encontrado",startServerHint:"Inicie um servidor local de desenvolvimento para v\xea-lo aqui",siteNamePlaceholder:"Nome do site",saveTitle:"Salvar",editNameTitle:"Editar nome",removeTitle:"Remover",removePortTitle:"Remover Porta",removePortMessage:"Remover a porta {port} da lista salva?",popupBlocked:"Pop-up bloqueado! Permita pop-ups para este site.",startProxyFailed:"Falha ao iniciar sess\xe3o de proxy para {name}",foundCount:"{n} site{suffix} encontrado",focusOpenedTab:"Focar aba aberta",openInNewTab:"Abrir em nova aba",goBack:"Voltar",goForward:"Avan\xe7ar",loadingSite:"Carregando...",empty:"Nenhum site ativo",emptyHint:"Execute um servidor local para v\xea-lo aqui",open:"Abrir",refresh:"Atualizar"},commandNotes:{title:"Notas de Comandos",noSavedCommands:"Nenhum comando salvo",addFirstBelow:"Adicione seu primeiro comando abaixo",clickToCopy:"Clique para copiar",copiedBang:"Copiado!",copy:"Copiar",edit:"Editar",delete:"Excluir",editCommandPlaceholder:"Editar comando...",addCommandPlaceholder:"Adicionar comando...",update:"Atualizar",add:"Adicionar Nota",empty:"Ainda n\xe3o h\xe1 notas",emptyHint:"Salve comandos para acesso r\xe1pido",edit:"Editar Nota",delete:"Excluir Nota",deleteMessage:"Excluir esta nota?",name:"Nome",command:"Comando",save:"Salvar",placeholderName:"ex.: Iniciar servidor de dev",placeholderCommand:"ex.: npm run dev"},mobileKeyboard:{pasteHere:"Cole aqui (Cmd+V)",enterToSend:"Tab / Ctrl+Num para mudar de aba",typeCommand:"Digite o comando e envie...",send:"Enviar",toggleExtraKeys:"Alternar teclas extras",toggleTextInput:"Alternar entrada de texto",customizeTerminalKeys:"Personalizar Teclas do Terminal",mainBar:"Barra Principal",extraPanel:"Painel Extra",fileTooLarge:"Arquivo muito grande (m\xe1x. 5MB)",readFileFailed:"Falha ao ler arquivo",uploadFailed:"Falha ao enviar arquivo: {error}"},terminalPane:{scrollToBottom:"Rolar at\xe9 o final",changedFiles:"Changed files",pasteOrType:"Cole ou digite aqui",paste:"Colar"},pwaGuide:{copyYourKey:"Copie Sua Chave",copyKeyHint:"Toque na chave abaixo para copiar — voc\xea precisar\xe1 dela para entrar ap\xf3s instalar",tapToCopyApiKey:"Toque para copiar a chave de API",copiedBang:"Copiado!",copy:"Copiar",tapShareButton:"Toque no Bot\xe3o Compartilhar",tapShareHint:"Toque no bot\xe3o compartilhar na parte inferior do iOS Safari",addToHome:"Adicionar \xe0 Tela de In\xedcio",addToHomeHint:'Role para baixo e toque em "Adicionar \xe0 Tela de In\xedcio"',openAppPasteKey:"Abrir App e Colar Chave",openAppPasteKeyHint:"Abra o app instalado e cole sua chave para entrar",openMenu:"Abrir Menu",openMenuHint:"Toque no bot\xe3o de menu (tr\xeas pontos) no Android Chrome",installApp:"Instalar App",installAppHint:'Toque em "Instalar app" ou "Adicionar \xe0 tela inicial"',lookInstallIcon:"Procure o \xcdcone de Instala\xe7\xe3o",lookInstallIconHint:"Procure o \xedcone de instala\xe7\xe3o na barra de endere\xe7o",clickInstallPaste:"Clique em Instalar e Cole a Chave",installNow:"Install Now",installNowHint:"Install 9Remote as an app for quick access",installing:"Installing...",clickInstallPasteHint:"Clique em instalar, abra o app e cole sua chave para entrar",alternativeHint:'Alternativa: Abra o menu do navegador → "Instalar 9Remote" ou "Criar atalho"',loadingPlatform:"Carregando detec\xe7\xe3o de plataforma...",iosPlatform:"iOS (iPhone/iPad)",androidPlatform:"Android",macosPlatform:"macOS",windowsPlatform:"Windows",desktopPlatform:"Desktop",alreadyInstalled:"J\xe1 Instalado!",alreadyInstalledHint:"Voc\xea j\xe1 est\xe1 usando o 9Remote como app instalado",installationGuide:"Guia de Instala\xe7\xe3o",installationSteps:"Passos de Instala\xe7\xe3o:"},community:{title:"Comunidade",description:"Junte-se \xe0 comunidade 9Remote"},pwa:{title:"Instalar como App",description:"Instale o 9Remote no seu dispositivo para a melhor experi\xeancia",iosTitle:"iOS Safari",androidTitle:"Android Chrome",desktopTitle:"Desktop"},codespace:{title:"Codespace",name:"Nome",status:"Status",running:"Em execu\xe7\xe3o",autoStart:"Iniciar 9Remote automaticamente",autoStartHint:"Iniciar o 9Remote quando o codespace abrir",stop:"Parar Codespace",stopHint:"Pare para economizar uso",restartHint:"Para reiniciar, v\xe1 ao GitHub",unknown:"Desconhecido"}}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5788],{2163:(e,t,r)=>{r.d(t,{o:()=>n});function n(e){if(!e)return"";if(e.length<=14)return e;let t=e.substring(0,8),r=e.substring(e.length-6),n="•".repeat(12);return`${t}${n}${r}`}},2805:(e,t,r)=>{r.d(t,{Yr:()=>o,_r:()=>s,gJ:()=>l,rh:()=>c,sP:()=>a});var n=r(90076);let i=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;function s(){let e=window.location.hostname;return"localhost"===e||"::1"===e||"[::1]"===e||e.startsWith("127.")||e.endsWith(".localhost")}function a(){return s()||!!window.__TAURI__}function l(){return!!window.__TAURI__||window.location.port===String(n._8)||!0}function o(){if(s())return!0;let e=i.exec(window.location.hostname);if(!e||e.slice(1).some(e=>Number(e)>255))return!1;let t=Number(e[1]),r=Number(e[2]);return 10===t||192===t&&168===r||172===t&&!!(r>=16)&&!!(r<=31)}function c(e){return s()&&window.location.port!==String(n._8)?e?.loopbackOrigin||n.w||n.lE:null}},4018:(e,t,r)=>{r.d(t,{N:()=>i.N0,u:()=>o});var n=r(1521),i=r(86129);let s="9remote_api_keys",a=()=>{window.dispatchEvent(new Event(i.N0))};function l(e){try{return btoa(e)}catch{return e}}function o(){let e=(0,n.useCallback)(()=>{try{let e=localStorage.getItem(s);if(!e)return[];return JSON.parse(e).map(e=>({...e,key:function(e){try{return atob(e)}catch{return e}}(e.key)}))}catch(e){return console.error("Failed to load API keys:",e),[]}},[!0]),t=(0,n.useCallback)((t,r="")=>{if(t&&1)try{let n=e(),i=n.findIndex(e=>e.key===t);if(-1!==i){let e=n.map((e,t)=>({...e,key:l(e.key),lastLoginDate:t===i?new Date().toISOString():e.lastLoginDate}));localStorage.setItem(s,JSON.stringify(e));return}let o={id:Date.now().toString(),key:l(t),label:r||`Key ${n.length+1}`,createdAt:new Date().toISOString(),lastLoginDate:new Date().toISOString()},c=[...n.map(e=>({...e,key:l(e.key)})),o];localStorage.setItem(s,JSON.stringify(c)),a()}catch(e){console.error("Failed to save API key:",e)}},[!0,e]),r=(0,n.useCallback)(t=>{try{let r=e().filter(e=>e.id!==t).map(e=>({...e,key:l(e.key)}));localStorage.setItem(s,JSON.stringify(r)),a()}catch(e){console.error("Failed to remove API key:",e)}},[!0,e]),i=(0,n.useCallback)(()=>{try{localStorage.removeItem(s)}catch(e){console.error("Failed to clear API keys:",e)}},[!0]),o=(0,n.useCallback)(()=>{try{let e=localStorage.getItem(s);if(!e)return!1;return JSON.parse(e).length>0}catch{return!1}},[!0]),c=(0,n.useCallback)((t,r)=>{try{let n=e().map(e=>({...e,key:l(e.key),label:e.id===t?r:e.label||""}));localStorage.setItem(s,JSON.stringify(n)),a()}catch(e){console.error("Failed to rename API key:",e)}},[!0,e]),d=(0,n.useCallback)(t=>{if(t&&1)try{let r=e().map(e=>({...e,key:l(e.key),lastLoginDate:e.key===t?new Date().toISOString():e.lastLoginDate}));localStorage.setItem(s,JSON.stringify(r))}catch(e){console.error("Failed to update last login date:",e)}},[!0,e]);return{saveKey:t,loadKeys:e,removeKey:r,renameKey:c,clearKeys:i,hasStoredKeys:o,updateLastLogin:d}}},7938:(e,t,r)=>{r.d(t,{D5:()=>a,FO:()=>c,I9:()=>o,Ic:()=>l,eR:()=>n,ij:()=>s,tC:()=>i});let n={namespace:"/remote",enableWebRTC:!0,enableTurn:!1,debug:{transport:!1,remote:!1,panel:!1,showButton:!1},dcChunkSize:8,dcReliable:!1,dcOrdered:!1,hashRequestInterval:1500,lastDataThreshold:500,restreamDelay:200,mouseThrottle:8,keyThrottle:25,scrollInterval:100,tileLoadTimeout:600,batchSize:16,batchDelay:3,decodeQueueCap:48,resizeDebounceMs:100,resizeStableFrames:3,resizeMaxFrames:30,focusDebounce:50,longPressDelay:1e3,doubleClickDelay:300,moveThreshold:10,edgeScrollThreshold:15,edgeScrollMultiplier:1.5,momentumFriction:.94,momentumMinVelocity:.3,pointerMode:"trackpad",trackpadSensitivity:1.3,trackpadAcceleration:1.5,trackpadTapMaxMove:8,trackpadTapMaxDuration:220,trackpadCursorSize:20,trackpadEdgeMarginRatio:.25,clipboardBadgeTimeout:1e4,gestureLockDelay:80,gestureDistanceThreshold:15,gestureCentroidThreshold:10,gestureDominanceRatio:2,wheelScrollMultiplier:2.5,wheelLineHeight:40,wheelPageHeight:400,wheelZoomStep:.1,wheelBoostInterval:250,mouseButtonMap:{0:"left",1:"middle",2:"right"},pcModeControls:{rectangleSelect:!1,pointerModeToggle:!1,handMode:!1,keyboardToggle:!1,textPanel:!0,modifierRow:!0,help:!0}},i={ctrl:"control",cmd:"command",alt:"alt",shift:"shift"},s=[{id:"ctrl",label:"Ctrl",modifier:"ctrl",type:"modifier"},{id:"alt",label:"Alt",modifier:"alt",type:"modifier"},{id:"shift",label:"Shift",modifier:"shift",type:"modifier"},{id:"cmd",label:"⌘",modifier:"cmd",type:"modifier"},{id:"esc",label:"Esc",key:"escape",type:"key"},{id:"tab",label:"Tab",key:"tab",type:"key"},{id:"enter",label:"↵",key:"enter",type:"key",primary:!0},{id:"backspace",label:"⌫",key:"backspace",type:"key"},{id:"undo",label:"Undo",key:"z",modifiers:["control"],type:"combo",osAdaptive:!0},{id:"redo",label:"Redo",key:"z",modifiers:["control","shift"],type:"combo",osAdaptive:!0},{id:"up",label:"↑",key:"up",type:"arrow"},{id:"down",label:"↓",key:"down",type:"arrow"},{id:"left",label:"←",key:"left",type:"arrow"},{id:"right",label:"→",key:"right",type:"arrow"},{id:"home",label:"Home",key:"home",type:"key"},{id:"end",label:"End",key:"end",type:"key"},{id:"pgup",label:"PgUp",key:"pageup",type:"key"},{id:"pgdn",label:"PgDn",key:"pagedown",type:"key"},{id:"del",label:"Del",key:"delete",type:"key"},{id:"ins",label:"Ins",key:"insert",type:"key"},{id:"f1",label:"F1",key:"f1",type:"key"},{id:"f2",label:"F2",key:"f2",type:"key"},{id:"f3",label:"F3",key:"f3",type:"key"},{id:"f4",label:"F4",key:"f4",type:"key"},{id:"f5",label:"F5",key:"f5",type:"key"},{id:"f6",label:"F6",key:"f6",type:"key"},{id:"f7",label:"F7",key:"f7",type:"key"},{id:"f8",label:"F8",key:"f8",type:"key"},{id:"f9",label:"F9",key:"f9",type:"key"},{id:"f10",label:"F10",key:"f10",type:"key"},{id:"f11",label:"F11",key:"f11",type:"key"},{id:"f12",label:"F12",key:"f12",type:"key"},{id:"ctrlAltDel",label:"Ctl+Alt+Del",key:"delete",modifiers:["control","alt"],type:"combo"},{id:"ctrlShiftEsc",label:"Task Mgr",key:"escape",modifiers:["control","shift"],type:"combo"},{id:"altTab",label:"Alt+Tab",key:"tab",modifiers:["alt"],type:"combo"},{id:"altF4",label:"Alt+F4",key:"f4",modifiers:["alt"],type:"combo"},{id:"winKey",label:"Win",key:"command",type:"key"},{id:"printScreen",label:"PrtSc",key:"printscreen",type:"key"},{id:"paste",label:"Paste",key:"v",modifiers:["control"],type:"combo",osAdaptive:!0},{id:"cut",label:"Cut",key:"x",modifiers:["control"],type:"combo",osAdaptive:!0},{id:"selectAll",label:"All",key:"a",modifiers:["control"],type:"combo",osAdaptive:!0},{id:"desktopPrev",label:"◀ Desk",type:"desktop",direction:"prev"},{id:"desktopNext",label:"Desk ▶",type:"desktop",direction:"next"},{id:"desktopNew",label:"+ Desk",type:"desktop",direction:"new"}],a=["esc","undo","up","down","tab","ctrl","alt","shift","cmd","backspace"],l="enter",o=[["left","right","home","end","pgup","pgdn","del"],["f1","f2","f3","f4","f5","f6","f7","altTab"],["f9","f10","f11","f12","ctrlAltDel",,"desktopPrev","desktopNext","desktopNew"]],c={enter:"enter",return:"enter",space:" ",backspace:"backspace",tab:"tab",escape:"escape",Enter:"enter"," ":"space",Backspace:"backspace",Tab:"tab",Escape:"escape",ArrowUp:"up",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right",Home:"home",End:"end",PageUp:"pageup",PageDown:"pagedown",Delete:"delete",Insert:"insert",F1:"f1",F2:"f2",F3:"f3",F4:"f4",F5:"f5",F6:"f6",F7:"f7",F8:"f8",F9:"f9",F10:"f10",F11:"f11",F12:"f12",CapsLock:"capslock",NumLock:"numlock",ScrollLock:"scrolllock",PrintScreen:"printscreen",ContextMenu:"menu"}},11155:(e,t,r)=>{function n(e){return"string"==typeof e&&!!e&&/^sk-[a-z0-9]{8}-[a-z0-9]{4}-[0-9a-f]{6}$/.test(e.trim().toLowerCase())}function i(e){if("string"!=typeof e||!/^sk-[a-z0-9]{8}-[a-np-z1-9]{8}-[a-np-z1-9]{8}$/.test(e))return e||null;let t=e.split("-");return`${t[0]}-${t[1]}-${t[2]}`}function s(e){return"string"==typeof e&&/^sk-[a-z0-9]{8}-[a-np-z1-9]{8}-[a-np-z1-9]{8}$/.test(e)?e.split("-")[3]:null}r.d(t,{Cj:()=>s,PF:()=>n,Uo:()=>i})},11865:(e,t,r)=>{r.d(t,{A:()=>o});var n=r(73365),i=r(1521),s=r(64683),a=r(80186),l=r(78762);function o({isOpen:e,onClose:t,onScan:c}){let{t:d}=(0,l.s)(),u=(0,i.useRef)(null),p=(0,i.useRef)(null),h=(0,i.useRef)(null),m=(0,i.useRef)(null),f=(0,i.useRef)(null),[g,y]=(0,i.useState)(""),[_,b]=(0,i.useState)(""),w=(0,i.useCallback)(async e=>{if(p.current)try{await p.current.stop()}catch(e){}b("detected"),await new Promise(e=>setTimeout(e,300)),b("authenticating"),await c(e)||(b(""),f.current?.())},[c]),k=(0,i.useCallback)(async()=>{if(!h.current){let e=await Promise.all([r.e(3446),r.e(6075)]).then(r.bind(r,16075)).catch(()=>null);if(!e)return void y(d("login.qrLibFail"));h.current=e.Html5Qrcode}let e=document.getElementById("qr-reader");if(!e)return void y(d("login.qrInitFail"));try{e.innerHTML="";let t=new h.current("qr-reader");p.current=t,await t.start({facingMode:"environment"},{fps:10,qrbox:{width:250,height:250}},e=>{m.current?.(e)},()=>{})}catch(t){let e=t.toString();e.includes("NotAllowedError")?y(d("login.qrCamDenied")):e.includes("NotFoundError")?y(d("login.qrNoCamera")):e.includes("NotReadableError")?y(d("login.qrCamBusy")):y(d("login.qrCamError"))}},[d]),v=(0,i.useCallback)(async()=>{if(p.current){try{await p.current.stop()}catch(e){}p.current=null}y(""),b(""),t()},[t]);return((0,i.useEffect)(()=>{m.current=w},[w]),(0,i.useEffect)(()=>{if(!e)return;let t=!1;f.current=async()=>{p.current=null,await new Promise(e=>setTimeout(e,400)),t||k()};let r=setTimeout(()=>{t||k()},200);return()=>{if(t=!0,clearTimeout(r),f.current=null,p.current){try{p.current.stop()}catch(e){}p.current=null}}},[e,k]),e)?(0,n.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm",children:(0,n.jsxs)("div",{className:"relative card-elev max-w-md w-full mx-4 overflow-hidden",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between p-4 border-b border-border",children:[(0,n.jsx)("h2",{className:"text-xl font-bold text-text",children:d("login.qrScanTitle")}),(0,n.jsx)("button",{onClick:v,className:"text-text-muted hover:text-text transition-colors p-1",children:(0,n.jsx)(s.X,{size:24})})]}),(0,n.jsx)("div",{className:"relative bg-black",children:(0,n.jsx)("div",{id:"qr-reader",ref:u,className:"w-full",style:{minHeight:"300px"}})}),(0,n.jsxs)("div",{className:"p-4",children:[g?(0,n.jsxs)("div",{className:"flex items-start gap-2 p-3 bg-red-500/10 rounded-brand text-red-400",children:[(0,n.jsx)(s.RI,{size:20,className:"flex-shrink-0 mt-0.5"}),(0,n.jsx)("p",{className:"text-sm",children:g})]}):"detected"===_?(0,n.jsxs)("div",{className:"flex items-center justify-center gap-2 p-3 bg-green-500/10 rounded-brand text-green-400",children:[(0,n.jsx)(s.vW,{size:22}),(0,n.jsx)("p",{className:"text-sm font-medium",children:d("login.qrDetected")})]}):"authenticating"===_?(0,n.jsx)("div",{className:"flex items-center justify-center gap-2 p-3 bg-brand-500/10 rounded-brand text-brand-400",children:(0,n.jsx)("p",{className:"text-sm font-medium",children:d("login.qrAuthenticating")})}):(0,n.jsx)("p",{className:"text-sm text-text-muted text-center",children:d("login.qrHint")}),(0,n.jsx)(a.A,{variant:"secondary",onClick:v,disabled:"authenticating"===_,className:"w-full mt-4",children:"authenticating"===_?d("login.qrPleaseWait"):d("common.cancel")})]})]})}):null}},18057:(e,t,r)=>{r.d(t,{A:()=>c});var n=r(73365),i=r(1521),s=r(64683),a=r(8910),l=r(78762),o=r(52345);function c({isOpen:e,onClose:t}){let{t:r,locale:d,setLocale:u}=(0,l.s)();return((0,i.useEffect)(()=>{if(!e)return;let r=e=>{"Escape"===e.key&&t()};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[e,t]),e)?(0,n.jsxs)("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",children:[(0,n.jsx)("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-[2px] animate-in fade-in duration-200",onClick:t}),(0,n.jsxs)("div",{className:"relative card-elev max-w-lg w-full max-h-[90dvh] flex flex-col animate-in zoom-in-95 duration-200",children:[(0,n.jsxs)("div",{className:"px-5 py-4 flex items-center justify-between flex-shrink-0",children:[(0,n.jsx)("h3",{className:"text-lg font-semibold text-text",children:r("menu.language")}),(0,n.jsx)("button",{onClick:t,className:"p-2 text-text-muted hover:text-text hover:bg-surface-2 rounded-brand transition-all duration-150 ease-out","aria-label":r("common.close"),children:(0,n.jsx)(s.X,{size:20})})]}),(0,n.jsx)("div",{className:"flex-1 overflow-y-auto modal-scrollable p-3",children:(0,n.jsx)("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-2",children:o.dI.map(e=>{let r=e.code===d;return(0,n.jsxs)("button",{onClick:()=>{var r;return r=e.code,void((0,a.e)(),u(r),t())},className:`px-2 py-2 rounded-brand flex items-center gap-2 transition-all duration-150 ease-out active:scale-[0.97] min-w-0 ${r?"bg-brand-500 text-white":"text-text hover:bg-surface-2"}`,children:[(0,n.jsx)("img",{src:`https://flagcdn.com/w80/${e.country}.png`,alt:e.label,className:"w-5 h-[14px] object-cover rounded-[2px] flex-shrink-0",loading:"lazy"}),(0,n.jsx)("span",{className:"flex-1 text-sm font-medium truncate text-left",children:e.label}),r&&(0,n.jsx)(s.aJ,{size:14,className:"flex-shrink-0"})]},e.code)})})})]})]}):null}},20464:(e,t,r)=>{r.d(t,{As:()=>f,zg:()=>u});var n=r(1521),i=r(29717),s=r(90076),a=r(11155),l=r(90084),o=r(2805),c=r(97711);let d="wrong-key-tail";async function u(e,t,r=s.qn){try{let t=new AbortController,n=setTimeout(()=>t.abort(),r),i=await fetch(`${e}/api/health`,{signal:t.signal});return clearTimeout(n),i.ok}catch{return!1}}async function p(e,{tail:t,tempKey:r},n=s.qn){try{let i=new AbortController,s=setTimeout(()=>i.abort(),n),a=await fetch(`${e}/api/verify-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({tail:t||null,tempKey:r||null}),signal:i.signal});if(clearTimeout(s),!a.ok)return null;return(await a.json())?.ok===!0}catch{return null}}async function h(){return(0,o._r)()?(0,o.rh)(await m()):(0,o.Yr)()?window.location.origin:null}async function m(){try{let e=await fetch(s.TR);return e.ok?await e.json():null}catch{return null}}function f(){let[e,t]=(0,n.useState)(!1),[r,o]=(0,n.useState)(""),u=(0,i.useRouter)(),{setAuth:f}=(0,c.Fo)(),g=(0,n.useCallback)(async(e,{persistSession:r=!0}={})=>{t(!0),o("");try{let t,n=await h();if(n){let t=e.tail||(0,a.Cj)(e.apiKey||""),i=e.tempKey||(e.token?.length<=8?e.token:null),s=await m(),c=(0,a.Uo)(s?.permanentKey||""),u=(0,a.Uo)(e.apiKey||e.token||""),h=String(s?.oneTimeKey||"").slice(0,6).toUpperCase(),g=i?!!h&&h===i.toUpperCase():!!c&&!!u&&(0,a.Uo)(c)===u;try{let s=g?await p(n,{tail:t,tempKey:i}):null;if(!0===s){let s=e.apiKey||i||"",o=(0,a.Uo)(s)||"direct";return t&&(0,l.LG)(o,{tail:t}),r&&f({apiKey:o,tunnelUrl:n,mode:"local",tempKey:i?i.toUpperCase():null,localIp:null}),{success:!0,shouldAskToSave:!0,apiKey:o}}if(!1===s)return o(d),{success:!1,wrongTail:!0}}catch{}}let i=new AbortController,c=setTimeout(()=>i.abort(),s.cC);try{t=await fetch(s.Sn.connect,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...e,apiKey:(0,a.Uo)(e.apiKey)}),signal:i.signal})}catch(e){throw Error(e?.name==="AbortError"?"Connection timed out. Please try again.":"Network error. Please try again.")}finally{clearTimeout(c)}if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error||"Authentication failed")}let u=await t.json(),g=(0,a.Uo)(e.apiKey||u.apiKey);u.hostKeys?.x&&(0,l.LG)(g,{hostSealKey:u.hostKeys.x,hostPubKey:u.hostKeys.ed||null});let y=e.tail||(0,a.Cj)(e.apiKey||"");if(u.tunnelUrl&&(y||e.tempKey)){let t=await p(u.tunnelUrl,{tail:y,tempKey:e.tempKey||null});if(!1===t)return o(d),{success:!1,wrongTail:!0}}return r&&f({apiKey:g,tunnelUrl:u.tunnelUrl||null,mode:"remote",tempKey:e.tempKey?e.tempKey.toUpperCase():null,localIp:u.localIp||null}),{success:!0,shouldAskToSave:!0,apiKey:g}}catch(e){return o(e.message),{success:!1,error:e.message}}finally{t(!1)}},[u,f]);return{loading:e,error:r,setError:o,authenticateWithToken:(0,n.useCallback)(async(e,t=!1,r=null,n)=>t?g({token:e,tempKey:e,tail:r},n):g({token:e},n),[g]),authenticateWithApiKey:(0,n.useCallback)((e,t)=>g({apiKey:e},t),[g])}}},27520:(e,t,r)=>{r.d(t,{FQ:()=>o,Lq:()=>m,UX:()=>l,k_:()=>d,yO:()=>c});var n=r(2805);let i=[],s=new Set,a=location.hostname.startsWith("dev.")||"localhost"===location.hostname&&!(0,n.gJ)()||"1"===localStorage.getItem("9remote:termLog");function l(){return a}function o(){return i}function c(e){return s.add(e),()=>s.delete(e)}function d(){for(let e of(i.length=0,s))try{e(null)}catch(e){}}function u(e){if(null==e)return"";if(e instanceof Uint8Array||ArrayBuffer.isView(e)||e instanceof ArrayBuffer)return`<${e.byteLength}b>`;if("string"==typeof e)return e.length>120?`${e.slice(0,60)}…${e.length}b`:e;if("object"==typeof e)try{return JSON.stringify(e)}catch(e){}return String(e)}let p=new Set(["recv"]),h=null;function m(e,...t){if(!a)return;let r=Date.now(),n=t.map(u).join(" ");if(h&&h.category===e&&h.baseMsg===n&&r-h.ts<3e3||p.has(e)&&h&&h.category===e&&r-h.ts<300){h.count=(h.count||1)+1,h.ts=r,h.msg=`${n} \xd7${h.count}`,queueMicrotask(()=>{for(let e of s)try{e(h)}catch(e){}});return}let l={ts:r,category:e,msg:n,baseMsg:n,count:1};h=l,i.push(l),i.length>800&&i.shift();try{console.log(`[termLog ${e}] ${n}`)}catch{}queueMicrotask(()=>{for(let e of s)try{e(l)}catch(e){}})}},29091:(e,t,r)=>{r.d(t,{B:()=>h});var n=r(2074),i=r(11472),s=r(34277),a=r(61826),l=r(33897);let o=(e,{min:t,max:r})=>Math.max(t,Math.min(r,Math.round(e)));var c=r(79253);let d={name:null,value:null},u=null,p=()=>{if(u&&(clearTimeout(u),u=null),null===d.name)return;let{name:e,value:t}=d;d.name=null,d.value=null;try{localStorage.setItem(e,JSON.stringify(t))}catch{}};window.addEventListener("pagehide",p),document.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&p()});let h=(0,n.v)((0,i.Zr)((e,t,r)=>({...{viewStack:[{type:"list"}],openedSessions:[],activeWorkspaceId:null,setActiveWorkspaceId:t=>e(e=>({activeWorkspaceId:t,fullMode:!!e.fullModes?.[t??l.AD]})),livePanes:[],touchLivePane:t=>e(e=>{let r=Array.isArray(t)?t:[t];return{livePanes:[...e.livePanes.filter(e=>!r.includes(e)),...r].slice(-s.kn)}}),mountedWorkspaces:{},markWorkspaceMounted:t=>e(e=>{let r=t??l.AD;return e.mountedWorkspaces[r]?e:{mountedWorkspaces:{...e.mountedWorkspaces,[r]:!0}}}),isWorkspaceMounted:e=>{let r=e??l.AD;return!!t().mountedWorkspaces[r]},drafts:{},setDraft:(t,r)=>e(e=>({drafts:{...e.drafts,[t]:r}})),collapsedWorkspaces:{},toggleWorkspace:t=>e(e=>({collapsedWorkspaces:{...e.collapsedWorkspaces,[t]:!e.collapsedWorkspaces[t]}})),cwdBySession:{},setCwd:(t,r)=>{if(!t||!r)return;let n=(0,c.kb)(r);e(e=>e.cwdBySession[t]===n?e:{cwdBySession:{...e.cwdBySession,[t]:n}})},pushView:t=>e(e=>{let r=Array.isArray(e.viewStack)?e.viewStack:[];return{viewStack:[...a.yP.includes(t?.type)?r:r.filter((e,t)=>!(a.yP.includes(e?.type)&&t===r.length-1)),t]}}),popView:()=>e(e=>{let t=Array.isArray(e.viewStack)?e.viewStack:[];return{viewStack:t.length>1?t.slice(0,-1):[{type:"list"}]}}),setViewStack:t=>e({viewStack:t}),addOpenedSession:t=>e(e=>({openedSessions:e.openedSessions.includes(t)?e.openedSessions:[...e.openedSessions,t]})),removeOpenedSession:t=>e(e=>{let{[t]:r,...n}=e.drafts,{[t]:i,...s}=e.pendingStartup,{[t]:a,...l}=e.artifactsBySession;return{artifactsBySession:l,openedSessions:e.openedSessions.filter(e=>e!==t),livePanes:e.livePanes.filter(e=>e!==t),hiddenPaneSessionIds:e.hiddenPaneSessionIds?e.hiddenPaneSessionIds.filter(e=>e!==t):[],drafts:n,pendingStartup:s}}),replaceOpenedSession:(t,r)=>e(e=>{if(!r||t===r)return e;let n=e=>e===t?r:e;return{openedSessions:!t||e.openedSessions.includes(t)?e.openedSessions.map(n):e.openedSessions.includes(r)?e.openedSessions:[...e.openedSessions,r],livePanes:e.livePanes.map(n)}}),clearOpenedSessions:()=>e({openedSessions:[],livePanes:[]}),reorderOpenedSessions:t=>e(e=>{let r=new Set(t),n=t.filter(t=>e.openedSessions.includes(t));if(n.length<2)return{};let i=0;return{openedSessions:e.openedSessions.map(e=>r.has(e)?n[i++]:e)}}),closeSession:t=>e(e=>{let{[t]:r,...n}=e.drafts,{[t]:i,...s}=e.pendingStartup,{[t]:a,...l}=e.agentBySession,o=((e,t)=>{let r={};for(let[n,i]of Object.entries(e))r[n]={at:0,sessions:t?i.sessions.map(t):i.sessions};return r})(e.agentHistory,e=>e.openSessionId===t?{...e,openSessionId:null}:e);return{openedSessions:e.openedSessions.filter(e=>e!==t),livePanes:e.livePanes.filter(e=>e!==t),drafts:n,pendingStartup:s,agentBySession:l,agentHistory:o}}),getCurrentView:()=>{let{viewStack:e}=t();return e[e.length-1]},getSelectedSession:()=>{let{viewStack:e}=t();for(let t=e.length-1;t>=0;t--)if("terminal"===e[t].type)return e[t].sessionId;return null},reset:()=>e({viewStack:[{type:"list"}],openedSessions:[],livePanes:[],activeWorkspaceId:null})},...{sidebarCollapsed:!1,toggleSidebar:()=>e(e=>({sidebarCollapsed:!e.sidebarCollapsed})),setSidebarCollapsed:t=>e({sidebarCollapsed:!!t}),sidebarWidth:s.gH.default,setSidebarWidth:t=>e({sidebarWidth:o(t,s.gH)}),fullModes:{},fullMode:!1,toggleFullMode:t=>e(e=>{let r=t??e.activeWorkspaceId??l.AD,n=!e.fullModes[r];return{fullModes:{...e.fullModes,[r]:n},fullMode:r===(e.activeWorkspaceId??l.AD)?n:e.fullMode}}),setFullMode:(t,r)=>e(e=>{let n="boolean"==typeof t?e.activeWorkspaceId??l.AD:t??e.activeWorkspaceId??l.AD,i="boolean"==typeof t?t:!!r;return{fullModes:{...e.fullModes,[n]:i},fullMode:n===(e.activeWorkspaceId??l.AD)?i:e.fullMode}}),hiddenPaneSessionIds:[],toggleHidePane:t=>e(e=>({hiddenPaneSessionIds:e.hiddenPaneSessionIds.includes(t)?e.hiddenPaneSessionIds.filter(e=>e!==t):[...e.hiddenPaneSessionIds,t]})),unhidePane:t=>e(e=>({hiddenPaneSessionIds:e.hiddenPaneSessionIds.filter(e=>e!==t)})),paneWidths:{},setPaneWidth:(t,r)=>e(e=>({paneWidths:{...e.paneWidths,[t]:null==r?null:o(r,s.k9)}})),rightPanelOpen:window.innerWidth>=s.jK,rightPanelTabs:{},rightPanelWidth:s.Ds.default,toggleRightPanel:()=>e(e=>({rightPanelOpen:!e.rightPanelOpen,rightPanelWasOpen:null})),closeRightPanel:()=>e({rightPanelOpen:!1,rightPanelWasOpen:null}),openRightPanel:()=>e({rightPanelOpen:!0,rightPanelWasOpen:null}),setRightPanelTab:(t,r)=>e(e=>({rightPanelOpen:!0,rightPanelWasOpen:null,...null!=r?{rightPanelTabs:{...e.rightPanelTabs,[r]:t}}:{}})),rightPanelRoots:{},setRightPanelRoot:(t,r)=>e(e=>{if(null==t)return e;let n=e.rightPanelRoots[t],i=r&&r!==t?r:void 0;if(n===i)return e;let s={...e.rightPanelRoots};return i?s[t]=i:delete s[t],{rightPanelRoots:s}}),setRightPanelWidth:t=>e({rightPanelWidth:o(t,s.Ds)}),editorFilePath:null,editorPanelWidth:s.Ao.default,setEditorPanelWidth:t=>e({editorPanelWidth:o(t,s.Ao)}),editorPreviewSeq:0,artifactTitle:null,rightPanelWasOpen:null,artifactSessionId:null,openEditorFile:(t,r={})=>e(e=>({editorFilePath:t,editorPreviewSeq:r.preview?e.editorPreviewSeq+1:0,artifactTitle:r.artifactTitle||null,artifactSessionId:r.artifactSessionId||null,...r.artifactTitle?{rightPanelWasOpen:e.rightPanelWasOpen??e.rightPanelOpen,rightPanelOpen:!1}:{}})),closeEditorFile:()=>e(e=>({editorFilePath:null,editorPreviewSeq:0,artifactTitle:null,artifactSessionId:null,rightPanelWasOpen:null,...e.rightPanelWasOpen?{rightPanelOpen:!0}:{},...e.artifactSessionId&&e.editorFilePath?{artifactsBySession:((e,t,r)=>{let n=e[t];if(!n)return e;let i=n.filter(e=>e.path!==r);if(i.length===n.length)return e;let{[t]:s,...a}=e;return i.length?{...a,[t]:i}:a})(e.artifactsBySession,e.artifactSessionId,e.editorFilePath)}:{}})),hiddenHeaderButtons:["mobile"],hiddenHeaderButtonsMigrated:!1,toggleHeaderButton:t=>e(e=>({hiddenHeaderButtons:e.hiddenHeaderButtons.includes(t)?e.hiddenHeaderButtons.filter(e=>e!==t):[...e.hiddenHeaderButtons,t]})),mobileLowPower:!1,setMobileLowPower:t=>e({mobileLowPower:!!t}),mobileOpen:!1,mobileMode:"float",mobilePanelWidth:s.b5.default,mobileFloatRect:null,setMobileOpen:t=>e({mobileOpen:!!t}),setMobileMode:t=>e({mobileMode:t,mobileOpen:!0}),setMobilePanelWidth:t=>e({mobilePanelWidth:o(t,s.b5)}),setMobileFloatRect:t=>e({mobileFloatRect:t}),mobileSession:null,setMobileSession:t=>e(e=>({mobileSession:"function"==typeof t?t(e.mobileSession):t}))},...{webglEnabled:!0,setWebglEnabled:t=>e({webglEnabled:!!t}),fontSize:null,setFontSize:t=>e({fontSize:t?Math.max(10,Math.min(18,Math.round(t))):null}),terminalTheme:"default",setTerminalTheme:t=>e({terminalTheme:t||"default"}),terminalBackgrounds:["art8"],setTerminalBackgrounds:t=>e({terminalBackgrounds:Array.isArray(t)?t.filter(Boolean):[]}),terminalBackgroundOpacity:null,setTerminalBackgroundOpacity:t=>e({terminalBackgroundOpacity:null==t?s._z:Number(Math.max(s.DW.min,Math.min(s.DW.max,Math.round(t/s.DW.step)*s.DW.step)).toFixed(2))}),customBackgrounds:[],setCustomBackgrounds:t=>e({customBackgrounds:Array.isArray(t)?t.filter(e=>e?.id&&e?.dataUrl):[]}),backgroundBySession:{},setSessionBackground:(t,r)=>e(e=>{let n={...e.backgroundBySession};return r?n[t]=r:delete n[t],{backgroundBySession:n}}),showFolderButton:!0,showNoteButton:!1,setShowFolderButton:t=>e({showFolderButton:!!t}),setShowNoteButton:t=>e({showNoteButton:!!t}),noteChips:[],addNoteChip:t=>e(e=>({noteChips:[...e.noteChips,t]})),removeNoteChip:t=>e(e=>({noteChips:e.noteChips.filter(e=>e!==t)})),pinnedNotes:{},setNotePinned:(t,r)=>e(e=>{let n={...e.pinnedNotes};return r?n[t]=!0:delete n[t],{pinnedNotes:n}})},...{agentCaps:{},setAgentCaps:t=>e({agentCaps:t||{}}),artifactEnabled:!1,setArtifactEnabled:t=>e({artifactEnabled:!!t}),mcpClients:[],setMcpClients:t=>e({mcpClients:Array.isArray(t)?t:[]}),agentClisBy:{},setAgentClis:(t,r)=>e(e=>({agentClisBy:{...e.agentClisBy,[t]:{list:Array.isArray(r)?r:[],at:Date.now()}}})),agentHistory:{},setAgentHistory:(t,r)=>e(e=>({agentHistory:{...e.agentHistory,[t]:{at:Date.now(),sessions:Array.isArray(r)?r:[]}}})),invalidateAgentHistory:()=>e(e=>({agentHistory:(e=>{let t={};for(let[r,n]of Object.entries(e))t[r]={at:0,sessions:n.sessions};return t})(e.agentHistory)})),agentBySession:{},setSessionAgent:(t,r)=>e(e=>e.agentBySession[t]===r?e:{agentBySession:{...e.agentBySession,[t]:r}}),pendingStartup:{},queueStartup:(t,r)=>e(e=>({pendingStartup:{...e.pendingStartup,[t]:r}})),consumeStartup:r=>{let n=t().pendingStartup[r];return void 0===n?null:(e(e=>{let{[r]:t,...n}=e.pendingStartup;return{pendingStartup:n}}),n)},artifactsBySession:{},pushArtifact:(t,r)=>e(e=>{if(!t||!r?.path)return{};let n=(e.artifactsBySession[t]||[]).filter(e=>e.path!==r.path);return{artifactsBySession:{...e.artifactsBySession,[t]:[r,...n].slice(0,s.zv)}}}),removeArtifact:(t,r)=>e(e=>({artifactsBySession:((e,t,r)=>{let n=e[t];if(!n)return e;let i=n.filter(e=>e.path!==r);if(i.length===n.length)return e;let{[t]:s,...a}=e;return i.length?{...a,[t]:i}:a})(e.artifactsBySession,t,r)}))}}),{name:"terminal-ui-state",partialize:e=>({viewStack:e.viewStack,openedSessions:e.openedSessions,agentBySession:e.agentBySession,activeWorkspaceId:e.activeWorkspaceId,collapsedWorkspaces:e.collapsedWorkspaces,webglEnabled:e.webglEnabled,fontSize:e.fontSize,terminalTheme:e.terminalTheme,terminalBackgrounds:e.terminalBackgrounds,terminalBackgroundOpacity:e.terminalBackgroundOpacity,backgroundBySession:e.backgroundBySession,showFolderButton:e.showFolderButton,showNoteButton:e.showNoteButton,noteChips:e.noteChips,pinnedNotes:e.pinnedNotes,sidebarCollapsed:e.sidebarCollapsed,sidebarWidth:e.sidebarWidth,fullModes:e.fullModes||{},fullMode:e.fullMode,hiddenPaneSessionIds:e.hiddenPaneSessionIds||[],paneWidths:e.paneWidths,rightPanelOpen:e.rightPanelOpen,rightPanelTabs:e.rightPanelTabs,rightPanelWidth:e.rightPanelWidth,editorPanelWidth:e.editorPanelWidth,hiddenHeaderButtons:e.hiddenHeaderButtons,hiddenHeaderButtonsMigrated:e.hiddenHeaderButtonsMigrated,mobileLowPower:e.mobileLowPower,mobileMode:e.mobileMode,mobilePanelWidth:e.mobilePanelWidth,mobileFloatRect:e.mobileFloatRect,artifactsBySession:e.artifactsBySession}),storage:{getItem:e=>{try{let t=localStorage.getItem(e);if(!t)return null;let r=JSON.parse(t);return r&&!Array.isArray(r.viewStack)&&(r.viewStack=[{type:"list"}]),r}catch{return null}},setItem:(e,t)=>{d.name=e,d.value=t,u||(u=setTimeout(p,s.eu))},removeItem:e=>{d.name===e&&(d.name=null,d.value=null),localStorage.removeItem(e)}},onRehydrateStorage:()=>e=>{e&&(Array.isArray(e.viewStack)&&0!==e.viewStack.length||(e.viewStack=[{type:"list"}]),window.location.pathname.replace(/\/+$/,"")===a.U2&&(e.viewStack=[{type:"list"}]),e.viewStack=e.viewStack.filter(e=>!a.yP.includes(e?.type)),0===e.viewStack.length&&(e.viewStack=[{type:"list"}]),Array.isArray(e.terminalBackgrounds)||(e.terminalBackgrounds=[]),e.terminalBackground&&"none"!==e.terminalBackground&&0===e.terminalBackgrounds.length&&(e.terminalBackgrounds=[e.terminalBackground]),e.agentBySession&&"object"==typeof e.agentBySession||(e.agentBySession={}),window.innerWidth<s.jK&&(e.rightPanelOpen=!1),!e.hiddenHeaderButtonsMigrated&&(e.hiddenHeaderButtonsMigrated=!0,Array.isArray(e.hiddenHeaderButtons)?e.hiddenHeaderButtons.includes("mobile")||(e.hiddenHeaderButtons=[...e.hiddenHeaderButtons,"mobile"]):e.hiddenHeaderButtons=["mobile"]))}}))},31408:(e,t,r)=>{function n(e,t){if(e===t)return!0;if(!e||!t||"object"!=typeof e||"object"!=typeof t)return!1;let r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let n of r)if(!(n in t)||e[n]!==t[n])return!1;return!0}function i(e,t){if(e===t)return!0;if(!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!n(e[r],t[r]))return!1;return!0}function s(e,t){if(e===t)return!0;if(!e||!t)return!1;let r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let i of r)if(!(i in t)||!n(e[i],t[i]))return!1;return!0}r.d(t,{dI:()=>n,h3:()=>s,nk:()=>i})},31735:(e,t,r)=>{r.d(t,{H$:()=>a,d6:()=>s});var n=r(1521),i=r(29717);let s=(e,t)=>{if(e&&t)try{localStorage.setItem("9remote_nav:"+e,t)}catch{}};function a(e){let t=(0,i.usePathname)(),r=(0,i.useSearchParams)();(0,n.useEffect)(()=>{if(!e||!t?.startsWith("/workspace"))return;let n=function(e,t){if(!e)return"";let r=t?.toString();return r?`${e}?${r}`:e}(t,r);n&&s(e,n)},[e,t,r])}},33897:(e,t,r)=>{r.d(t,{AD:()=>n,Jc:()=>o,Mt:()=>a,g4:()=>l,gk:()=>s,xs:()=>i});let n="__ungrouped__",i=e=>e?.workspaceId??e?.groupId??null;function s({sessions:e,openedSessions:t,livePanes:r,mountedWorkspaces:a,activeWorkspaceId:l,isDesktop:o}){let c=new Set(e.filter(e=>i(e)===(l??null)).map(e=>e.id)),d=t.filter(e=>c.has(e)),u=new Set([...d,...r.filter(e=>t.includes(e))]),p=t.filter(e=>u.has(e)),h=new Map(e.map(e=>[e.id,i(e)])),m=new Set(t.filter(e=>!!c.has(e)||!!o&&!!a[h.get(e)??n])),f=new Map(d.map((e,t)=>[e,t]));return{workspaceSessionIds:c,workspaceOpenedSessions:d,renderedSessions:p,mountedSet:m,workspaceIndex:f}}let a=(e,t,r)=>!t&&r.has(e)?120*r.get(e):0;function l({container:e,pane:t}){if(!e||!t||t.offsetWidth<=0)return null;let r=t.getBoundingClientRect().left-e.getBoundingClientRect().left;return Math.max(0,Math.min(e.scrollLeft+r-(e.clientWidth-t.offsetWidth)/2,e.scrollWidth-e.clientWidth))}function o({rowWidth:e,paneCount:t,sidebarWidth:r,sidePx:n,gapPx:i,paddingPx:s,minWidth:a}){return!(e>0)||t<=0?null:Math.max(a,Math.floor((e-r-s-n-(t-1)*i)/t))}},34277:(e,t,r)=>{r.d(t,{$Z:()=>ee,A_:()=>c,Ao:()=>h,B$:()=>K,BM:()=>es,DW:()=>H,Ds:()=>p,EE:()=>P,FC:()=>eg,Fz:()=>m,GL:()=>f,Gp:()=>et,IJ:()=>Y,Il:()=>ef,Jv:()=>l,KA:()=>b,KN:()=>$,Lo:()=>Q,M8:()=>er,Mg:()=>eS,Nz:()=>ew,OM:()=>eu,Pj:()=>j,Pz:()=>Z,Qe:()=>d,RF:()=>ey,RS:()=>V,TM:()=>D,Tb:()=>v,Tk:()=>w,Uc:()=>ea,VE:()=>ec,W$:()=>E,YA:()=>em,YS:()=>x,ZU:()=>U,_C:()=>eT,_O:()=>X,_z:()=>B,aD:()=>L,am:()=>T,ar:()=>N,b5:()=>g,b9:()=>eb,bl:()=>e_,bs:()=>C,c:()=>W,cK:()=>ev,dU:()=>ei,de:()=>eR,dt:()=>n,eE:()=>ed,eu:()=>I,fw:()=>ep,g$:()=>eA,gH:()=>u,hp:()=>R,i5:()=>eh,iW:()=>k,j4:()=>en,jK:()=>i,k9:()=>s,kn:()=>o,ll:()=>S,ok:()=>eC,pS:()=>a,pZ:()=>q,pt:()=>J,qQ:()=>A,qj:()=>y,qw:()=>el,t:()=>F,vP:()=>M,vk:()=>z,wu:()=>O,y:()=>ek,zm:()=>eo,zv:()=>_});let n=["git status","git add .",'git commit -m ""',"git push","git pull","git fetch","git diff","git log --oneline","git branch","git checkout","git checkout -b","git switch","git stash","git stash pop","git merge","git rebase","git clone","git remote -v","git restore","npm install","npm ci","npm run dev","npm run build","npm run test","npm run lint","npm outdated","pnpm install","pnpm dev","yarn dev","bun install","cd ..","cd ~","cd -","ls -la","ll","mkdir -p","cp -r","find . -name","du -sh","chmod +x","ln -s","grep -rn","grep -i","wc -l","tail -f","ps aux","df -h","free -h","lsof -i","netstat -tlnp","docker ps","docker ps -a","docker images","docker logs -f","docker exec -it","docker compose up -d","docker compose down","docker build -t","code .","claude","claude --continue","claude --resume","claude --dangerously-skip-permissions","claude mcp","codex","codex --full-auto"],i=760,s={min:400,max:1/0},a=2,l=0,o=12,c=250,d=8,u={default:190,min:180,max:1/0},p={default:190,min:190,max:1/0},h={default:420,min:280,max:1/0},m=[{id:"remote",labelKey:"menu.remoteDesktop",group:"header"},{id:"mobile",labelKey:"mobile.androidDevice",group:"header"},{id:"sites",labelKey:"menu.sites",group:"header"},{id:"notifications",labelKey:"menu.notificationsButton",group:"header"},{id:"folder",labelKey:"menu.showFolder",group:"pane",storeKey:"showFolderButton",setterKey:"setShowFolderButton"},{id:"note",labelKey:"menu.showNote",group:"pane",storeKey:"showNoteButton",setterKey:"setShowNoteButton"}],f=[{group:"header",titleKey:"menu.headerButtons"},{group:"pane",titleKey:"menu.showButtons"}],g={default:300,min:240,max:1/0},y={width:{default:300,min:240,max:900},height:{default:620,min:320},margin:12,defaultOffset:24},_=20,b=1e4,w={maxDepth:1,deepMaxDepth:3,cacheTtlMs:3e4},k={topThresholdLines:5,guardMs:600,minFetchBytes:256,chainMax:3,chainDebounceMs:300,disabled:!1},v=5242880,A=5,S=3e3,T=150,x=100,C=101,R=200,P={Escape:{data:"\x1b"},c:{ctrl:!0,data:"\x03",requireNoSelection:!0},d:{ctrl:!0,data:"\x04"},z:{ctrl:!0,data:"\x1a"},l:{ctrl:!0,data:"\f"}},I=250,$=999,D=["check again","continue","summarize"],L="terminal:noteSync",M="terminal:openSession",O=5e3,U=250,E=90,j={cursorBlink:!0,fontSize:12,fontSizeMobile:12,fontFamily:'ui-monospace, "SF Mono", "Cascadia Code", "Roboto Mono", "Noto Sans Mono", Menlo, Monaco, "Courier New", monospace',scrollback:15e3,convertEol:!0,allowProposedApi:!0,scrollOnUserInput:!0,fastScrollModifier:"none",smoothScrollDuration:0,rescaleOverlappingGlyphs:!0,minimumContrastRatio:4.5,macOptionIsMeta:!0};function N(e){return null!=e?e:window.innerWidth<768?j.fontSizeMobile:j.fontSize}let B=.8,F=.25,W="16,16,20",q="116,120,136",K=.28,H={min:.3,max:.95,step:.01},z={none:{label:"None"},art1:{label:"Anime 1",src:"/backgrounds/bg9.jpg"},art2:{label:"Anime 2",src:"/backgrounds/bg2.jpg"},art3:{label:"Anime 3",src:"/backgrounds/bg3.jpg"},art4:{label:"Anime 4",src:"/backgrounds/bg4.jpg"},art5:{label:"Anime 5",src:"/backgrounds/bg5.jpg"},art7:{label:"Anime 7",src:"/backgrounds/bg7.jpg"},art8:{label:"Anime 8",src:"/backgrounds/bg8.jpg"},art9:{label:"Anime 9",src:"/backgrounds/bg10.jpg"},art10:{label:"Anime 10",src:"/backgrounds/bg11.jpg"},art11:{label:"Anime 11",src:"/backgrounds/bg12.jpg"},art12:{label:"Anime 12",src:"/backgrounds/bg13.jpg"}};function J(e,t){return e&&t&&"none"!==t&&(z[t]||String(t).startsWith("custom"))?{...e,background:"#10101400"}:e}function G(e){return"custom"===e?"custom":"string"==typeof e&&e.startsWith("custom:")?e.slice(7):null}function V(e,t=[]){let r=G(e);return r?t.find(e=>e?.id===r)?.dataUrl||null:z[e]?.src||null}function Z(e){return z[e]?.label||(G(e)?"Custom":z.none.label)}let X=4e3,Q=2e4;function Y(e,t=[]){return Array.isArray(e)?e.filter(e=>{let r=G(e);return r?t.some(e=>e?.id===r):"none"===e||!!z[e]}):[]}function ee(e,t,r=[],n=0){var i;return Y([e],r)[0]||(i=Y(t,r),Array.isArray(i)&&0!==i.length&&i[n%i.length]||"none")}let et={gpuAcceleration:"auto",smoothScrollDuration:125},er={clipboard:!0,search:!0,image:!0},en=30,ei=2,es=100,ea=600,el=150,eo=4e3,ec=3e3,ed=8e3,eu=6e4,ep=3e4,eh="28%",em=400,ef={lineHeight:18,sensitivity:1,friction:.95,minVelocity:.3,maxVelocity:55,wheelStepLines:1,tuiThrottleMs:50,momentumRenderCadenceMs:33,tuiBackpressureTimeoutMs:120,sgrUp:(e,t)=>`\x1b[<64;${e};${t}M`,sgrDown:(e,t)=>`\x1b[<65;${e};${t}M`},eg={longPressMs:450,moveTolerance:10,wordChars:/[A-Za-z0-9._\-/~:@]/},ey={verbs:["cd","ls","ll","cat","less","more","head","tail","vim","nvim","nano","bat","code","code-insiders","rm","cp","mv","mkdir","touch","chmod","open","grep"],ttlMs:3e5,debounceMs:120,maxDirs:20,maxResults:8},e_={minDistance:60,ratio:1.5,maxDuration:500},eb=e=>!!e&&27!==e.charCodeAt(0),ew=e=>"string"==typeof e&&(/^\x1b\[[?>=][0-9;]*c$/.test(e)||/^\x1b\[[0-9]+;[0-9]+R$/.test(e)||/^\x1b\[0n$/.test(e)||/^\x1b\]\d+;/.test(e)),ek=[{id:"ctrl",label:"Ctrl",key:"Ctrl",type:"modifier"},{id:"opt",label:"Opt",key:"Alt",type:"modifier"},{id:"shift",label:"Shift",key:"Shift",type:"modifier"},{id:"meta",label:"⌘",key:"Meta",type:"modifier"},{id:"esc",label:"Esc",key:"Escape",type:"key"},{id:"tab",label:"Tab",key:"Tab",type:"key"},{id:"enter",label:"↵",key:"Enter",type:"key"},{id:"backspace",label:"⌫",key:"Backspace",type:"key"},{id:"up",label:"↑",key:"ArrowUp",type:"arrow"},{id:"down",label:"↓",key:"ArrowDown",type:"arrow"},{id:"left",label:"←",key:"ArrowLeft",type:"arrow"},{id:"right",label:"→",key:"ArrowRight",type:"arrow"},{id:"home",label:"Home",key:"Home",type:"key"},{id:"end",label:"End",key:"End",type:"key"},{id:"pgup",label:"PgUp",key:"PageUp",type:"key"},{id:"pgdn",label:"PgDn",key:"PageDown",type:"key"},{id:"del",label:"Del",key:"Delete",type:"key"},{id:"ins",label:"Ins",key:"Insert",type:"key"},{id:"ctrlA",label:"^A",key:"a",type:"ctrl"},{id:"ctrlC",label:"^C",key:"c",type:"ctrl"},{id:"ctrlD",label:"^D",key:"d",type:"ctrl"},{id:"ctrlE",label:"^E",key:"e",type:"ctrl"},{id:"ctrlK",label:"^K",key:"k",type:"ctrl"},{id:"ctrlL",label:"^L",key:"l",type:"ctrl"},{id:"ctrlN",label:"^N",key:"n",type:"ctrl"},{id:"ctrlP",label:"^P",key:"p",type:"ctrl"},{id:"ctrlR",label:"^R",key:"r",type:"ctrl"},{id:"ctrlT",label:"^T",key:"t",type:"ctrl"},{id:"ctrlU",label:"^U",key:"u",type:"ctrl"},{id:"ctrlW",label:"^W",key:"w",type:"ctrl"},{id:"ctrlX",label:"^X",key:"x",type:"ctrl"},{id:"ctrlY",label:"^Y",key:"y",type:"ctrl"},{id:"ctrlZ",label:"^Z",key:"z",type:"ctrl"},{id:"f1",label:"F1",key:"F1",type:"key"},{id:"f2",label:"F2",key:"F2",type:"key"},{id:"f3",label:"F3",key:"F3",type:"key"},{id:"f4",label:"F4",key:"F4",type:"key"},{id:"f5",label:"F5",key:"F5",type:"key"},{id:"f6",label:"F6",key:"F6",type:"key"},{id:"f7",label:"F7",key:"F7",type:"key"},{id:"f8",label:"F8",key:"F8",type:"key"},{id:"f9",label:"F9",key:"F9",type:"key"},{id:"f10",label:"F10",key:"F10",type:"key"},{id:"f11",label:"F11",key:"F11",type:"key"},{id:"f12",label:"F12",key:"F12",type:"key"},{id:"pipe",label:"|",key:"|",type:"key"},{id:"tilde",label:"~",key:"~",type:"key"},{id:"slash",label:"/",key:"/",type:"key"},{id:"backslash",label:"\\",key:"\\",type:"key"},{id:"dash",label:"-",key:"-",type:"key"},{id:"underscore",label:"_",key:"_",type:"key"}],ev=["esc","up","down","ctrlC","ctrl","opt","shift","tab","slash"],eA="enter",eS=[["left","right","home","end","pgup","pgdn","del"],["ctrlZ","ctrlR","ctrlL","ctrlA","ctrlE","ctrlW","ctrlD"],["f1","f2","f3","f4","f5","f10","f11"]],eT={base:"flex items-center justify-center rounded-brand font-semibold transition-all duration-150 ease-out active:scale-[0.94]",textNormal:"text-xs",textSmall:"text-[11px]",normal:"bg-surface-2 hover:bg-surface-3 text-text",arrow:"bg-surface-2 hover:bg-surface-3 text-text text-sm",modifierActive:"bg-brand-500 text-white shadow-sm",pinned:"bg-brand-500/15 hover:bg-brand-500/25 text-brand-400",size:{minWidth:"34px",height:"32px",paddingLeft:"6px",paddingRight:"6px"},sizeLarge:{minWidth:"38px",height:"32px",paddingLeft:"8px",paddingRight:"8px"},sizeSmall:{width:"28px",height:"28px"}},ex=["main","master"],eC=e=>ex.includes(e),eR={DELAY_MS:400,GAP_PX:6,EDGE_PX:8,MAX_WIDTH_PX:320,EST_HEIGHT_PX:48,SLACK_PX:.5}},38415:(e,t,r)=>{r.d(t,{Gf:()=>c,Gi:()=>h,Hu:()=>o,Nn:()=>u,O8:()=>s,cu:()=>d,el:()=>a,ij:()=>p,l7:()=>l,no:()=>m,pe:()=>n,rl:()=>i,xO:()=>f});let n="https://api.github.com",i="https://github.com/decolua/9remote",s=`${n}/repos/decolua/9remote`,a=`${s}/releases?per_page=100`,l=!1,o=".devcontainer/devcontainer.json",c="NREMOTE_API_KEY",d={name:"9Remote",image:"mcr.microsoft.com/devcontainers/universal:latest",postCreateCommand:"npm install -g 9remote@latest",postAttachCommand:"nohup 9remote start > /tmp/9remote.log 2>&1 &",forwardPorts:[2208],portsAttributes:{2208:{label:"9Remote Server",onAutoForward:"silent",visibility:"public"}}},u=3e3,p=60,h={available:"Available",starting:"Starting",shutdown:"Shutdown",unknown:"Unknown"},m={user:"/user",codespaces:"/user/codespaces",codespaceByName:e=>`/user/codespaces/${e}`,startCodespace:e=>`/user/codespaces/${e}/start`,userReposList:"/user/repos?per_page=100&sort=updated&affiliation=owner,collaborator",repoContents:(e,t,r)=>`/repos/${e}/${t}/contents/${r}`,createCodespaceForRepo:(e,t)=>`/repos/${e}/${t}/codespaces`,codespaceSecretsPublicKey:"/user/codespaces/secrets/public-key",codespaceSecret:e=>`/user/codespaces/secrets/${e}`,codespaceSecretRepos:(e,t)=>`/user/codespaces/secrets/${e}/repositories/${t}`};function f(e){return`https://${e}-2208.app.github.dev`}},42174:(e,t,r)=>{r.d(t,{A:()=>c});var n=r(73365),i=r(1521),s=r(98196),a=r(8910),l=r(78762),o=r(64683);function c({isOpen:e,onClose:t,onConfirm:r,title:d,message:u,confirmText:p,cancelText:h}){let{t:m}=(0,l.s)(),f=(0,i.useRef)(null),g=(0,i.useRef)(null),y=p??m("common.confirm"),_=h??m("common.cancel");return((0,i.useEffect)(()=>{if(!e)return;let t=requestAnimationFrame(()=>{g.current?.focus()});return()=>cancelAnimationFrame(t)},[e]),(0,i.useEffect)(()=>{if(!e)return;let n=e=>{if("Escape"===e.key)e.preventDefault(),e.stopPropagation(),t();else if("Enter"===e.key){if(f.current&&document.activeElement===f.current){e.preventDefault(),e.stopPropagation(),t();return}e.preventDefault(),e.stopPropagation(),(0,a.e)(),r?.(),t()}};return window.addEventListener("keydown",n,!0),()=>window.removeEventListener("keydown",n,!0)},[e,t,r]),!e||"u"<typeof document)?null:(0,s.createPortal)((0,n.jsxs)("div",{className:"fixed inset-0 z-[100] flex items-center justify-center px-4",style:{paddingTop:"max(1rem, env(safe-area-inset-top))",paddingBottom:"max(1rem, env(safe-area-inset-bottom))"},children:[(0,n.jsx)("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-[2px] animate-in fade-in duration-150",onClick:t}),(0,n.jsxs)("div",{role:"dialog","aria-modal":"true",className:"relative card-elev max-w-md w-full my-auto max-h-[min(85%,calc(var(--app-height,85vh)-2rem))] overflow-y-auto animate-in zoom-in-95 duration-200",onClick:e=>e.stopPropagation(),onKeyDown:e=>e.stopPropagation(),children:[(0,n.jsx)("div",{className:"px-6 py-4",children:(0,n.jsx)("h3",{className:"text-lg font-semibold text-text",children:d})}),(0,n.jsx)("div",{className:"px-6 pb-4",children:(0,n.jsx)("p",{className:"text-text whitespace-pre-line",children:u})}),(0,n.jsxs)("div",{className:"px-6 py-4 flex justify-end gap-3",children:[(0,n.jsxs)("button",{ref:f,onClick:()=>{(0,a.e)(),t()},className:"px-4 py-2 bg-surface-2 hover:bg-surface-3 text-text rounded-brand transition-all duration-150 ease-out active:scale-[0.98] font-medium flex items-center gap-1.5",children:[(0,n.jsx)("span",{children:_}),(0,n.jsx)("kbd",{className:"hidden sm:inline-flex items-center text-[10px] font-mono px-1 py-0.5 rounded bg-surface-3 text-text-muted leading-none",children:"Esc"})]}),(0,n.jsxs)("button",{ref:g,onClick:()=>{(0,a.e)(),r?.(),t()},className:"px-4 py-2 bg-red-600 hover:bg-red-700 text-white rounded-brand transition-all duration-150 ease-out active:scale-[0.98] font-medium flex items-center gap-1.5 focus:outline-none focus:ring-2 focus:ring-red-500/50",children:[(0,n.jsx)("span",{children:y}),(0,n.jsx)("kbd",{className:"hidden sm:inline-flex items-center justify-center w-4 h-4 rounded bg-white/20 text-white",children:(0,n.jsx)(o.Lt,{size:10,strokeWidth:2.5})})]})]})]})]}),document.body)}},45111:(e,t,r)=>{r.d(t,{A:()=>i});var n=r(73365);function i({size:e="md",text:t,className:r=""}){return(0,n.jsxs)("div",{className:`flex flex-col items-center justify-center gap-3 ${r}`,children:[(0,n.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,n.jsx)("p",{className:"text-brand-500 text-sm font-medium",children:t})]})}},51627:(e,t,r)=>{r.d(t,{U:()=>n});function n(e,t){if(!e||!t)return!1;let r=String(e).split(".").map(Number),n=String(t).split(".").map(Number);for(let e=0;e<3;e++){let t=r[e]||0,i=n[e]||0;if(t!==i)return t>i}return!1}},52159:(e,t,r)=>{r.d(t,{c:()=>i});var n=r(7938);function i(e,...t){n.eR.debug?.[e]&&console.log(...t)}},61826:(e,t,r)=>{r.d(t,{O5:()=>c,U2:()=>n,dX:()=>d,mn:()=>o,yP:()=>s});let n="/workspace",i={list:()=>n,terminal:e=>`${n}/terminal/${encodeURIComponent(e.sessionId||"")}`,files:e=>l(`${n}/files`,{ws:e.workspace,p:e.currentPath}),editor:e=>l(`${n}/editor`,{path:e.path,line:e.line,col:e.column}),git:e=>l(`${n}/git`,{ws:e.workspace}),remote:()=>`${n}/remote`,mobile:()=>`${n}/mobile`,workspaces:()=>`${n}/workspaces`,browse:e=>l(`${n}/browse`,{path:e.path}),pair:()=>`${n}/pair`,welcome:()=>`${n}/welcome`},s=["site"],a={"":"list",terminal:"terminal",files:"files",editor:"editor",git:"git",remote:"remote",mobile:"mobile",workspaces:"workspaces",browse:"browse",pair:"pair",welcome:"welcome"};function l(e,t){let r=Object.entries(t).filter(([,e])=>null!=e&&""!==e).map(([e,t])=>`${e}=${encodeURIComponent(t)}`).join("&");return r?`${e}?${r}`:e}function o(e,t){if(!e?.startsWith(n))return null;let[r,i]=e.slice(n.length).replace(/^\//,"").split("/"),s=a[r||""];if(!s)return null;let l=e=>t?.get(e)||void 0;switch(s){case"terminal":return{type:s,sessionId:i?decodeURIComponent(i):void 0};case"files":return{type:s,workspace:l("ws"),currentPath:l("p")};case"editor":return{type:s,path:l("path"),line:u(l("line")),column:u(l("col"))};case"git":return{type:s,workspace:l("ws")};case"browse":return{type:s,path:l("path")};default:return{type:s}}}function c(e){return(i[e?.type]||i.list)(e)}function d(e,t){let r=c(t),n=e.findIndex(e=>c(e)===r);if(-1!==n)return e.slice(0,n+1);if("terminal"===t.type&&e[e.length-1]?.type==="terminal"){let r=[...e];return r[r.length-1]=t,r}return null}function u(e){let t=Number(e);return Number.isFinite(t)?t:void 0}},63977:(e,t,r)=>{r.d(t,{freshAuth:()=>s});var n=r(90084),i=r(86251);async function s(e={},t){let r={...e,connectionMode:t},a=(0,n.lz)(e.apiKey),l=e.tempKey?(0,n.lz)(e.tempKey):null,o=l?.tail?l:a?.tail?a:a||l,c=o?.tail;if(delete r.keyTail,delete r.keyTailSealed,!c)return r;if(o?.hostSealKey){let e=await (0,i.Y)(c,o.hostSealKey);if(e)return r.keyTailSealed=e,r}return r.keyTail=c,r}},64683:(e,t,r)=>{r.d(t,{$o:()=>eE.A,AX:()=>e_.A,Ay:()=>tl,BK:()=>e5.A,BZ:()=>Q.A,Bm:()=>W.A,Cp:()=>z.A,Do:()=>l.A,F1:()=>o.A,FE:()=>e0.A,FW:()=>eO.A,Fc:()=>eM.A,GD:()=>O.A,GO:()=>ef.A,Gr:()=>I.A,Gv:()=>ew.A,Hx:()=>es.A,Ir:()=>d.A,J4:()=>eY.A,JG:()=>g.A,JU:()=>q.A,Jl:()=>m.A,Kq:()=>ts.A,LM:()=>ec.A,Lt:()=>x.A,M6:()=>eQ.A,MA:()=>c.A,Mr:()=>eU.A,P6:()=>et.A,QR:()=>T.A,Qp:()=>a.A,RI:()=>i.A,TB:()=>e8.A,Ud:()=>V.A,VA:()=>ey.A,Vn:()=>eH.A,W1:()=>em.A,WE:()=>b.A,We:()=>e3.A,Wn:()=>S.A,X:()=>ti.A,X_:()=>D.A,ZH:()=>M.A,ZU:()=>e4.A,Ze:()=>eD.A,Zr:()=>K.A,_O:()=>e7.A,_V:()=>ee.A,a4:()=>eb.A,aJ:()=>h.A,ak:()=>Z.A,bE:()=>e6.A,bd:()=>e2.A,cC:()=>u.A,c_:()=>y.A,dJ:()=>B.A,de:()=>tn.A,dx:()=>H.A,e6:()=>eS.A,e9:()=>eN.A,eM:()=>eW.A,ek:()=>eV.A,es:()=>eA.A,f2:()=>G.A,f5:()=>P.A,gH:()=>eI.A,h1:()=>ep.A,iU:()=>j.A,jG:()=>eL.A,jj:()=>eg.A,jl:()=>w.A,jz:()=>eC.A,kU:()=>$.A,kV:()=>er.A,kr:()=>eo.A,kt:()=>eF.A,lM:()=>e9.A,lP:()=>ev.A,m0:()=>k.A,mN:()=>X.A,nU:()=>eu.A,qz:()=>J.A,rX:()=>_.A,s3:()=>en.A,sU:()=>eX.A,sv:()=>N.A,ue:()=>eT.A,vR:()=>eP.A,vW:()=>ej.A,vd:()=>F.A,vj:()=>eK.A,vv:()=>ea.A,wB:()=>eJ.A,wO:()=>eZ.A,ww:()=>Y.A,xq:()=>eh.A,xv:()=>eR.A,y8:()=>el.A,yQ:()=>f.A,yU:()=>e$.A,yd:()=>s.A,zP:()=>p.A,zW:()=>te.A});var n=r(73365),i=r(87821),s=r(21878),a=r(79376),l=r(61659),o=r(6504),c=r(19307),d=r(74739),u=r(29967),p=r(17836),h=r(67494),m=r(66687),f=r(95188),g=r(54453),y=r(34582),_=r(70453),b=r(10949),w=r(64570),k=r(31258),v=r(59907),A=r(13374),S=r(17406),T=r(46431),x=r(29260),C=r(88433),R=r(49553),P=r(20478),I=r(17568),$=r(87831),D=r(1916),L=r(29418),M=r(18272),O=r(10550),U=r(9271),E=r(14251),j=r(50068),N=r(98173),B=r(10194),F=r(70362),W=r(17909),q=r(59437),K=r(33109),H=r(48433),z=r(86877),J=r(34271),G=r(60919),V=r(35723),Z=r(41046),X=r(64629),Q=r(6534),Y=r(5370),ee=r(59711),et=r(39831),er=r(9560),en=r(44159),ei=r(41098),es=r(20021),ea=r(14797),el=r(15504),eo=r(93292),ec=r(92165),ed=r(94304),eu=r(40789),ep=r(64871),eh=r(31805),em=r(19621),ef=r(40081),eg=r(38781),ey=r(88768),e_=r(68395),eb=r(88793),ew=r(25406),ek=r(10998),ev=r(64446),eA=r(12925),eS=r(93354),eT=r(73243),ex=r(89317),eC=r(12283),eR=r(1578),eP=r(90612),eI=r(43959),e$=r(76621),eD=r(59833),eL=r(67236),eM=r(37266),eO=r(97038),eU=r(72147),eE=r(68859),ej=r(93285),eN=r(20178),eB=r(65062),eF=r(87030),eW=r(67519),eq=r(457),eK=r(58450),eH=r(48088),ez=r(56023),eJ=r(59311),eG=r(38177),eV=r(60659),eZ=r(1838),eX=r(34969),eQ=r(42685),eY=r(99707),e0=r(6830),e1=r(20248),e2=r(11384),e3=r(50211),e5=r(64342),e8=r(60151),e9=r(81610),e4=r(11990),e6=r(52715),e7=r(49387),te=r(894),tt=r(2031),tr=r(58573),tn=r(51328),ti=r(3382),ts=r(57717);let ta={AlertCircle:i.A,ArrowDown:s.A,ArrowRight:a.A,ArrowUp:l.A,ArrowUpRight:o.A,Ban:c.A,Bell:d.A,Bot:u.A,Bug:p.A,Check:h.A,CheckCircle2:m.A,ChevronDown:f.A,ChevronLeft:g.A,ChevronRight:y.A,ChevronUp:_.A,ChevronsDownUp:b.A,Circle:w.A,ClipboardPaste:k.A,Command:v.A,Compass:A.A,Columns2:S.A,Copy:T.A,CornerDownLeft:x.A,Crown:C.A,Delete:R.A,Download:P.A,ExternalLink:I.A,Eye:$.A,EyeOff:D.A,Facebook:L.A,File:M.A,FileCode:O.A,FileJson:U.A,FilePlus:E.A,FileText:j.A,Files:N.A,Filter:B.A,Folder:F.A,FolderOpen:W.A,FolderPlus:q.A,GitBranch:K.A,GitFork:H.A,Github:z.A,Globe:J.A,GripVertical:G.A,Hand:V.A,HardDrive:Z.A,HelpCircle:X.A,History:Q.A,Home:Y.A,Image:ee.A,ImageOff:et.A,KeyRound:er.A,Keyboard:en.A,Laptop:ei.A,LayoutDashboard:es.A,Link2:ea.A,ListChecks:el.A,Loader2:eo.A,Lock:ec.A,LogIn:ed.A,LogOut:eu.A,Maximize2:ep.A,Minimize2:eh.A,Menu:em.A,Mic:ef.A,MicOff:eg.A,Monitor:ey.A,Moon:e_.A,MoreHorizontal:eb.A,MoreVertical:ew.A,MousePointer2:ek.A,Package:ev.A,Palette:eA.A,PanelLeft:eS.A,PanelLeftClose:eT.A,PanelLeftOpen:ex.A,PanelRight:eC.A,Paperclip:eR.A,Pause:eP.A,Pencil:eI.A,Pin:e$.A,PinOff:eD.A,Play:eL.A,Plug:eM.A,Plus:eO.A,Power:eU.A,PowerOff:eE.A,QrCode:ej.A,RefreshCw:eN.A,Replace:eB.A,RotateCw:eF.A,Save:eW.A,Scissors:eq.A,Search:eK.A,Send:eH.A,SendHorizontal:ez.A,Settings:eJ.A,Share:eG.A,Shield:eV.A,Smartphone:eZ.A,Sparkles:eX.A,Square:eQ.A,SquarePen:eY.A,Star:e0.A,StickyNote:e1.A,Sun:e2.A,Target:e3.A,Terminal:e5.A,Trash2:e8.A,Triangle:e9.A,Type:e4.A,Undo2:e6.A,Upload:e7.A,Users:te.A,Volume2:tt.A,VolumeX:tr.A,Wallpaper:tn.A,X:ti.A,Zap:ts.A};function tl({name:e,size:t=20,className:r="",...i}){let s=ta[e];return s?(0,n.jsx)(s,{size:t,className:r,strokeWidth:2,...i}):(console.warn(`Icon "${e}" not found in the icon registry`),null)}},73426:(e,t,r)=>{r.d(t,{U:()=>h,x$:()=>p,zm:()=>m});var n=r(90076),i=r(20464),s=r(31735),a=r(97711),l=r(11155),o=r(98988),c=r(90084),d=r(86129);let u=0;async function p(e,{currentKey:t}={}){let r=++u,c=o.rh.getState(),d=t||c.hosts[c.currentKey]?.full||c.currentKey;d&&((0,s.d6)(d,window.location.pathname+window.location.search),o.rh.getState().setAutoConnect((0,l.Uo)(d),!0));let h=await fetch(n.Sn.connect,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e})});if(!h.ok)throw Error("connect failed");let m=await h.json(),f=!1;for(let t=0;t<n.jP&&!f;t++)(f=await (0,i.zg)(m.tunnelUrl,e))||!(t<n.jP-1)||await new Promise(e=>setTimeout(e,n.dM));if(!f)throw Error("unreachable");r===u&&(0,a.vd)({apiKey:e,tunnelUrl:m.tunnelUrl,mode:"remote",localIp:m.localIp||null})}function h(e){try{e?sessionStorage.setItem(d.aS,"1"):sessionStorage.removeItem(d.aS)}catch{}}function m(e,{remember:t=!0,leavingHead:r=null,navigate:n=!0}={}){e?.tail&&e.tempKey&&(0,c.LG)(e.tempKey,{tail:e.tail}),h(t),r&&((0,s.d6)(r,window.location.pathname+window.location.search),o.rh.getState().setAutoConnect((0,l.Uo)(r),!0)),n&&(window.location.href="/workspace/")}},75687:(e,t,r)=>{r.d(t,{k:()=>n});function n(e){let t=String(e||"").trim(),r=e=>({tempKey:e.slice(0,6).toUpperCase(),tail:e.slice(6,8).toUpperCase()}),n=/#([A-NP-Z1-9]{6}-?[a-np-z1-9]{2})$/i.exec(t);if(n)return r(n[1].replace(/-/g,""));let i=/^([A-NP-Z1-9]{6}-?[a-np-z1-9]{2})$/i.exec(t);if(i)return r(i[1].replace(/-/g,""));let s=/[?&]k=([A-NP-Z1-9]{6})(?:[^A-NP-Z1-9]|$)/i.exec(t);return s?{tempKey:s[1].toUpperCase()}:/^[A-NP-Z1-9]{6}$/i.test(t)?{tempKey:t.toUpperCase()}:null}},79253:(e,t,r)=>{r.d(t,{$b:()=>b,A0:()=>z,AE:()=>g,Ax:()=>$,Dk:()=>P,GW:()=>q,Jl:()=>W,Kr:()=>H,L0:()=>X,L8:()=>y,LN:()=>j,Qw:()=>M,RV:()=>function e(t){let r;if(!t||"object"!=typeof t)return t;if(Array.isArray(t)){let r=!1,n=t.map(t=>{let n=e(t);return n!==t&&(r=!0),n});return r?n:t}for(let s of Object.keys(t)){let a=t[s];if(i.has(s)&&"string"==typeof a&&a.includes("\\"))(r||={...t})[s]=n(a);else if(a&&"object"==typeof a){let n=e(a);n!==a&&((r||={...t})[s]=n)}}return r||t},W5:()=>Q,YO:()=>k,ZH:()=>_,_C:()=>B,bd:()=>Z,cv:()=>F,d5:()=>K,fQ:()=>v,gh:()=>C,hh:()=>O,iB:()=>w,kS:()=>N,kb:()=>n,mv:()=>x,n2:()=>D,pA:()=>I,qu:()=>L,rL:()=>G,so:()=>A,u:()=>f,vd:()=>U,vs:()=>S,xW:()=>T,xl:()=>J,xr:()=>V,zT:()=>E});let n=e=>"string"==typeof e?e.replace(/\\/g,"/"):e,i=new Set(["path","currentPath","parentPath","dirPath","filePath","repoPath","oldPath","newPath","fullPath","relativePath"]),s=[".png",".jpg",".jpeg",".gif",".webp",".ico",".bmp",".svg",".avif",".apng",".tif",".tiff",".heic",".heif"],a=[".mp4",".m4v",".webm",".ogv",".mov",".mkv",".avi",".3gp"],l=[".mp3",".wav",".ogg",".oga",".flac",".m4a",".aac",".opus"],o=[".pdf"],c=[".docx"],d=[".xlsx",".xls",".csv",".tsv"],u=[".html",".htm",".xhtml"],p=[".mmd",".mermaid"],h=[".md",".markdown",".mdx"];function m(e,t){if(!e)return!1;let r=e.toLowerCase();return t.some(e=>r.endsWith(e))}let f=e=>m(e,s),g=e=>m(e,a),y=e=>m(e,l),_=e=>m(e,o),b=e=>m(e,c),w=e=>m(e,d);function k(e){return e?m(e,u)?"html":m(e,h)?"markdown":m(e,p)?"mermaid":null:null}let v="9remote-preview",A={".js":"javascript",".jsx":"javascript",".ts":"javascript",".tsx":"javascript",".mjs":"javascript",".cjs":"javascript",".html":"html",".htm":"html",".xhtml":"html",".css":"css",".scss":"css",".sass":"css",".less":"css",".styl":"css",".json":"json",".json5":"json",".jsonc":"json",".md":"markdown",".markdown":"markdown",".mdx":"markdown",".py":"python",".pyw":"python",".rb":"ruby",".php":"php",".go":"go",".rs":"rust",".java":"java",".kt":"kotlin",".kts":"kotlin",".swift":"swift",".scala":"scala",".clj":"clojure",".cljs":"clojure",".ex":"elixir",".exs":"elixir",".erl":"erlang",".hs":"haskell",".ml":"ocaml",".mli":"ocaml",".jl":"julia",".pl":"perl",".pm":"perl",".tcl":"tcl",".lua":"lua",".r":"r",".dart":"dart",".groovy":"groovy",".gradle":"groovy",".c":"c",".h":"c",".cpp":"cpp",".cc":"cpp",".cxx":"cpp",".hpp":"cpp",".hh":"cpp",".cs":"csharp",".m":"objectivec",".sh":"shell",".bash":"shell",".zsh":"shell",".fish":"shell",".ps1":"powershell",".bat":"batch",".cmd":"batch",".yml":"yaml",".yaml":"yaml",".toml":"toml",".ini":"ini",".cfg":"ini",".conf":"ini",".properties":"ini",".xml":"xml",".sql":"sql",".graphql":"graphql",".gql":"graphql",".proto":"protobuf",".vue":"vue",".svelte":"svelte",".csv":"csv",".tsv":"csv",".log":"log",".diff":"diff",".patch":"diff",".dockerfile":"dockerfile",".makefile":"makefile",".mk":"makefile",".env":"env",".gitignore":"gitignore"},S={M:"text-git-modified",A:"text-git-added",D:"text-git-deleted","?":"text-git-untracked",U:"text-git-modified"},T={normal:{indentBase:12,indentStep:12,icon:16,chevron:14,text:"text-[15px] sm:text-sm",padY:"py-1 sm:py-0.5"},compact:{indentBase:8,indentStep:8,icon:14,chevron:12,text:"text-[13px] sm:text-[12px]",padY:"py-0.5 sm:py-[1px]"}},x=e=>e?"folder-changed"===e?22:32:4,C=768,R="git-diff:",P=(e,t)=>`${R}${e}:${t}`,I=e=>"string"==typeof e&&e.startsWith(R),$=e=>{let t=e.slice(R.length),r=t.indexOf(":");return{status:t.slice(0,r),absPath:t.slice(r+1)}},D=(e,t,r)=>`${R}${e}:${t}\u0000${r}`,L=e=>{let{status:t,absPath:r}=$(e),n=r.indexOf("\0");return -1===n?{status:t,repoPath:null,filePath:r}:{status:t,repoPath:r.slice(0,n),filePath:r.slice(n+1)}},M=18,O=12,U=40,E=48,j=30,N=10,B=70,F=20,W={MAX_DIRS:40,DEBOUNCE_MS:300,PREVIEW_DEBOUNCE_MS:1e3,IDLE_UNWATCH_MS:6e4},q="fileExplorer:gitRefresh",K={sidebarWidth:"fileExplorer.sidebarWidth",sidebarVisible:"fileExplorer.sidebarVisible",bottomPanelVisible:"fileExplorer.bottomPanelVisible",bottomPanelHeight:"fileExplorer.bottomPanelHeight",activityPanel:"fileExplorer.activityPanel",recentFiles:"fileExplorer.recentFiles",openTabs:"fileExplorer.openTabs",editorFontSize:"fileExplorer.editorFontSize",wordWrap:"fileExplorer.wordWrap",expandedFolders:"fileExplorer.expandedFolders",showHidden:"fileExplorer.showHidden"},H={explorer:"explorer",search:"search",scm:"scm",settings:"settings"},z=14,J=4,G=9,V=10,Z=28,X=5,Q=4194304},79453:(e,t,r)=>{r.d(t,{g:()=>J});var n=r(86129);class i{static{this.id="base"}static{this.capabilities={control:!1,binary:!1,signaling:"none"}}static{this.priority={control:0,binary:0}}constructor(){this._listeners=new Map,this._state=n.Of.idle}get state(){return this._state}get ready(){return this._state===n.Of.open}supports(e){return!!this.constructor.capabilities[e]}getPriority(e){return this.constructor.priority[e]??0}on(e,t){this._listeners.has(e)||this._listeners.set(e,new Set),this._listeners.get(e).add(t)}off(e,t){this._listeners.get(e)?.delete(t)}_emit(e,...t){let r=this._listeners.get(e);if(r)for(let e of r)e(...t)}_setState(e){this._state!==e&&(this._state=e,this._emit("stateChange",e))}connect(e){throw Error("Not implemented: connect")}disconnect(){throw Error("Not implemented: disconnect")}send(e,t){throw Error("Not implemented: send")}}var s=r(48193),a=r(63977);let l={transports:["websocket"],reconnection:!1,reconnectionDelay:1e3,reconnectionDelayMax:5e3};class o{constructor({tunnelUrl:e,namespace:t="",socketOptions:r={}}){this._tunnelUrl=e,this._namespace=t,this._socketOptions=r}connect({onSocket:e,onFail:t}){let r=this._namespace?`${this._tunnelUrl}${this._namespace}`:this._tunnelUrl,n=this._tunnelUrl===window.location.origin?"local":"tunnel",i=(0,s.io)(r,{...l,...this._socketOptions,path:"/socket.io",auth:e=>{(0,a.freshAuth)(this._socketOptions.auth,n).then(e)}}),o=!1;i.once("connect",()=>{o||(o=!0,e(i,n))}),i.once("connect_error",()=>{o||(o=!0,t?.())})}}let c={transports:["websocket"],reconnection:!1};class d{constructor({tunnelUrl:e,localIp:t,namespace:r="",socketOptions:n={}}){this._tunnelUrl=e,this._localIp=t,this._namespace=r,this._socketOptions=n}connect({onSocket:e,onFail:t}){let r=!1,n=(t,n)=>{if(r){try{t.disconnect()}catch{}return}r=!0,e(t,n)},i=e=>this._namespace?`${e}${this._namespace}`:e,l=e=>({...c,...this._socketOptions,path:"/socket.io",auth:t=>{(0,a.freshAuth)(this._socketOptions.auth,e).then(t)}}),o=()=>{let e=this._tunnelUrl===window.location.origin?"local":"tunnel",a=(0,s.io)(i(this._tunnelUrl),l(e));a.once("connect",()=>n(a,e)),a.once("connect_error",()=>void(!r&&(r=!0,t?.())))};if(!this._localIp||"https:"===window.location.protocol)return void o();let d=(0,s.io)(i(`http://${this._localIp}`),l("local"));d.once("connect",()=>n(d,"local")),d.once("connect_error",()=>{r||(d.disconnect(),o())})}}var u=r(90076);let p=3;var h=r(52159),m=r(27520);let f=2e3,g=15,y=15,_=15,b=45;class w extends i{static{this.id="ws"}static{this.capabilities={control:!0,binary:!0,file:!0,signaling:"ws"}}static{this.priority={control:100,binary:10,file:10}}constructor(){super(),this._socket=null,this._connectionMode="local",this._retryTimer=null,this._retryAttempt=0,this._retryScheduled=!1,this._retryNowTimer=null,this._destroyed=!1,this._blocked=!1,this._updating=!1,this._connecting=!1,this._visibilityHandler=null,this._lastInboundAt=Date.now(),this._lastMsgAt=0,this._zombieWatchdogTimer=null,this._retrySeq=0}get lastInboundAt(){return this._lastInboundAt}get lastMsgAt(){return this._lastMsgAt}get socket(){return this._socket}get connectionMode(){return this._connectionMode}get blocked(){return this._blocked}setUpdating(e){this._updating=e,e&&(this._maxAttempts=b,this._retryAttempt=0,(0,h.c)("transport",`[ws] updating=true maxAttempts=${this._maxAttempts}`))}forceReconnect(){this._destroyed||this._forceReconnect()}retryNow(e="?"){if(this._blocked)return void(0,m.Lq)("switch",`ws retryNow SKIP by=${e} (blocked)`);let t=Date.now(),r=t-(this._lastRetryNowAt||0);if(r<3e3){this._retryNowTimer||(this._retryNowTimer=setTimeout(()=>{this._retryNowTimer=null,this.retryNow(`${e}-deferred`)},3e3-r)),(0,h.c)("transport","[ws] retryNow throttled → deferred"),(0,m.Lq)("switch",`ws retryNow DEFER by=${e} (${3e3-r}ms left)`);return}(0,m.Lq)("switch",`ws retryNow GO by=${e} (drops attempt ${this._retryAttempt})`),this._retrySeq++,this._lastRetryNowAt=t,clearTimeout(this._retryNowTimer),this._retryNowTimer=null,clearTimeout(this._retryTimer),clearTimeout(this._connectingTimer),this._retryTimer=null,this._retryScheduled=!1,this._retryAttempt=0,this._connecting=!1,this._destroyed=!0,this._detachSocketEvents(),this._socket?.disconnect(),this._socket=null,this._destroyed=!1,this._ctx?.onRetryStatus?.({isRetrying:!0,attempt:1,maxAttempts:this._maxAttempts,failed:!1}),this._setState(n.Of.connecting),this._connectInternal()}setBlocked(e){this._blocked=e,(0,h.c)("transport",`[ws] blocked=${e}`),e?(this._cancelRetry(),this._socket?.disconnect()):this._socket?.connected||this._destroyed||this._connectInternal()}connect(e){this._ctx=e,this._auth=e.auth,this._maxAttempts=this._auth.tempKey?g:y,this._reconnectMaxAttempts=_,this._destroyed=!1,this._attachNetworkListeners(),this._setState(n.Of.connecting),this._connectInternal()}disconnect(){this._destroyed=!0,this._retrySeq++,this._cancelRetry(),clearTimeout(this._zombieWatchdogTimer),this._removeNetworkListeners(),this._detachSocketEvents(),this._socket?.disconnect(),this._socket=null,this._setState(n.Of.closed)}send(e,t){if(!this._socket?.connected)return!1;if(e===n.l_.control){let{event:e,args:r=[],cb:n}=t;return n?this._socket.emit(e,...r,n):this._socket.emit(e,...r),!0}return e===n.l_.binary?(this._socket.emit("tiles-bin-v2",t),!0):e===n.l_.file&&(this._socket.emit("file-bin",t),!0)}_connectInternal(){if(this._connecting||this._socket?.connected||this._destroyed)return;if(!this._auth.tunnelUrl&&!this._auth.localIp){(0,h.c)("transport","[ws] connect HOLD (no tunnelUrl/localIp yet) → retry"),(0,m.Lq)("switch","ws connect HOLD (no url yet) → fetch on retry"),this._setState(n.Of.degraded),this._scheduleRetry();return}this._connecting=!0,clearTimeout(this._connectingTimer),this._connectingTimer=setTimeout(()=>{this._connecting=!1},f);let e={tunnelUrl:this._auth.tunnelUrl,namespace:this._auth.namespace||"",socketOptions:this._auth.socketOptions||{}};(0,h.c)("transport",`[ws] connect: tunnelUrl=${this._auth.tunnelUrl} localIp=${this._auth.localIp||"none"}`),new o(e).connect({onSocket:(e,t)=>{if(this._connecting=!1,clearTimeout(this._connectingTimer),this._socket?.connected&&this._socket!==e){try{e.disconnect()}catch{}return}this._connectionMode=t,this._socket=e,this._retryAttempt=0,this._updating=!1,this._maxAttempts=this._reconnectMaxAttempts,this._cancelRetry(),this._attachSocketEvents(e),(0,h.c)("transport",`[ws] connect mode=${t}`),(0,m.Lq)("switch",`ws open mode=${t}`),this._setState(n.Of.open)},onFail:()=>{this._connecting=!1,clearTimeout(this._connectingTimer),(0,h.c)("transport","[ws] connect FAIL → schedule retry"),this._scheduleRetry()}})}_attachSocketEvents(e){e.on("disconnect",e=>{(0,h.c)("transport",`[ws] disconnect reason=${e}`),(0,m.Lq)("switch",`ws disconnect reason=${e}`),this._setState(n.Of.degraded),this._destroyed||this._forceReconnect()}),e.on("connect_error",e=>{(0,h.c)("transport",`[ws] connect_error ${e?.message||e}`),this._setState(n.Of.degraded),this._forceReconnect()});let t=()=>{clearTimeout(this._zombieWatchdogTimer),this._zombieWatchdogTimer=setTimeout(()=>{if(!this._destroyed&&this._socket===e){if(Date.now()-this._lastInboundAt<n.Rh)return void t();(0,m.Lq)("switch","ws zombie watchdog → force reconnect"),this.forceReconnect()}},n.Rh)};t(),e.io?.on?.("ping",()=>{this._lastInboundAt=Date.now(),t()}),e.on("connect",()=>{this._lastInboundAt=Date.now(),t()}),e.onAny((e,t)=>{this._lastMsgAt=Date.now(),this._emit("message",{event:e,data:t,source:"ws"})})}_attachNetworkListeners(){this._visibilityHandler||(this._visibilityHandler=()=>{"visible"!==document.visibilityState||this._socket?.connected||this._connecting||this.retryNow("visible")},this._offlineHandler=()=>{(0,m.Lq)("switch","ws offline event → drop socket, degraded"),this._socket?.disconnect(),this._socket=null,this._setState(n.Of.degraded)},this._onlineHandler=()=>{this._socket?.connected||this._connecting?(0,m.Lq)("switch",`ws online event → skip (${this._connecting?"handshaking":"already up"})`):this.retryNow("online")},this._pagehideHandler=()=>{try{this._socket?.disconnect()}catch{}},window.addEventListener("pagehide",this._pagehideHandler),document.addEventListener("visibilitychange",this._visibilityHandler),window.addEventListener("offline",this._offlineHandler),window.addEventListener("online",this._onlineHandler))}_detachSocketEvents(){if(this._socket)try{this._socket.offAny()}catch{}}_removeNetworkListeners(){this._pagehideHandler&&(window.removeEventListener("pagehide",this._pagehideHandler),this._pagehideHandler=null),this._visibilityHandler&&(document.removeEventListener("visibilitychange",this._visibilityHandler),this._visibilityHandler=null),this._offlineHandler&&(window.removeEventListener("offline",this._offlineHandler),this._offlineHandler=null),this._onlineHandler&&(window.removeEventListener("online",this._onlineHandler),this._onlineHandler=null)}_forceReconnect(){if(!this._destroyed&&!this._blocked&&!this._retryScheduled&&!this._connecting){if(this._retrySeq++,this._retryAttempt++,this._retryAttempt>p){this._retryAttempt=0,this._scheduleRetry();return}this._socket?.disconnect(),this._socket=null,this._connectInternal()}}_scheduleRetry(){this._retryScheduled||this._destroyed||this._blocked||(this._retryScheduled=!0,this._retryTimer=setTimeout(()=>this._doRetry(),f))}async _doRetry(){if(this._destroyed)return;if("u">typeof document&&"hidden"===document.visibilityState){(0,m.Lq)("switch",`ws retry HOLD (hidden, still at ${this._retryAttempt}/${this._maxAttempts})`),this._retryScheduled=!1,this._scheduleRetry();return}this._retryAttempt++;let e=this._retryAttempt,t=this._retrySeq;if(e>this._maxAttempts){this._retryScheduled=!1,(0,m.Lq)("switch",`ws GAVE UP after ${this._maxAttempts} attempts → closed`),this._ctx?.onRetryStatus?.({isRetrying:!1,attempt:e,maxAttempts:this._maxAttempts,failed:!0}),this._setState(n.Of.closed);return}(0,h.c)("transport",`[ws] retry attempt=${e}/${this._maxAttempts}`),(0,m.Lq)("switch",`ws retry ${e}/${this._maxAttempts}`),this._ctx?.onRetryStatus?.({isRetrying:!0,attempt:e,maxAttempts:this._maxAttempts,failed:!1});try{let e=await fetch(u.Sn.connect,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:this._auth.apiKey})});if(!e.ok)throw Error("Failed");let{tunnelUrl:r,localIp:n}=await e.json();if(t!==this._retrySeq)return void(0,m.Lq)("switch","ws retry ABORT (superseded mid-fetch)");this._auth.tunnelUrl=r,this._auth.localIp=n||null,this._connectionMode="local",this._ctx?.onUrlUpdate?.({tunnelUrl:r,localIp:n}),this._socket?.disconnect(),this._retryScheduled=!1,this._connectInternal()}catch{if(t!==this._retrySeq)return;this._retryScheduled=!1,this._scheduleRetry()}}_cancelRetry(){clearTimeout(this._retryTimer),this._retryTimer=null,clearTimeout(this._retryNowTimer),this._retryNowTimer=null,this._retrySeq++,this._retryAttempt=0,this._retryScheduled=!1,this._ctx?.onRetryStatus?.({isRetrying:!1,attempt:0,maxAttempts:this._maxAttempts,failed:!1})}}function k(e,t){if(t instanceof Uint8Array){let e="";for(let r=0;r<t.length;r++)e+=String.fromCharCode(t[r]);return{__b:btoa(e)}}return t}function v(e,t){if(t&&"object"==typeof t&&"string"==typeof t.__b){let e=atob(t.__b),r=new Uint8Array(e.length);for(let t=0;t<e.length;t++)r[t]=e.charCodeAt(t);return r}return t}function A(e){return JSON.stringify(e,k)}function S(e,t=null){let r=[],n={event:e.event,args:function e(t,r){if(t instanceof ArrayBuffer)return r.push(new Uint8Array(t)),{__B:r.length-1};if(ArrayBuffer.isView(t))return r.push(new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),{__B:r.length-1};if(Array.isArray(t))return t.map(t=>e(t,r));if(t&&"object"==typeof t){let n={};for(let i of Object.keys(t))n[i]=e(t[i],r);return n}return t}(e.args||[],r),ackId:e.ackId??null,lens:r.map(e=>e.length)};t&&(n.frag=t.id,n.part=t.part,n.parts=t.parts);let i=new TextEncoder().encode(JSON.stringify(n)),s=new Uint8Array(4+i.length+r.reduce((e,t)=>e+t.length,0));new DataView(s.buffer).setUint32(0,i.length,!0),s.set(i,4);let a=4+i.length;for(let e of r)s.set(e,a),a+=e.length;return s}function T(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<4)throw Error("frame too short");let r=4+new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0);if(r>t.length)throw Error("frame header truncated");let n=JSON.parse(new TextDecoder().decode(t.subarray(4,r))),i=[],s=r;for(let e of n.lens||[]){if(s+e>t.length)throw Error("frame part truncated");i.push(t.subarray(s,s+e)),s+=e}return{event:n.event,args:function e(t,r){if(Array.isArray(t))return t.map(t=>e(t,r));if(t&&"object"==typeof t){if("number"==typeof t.__B)return r[t.__B]??null;let n={};for(let i of Object.keys(t))n[i]=e(t[i],r);return n}return t}(n.args||[],i),ackId:n.ackId??null,frag:n.frag,part:n.part,parts:n.parts}}function x(){let e=new Map;return{push(t){let{frag:r,part:n,parts:i}=t;if(null==r)return t;if(!Number.isInteger(n)||!Number.isInteger(i)||n<0||i<1||n>=i||i>4096)return null;let s=e.get(r);s||(e.size>=4&&e.delete(e.keys().next().value),s={slices:Array(i),got:0},e.set(r,s));let a=t.args?.[0];if(null==a||(!s.slices[n]&&(s.slices[n]=a,s.got++),s.got<i))return null;e.delete(r);let l=new Uint8Array(s.slices.reduce((e,t)=>e+t.byteLength,0)),o=0;for(let e of s.slices)l.set(e,o),o+=e.byteLength;return T(l)}}}var C=r(90084),R=r(7938);let P=null,I=0,$=new Map,D=0;async function L(e,t){let r=`9remote_turn_cache_${t?.slice(0,12)||"anon"}`;try{let e="u">typeof localStorage?localStorage.getItem(r):null;if(e){let t=JSON.parse(e);if(t?.expiresAt>Date.now()&&Array.isArray(t.iceServers)&&t.iceServers.length)return t.iceServers}}catch{}try{let n=await fetch(e,{headers:{"X-API-Key":t},signal:AbortSignal.timeout(4e3)});if(n.ok){let e=await n.json();if(e?.iceServers?.length){try{"u">typeof localStorage&&localStorage.setItem(r,JSON.stringify({iceServers:e.iceServers,expiresAt:Date.now()+828e5}))}catch{}return e.iceServers}}}catch(e){console.warn("[WebRtcProtocol] TURN fetch failed:",e.message)}return null}class M extends i{static{this.id="rtc"}static{this.capabilities={control:!0,binary:!0,file:!0,signaling:"external"}}static{this.priority={control:50,binary:100,file:100}}constructor(){super(),this._pc=null,this._dcControl=null,this._dcBinary=null,this._dcFile=null,this._dcMobile=null,this._typeDetail="dc-stun",this._localCandidateTypes=new Set,this._answerApplied=!1,this._pendingCandidates=[],this._iceReachedChecking=!1,this._everOpened=!1,this._isLoopback=!1,this._pendingEmit=null,this._flushTimer=null,this._latestTileTs=new Map,this._hbTimer=null,this._hbLastPing=0,this._peerEnv2=!1,this._peerFragCtl=!1,this._v2Announced=!1,this._v2RxSeen=!1,this._fragSeq=0,this._reassemble=x(),this._lastInboundAt=0,this._signalingHandlers={},this._signaling=null,this._useTurn=!1}get lastInboundAt(){return this._lastInboundAt}getPriority(e){return"dc-turn"===this._typeDetail?5:150}async connect(e){this._ctx=e,this._cleanupPeer(),this._peerEpoch=(this._peerEpoch??0)+1,this._localCandidateTypes=new Set,this._answerApplied=!1,this._pendingCandidates=[],this._iceReachedChecking=!1,this._everOpened=!1,this._isLoopback=!1,this._typeDetail="dc-stun",this._lastMid=null,this._remoteGatheringDone=!1,this._setState(n.Of.connecting),this.connectingSince=Date.now(),this.connectDeadline=this.connectingSince+n.AC,clearTimeout(this._connectTimer),this._connectTimer=setTimeout(()=>{this._state!==n.Of.open&&((0,h.c)("transport",`[rtc] connect timeout (${n.AC}ms, state=${this._state}) → close + retry`),this._closePeer(`connect-timeout (state=${this._state})`))},n.AC);let t=[{urls:["stun:stun.l.google.com:19302","stun:stun1.l.google.com:19302","stun:stun2.l.google.com:19302","stun:stun3.l.google.com:19302","stun:stun4.l.google.com:19302"]},{urls:"stun:global.stun.twilio.com:3478"},{urls:"stun:stun.cloudflare.com:3478"}];if(this._useTurn=!!(e.useTurn||e.profile?.rtc?.enableTurn),e.iceServers?.length)t=e.iceServers;else if(this._useTurn){let r=await L(u.Sn.turnCredentials,e.auth?.apiKey);r?.length&&(t=r)}let r=new RTCPeerConnection({iceServers:t,iceCandidatePoolSize:4,bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});this._pc=r;let i=e.profile?.rtc?.dcControl?.ordered??!0,s=r.createDataChannel("control",{ordered:i}),a=r.createDataChannel("binary",{ordered:!1,maxPacketLifeTime:500}),l=r.createDataChannel("file",{ordered:!0}),o=r.createDataChannel("mobile",{ordered:!0});a.binaryType="arraybuffer",s.binaryType="arraybuffer",l.binaryType="arraybuffer",o.binaryType="arraybuffer",this._dcControl=s,this._dcBinary=a,this._dcFile=l,this._dcMobile=o;let c=async()=>{if("open"!==s.readyState||"open"!==a.readyState)return;let e="";try{let t=await r.getStats();t.forEach(r=>{if("candidate-pair"===r.type&&"succeeded"===r.state){let n=[...t.values()].find(e=>e.id===r.localCandidateId),i=[...t.values()].find(e=>e.id===r.remoteCandidateId);(n?.candidateType==="relay"||i?.candidateType==="relay")&&(this._typeDetail="dc-turn");let s=n?.address||n?.ip||"",a=i?.address||i?.ip||"";("127.0.0.1"===s||"::1"===s||"127.0.0.1"===a||"::1"===a)&&(this._isLoopback=!0),e=`local=${n?.candidateType}/${n?.protocol} remote=${i?.candidateType}/${i?.protocol}`}})}catch{}this.send(n.l_.control,{event:"rtc:linkType",args:[this._typeDetail]}),(0,h.c)("transport",`[rtc] dc OPEN type=${this._typeDetail} ${e}`),(0,m.Lq)("switch",`rtc dc OPEN (${this._typeDetail} ${e})`),clearTimeout(this._connectTimer),this._connectTimer=null,this._everOpened=!0,this._lastInboundAt=Date.now(),this._setState(n.Of.open)};s.onopen=c,a.onopen=c;let d=()=>{let e=!this._dcControl||"closed"===this._dcControl.readyState,t=!this._dcBinary||"closed"===this._dcBinary.readyState;(0,m.Lq)("switch",`rtc dc-close (ctrl=${this._dcControl?.readyState} bin=${this._dcBinary?.readyState})`),e&&t?this._setState(n.Of.closed):this._setState(n.Of.degraded)};s.onclose=d,a.onclose=d,l.onclose=()=>{this._dcFile=null},o.onclose=()=>{this._dcMobile=null},s.onerror=e=>{let t=e.error?.message??"unknown";t.includes("User-Initiated")||console.error("[rtc] dcControl ERROR:",t)},a.onerror=e=>{let t=e.error?.message??"unknown";t.includes("User-Initiated")||console.error("[rtc] dcBinary ERROR:",t)},l.onerror=e=>{let t=e.error?.message??"unknown";t.includes("User-Initiated")||console.error("[rtc] dcFile ERROR:",t)},s.onmessage=({data:e})=>{let t;this._lastInboundAt=Date.now();try{let r;if("string"==typeof e)r=JSON.parse("string"==typeof e?e:new TextDecoder().decode(e),v);else r=T(e),this._v2RxSeen||(this._v2RxSeen=!0,(0,m.Lq)("switch","env2: first v2 binary frame DECODED from agent (mutual upgrade confirmed)"));t=this._reassemble.push(r)}catch(e){console.error("[rtc] control parse error:",e.message);return}if(t){if("__ping"===t.event){this._hbTimer||this._startHeartbeatWatch(),this._hbLastPing=Date.now();try{s.send(A({event:"__pong",args:t.args||[]}))}catch{}return}this._emit("message",{event:t.event,data:t,source:"rtc"})}},a.onmessage=({data:e})=>{this._lastInboundAt=Date.now(),e instanceof ArrayBuffer&&this._receiveTile(e)},l.onmessage=({data:e})=>{this._lastInboundAt=Date.now(),e instanceof ArrayBuffer&&this._emit("binary",{channel:"file",buffer:e,source:"rtc"})},o.onmessage=({data:e})=>{this._lastInboundAt=Date.now(),e instanceof ArrayBuffer&&this._emit("binary",{channel:"mobile",buffer:e,source:"rtc"})},r.onicecandidate=({candidate:e})=>{var t;if(!e)return void this._sendSignaling({type:"ice",candidate:"",mid:this._lastMid||"0"});this._lastMid=e.sdpMid;let r=/typ (host|srflx|relay|prflx)/.exec(e.candidate||"");r&&this._localCandidateTypes.add(r[1]);let n=(t=e.candidate)&&t.includes("typ srflx")&&t.split(" ")[4]||null;n&&this._emit("netFingerprint",n),this._sendSignaling({type:"ice",candidate:e.candidate,mid:e.sdpMid})},r.oniceconnectionstatechange=()=>{(0,h.c)("transport",`[rtc] iceState=${r.iceConnectionState}`),(0,m.Lq)("switch",`rtc ice=${r.iceConnectionState} types=[${[...this._localCandidateTypes].join(",")}]`),"checking"===r.iceConnectionState&&(this._iceReachedChecking=!0),"disconnected"===r.iceConnectionState?this._setState(n.Of.degraded):"failed"===r.iceConnectionState?this._closePeer("ice-failed"):"connected"===r.iceConnectionState&&this._dcControl?.readyState==="open"&&this._dcBinary?.readyState==="open"&&this._setState(n.Of.open)},this._signaling=e.signaling,this._signaling?.on?.(e=>this._handleSignal(e));try{let e=await r.createOffer();await r.setLocalDescription(e),(0,h.c)("transport","[rtc] offer sent"),(0,m.Lq)("switch","rtc offer sent"),this._sendSignaling({type:"offer",sdp:e.sdp,useTurn:this._useTurn})}catch(e){console.error("[rtc] createOffer error:",e.message),this._closePeer(`create-offer:${e.message}`)}}disconnect(e="?"){this._closePeer(`manual-disconnect by=${e} state=${this._state}`),this._signaling?.off?.(),this._signaling=null}send(e,t){if(e===n.l_.control){if(this._dcControl?.readyState!=="open")return!1;let e={event:t.event,args:t.args||[],ackId:t.ackId||null};if(this._peerEnv2)return!!this._sendFramed(e)&&(this._v2Announced||(this._v2Announced=!0,(0,m.Lq)("switch","env2: client→agent control now SENT as v2 binary frames")),!0);try{return this._dcControl.send(A(e)),!0}catch(e){return!1}}if(e===n.l_.binary){if(this._dcBinary?.readyState!=="open")return!1;try{return this._dcBinary.send(t),!0}catch(e){return console.error("[rtc] send binary error:",e.message),!1}}if(e===n.l_.file){if(this._dcFile?.readyState!=="open")return!1;try{if(this._dcFile.bufferedAmount>n.HE.dcBufferThreshold)return!1;return this._dcFile.send(t),!0}catch(e){console.error("[rtc] send file error:",e.message)}}return!1}get typeDetail(){return this._typeDetail}get isLoopback(){return this._isLoopback}_closePeer(e){(0,m.Lq)("switch",`rtc→closed reason=${e}`),this._cleanupPeer(),this._setState(n.Of.closed)}setPeerCaps(e){this._peerEnv2=!!e?.env2,this._peerFragCtl=!!e?.fragCtl}get maxControlBytes(){return this._pc?.sctp?.maxMessageSize||n.dT}_sendFramed(e){var t;let r,n,i=this._peerFragCtl?this.maxControlBytes:1/0,s=(t=++this._fragSeq,(n=function(e,t){if(e.byteLength<=t)return[e];let r=t-192;if(r<=0)return null;let n=Math.ceil(e.byteLength/r);if(n>4096)return null;let i=[];for(let t=0;t<n;t++)i.push(e.subarray(t*r,Math.min((t+1)*r,e.byteLength)));return i}(r=S(e),i))?1===n.length?[r]:n.map((r,i)=>S({event:e.event,args:[r]},{id:t,part:i,parts:n.length})):null);if(!s)return!1;try{for(let e of s)this._dcControl.send(e);return!0}catch(e){return(0,h.c)("transport",`[rtc] control send refused: ${e.message}`),!1}}_startHeartbeatWatch(){this._hbTimer&&(clearInterval(this._hbTimer),this._hbTimer=null),this._hbLastPing=Date.now(),this._hbTimer=setInterval(()=>{if(this._state!==n.Of.open){clearInterval(this._hbTimer),this._hbTimer=null;return}let e=Date.now()-this._hbLastPing;e>n.An&&((0,h.c)("transport",`[rtc] heartbeat: no ping for ${e}ms → closing stalled peer`),this._closePeer(`heartbeat-stale (${e}ms)`))},n.KF)}async _addRemoteCandidate({candidate:e,mid:t}){e||(this._remoteGatheringDone=!0),await this._pc.addIceCandidate(new RTCIceCandidate(e?{candidate:e,sdpMid:t}:{candidate:"",sdpMid:t||"0"})).catch(()=>{})}_startDeadPathWatch(){clearInterval(this._deadPathTimer),this._deadPathTimer=setInterval(async()=>{if(this._state===n.Of.open||!this._pc)return this._stopDeadPathWatch();if(!this._remoteGatheringDone||"complete"!==this._pc.iceGatheringState)return;let e=0,t=0;try{(await this._pc.getStats()).forEach(r=>{"candidate-pair"===r.type&&(e++,"failed"===r.state&&t++)})}catch{return}e&&!(t<e)&&(this._stopDeadPathWatch(),this._closePeer(`dead-path (${t} pair(s) failed)`))},n.QS)}_stopDeadPathWatch(){clearInterval(this._deadPathTimer),this._deadPathTimer=null}_sendSignaling(e){this._signaling?.send?.(e)}async _handleSignal(e){if((0,h.c)("transport",`[rtc] signal: ${e.type}`),(0,m.Lq)("switch",`rtc signal recv=${e.type}`),this._pc)try{if("answer"===e.type){if(this._answerApplied||"stable"===this._pc.signalingState){(0,h.c)("transport","[rtc] duplicate answer ignored"),(0,m.Lq)("switch","rtc duplicate answer ignored");return}if(e.pub&&e.sig){let t=await this._verifyHostAnswer(e);if(t){console.error(`[rtc] host key verification FAILED (${t}) — relayed answer rejected`),this._closePeer(`host-key-rejected:${t}`);return}}await this._pc.setRemoteDescription(new RTCSessionDescription({type:"answer",sdp:e.sdp})),this._answerApplied=!0,(0,h.c)("transport","[rtc] answer set"),(0,m.Lq)("switch","rtc answer applied");let t=this._pendingCandidates;for(let e of(this._pendingCandidates=[],t))await this._addRemoteCandidate(e);clearTimeout(this._connectTimer),this.connectDeadline=Date.now()+n.HJ,this._startDeadPathWatch(),this._connectTimer=setTimeout(async()=>{if(this._state!==n.Of.open){try{let e=await this._pc.getStats();e.forEach(t=>{if("candidate-pair"!==t.type)return;let r=e.get(t.localCandidateId),n=e.get(t.remoteCandidateId),i=(r?.address||r?.ip||"?").split(":")[0].slice(-12),s=n?.address||n?.ip||"?";(0,m.Lq)("switch",`pair ${t.state} ${r?.candidateType}:${i}→${n?.candidateType}:${s}`)})}catch{}this._closePeer(`ice-timeout (state=${this._state})`)}},n.HJ)}else if("ice"===e.type){if(!this._answerApplied)return void this._pendingCandidates.push(e);await this._addRemoteCandidate(e)}else"error"===e.type&&((0,h.c)("transport",`[rtc] server error: ${e.message}`),this._closePeer(`server-error:${e.message}`))}catch(e){console.error("[rtc] signal handle error:",e.message)}}async _verifyHostAnswer(e){let t=this._ctx?.auth?.apiKey;if(!t)return null;let r=(0,C.lz)(t),n=r?.hostPubKey?r:null,i=!!r?.hostSealKey;if((0,h.c)("auth","[seal] verify answer:",{hostSentXpub:!!e.xpub,agentSentXpub:!!e.xpub,pinned:!!n,stalePin:!!(r?.hostPubKey&&!i),pendingFp2:(0,C.e1)()}),n){if(n.hostPubKey!==e.pub){let r=(0,C.e1)();return r&&await (0,C.t8)(e.pub,e.xpub)===r?((0,C.LG)(t,{hostPubKey:e.pub,hostSealKey:e.xpub,fp2:r}),(0,h.c)("transport","[rtc] host key re-pinned via fresh pairing fp2"),null):((0,h.c)("auth","[seal] REJECT answer — pinned pub differs (host key rotated?) and no fresh fp2 to re-pin"),"pinned-pub-mismatch")}let r=await (0,C.D5)(e.pub,e.sdp,e.sig);if(!1===r)return(0,h.c)("auth","[seal] REJECT answer — signature invalid (relay tampering?)"),"sig-invalid";if(null===r){if(!i)return(0,h.c)("auth","[seal] REJECT answer — no Ed25519 in browser and pinned fp2 predates sealing"),"no-ed25519-old-pin";let t=await (0,C.t8)(e.pub,e.xpub)===n.fp2;return t||(0,h.c)("auth","[seal] REJECT answer — fp2 fallback mismatch vs pinned",n.fp2),t?null:"fp2-mismatch"}return null}let s=(0,C.e1)();if(s){let r=await (0,C.t8)(e.pub,e.xpub);if(r!==s)return(0,h.c)("auth","[seal] REJECTED — fp2",r,"!= code",s,e.xpub?"":"(agent sent no sealing key — needs the source build)"),(0,C.HY)(),"pairing-fp2-mismatch";(0,C.LG)(t,{hostPubKey:e.pub,hostSealKey:e.xpub,fp2:r}),(0,h.c)("auth","[seal] pinned via RTC — fp2",r,"sealing key stored"),(0,h.c)("transport","[rtc] host key pinned via pairing fp2")}return null}natVerdict(){let e=this._localCandidateTypes;return this._everOpened||e.has("relay")?"ok":0===e.size||e.has("srflx")&&(!this._answerApplied||this._iceReachedChecking)?"unknown":"hard"}_cleanupPeer(){for(let e of(clearTimeout(this._connectTimer),this._connectTimer=null,this._stopDeadPathWatch(),this._hbTimer&&(clearInterval(this._hbTimer),this._hbTimer=null),[this._dcControl,this._dcBinary,this._dcFile,this._dcMobile]))if(e){e.onopen=null,e.onclose=null,e.onerror=null,e.onmessage=null;try{e.close()}catch{}}if(this._dcControl=null,this._dcBinary=null,this._dcFile=null,this._dcMobile=null,this._isLoopback=!1,this._typeDetail="dc-stun",this._pc){this._pc.onicecandidate=null,this._pc.oniceconnectionstatechange=null;try{this._pc.close()}catch{}this._pc=null}this._pendingEmit=null,this._flushTimer&&(clearTimeout(this._flushTimer),this._flushTimer=null),this._latestTileTs.clear(),this._reassemble=x()}_receiveTile(e){let t=++I,n=e.byteLength;new Promise(n=>{let i=setTimeout(()=>{$.has(t)&&($.delete(t),n(null))},8e3),s=R.eR.decodeQueueCap;for(;$.size>=s;){let e=$.keys().next().value,t=$.get(e);if(!t)break;clearTimeout(t.timer),$.delete(e),t.resolve(null)}let a=function(){if(!1===P)return null;if(P)return P;try{P=new Worker(r.tu(new URL(r.p+r.u(3692),r.b)))}catch{return P=!1,null}return P.onmessage=({data:{tiles:e,timestamp:t,id:r,hasBitmap:n,error:i}})=>{D=0;let s=$.get(r);if(!s){if(e)for(let t of e)t.bitmap?.close?.();return}clearTimeout(s.timer),$.delete(r),s.resolve(i?null:{tiles:e,timestamp:t,hasBitmap:n})},P.onerror=e=>{console.error("[Worker] tileDecoder:",e.message),function(){if(P)try{P.terminate()}catch{}for(let{resolve:e}of(P=null,$.values()))try{e(null)}catch{}$.clear()}(),++D>=3&&(P=!1)},P}();if(!a){clearTimeout(i),$.delete(t),n(null);return}$.set(t,{resolve:n,timer:i}),a.postMessage({buffer:e,id:t,v:2},[e])}).then(e=>{if(!e)return;let{tiles:t,timestamp:r,hasBitmap:i}=e;for(let e of(this._pendingEmit||(this._pendingEmit={tiles:new Map,timestamp:r,hasBitmap:i,bytes:0}),this._pendingEmit.bytes+=n,t))r>=(this._latestTileTs.get(e.tileIndex)??0)?(this._latestTileTs.set(e.tileIndex,r),this._pendingEmit.tiles.get(e.tileIndex)?.bitmap?.close?.(),this._pendingEmit.tiles.set(e.tileIndex,e),r>this._pendingEmit.timestamp&&(this._pendingEmit.timestamp=r)):e.bitmap?.close?.();this._flushTimer&&clearTimeout(this._flushTimer),this._flushTimer=setTimeout(()=>{if(this._flushTimer=null,!this._pendingEmit)return;let{tiles:e,timestamp:t,hasBitmap:r,bytes:n}=this._pendingEmit;this._pendingEmit=null;let i=[...e.values()];i.length&&this._emit("message",{event:"tiles-data",data:{tiles:i,timestamp:t,hasBitmap:r,bytes:n,transport:this._typeDetail},source:"rtc"})},0)})}}let O=new Map;function U(e){if(!e?.id)throw Error("Adapter missing static id");O.set(e.id,e)}function E({urls:e,timeoutMs:t,PeerConnection:r}={}){let i=r||("u">typeof RTCPeerConnection?RTCPeerConnection:null);if(!i)return Promise.resolve(null);let s=[{urls:e||n.cx.urls}];return new Promise(e=>{let r,a,l=!1,o=t=>{if(!l){l=!0,clearTimeout(a);try{r.onicecandidate=null,r.close()}catch{}e(t)}};try{r=new i({iceServers:s,iceCandidatePoolSize:0})}catch{return e(null)}a=setTimeout(()=>o(null),t??n.cx.timeoutMs),r.onicecandidate=({candidate:e})=>{var t;if(!e)return o(null);let r=(t=e.candidate)&&t.includes("typ srflx")&&t.split(" ")[4]||null;r&&o(r)};try{r.createDataChannel("probe"),r.createOffer().then(e=>r.setLocalDescription(e)).catch(()=>o(null))}catch{o(null)}})}let j="no-public-ip";function N(e){let t=0,r=!1;for(let n of e.values())"candidate-pair"===n.type&&(n.nominated||n.selected)&&(r=!0,t+=(n.bytesReceived??0)+(n.responsesReceived??0));return r?t:null}function B(e,t="stale"){let r=e._adapters.get("ws"),i=Math.max(r?.lastInboundAt??0,r?.lastMsgAt??0),s=r?.ready&&function({ready:e=!0,lastInboundAt:t=0,now:r}={}){return!!e&&(!t||r-t>=n.Rh)}({ready:!0,lastInboundAt:i,now:Date.now()});if(r){let e=r.lastInboundAt??0,n=r.lastMsgAt??0,i=Date.now();(0,m.Lq)("switch",`zombie check (${t}): verdict=${!!s} ready=${!!r.ready} lastPong=${e?`${i-e}ms`:"never"} lastMsg=${n?`${i-n}ms`:"never"}`)}if(!s)return!1;(0,h.c)("transport",`[pm] ws zombie (${t}) → force reconnect`);try{r.forceReconnect?.()}catch{}return!0}function F(e,t){let r=e._adapters.get("rtc"),i=r?._pc;if(!i||"failed"===i.connectionState)return void e._forceRestartRtc(`${t}-pc-failed`);if(e._probeLive?.rtc===r)return void(0,m.Lq)("switch",`${t} probe shared (already measuring this peer)`);clearTimeout(e._resumeProbeTimer);let s=++e._probeToken;e._probeLive={rtc:r,token:s},(async()=>{let t=N(await i.getStats());return null==t||(await new Promise(t=>{e._resumeProbeTimer=setTimeout(t,n.UT)}),s!==e._probeToken)?null:N(await i.getStats())-t})().then(i=>{if(s!==e._probeToken)return;let a=r?.lastInboundAt&&Date.now()-r.lastInboundAt<n.An;null!=i&&i>0||a?(0,m.Lq)("switch",`${t} probe alive (Δ=${i}, recent=${!!a})`):((0,m.Lq)("switch",`${t} probe DEAD (Δ=${i}) → forceRestartRtc`),e._forceRestartRtc(`${t}-probe-dead`))}).catch(()=>{s!==e._probeToken||(r?.lastInboundAt&&Date.now()-r.lastInboundAt<n.An?(0,m.Lq)("switch",`${t} probe error ignored (rtc recently active)`):((0,m.Lq)("switch",`${t} probe error → forceRestartRtc`),e._forceRestartRtc(`${t}-probe-error`)))}).finally(()=>{e._probeLive?.token===s&&(e._probeLive=null)})}function W(e,t){if(t?.type!=="error")return!1;let r=t.message===n.bg.pending?"pending":t.message===n.bg.rejected?"rejected":null;return!!r&&((0,h.c)("transport",`[pm] device ${r} → approval UI`),e._awaitingApproval=!0,e._wsCallbacks.onApproval?.(r),!0)}function q(e){if((0,m.Lq)("switch","signaling ready"),H(e),e._awaitingApproval)return;let t=e._adapters.get("rtc");if(!t){(0,m.Lq)("switch","sig-ready → start rtc (was deferred)"),e._startSecondaryAdapters();return}t.state===n.Of.closed&&((0,m.Lq)("switch","sig-ready → restartRtc (rtc was closed)"),e._restartRtc("sig-ready"))}function K(e,t){!(e._sig?.ready&&e._sig.send(t))&&("offer"===t.type&&(e._sigBuffer=e._sigBuffer.filter(e=>"offer"!==e.type&&"ice"!==e.type)),e._sigBuffer.push(t),e._sigBuffer.length>32&&e._sigBuffer.shift())}function H(e){if(!e._sigBuffer.length)return;let t=e._sigBuffer;for(let r of(e._sigBuffer=[],t))K(e,r)}async function z(e){if(e._auth.tunnelUrl!==window.location.origin)try{(0,h.c)("transport",`[pm] refreshTunnelUrl: fetching from ${u.O}/api/connect`);let t=await fetch(`${u.O}/api/connect`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e._auth.apiKey})});if(!t.ok)return void(0,h.c)("transport",`[pm] refreshTunnelUrl: HTTP ${t.status}`);let r=await t.json();(0,h.c)("transport",`[pm] refreshTunnelUrl: got ${r.tunnelUrl} (was ${e._auth.tunnelUrl})`),r.tunnelUrl&&r.tunnelUrl!==e._auth.tunnelUrl&&(e._auth.tunnelUrl=r.tunnelUrl)}catch(e){(0,h.c)("transport",`[pm] refreshTunnelUrl: error ${e.message}`)}}U(w),U(M);class J{constructor(e,t){const{profile:r,auth:i,wsCallbacks:s,rtcCallbacks:a,peerId:l}=function(e,t){let r=t?.enableWebRTC?"remoteDesktop":"clientApp",i={...n.j3[r]};t?.enableWebRTC||(i.enabled=["ws"]),t?.enableTurn&&(i.rtc={...i.rtc,enableTurn:!0});let s={tunnelUrl:e.tunnelUrl,localIp:e.localIp,apiKey:e.apiKey,tempKey:e.tempKey,deviceId:e.deviceId,namespace:e.namespace,socketOptions:e.socketOptions},a={onConnect:e.onConnect,onDisconnect:e.onDisconnect,onRetryStatus:e.onRetryStatus,onUrlUpdate:e.onUrlUpdate,onApproval:e.onApproval},l=t?{onUpgrade:t.onUpgrade,onFallback:t.onFallback,onTransportChange:t.onTransportChange}:{},o=`${e.deviceId}:${Math.random().toString(36).slice(2,10)}`;return s.socketOptions?.auth&&(s.socketOptions.auth.peerId=o),{profile:i,auth:s,wsCallbacks:a,rtcCallbacks:l,peerId:o}}(e,t);for(const e of(this._profile=r,this._auth=i,this._wsCallbacks=s,this._rtcCallbacks=a,this._peerId=l,Object.assign(this,{_adapters:new Map,_buffer:[],_pendingAcks:new Map,_ackTimers:new Map,_ackSeq:0,_rtcRestartAttempts:0,_rtcRestartTimer:null,_rtcRestartDueAt:0,_probeAttempts:0,_rtcGivenUp:!1,_giveUpIp:null,_lastStunProbeAt:0,_rejoinDebounceTimer:null,_netFingerprint:null,_awaitingApproval:!1,_ackTimeoutMs:n.QZ.ackTimeoutMs,_hiddenAt:null,_resumeProbeTimer:null,_probeToken:0,_probeLive:null,_connected:!1,_type:"ws",_connectionMode:"tunnel",_lastWsState:null,_rawSocket:null,_onConnectFired:!1,_rtcSignalingHandler:null,_sig:null,_sigDestroyed:!1,_sigBuffer:[],_wsFallbackTimer:null}),this._bus=function(e){let t=new Map,r=(e,r)=>{t.has(e)||t.set(e,[]),t.get(e).push(r)},n=(e,r)=>{let n=t.get(e);if(!n)return;let i=n.findIndex(e=>e===r||e._original===r);-1!==i&&n.splice(i,1)};return{_listeners:t,get connected(){return e._anyAdapterReady()},get id(){return e._rawSocket?.id||null},emit(t,...r){e._sendControl(t,r)},on(e,t){r(e,t)},off(e,t){n(e,t)},once(e,t){let i=(...r)=>{n(e,i),t(...r)};i._original=t,r(e,i)},listeners:e=>[...t.get(e)||[]],dispatch(e,r=[]){let n=t.get(e);if(n?.length){for(let e of[...n])if(n.includes(e))try{e(...r)}catch{}}},clear(){t.clear()},disconnect(){e._rawSocket?.disconnect()},kickWsZombie:t=>e.kickWsZombie(t)}}(this),this.busRef={current:this._bus},C.IU))this._bus.on(e,t=>(0,C.lu)(this,e,t));this._watchers=function(e){let t=()=>{let t;if((0,m.Lq)("switch",`visibility=${document.visibilityState}`),"visible"!==document.visibilityState)return;let r=e._adapters.get("ws"),i=e._adapters.get("rtc");if((0,m.Lq)("switch",`resume check: ws=${r?.ready?"ready":r?.state} rtc=${i?.ready?"ready":i?.state}`),B(e,"resume"),e._awaitingApproval)return;if(e._rtcGivenUp)return void e._maybeRearmRtc();if(t=e._rtcRestartTimer?Math.max(e._rtcRestartDueAt-Date.now(),0):-1,(0,m.Lq)("switch",`RESET attempts (was ${e._rtcRestartAttempts}) reason=resume pendingIn=${t}ms`),e._rtcRestartAttempts=0,e._probeAttempts=0,t<=n.QZ.backoffMs[0]||((0,m.Lq)("switch",`resume: pending rung was ${t}ms out → re-arm fast`),e._disarmRestart(),e._scheduleRtcRestart("resume-rearm")),!e._canSignal())return void e._sig?.retryNow("resume-no-carrier");let s=i?.state;i&&s!==n.Of.closed&&s!==n.Of.degraded?function(e){let t=e._adapters.get("rtc");if(!t?.ready)return e._restartRtc("resume-not-ready");let r=e._hiddenAt?Date.now()-e._hiddenAt:0;if("function"==typeof matchMedia&&matchMedia("(pointer: coarse)").matches&&r>n.Tr){(0,m.Lq)("switch",`resume: hidden ${Math.round(r/1e3)}s on touch → skip probe, force restart`),(0,h.c)("transport",`[pm] resume: hidden ${Math.round(r/1e3)}s → immediate restart`),e._forceRestartRtc("resume-hidden-touch");return}F(e,"resume")}(e):((0,m.Lq)("switch",`visibility → restartRtc (rtc=${s||"absent"})`),e._restartRtc("resume-dead-rtc"))},r=()=>{if("hidden"===document.visibilityState){e._hiddenAt=Date.now();return}clearTimeout(e._resumeCoalesceTimer),e._resumeCoalesceTimer=setTimeout(t,150)};document.addEventListener("visibilitychange",r);let i=!1,s=r=>{let n=!!r.detail?.hidden;if(n!==i){if(i=n,n){e._hiddenAt=Date.now();return}clearTimeout(e._resumeCoalesceTimer),e._resumeCoalesceTimer=setTimeout(t,150)}};document.addEventListener("app-visibility",s);let a=()=>{"visible"===document.visibilityState&&r()},l=()=>{e._hiddenAt=Date.now()};document.addEventListener("resume",a),document.addEventListener("freeze",l);let o=()=>{clearTimeout(e._netDebounceTimer),e._netDebounceTimer=setTimeout(()=>{!1===navigator.onLine?(0,m.Lq)("switch","net-change: still offline → wait"):((0,h.c)("transport","[pm] network change → probe rtc"),(0,m.Lq)("switch",`net-change: online=${navigator.onLine} → kick sig + ws + rtc`),e._sig?.retryNow("net-change"),e.retryNow("net-change"),(0,m.Lq)("switch",`RESET attempts (was ${e._rtcRestartAttempts}) givenUp=${e._rtcGivenUp} reason=net-change`),e._rtcRestartAttempts=0,e._probeAttempts=0,e._rtcGivenUp=!1,e._giveUpIp=null,e._shouldRenegotiate()&&e._restartRtc("net-change"))},n.o_.debounceMs)};return window.addEventListener("online",o),navigator.connection?.addEventListener?.("change",o),{visibilityHandler:r,detach(){document.removeEventListener("visibilitychange",r),document.removeEventListener("app-visibility",s),document.removeEventListener("resume",a),document.removeEventListener("freeze",l),window.removeEventListener("online",o),navigator.connection?.removeEventListener?.("change",o),clearTimeout(e._netDebounceTimer),e._netDebounceTimer=null,clearTimeout(e._resumeCoalesceTimer),e._resumeCoalesceTimer=null}}}(this)}get type(){return this._type}get connected(){return this._connected}get connectionMode(){return this._connectionMode}get wsBlocked(){return this._adapters.get("ws")?.blocked||!1}setWsBlocked(e){this._adapters.get("ws")?.setBlocked(e)}setUpdating(e){this._adapters.get("ws")?.setUpdating(e)}retryNow(e="user"){let t=this._adapters.get("ws");t?t.retryNow?.(e):((0,m.Lq)("switch",`retryNow by=${e}: no ws adapter → full connect()`),this.connect())}kickWsZombie(e="stale"){return B(this,e)}emit(e,...t){this._sendControl(e,t)}sendBinary(e,t){let r=this._pickAdapter(e);return!!r&&r.send(e,t)}connect(){this._sigDestroyed=!1;let e=this._profile.enabled.includes("rtc");e&&this._initSignalingClient(),e&&(this._canSignal()?this._startSecondaryAdapters():((0,m.Lq)("switch","rtc deferred — waiting for signaling relay"),clearTimeout(this._rtcDeferTimer),this._rtcDeferTimer=setTimeout(()=>{this._sigDestroyed||this._adapters.has("rtc")||((0,m.Lq)("switch","rtc defer expired → start anyway"),this._startSecondaryAdapters())},n.BF))),this._startWsFallback(),(0,h.c)("transport","[pm] connect: RTC + WS parallel (RTC preferred, WS warm standby)."),(0,m.Lq)("switch","connect: RTC + WS parallel")}async _startWsFallback(){if(!(this._adapters.has("ws")||this._sigDestroyed||this._adapters.get("rtc")?.isLoopback)){if((0,m.Lq)("switch","ws-fallback: start (refresh url)"),await this._refreshTunnelUrl(),this._adapters.has("ws")||this._sigDestroyed||this._adapters.get("rtc")?.isLoopback)return void(0,m.Lq)("switch","ws-fallback: aborted (destroyed, loopback or already attached)");(0,m.Lq)("switch","ws-fallback: connecting"),this._instantiate("ws"),this._adapters.get("ws")?.connect(this._buildCtx("ws"))}}async _refreshTunnelUrl(){return z(this)}_initSignalingClient(){!function(e){if(!n.gI.enabled||e._sig||e._sigDestroyed||!e._auth.deviceId||!e._auth.apiKey)return;let t=u.O.replace(/^http/,"ws")+"/signaling";r.e(6739).then(r.bind(r,46739)).then(({SignalingClient:r})=>{e._sig||e._sigDestroyed||(e._sig=new r({url:t,role:"client",roomId:e._auth.apiKey,apiKey:e._auth.apiKey,from:e._peerId,onReady:()=>q(e),pingMs:n.gI.pingMs}),e._sig.on(t=>{if("error"===t.type&&"rtc-disabled"===t.message){e._rtcTestDisabled=!0,(0,m.Lq)("switch","rtc-disabled by host → stop RTC retry (use WS)");return}W(e,t)||e._rtcSignalingHandler?.(t)}),e._sig.connect())}).catch(e=>(0,h.c)("transport",`[pm] SignalingClient load failed: ${e?.message||e}`))}(this)}_instantiate(e){if(this._adapters.has(e))return;let t=O.get(e);if(!t)return;let r=new t;r.on("stateChange",t=>this._onAdapterStateChange(e,t)),r.on("message",({event:e,data:t,source:r})=>this._dispatch(e,t,r)),r.on("binary",e=>this._onBinary(e)),"rtc"===e&&(r.on("netFingerprint",e=>this._onNetFingerprint(e)),this._srvCaps&&r.setPeerCaps?.(this._srvCaps)),this._adapters.set(e,r)}_onNetFingerprint(e){if(!e||e===this._netFingerprint)return;let t=this._netFingerprint;this._netFingerprint=e,t&&(0,h.c)("transport",`[pm] net fingerprint ${t}→${e} (same network — no backoff reset)`)}_maybeRearmRtc(){if(!this._rtcGivenUp)return;let e=Date.now();e-this._lastStunProbeAt<n.cx.minIntervalMs||(this._lastStunProbeAt=e,E().then(e=>{var t;if(this._sigDestroyed||!this._rtcGivenUp)return;let r=e||(this._giveUpIp===j?j:null);(t=this._giveUpIp,r&&(!t||r!==t))?((0,m.Lq)("switch",`rearm check: ip ${this._giveUpIp||"unknown"}→${r} changed → re-arm RTC`),(0,h.c)("transport","[pm] public ip changed → re-arm rtc"),this._rtcGivenUp=!1,this._giveUpIp=null,this._probeAttempts=0,this._rtcRestartAttempts=0,this._netFingerprint=e,this._canSignal())?this._shouldRenegotiate()&&this._restartRtc("stun-rearm"):this._sig?.retryNow("stun-rearm"):(0,m.Lq)("switch",`rearm check: ip=${r||"unknown"} same as give-up → stay WS-only`)}).catch(()=>{}))}_startSecondaryAdapters(){for(let e of((0,h.c)("transport",`[pm] startSecondary enabled=${this._profile.enabled}`),(0,h.c)("transport",`[pm] startSecondary rtcTestDisabled=${!!this._rtcTestDisabled}`),this._profile.enabled))"ws"!==e&&("rtc"!==e||!this._rtcTestDisabled)&&(this._adapters.has(e)||((0,h.c)("transport",`[pm] start adapter ${e}`),this._instantiate(e),this._adapters.get(e)?.connect(this._buildCtx(e))))}_handleApprovalSignal(e){return W(this,e)}_onSignalingReady(){q(this)}_canSignal(){return!!this._sig?.ready}_shouldRenegotiate(){return!this._awaitingApproval&&this._canSignal()}_restartRtc(e="?"){(0,m.Lq)("switch",`restartRtc CALLED by=${e} attempts=${this._rtcRestartAttempts}`);let t=this._adapters.get("rtc"),r=function({testDisabled:e,givenUp:t,rtcState:r,hasRtc:i}){return e?"skip-test-disabled":t?"skip-given-up":i&&(r===n.Of.connecting||r===n.Of.open)?"skip-in-flight":i?"restart":"start-fresh"}({testDisabled:!!this._rtcTestDisabled,givenUp:this._rtcGivenUp,rtcState:t?.state,hasRtc:!!t});if("skip-test-disabled"===r)return void(0,m.Lq)("switch","restartRtc skipped (rtcTestDisabled)");if("skip-given-up"===r)return void(0,m.Lq)("switch","restartRtc skipped (hard NAT → WS-only)");if("skip-in-flight"===r)return void(0,m.Lq)("switch",`restartRtc skipped (rtc=${t.state})`);if("start-fresh"===r){(0,m.Lq)("switch","restartRtc: no rtc → startSecondary"),this._startSecondaryAdapters();return}(0,m.Lq)("switch","restartRtc: tear down + renegotiate"),(0,h.c)("transport","[pm] ws reconnected → restart rtc");try{t.disconnect(`restart:${e}`)}catch{}this._adapters.delete("rtc"),this._rtcSignalingHandler=null,this._startSecondaryAdapters()}_forceRestartRtc(e="?"){(0,m.Lq)("switch",`forceRestartRtc CALLED by=${e}`);let t=this._adapters.get("rtc");if(t){try{t.disconnect(`force:${e}`)}catch{}this._adapters.delete("rtc"),this._rtcSignalingHandler=null}this._rtcGivenUp?(0,m.Lq)("switch","forceRestartRtc: torn down, no renegotiate (hard NAT)"):this._startSecondaryAdapters()}disconnect(){this._watchers?.detach(),this._watchers=null,clearTimeout(this._resumeProbeTimer),this._resumeProbeTimer=null,clearTimeout(this._rtcDeferTimer),this._rtcDeferTimer=null,this._probeToken++;try{this._sig?.disconnect()}catch{}for(let e of(this._sig=null,this._sigDestroyed=!0,this._sigBuffer=[],clearTimeout(this._wsFallbackTimer),clearTimeout(this._rejoinDebounceTimer),this._rejoinDebounceTimer=null,this._adapters.values()))try{e.disconnect("pm-disconnect")}catch{}for(let e of(this._adapters.clear(),this._bus.clear(),this._buffer=[],this._connected=!1,this._rawSocket=null,this._disarmRestart(),(0,m.Lq)("switch",`RESET attempts (was ${this._rtcRestartAttempts}) reason=pm-disconnect`),this._rtcRestartAttempts=0,this._probeAttempts=0,this._rtcGivenUp=!1,this._giveUpIp=null,this._lastStunProbeAt=0,this._ackTimers.values()))clearTimeout(e);this._ackTimers.clear()}_buildCtx(e,t){let r={auth:this._auth,profile:this._profile};return"ws"===e&&(r.onRetryStatus=this._wsCallbacks.onRetryStatus,r.onUrlUpdate=e=>{e.tunnelUrl&&(this._auth.tunnelUrl=e.tunnelUrl),void 0!==e.localIp&&(this._auth.localIp=e.localIp),this._wsCallbacks.onUrlUpdate?.(e)}),"rtc"===e&&(r.signaling={send:e=>this._sendSignaling(e),on:e=>{this._rtcSignalingHandler=e},off:()=>{this._rtcSignalingHandler=null}}),r}_onAdapterStateChange(e,t){(0,h.c)("transport",`[pm] ${e} state=${t}`),("rtc"!==e||t!==n.Of.closed)&&(0,m.Lq)("switch",`${e}→${t}`),"ws"===e&&function(e,t){let r=e._adapters.get("ws");if(t===n.Of.open){let t=e._lastWsState===n.Of.degraded;e._connected=!0,e._connectionMode=r?.connectionMode||"tunnel",e._rawSocket=r?.socket||null,t&&e._maybeFireRejoin("ws","ws reconnect while rtc ready"),e._lastWsState!==n.Of.open&&(e._onConnectFired?e._wsCallbacks.onUrlUpdate?.({}):(e._onConnectFired=!0,(0,m.Lq)("switch",`onConnect FIRE (ws, mode=${e._connectionMode})`),e._wsCallbacks.onConnect?.(e._bus,e._connectionMode)))}else e._rawSocket=null,e._lastWsState===n.Of.open&&((0,m.Lq)("switch","ws down"),e._anyAdapterReady()&&(0,m.Lq)("switch","ws down but rtc alive → skip onDisconnect"));e._lastWsState=t}(this,t),"rtc"===e&&function(e,t){if(t===n.Of.open){let t=e._onConnectFired;clearTimeout(e._wsFallbackTimer),e._rtcCallbacks.onUpgrade?.(e._adapters.get("rtc")?.typeDetail||"dc-stun"),e._onConnectFired||(e._onConnectFired=!0,e._connected=!0,e._connectionMode="webrtc",(0,m.Lq)("switch","onConnect FIRE (rtc, mode=webrtc)"),e._wsCallbacks.onConnect?.(e._bus,e._connectionMode)),e._rtcRestartAttempts=0,e._probeAttempts=0,e._rtcGivenUp=!1,e._giveUpIp=null,e._disarmRestart(),clearTimeout(e._rejoinDebounceTimer),e._rejoinDebounceTimer=null;let r=e._adapters.get("rtc");if(r?.isLoopback){(0,m.Lq)("switch","rtc loopback detected (same machine) → drop ws standby");let t=e._adapters.get("ws");if(t){try{t.disconnect()}catch{}e._adapters.delete("ws")}}t&&e._maybeFireRejoin("rtc","rtc reconnect while ws ready")}if(t===n.Of.closed){for(let t of(e._rtcCallbacks.onFallback?.("ws"),(0,m.Lq)("switch","rtc closed → startWsFallback + scheduleRtcRestart"),e._startWsFallback(),clearTimeout(e._wsFallbackTimer),e._pendingAcks.values()))try{t({error:"rtc-closed"})}catch{}for(let t of(e._pendingAcks.clear(),e._ackTimers.values()))clearTimeout(t);e._ackTimers.clear(),e._scheduleRtcRestart("rtc-closed")}}(this,t),"rtc"===e&&t===n.Of.open&&((0,h.c)("auth","[seal] rtc OPEN → sending proof"),(0,C.pV)(this)),this._recomputeType();let r=this._anyAdapterReady();r!==this._connected&&(this._connected=r,r||(this._onConnectFired=!1,(0,m.Lq)("switch",`onDisconnect FIRE (last carrier gone: ${e}→${t})`),this._wsCallbacks.onDisconnect?.(`${e}-${t}`))),this._flushBuffer()}_maybeFireRejoin(e,t){let r="ws"===e?this._adapters.get("rtc"):this._adapters.get("ws");if(r?.ready){(0,h.c)("transport",`[pm] ${t} → skip rejoin (other ready)`),(0,m.Lq)("switch",`${t} → skip rejoin (other ready)`);return}if("ws"===e&&r&&r.state===n.Of.connecting){(0,h.c)("transport",`[pm] ${t} → debounce rejoin (rtc connecting)`),(0,m.Lq)("switch",`${t} → debounce rejoin ${n.ZN}ms (rtc connecting)`),clearTimeout(this._rejoinDebounceTimer),this._rejoinDebounceTimer=setTimeout(()=>{this._rejoinDebounceTimer=null;let e=this._adapters.get("rtc");e?.ready?(0,m.Lq)("switch","debounce: rtc opened → skip rejoin"):((0,m.Lq)("switch",`debounce expired → FIRE rejoin (rtc=${e?.state||"absent"})`),this._bus.dispatch("connect",[]))},n.ZN);return}(0,m.Lq)("switch",`${t} → FIRE rejoin`),this._bus.dispatch("connect",[])}_recomputeType(){let e=this._pickAdapter(n.l_.binary)||this._pickAdapter(n.l_.control),t=e&&"rtc"===e.constructor.id?e.typeDetail||"dc-stun":"ws";t!==this._type&&(this._type=t,this._rtcCallbacks.onTransportChange?.(t))}_anyAdapterReady(){for(let e of this._adapters.values())if(e.ready)return!0;return!1}_pickAdapter(e){return function(e,t,r){let n=t.channels[r];if(!n)return null;let i=[...e.values()].filter(e=>e.supports(r)&&e.ready);return i.length?(i.sort((e,t)=>{let i=t.getPriority?t.getPriority(r):t.constructor.priority[r]??0,s=e.getPriority?e.getPriority(r):e.constructor.priority[r]??0;if(i!==s)return i-s;if(n.prefer){if(t.constructor.id===n.prefer)return 1;if(e.constructor.id===n.prefer)return -1}return 0}),i[0]||null):null}(this._adapters,this._profile,e)}_sendControl(e,t){!function(e,t,r){let i="function"==typeof r[r.length-1]?r.pop():null,s=e._pickAdapter(n.l_.control);if(!s){(0,h.c)("transport",`[pm] buffer event=${t} (no adapter ready)`),(0,m.Lq)("switch",`buffer "${t}" (no adapter)`),e._buffer.push({event:t,args:r,cb:i});return}if((0,h.c)("transport",`[pm] send control event=${t} via=${s.constructor.id}`),"rtc"===s.constructor.id){let a=null;if(i&&(a=`c_${++e._ackSeq}`,e._pendingAcks.set(a,i),e._scheduleAckTimeout(a,{event:t,args:r})),!s.send(n.l_.control,{event:t,args:r,ackId:a})){let l=e._pickAdapter(n.l_.control);if(l&&l!==s&&l.send(n.l_.control,i?{event:t,args:r,ackId:a,cb:i}:{event:t,args:r,ackId:a}))return;(0,h.c)("transport",`[pm] rtc refused event=${t} → buffered`),e._buffer.push({event:t,args:r,cb:i})}}else s.send(n.l_.control,{event:t,args:r,cb:i})}(this,e,t)}_flushBuffer(){!function(e){if(!e._buffer.length)return;let t=e._pickAdapter(n.l_.control);if(!t)return;let r=e._buffer.splice(0);for(let{event:n,args:i,cb:s}of((0,h.c)("transport",`[pm] flush ${r.length} buffered via=${t.constructor.id}`),r))e._sendControl(n,s?[...i,s]:i)}(this)}_dispatch(e,t,r){!function(e,t,r,i){if("srvCaps"===t){let t="rtc"===i?r?.args?.[0]:r;(0,h.c)("transport",`[pm] srvCaps from host via ${i}: ${JSON.stringify(t)}`),e._srvCaps=t||{},e._adapters.get("rtc")?.setPeerCaps?.(e._srvCaps)}if("__ack"===t){let{ackId:t,args:n}=r||{},i=e._pendingAcks.get(t);if(i){e._pendingAcks.delete(t);let r=e._ackTimers.get(t);r&&(clearTimeout(r),e._ackTimers.delete(t)),i(...n||[])}return}if("device:approved"===t){e._awaitingApproval=!1;let t=e._adapters.get("rtc");e._canSignal()&&(!t||t.state===n.Of.closed)&&e._restartRtc("device-approved")}if("rtc:enabled"===t){e._rtcTestDisabled&&(e._rtcTestDisabled=!1,(0,m.Lq)("switch","rtc:enabled by host → clear flag + restart RTC"),e._restartRtc("rtc-enabled"));return}if("tunnel:updated"===t){let t="rtc"===i?r?.args?.[0]:r;if(t){let{tunnelUrl:r,localIp:n,status:i}=t;if(e._auth.tunnelUrl===window.location?.origin)return(0,m.Lq)("switch",`tunnel:updated ignored (carrier is the page origin; got url=${r||"none"})`);if((0,m.Lq)("switch",`tunnel:updated recv (status=${i} url=${r||"none"})`),"ready"===i&&r){let t=e._auth.tunnelUrl!==r;e._auth.tunnelUrl=r,n&&(e._auth.localIp=n),e._wsCallbacks.onUrlUpdate?.({tunnelUrl:r,localIp:n});let i=e._adapters.get("ws");if(i&&(!i.ready||t)){(0,m.Lq)("switch",`tunnel:updated → ${t?"url changed":"ws not ready"} → retry ws with new URL`);try{i.retryNow("tunnel-updated")}catch{}}}else"down"===i&&(e._auth.tunnelUrl="",e._wsCallbacks.onUrlUpdate?.({tunnelUrl:"",localIp:n}))}return}let s="rtc"===i&&Array.isArray(r?.args)?r.args:[r];e._bus?.dispatch(t,s)}(this,e,t,r)}_onBinary(e){e&&("mobile"===e.channel?this._bus?.dispatch("mobile-bin",[e.buffer]):"file"===e.channel&&this._bus?.dispatch("file-bin",[e.buffer]))}_scheduleAckTimeout(e){var t;let r;t=this,r=setTimeout(()=>{t._ackTimers.delete(e),(0,h.c)("transport",`[pm] ack timeout ackId=${e} event=undefined → suspect zombie RTC`);let r=t._pendingAcks.get(e),i=t._adapters.get("rtc");t._adapters.get("ws");let s=Date.now(),a=i?.lastInboundAt||0;i?.ready&&a&&s-a<n.An?(0,m.Lq)("switch",`ack-timeout ? ignored (rtc active, lastInbound=${s-a}ms ago)`):i?.state===n.Of.open?F(t,"ack-timeout:?"):t._scheduleRtcRestart("ack-timeout")},t._ackTimeoutMs),t._ackTimers.set(e,r)}_armRestart(e,t){clearTimeout(this._rtcRestartTimer),this._rtcRestartDueAt=Date.now()+t,this._rtcRestartTimer=setTimeout(e,t)}_disarmRestart(){let e=this._rtcRestartTimer?Math.max(this._rtcRestartDueAt-Date.now(),0):-1;return clearTimeout(this._rtcRestartTimer),this._rtcRestartTimer=null,this._rtcRestartDueAt=0,e}_scheduleRtcRestart(e="?"){if((0,m.Lq)("switch",`rtcRestart REQ by=${e} attempts=${this._rtcRestartAttempts} probe=${this._probeAttempts} givenUp=${this._rtcGivenUp} pending=${!!this._rtcRestartTimer}`),this._rtcRestartTimer){let t=Math.max(this._rtcRestartDueAt-Date.now(),0);(0,m.Lq)("switch",`rtcRestart SKIP by=${e} (pending rung ${this._rtcRestartAttempts} fires in ${t}ms)`);return}if(this._rtcGivenUp){(0,m.Lq)("switch","scheduleRtcRestart skipped (hard NAT → WS-only)"),(0,h.c)("transport","[pm] rtc probe skipped (given up — hard NAT)");return}let t=function({attempts:e,probeAttempts:t,verdict:r}){let i,s,a=e>=n.QZ.maxAttempts,l=t;if(a){if(i=n.QZ.probeBackoffMs[t]??n.QZ.probeBackoffMs.at(-1),(l=t+1)>=n.QZ.classifyAfterProbes){if("hard"===(s=r?.()??"unknown"))return{giveUp:!0,verdict:s,probeAttempts:l};l=0}}else i=n.QZ.backoffMs[e]??n.QZ.backoffMs.at(-1);return{delay:i,isProbe:a,attempts:e+1,probeAttempts:l,verdict:s}}({attempts:this._rtcRestartAttempts,probeAttempts:this._probeAttempts,verdict:()=>this._adapters.get("rtc")?.natVerdict?.()??"unknown"});if(void 0!==t.verdict&&((0,m.Lq)("switch",`scheduleRtcRestart natVerdict=${t.verdict} probeAttempts=${t.probeAttempts}`),(0,h.c)("transport",`[pm] rtc nat verdict=${t.verdict} after ${t.probeAttempts} probes`)),t.giveUp){this._probeAttempts=t.probeAttempts,this._rtcGivenUp=!0,this._giveUpIp=this._netFingerprint,this._giveUpIp||E().then(e=>{this._rtcGivenUp&&!this._giveUpIp&&(this._giveUpIp=e||j,(0,m.Lq)("switch",`give-up baseline from probe: ip=${this._giveUpIp}`))}).catch(()=>{}),(0,m.Lq)("switch",`RTC give-up: hard NAT → WS-only (ip=${this._giveUpIp||"pending"})`);return}let{delay:r,isProbe:i}=t;this._probeAttempts=t.probeAttempts,this._rtcRestartAttempts=t.attempts,(0,m.Lq)("switch",`rtcRestart ARM by=${e} rung=${this._rtcRestartAttempts} delay=${r}ms probe=${i}`),(0,h.c)("transport",`[pm] schedule rtc ${i?"probe":"restart"} #${this._rtcRestartAttempts} in ${r}ms`);let s=()=>{if(this._disarmRestart(),this._awaitingApproval||!this._sig?.ready)return;let e=this._adapters.get("rtc");if(e){let t=function({state:e,connectingSince:t,connectDeadline:r,now:i,connectTimeoutMs:s}){return e!==n.Of.connecting?"restart":i<function({connectingSince:e,connectDeadline:t,connectTimeoutMs:r}){return t??(e??0)+r}({connectingSince:t,connectDeadline:r,connectTimeoutMs:s})?"wait":"teardown"}({state:e.state,connectingSince:e.connectingSince,connectDeadline:e.connectDeadline,now:Date.now(),connectTimeoutMs:n.AC});if("wait"===t){let t=Math.max(function({connectingSince:e,connectDeadline:t,connectTimeoutMs:r}){return t??(e??0)+r}({connectingSince:e.connectingSince,connectDeadline:e.connectDeadline,connectTimeoutMs:n.AC})-Date.now(),r);(0,m.Lq)("switch",`restart tick: peer still young (rung ${this._rtcRestartAttempts}) → re-arm in ${t}ms, no rung spent`),this._armRestart(s,t);return}if("teardown"===t){try{e.disconnect(`rung-${this._rtcRestartAttempts}-teardown`)}catch{}this._adapters.delete("rtc"),this._rtcSignalingHandler=null}}this._restartRtc(`rung-${this._rtcRestartAttempts}`)};this._armRestart(s,r)}_sendSignaling(e){K(this,e)}_flushSigBuffer(){H(this)}}},80186:(e,t,r)=>{r.d(t,{A:()=>i});var n=r(73365);function i({children:e,variant:t="primary",size:r="md",disabled:s=!1,loading:a=!1,onClick:l,className:o="",...c}){let d=`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"}[r]} ${s||a?"cursor-not-allowed":""} ${o}`;return(0,n.jsx)("button",{onClick:l,disabled:s||a,className:d,...c,children:a?(0,n.jsxs)("span",{className:"flex items-center justify-center gap-2",children:[(0,n.jsx)("span",{className:"animate-spin rounded-full h-4 w-4 border-b-2 border-white"}),e]}):e})}},86129:(e,t,r)=>{r.d(t,{AC:()=>u,An:()=>d,BF:()=>m,El:()=>v,HE:()=>P,HJ:()=>p,Ic:()=>x,J2:()=>w,Jd:()=>T,KF:()=>c,ML:()=>b,N0:()=>S,Of:()=>I,QS:()=>h,QZ:()=>s,Rh:()=>R,Tr:()=>g,UT:()=>f,ZN:()=>l,aS:()=>A,bg:()=>_,cx:()=>a,dT:()=>i,gI:()=>y,j3:()=>$,l_:()=>n,o_:()=>C,qM:()=>k,si:()=>o});let n={control:"control",binary:"binary",file:"file",mobile:"mobile"},i=65536,s={ackTimeoutMs:5e3,maxAttempts:3,backoffMs:[500,1500,3e3],probeBackoffMs:[3e4,6e4,12e4,3e5],classifyAfterProbes:3},a={urls:["stun:stun.l.google.com:19302","stun:stun1.l.google.com:19302"],timeoutMs:2500,minIntervalMs:15e3},l=500,o=3,c=1e4,d=25e3,u=4e3,p=15e3,h=1e3,m=12e3,f=2e3,g=1e4,y={enabled:!0,pingMs:25e3},_={pending:"pending-approval",rejected:"device-rejected"},b={mismatch:"mismatch",sealUnreadable:"seal-unreadable",timeout:"proof-timeout"},w={pending:"pending",approved:"approved",rejected:"rejected",reconnect:"reconnect"},k=8,v="9remote_pending_save",A="9remote_wants_save",S="9remote:keys-changed",T="9remote_login_error",x="strict",C={debounceMs:500},R=3e4,P={chunkSize:65528,windowSize:64,dcBufferThreshold:8388608,maxUploadSize:0x3200000,maxDownloadSize:0xc800000,maxStreamMediaSize:524288e3},I={idle:"idle",connecting:"connecting",open:"open",degraded:"degraded",closed:"closed"},$={clientApp:{enabled:["ws","rtc"],parallel:!0,channels:{control:{strategy:"priority",prefer:"rtc"},binary:{strategy:"priority",prefer:"rtc"},file:{strategy:"priority",prefer:"rtc"},mobile:{strategy:"priority",prefer:"rtc"}},rtc:{enableTurn:!0,dcControl:{ordered:!0}}},remoteDesktop:{enabled:["ws","rtc"],parallel:!0,channels:{control:{strategy:"priority",prefer:"rtc"},binary:{strategy:"priority",prefer:"rtc"},file:{strategy:"priority",prefer:"rtc"},mobile:{strategy:"priority",prefer:"rtc"}},rtc:{enableTurn:!0,dcControl:{ordered:!0}}}}},86251:(e,t,r)=>{r.d(t,{O:()=>u,Y:()=>c});let n=new Uint8Array([48,42,48,5,6,3,43,101,110,3,33,0]);function i(e){let t=atob(e),r=new Uint8Array(t.length);for(let e=0;e<t.length;e++)r[e]=t.charCodeAt(e);return r}function s(e){let t="",r=new Uint8Array(e);for(let e=0;e<r.length;e++)t+=String.fromCharCode(r[e]);return btoa(t)}function a(...e){let t=new Uint8Array(e.reduce((e,t)=>e+t.length,0)),r=0;for(let n of e)t.set(n,r),r+=n.length;return t}async function l(e){let t;try{t=i(String(e))}catch{return null}if(32!==t.length)return null;try{return await crypto.subtle.importKey("spki",a(n,t),{name:"X25519"},!0,[])}catch{return null}}async function o(e,t,r,n){let i=await crypto.subtle.deriveBits({name:"X25519",public:t},e,256),s=await crypto.subtle.importKey("raw",i,"HKDF",!1,["deriveKey"]);return await crypto.subtle.deriveKey({name:"HKDF",hash:"SHA-256",salt:a(r,n),info:new TextEncoder().encode("9remote-tail-seal-v1")},s,{name:"AES-GCM",length:256},!1,["encrypt"])}async function c(e,t){if("string"!=typeof e||!e||"string"!=typeof t||!t)return null;let r=await l(t);if(!r)return null;try{let t=await crypto.subtle.generateKey({name:"X25519"},!0,["deriveBits"]),n=new Uint8Array(await crypto.subtle.exportKey("spki",t.publicKey)).slice(-32),i=new Uint8Array(await crypto.subtle.exportKey("spki",r)).slice(-32),a=await o(t.privateKey,r,n,i),l=crypto.getRandomValues(new Uint8Array(12)),c=await crypto.subtle.encrypt({name:"AES-GCM",iv:l},a,new TextEncoder().encode(e));return{epk:s(n),iv:s(l),ct:s(c)}}catch{return null}}let d="ABCDEFGHJKLMNPQRSTUVWXYZ23456789";async function u(e,t){if("u"<typeof crypto||!crypto.subtle)return null;let r=[e,t].map(e=>{let t;try{t=i(String(e||""))}catch{t=new Uint8Array(0)}let r=new Uint8Array(2);return new DataView(r.buffer).setUint16(0,t.length),a(r,t)}),n=new Uint8Array(await crypto.subtle.digest("SHA-256",a(...r)));return d[n[0]%32]+d[n[1]%32]}},90076:(e,t,r)=>{r.d(t,{O:()=>n,Sn:()=>c,TR:()=>o,_8:()=>s,cC:()=>h,dM:()=>u,fm:()=>i,jP:()=>d,lE:()=>l,qn:()=>p,w:()=>a});let n="https://9remote.cc",i="https://9remote.cc/",s=2208,a=`http://127.0.0.1:${s}`,l=a,o=`${a}/api/ui/state`,c={connect:`${n}/api/connect`,tempKeyCreate:`${n}/api/temp-key/create`,tempKeyVerify:`${n}/api/temp-key/verify`,tempKeyRemove:`${n}/api/temp-key/remove`,localSites:"/api/local-sites",turnCredentials:`${n}/api/webrtc/turn-credentials`},d=5,u=2e3,p=5e3,h=1e4},90084:(e,t,r)=>{r.d(t,{$4:()=>d,D5:()=>b,HY:()=>h,I8:()=>g,IU:()=>w,LG:()=>u,cH:()=>y,e1:()=>m,lu:()=>k,lz:()=>c,pV:()=>v,t8:()=>p});var n=r(86129);r(52159);var i=r(86251);let s="9remote_device_trust",a="9remote_pending_fp2";function l(){try{return JSON.parse(localStorage.getItem(s)||"{}")}catch{return{}}}function o(e){localStorage.setItem(s,JSON.stringify(e))}function c(e){return l()[e]||null}function d(e){if(!e)return e;let t=c(e)?.tail;return t?`${e}-${t}`:e}function u(e,t){let r=l();r[e]={...r[e]||{},...t},o(r)}async function p(e,t){return e&&t?await (0,i.O)(e,t):null}function h(){let e=sessionStorage.getItem(a);return sessionStorage.removeItem(a),e?JSON.parse(e).fp2??null:null}function m(){try{let e=sessionStorage.getItem(a);if(!e)return null;let{fp2:t,exp:r}=JSON.parse(e);if(!t||Date.now()>r)return sessionStorage.removeItem(a),null;return t}catch{return null}}let f="9remote_api_keys";function g(){try{let e=sessionStorage.getItem(n.El);if(!e)return;sessionStorage.removeItem(n.El);let t=JSON.parse(localStorage.getItem(f)||"[]");if(t.some(t=>{try{return atob(t.key)===e}catch{return!1}}))return;t.push({id:String(Date.now()),key:btoa(e),label:`Key ${t.length+1}`,createdAt:new Date().toISOString(),lastLoginDate:new Date().toISOString()}),localStorage.setItem(f,JSON.stringify(t));try{window.dispatchEvent(new Event(n.N0))}catch{}}catch{}}function y(e){if(e)try{let t=l();delete t[e],o(t)}catch{}}function _(e){let t=atob(e),r=new Uint8Array(t.length);for(let e=0;e<t.length;e++)r[e]=t.charCodeAt(e);return r}async function b(e,t,r){try{let n=await crypto.subtle.importKey("raw",_(e),{name:"Ed25519"},!1,["verify"]);return await crypto.subtle.verify("Ed25519",n,_(r),new TextEncoder().encode(t))}catch{return null}}let w=["device:keyIssued","device:tailRejected"];function k(e,t,r){let i=e._auth?.apiKey;if(!i)return!1;if("device:keyIssued"===t){e._auth.tempKey=null,e._auth.socketOptions?.auth&&(e._auth.socketOptions.auth.tempKey=null);try{sessionStorage.removeItem("tempKey")}catch{}let t=r?.tail;return!t||(u(i,{tail:t}),e._tailProofSent=e._adapters.get("rtc")?._peerEpoch??0,sessionStorage.getItem(n.aS)&&(sessionStorage.removeItem(n.aS),sessionStorage.setItem(n.El,`${i}-${t}`),g()),!0)}return"device:tailRejected"===t&&(r?.reason===n.ML.sealUnreadable&&u(i,{hostSealKey:null}),!0)}async function v(e){let t=e._auth?.apiKey;if(!t)return;let i=e._adapters.get("rtc");if(!i?.ready)return;let s=i._peerEpoch??0;if(e._tailProofSent===s)return;let{freshAuth:a}=await Promise.resolve().then(r.bind(r,63977)),l=await a({apiKey:t,tempKey:e._auth?.tempKey||null},"rtc");(l.keyTail||l.keyTailSealed)&&i.send(n.l_.control,{event:"device:tailProof",args:[{keyTail:l.keyTail,keyTailSealed:l.keyTailSealed,tempKey:e._auth?.tempKey||null}]})&&(e._tailProofSent=s)}},94858:(e,t,r)=>{r.d(t,{d:()=>s});var n=r(2074),i=r(86129);let s=(0,n.v)(e=>({bus:null,busRef:{current:null},protocolRef:{current:null},connected:!1,everConnected:!1,deliberate:!1,connectionMode:"tunnel",carrier:"ws",approvalStatus:null,admitted:!1,authKey:null,endpoint:null,retryStatus:{isRetrying:!1,attempt:0,maxAttempts:10,failed:!1},setConnection:t=>e(e=>({...e,...t})),setConnected:t=>e({connected:t}),setCarrier:t=>e({carrier:t}),setConnectionMode:t=>e({connectionMode:t}),setRetryStatus:t=>e({retryStatus:t}),setAuthKey:t=>e({authKey:t}),setAdmitted:t=>e({admitted:t}),applyApproval:t=>e(e=>{let r=e.approvalStatus;return t===i.J2.reconnect?r===i.J2.approved?{approvalStatus:null}:{}:r===i.J2.approved&&t===i.J2.pending?{}:{approvalStatus:t}}),reset:()=>e({bus:null,connected:!1,deliberate:!1,everConnected:!1,connectionMode:"tunnel",carrier:"ws",endpoint:null,approvalStatus:null,admitted:!1,retryStatus:{isRetrying:!1,attempt:0,maxAttempts:10,failed:!1}})}))},97711:(e,t,r)=>{r.d(t,{Fo:()=>u,U0:()=>o,vd:()=>d});var n=r(1521),i=r(94858);let s="9remote_auth",a="9remote_auth_state",l=["apiKey","tunnelUrl","mode","localIp"];function o(){try{localStorage.removeItem(a)}catch{}}function c(e){"u">typeof document&&(document.cookie=`${s}=${e}; path=/; max-age=86400; SameSite=Lax`)}function d({apiKey:e,tunnelUrl:t,mode:r="remote",tempKey:n=null,localIp:s=null}){if(!e){try{localStorage.removeItem(a)}catch{}return}try{sessionStorage.setItem("apiKey",e),sessionStorage.setItem("tunnelUrl",t),sessionStorage.setItem("mode",r||"remote"),n?sessionStorage.setItem("tempKey",n):sessionStorage.removeItem("tempKey"),s?sessionStorage.setItem("localIp",s):sessionStorage.removeItem("localIp")}catch{}c(e);try{sessionStorage.removeItem("9remote_manual_disconnect")}catch{}try{!function(){try{return"false"!==localStorage.getItem("9remote_remember_key_preference")}catch{return!1}}()?localStorage.removeItem(a):localStorage.setItem(a,JSON.stringify({apiKey:e,tunnelUrl:t,mode:r,localIp:s}))}catch{}i.d.getState().setAuthKey(e)}function u(){let e=(0,n.useCallback)(()=>{let e,t,r,n,i;try{e=sessionStorage.getItem("apiKey"),t=sessionStorage.getItem("tunnelUrl"),r=sessionStorage.getItem("mode"),n=sessionStorage.getItem("tempKey"),i=sessionStorage.getItem("localIp")}catch{return null}if(!e){let n=function(){try{return JSON.parse(localStorage.getItem(a)||"null")}catch{return null}}();if(!n?.apiKey)return null;try{for(let e of l)n[e]&&sessionStorage.setItem(e,n[e])}catch{}e=n.apiKey,t=n.tunnelUrl??null,r=n.mode??null,i=n.localIp??null}return c(e),{apiKey:e,tunnelUrl:t,mode:r,tempKey:n,localIp:i}},[]);return{getAuth:e,setAuth:(0,n.useCallback)(e=>d(e),[]),clearAuth:(0,n.useCallback)(()=>{try{sessionStorage.clear()}catch{}try{localStorage.removeItem(a)}catch{}"u">typeof document&&(document.cookie=`${s}=; path=/; max-age=0`)},[])}}},98988:(e,t,r)=>{r.d(t,{Nw:()=>x,eJ:()=>S,d:()=>T,rh:()=>A});var n=r(2074),i=r(29091),s=r(94858),a=r(79453),l=r(7938),o=r(11155),c=r(90084);let d="9remote_fleet_connected";function u(){try{return JSON.parse(localStorage.getItem(d)||"[]")}catch{return[]}}class p{constructor({hostOf:e,patch:t,bindBus:r,ready:n,probeTargets:i,servedBy:s=null,servedBus:a=null}){this._hostOf=e,this._patch=t,this._bindBus=r,this._ready=n,this._probeTargets=i,this._servedBy=s||(()=>!1),this._servedBus=a||(()=>null),this.buses=new Map,this._connectTimers=new Map,this.pending=new Map,this._probeTimer=null,this._probeVisible=null}busOf(e){return e&&this.buses.get(e)?.busRef?.current||null}pmOf(e){return this.buses.get(e)||null}has(e){return this.buses.has(e)}whenReady(e,t){let r=this._hostOf(e);if(!e||!r)return;if(this._servedBy(e)){let r=this._servedBus(e);r&&t(r);return}let n=this.busOf(e);if(n&&"online"===r.status)return void t(n);if(!this._canOpen(r,e))return;this.open(e,r);let i=this.pending.get(e)||[];i.push(t),this.pending.set(e,i)}persistIntent(e,t){if(e)try{let r=new Set(u());t?r.add(e):r.delete(e),localStorage.setItem(d,JSON.stringify([...r]))}catch{}}_canOpen(e,t){return!(!e||this._servedBy(t))&&!!e.full}open(e,t){if(this.has(e))return;let r=function(){try{return localStorage.getItem("9remote_deviceId")}catch{return null}}();if(!this._canOpen(t,e)||!r)return;this.persistIntent(e,!0);let n=(0,o.Cj)(t.full);n&&(0,c.LG)(e,{tail:n});let i=t=>this._patch(e,t),s=!1,d=new a.g({tunnelUrl:null,localIp:null,namespace:"",socketOptions:{auth:{apiKey:e,tempKey:null,deviceId:r}},apiKey:e,deviceId:r,tempKey:null,onConnect:t=>{clearTimeout(this._connectTimers.get(e)),this._connectTimers.delete(e),i({status:"online",lastSeenAt:Date.now(),updating:!1,approval:null});let r=this.pending.get(e);if(r)for(let n of(this.pending.delete(e),r))try{n(t)}catch{}s||(s=!0,this._bindBus(t,e)),this._ready(t,e)},onDisconnect:()=>{this.pending.delete(e),i({status:"offline",lastSeenAt:Date.now()})}},{enableWebRTC:l.eR.enableWebRTC,enableTurn:l.eR.enableTurn,apiKey:e,onTransportChange:e=>i({carrier:e||"ws"})});this.buses.set(e,d),i({status:"connecting"}),this._connectTimers.set(e,setTimeout(()=>this._onConnectTimeout(e),15e3)),d.connect()}_onConnectTimeout(e){this._connectTimers.delete(e),this.buses.has(e)&&this._hostOf(e)?.status==="connecting"&&(this._patch(e,{status:"offline"}),this._hostOf(e)?.approval!=="pending"&&this.persistIntent(e,!1))}drop(e){let t=this.buses.get(e);t&&(t.disconnect(),this.buses.delete(e)),clearTimeout(this._connectTimers.get(e)),this._connectTimers.delete(e),this.pending.delete(e)}retry(e){this.drop(e),this.open(e,this._hostOf(e))}closeAll(){for(let e of this.buses.values())e.disconnect();for(let e of(this.buses.clear(),this._connectTimers.values()))clearTimeout(e);this._connectTimers.clear(),this.pending.clear(),this.disarmProbe()}armProbe(){this._probeTimer||(this._probeTimer=setInterval(()=>{document.hidden||this.probeOnce()},6e4),this._probeVisible=()=>{"visible"===document.visibilityState&&this.probeOnce()},document.addEventListener("visibilitychange",this._probeVisible))}disarmProbe(){this._probeTimer&&(clearInterval(this._probeTimer),this._probeTimer=null,document.removeEventListener("visibilitychange",this._probeVisible),this._probeVisible=null)}probeOnce(){let e=this._probeTargets().filter(e=>!this.has(e));e.length&&fetch("/api/host-status",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({heads:e})}).then(e=>e.ok?e.json():null).then(t=>{for(let r of e){if(this.has(r))continue;let e=t?.hosts?.[r];e&&this._patch(r,{status:e.online?"online":"offline"})}}).catch(()=>{})}}var h=r(51627),m=r(31408),f=r(27520);let g="9remote_fleet_cache",y=null;function _(e){clearTimeout(y),y=setTimeout(()=>{y=null;let t={};for(let[r,n]of Object.entries(e().hosts))t[r]={label:n.label,platform:n.platform,version:n.version,sessions:n.sessions,workspaces:n.workspaces,statusMap:n.statusMap,lastSeenAt:n.lastSeenAt};try{localStorage.setItem(g,JSON.stringify(t))}catch{}},1e3)}let b=e=>({key:e,full:null,label:"",status:"offline",carrier:"ws",sessions:[],workspaces:[],statusMap:{},platform:null,version:null,lastSeenAt:null,updateAvailable:null,canSelfUpdate:!1,updating:!1,approval:null,remoteAvailable:!1,mobileAvailable:!1,isCodespaces:!1,mobileDeviceCount:0}),w=(e,t)=>A.getState()._patchHost(e,t),k=(e,t)=>{e?.emit("getSessions",e=>{Array.isArray(e)&&w(t,{sessions:e})}),e?.emit("getWorkspaces",e=>{Array.isArray(e)&&w(t,{workspaces:e})}),e?.emit("getStatusState")},v=null,A=(0,n.v)((e,t)=>({hosts:{},currentKey:null,sync(r,n){let i=n||"",s=new Map;for(let e of r){let t=(0,o.Uo)(e.key);t&&!s.has(t)&&s.set(t,{full:e.key,label:e.label||""})}i&&!s.has(i)&&s.set(i,{full:null,label:""});let a=[...s.keys()].filter(e=>e!==i).slice(0,8),l=new Set(a);for(let e of[...v.buses.keys()])l.has(e)||v.drop(e);let c=function(){try{return JSON.parse(localStorage.getItem(g)||"{}")}catch{return{}}}(),d=new Set(u()),p=!1;try{p="1"===sessionStorage.getItem("9remote_manual_disconnect")}catch{}for(let r of(e(e=>{let t={};for(let[r,n]of s){let s=e.hosts[r]||{...b(r),...c[r]||{}};t[r]={...s,key:r,full:n.full,label:n.label||s.label,status:r===i?p?"offline":"full":l.has(r)&&("online"===s.status||"connecting"===s.status)?s.status:"offline"}}return{hosts:t,currentKey:i}}),a))d.has(r)&&v.open(r,t().hosts[r]);v.probeOnce(),v.armProbe()},_patchHost(r,n){e(e=>{let t=e.hosts[r];return t?{hosts:{...e.hosts,[r]:{...t,...n}}}:e}),_(t)},applyStatusState(r,n){let i=n||{};e(e=>{let t=e.hosts[r];return!t||(0,m.h3)(t.statusMap,i)?e:{hosts:{...e.hosts,[r]:{...t,statusMap:i}}}}),_(t)},applyStatusChange(r,{sessionId:n,state:i,tool:s,since:a,conversationId:l}={}){n&&(e(e=>{let t=e.hosts[r];if(!t)return e;let o=t.statusMap[n],c={state:i,tool:void 0!==s?s:o?.tool,since:a,...l||o?.conversationId?{conversationId:l||o?.conversationId}:{}};return(0,m.dI)(o,c)?e:{hosts:{...e.hosts,[r]:{...t,statusMap:{...t.statusMap,[n]:c}}}}}),_(t))},applyStatusCleared(r,n){n&&(e(e=>{let t=e.hosts[r],i=t?.statusMap?.[n];return i?{hosts:{...e.hosts,[r]:{...t,statusMap:{...t.statusMap,[n]:{...i,state:"idle"}}}}}:e}),_(t))},_closeHost(e,r={}){v.drop(e),t()._patchHost(e,{status:"offline",lastSeenAt:Date.now(),approval:null,...r})},ensureHost(e){e===t().currentKey||v.has(e)||v.open(e,t().hosts[e])},connectHost(e){t().retryHost(e)},requestHostUpdate(e,r="update"){let n=t().hosts[e];if(!n||n.updating)return;let i={updating:!0,updateAvailable:null};if("full"===n.status){let n=s.d.getState(),a=n.busRef?.current;if(!a?.connected)return void(0,f.Lq)("update",`request ${r} on ACTIVE ${e} dropped: bus not connected`);t()._patchHost(e,i),n.protocolRef?.current?.setUpdating?.(!0),a.emit("restart"===r?"requestRestart":"requestUpdate")}else t()._patchHost(e,i),v.pmOf(e)?.setUpdating?.(!0),v.whenReady(e,t=>{v.pmOf(e)?.setUpdating?.(!0),(0,f.Lq)("update",`request ${r} sent on fleet bus ${e}`),t.emit("restart"===r?"requestRestart":"requestUpdate")});setTimeout(()=>{t().hosts[e]?.updating&&t()._patchHost(e,{updating:!1})},12e4)},setAutoConnect(e,t){v.persistIntent(e,t)},retryHost(e){v.retry(e)},disconnectHost(e){v.persistIntent(e,!1),t()._closeHost(e)},closeAll(){v.closeAll()}}));function S(e){return v?.busOf(e)||null}function T(e){return v?.pmOf(e)||null}function x(e,t){v?.whenReady(e,t)}v=new p({hostOf:e=>A.getState().hosts[e],patch:w,bindBus:(e,t)=>{e.on("connect",()=>{e.emit("device:clientReady"),k(e,t)}),e.on("serverInfo",e=>{let r=!!A.getState().hosts[t]?.updating;w(t,{platform:e?.platform||null,isCodespaces:!!e?.isCodespaces,version:e?.version||null,updateAvailable:!r&&(0,h.U)(e?.updateAvailable?.version,e?.version)?e.updateAvailable:null,canSelfUpdate:!!e?.canSelfUpdate,remoteAvailable:!!e?.remoteAvailable,mobileAvailable:!!e?.mobileAvailable})}),e.on("statusState",e=>A.getState().applyStatusState(t,e)),e.on("statusChange",e=>A.getState().applyStatusChange(t,e)),e.on("statusCleared",e=>A.getState().applyStatusCleared(t,e)),e.on("sessionsChanged",()=>k(e,t)),e.on("workspacesChanged",()=>k(e,t)),e.on("session-renamed",()=>k(e,t)),e.on("sessionClosed",r=>{r&&i.B.getState().closeSession(r),k(e,t)}),e.on("device:pendingApproval",()=>w(t,{approval:"pending"})),e.on("device:approved",()=>w(t,{approval:null})),e.on("device:rejected",()=>A.getState()._closeHost(t,{approval:"rejected"})),e.on("device:tailRejected",()=>A.getState()._closeHost(t))},ready:(e,t)=>{e.emit("device:clientReady"),k(e,t)},probeTargets:()=>{let e=A.getState(),t=new Set(u());return Object.values(e.hosts).filter(r=>r.key!==e.currentKey&&t.has(r.key)).map(e=>e.key)},servedBy:e=>!!e&&e===A.getState().currentKey,servedBus:()=>{let e=s.d.getState();return e.connected?e.busRef?.current||e.bus:null}})}}]);
|