9remote 3.0.46 → 3.0.48
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/dist/cli.cjs +2 -2
- package/dist/server.cjs +244 -244
- package/dist/ui/assets/index-C_lQRNIZ.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 +8 -8
- package/dist/web/__next._head.txt +1 -1
- package/dist/web/__next._index.txt +7 -7
- package/dist/web/__next._tree.txt +2 -2
- package/dist/web/_next/static/chunks/1772-6cecc4aa50d11a9a.js +1 -0
- package/dist/web/_next/static/chunks/{8126-c11d39a1ae6ac126.js → 8126-a5f1dc08132cc504.js} +1 -1
- package/dist/web/_next/static/chunks/{9121-cf1e65bb26b0908b.js → 9121-de912622f0c3477f.js} +1 -1
- package/dist/web/_next/static/chunks/app/{layout-fc9671123388edff.js → layout-a65a70a4500177c7.js} +1 -1
- package/dist/web/_next/static/chunks/app/page-08396a6df5b1d417.js +22 -0
- package/dist/web/_next/static/chunks/app/workspace/layout-a0cc68d6cac6faac.js +23 -0
- package/dist/web/_next/static/css/{4da4daf9f2bf1755.css → 2072cba9849e7093.css} +1 -1
- package/dist/web/_next/static/css/316b0ddc7b4a58b9.css +1 -0
- package/dist/web/_not-found/__next._full.txt +7 -7
- package/dist/web/_not-found/__next._head.txt +1 -1
- package/dist/web/_not-found/__next._index.txt +7 -7
- 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 +2 -2
- package/dist/web/_not-found.html +1 -1
- package/dist/web/_not-found.txt +7 -7
- package/dist/web/admin/__next._full.txt +8 -8
- package/dist/web/admin/__next._head.txt +1 -1
- package/dist/web/admin/__next._index.txt +7 -7
- package/dist/web/admin/__next._tree.txt +2 -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 +8 -8
- package/dist/web/admin/access/__next._head.txt +1 -1
- package/dist/web/admin/access/__next._index.txt +7 -7
- package/dist/web/admin/access/__next._tree.txt +2 -2
- package/dist/web/admin/access/__next.admin.access.__PAGE__.txt +2 -2
- package/dist/web/admin/access/__next.admin.access.txt +1 -1
- package/dist/web/admin/access/__next.admin.txt +1 -1
- package/dist/web/admin/access.html +1 -1
- package/dist/web/admin/access.txt +8 -8
- package/dist/web/admin/login/__next._full.txt +8 -8
- package/dist/web/admin/login/__next._head.txt +1 -1
- package/dist/web/admin/login/__next._index.txt +7 -7
- package/dist/web/admin/login/__next._tree.txt +2 -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 +8 -8
- package/dist/web/admin/ota/__next._full.txt +8 -8
- package/dist/web/admin/ota/__next._head.txt +1 -1
- package/dist/web/admin/ota/__next._index.txt +7 -7
- package/dist/web/admin/ota/__next._tree.txt +2 -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 +8 -8
- package/dist/web/admin/turn/__next._full.txt +8 -8
- package/dist/web/admin/turn/__next._head.txt +1 -1
- package/dist/web/admin/turn/__next._index.txt +7 -7
- package/dist/web/admin/turn/__next._tree.txt +2 -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 +8 -8
- package/dist/web/admin.html +1 -1
- package/dist/web/admin.txt +8 -8
- package/dist/web/download/__next._full.txt +8 -8
- package/dist/web/download/__next._head.txt +1 -1
- package/dist/web/download/__next._index.txt +7 -7
- package/dist/web/download/__next._tree.txt +2 -2
- package/dist/web/download/__next.download.__PAGE__.txt +2 -2
- package/dist/web/download/__next.download.txt +1 -1
- package/dist/web/download.html +1 -1
- package/dist/web/download.txt +8 -8
- package/dist/web/index.html +1 -1
- package/dist/web/index.txt +8 -8
- package/dist/web/login/__next._full.txt +8 -8
- package/dist/web/login/__next._head.txt +1 -1
- package/dist/web/login/__next._index.txt +7 -7
- package/dist/web/login/__next._tree.txt +2 -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 +8 -8
- package/dist/web/workspace/__next._full.txt +10 -10
- package/dist/web/workspace/__next._head.txt +1 -1
- package/dist/web/workspace/__next._index.txt +7 -7
- package/dist/web/workspace/__next._tree.txt +3 -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 +10 -10
- package/dist/web/workspace/browse/__next._head.txt +1 -1
- package/dist/web/workspace/browse/__next._index.txt +7 -7
- package/dist/web/workspace/browse/__next._tree.txt +3 -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 +10 -10
- package/dist/web/workspace/editor/__next._full.txt +10 -10
- package/dist/web/workspace/editor/__next._head.txt +1 -1
- package/dist/web/workspace/editor/__next._index.txt +7 -7
- package/dist/web/workspace/editor/__next._tree.txt +3 -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 +10 -10
- package/dist/web/workspace/files/__next._full.txt +10 -10
- package/dist/web/workspace/files/__next._head.txt +1 -1
- package/dist/web/workspace/files/__next._index.txt +7 -7
- package/dist/web/workspace/files/__next._tree.txt +3 -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 +10 -10
- package/dist/web/workspace/git/__next._full.txt +10 -10
- package/dist/web/workspace/git/__next._head.txt +1 -1
- package/dist/web/workspace/git/__next._index.txt +7 -7
- package/dist/web/workspace/git/__next._tree.txt +3 -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 +10 -10
- package/dist/web/workspace/mobile/__next._full.txt +10 -10
- package/dist/web/workspace/mobile/__next._head.txt +1 -1
- package/dist/web/workspace/mobile/__next._index.txt +7 -7
- package/dist/web/workspace/mobile/__next._tree.txt +3 -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 +10 -10
- package/dist/web/workspace/pair/__next._full.txt +10 -10
- package/dist/web/workspace/pair/__next._head.txt +1 -1
- package/dist/web/workspace/pair/__next._index.txt +7 -7
- package/dist/web/workspace/pair/__next._tree.txt +3 -3
- package/dist/web/workspace/pair/__next.workspace.pair.__PAGE__.txt +1 -1
- package/dist/web/workspace/pair/__next.workspace.pair.txt +1 -1
- package/dist/web/workspace/pair/__next.workspace.txt +3 -3
- package/dist/web/workspace/pair.html +1 -1
- package/dist/web/workspace/pair.txt +10 -10
- package/dist/web/workspace/remote/__next._full.txt +10 -10
- package/dist/web/workspace/remote/__next._head.txt +1 -1
- package/dist/web/workspace/remote/__next._index.txt +7 -7
- package/dist/web/workspace/remote/__next._tree.txt +3 -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 +10 -10
- package/dist/web/workspace/settings/__next._full.txt +10 -10
- package/dist/web/workspace/settings/__next._head.txt +1 -1
- package/dist/web/workspace/settings/__next._index.txt +7 -7
- package/dist/web/workspace/settings/__next._tree.txt +3 -3
- package/dist/web/workspace/settings/__next.workspace.settings.__PAGE__.txt +1 -1
- package/dist/web/workspace/settings/__next.workspace.settings.txt +1 -1
- package/dist/web/workspace/settings/__next.workspace.txt +3 -3
- package/dist/web/workspace/settings.html +1 -1
- package/dist/web/workspace/settings.txt +10 -10
- package/dist/web/workspace/terminal/default/__next._full.txt +10 -10
- package/dist/web/workspace/terminal/default/__next._head.txt +1 -1
- package/dist/web/workspace/terminal/default/__next._index.txt +7 -7
- package/dist/web/workspace/terminal/default/__next._tree.txt +3 -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 +10 -10
- package/dist/web/workspace/welcome/__next._full.txt +10 -10
- package/dist/web/workspace/welcome/__next._head.txt +1 -1
- package/dist/web/workspace/welcome/__next._index.txt +7 -7
- package/dist/web/workspace/welcome/__next._tree.txt +3 -3
- package/dist/web/workspace/welcome/__next.workspace.txt +3 -3
- package/dist/web/workspace/welcome/__next.workspace.welcome.__PAGE__.txt +1 -1
- package/dist/web/workspace/welcome/__next.workspace.welcome.txt +1 -1
- package/dist/web/workspace/welcome.html +1 -1
- package/dist/web/workspace/welcome.txt +10 -10
- package/dist/web/workspace/workspaces/__next._full.txt +10 -10
- package/dist/web/workspace/workspaces/__next._head.txt +1 -1
- package/dist/web/workspace/workspaces/__next._index.txt +7 -7
- package/dist/web/workspace/workspaces/__next._tree.txt +3 -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 +10 -10
- package/dist/web/workspace.html +1 -1
- package/dist/web/workspace.txt +10 -10
- package/package.json +1 -1
- package/dist/ui/assets/index-BefL072o.js +0 -8
- package/dist/web/_next/static/chunks/1772-2df6c72aa1bdf99d.js +0 -1
- package/dist/web/_next/static/chunks/app/page-fde2c88f21078fca.js +0 -22
- package/dist/web/_next/static/chunks/app/workspace/layout-0d349197dc482ccd.js +0 -23
- package/dist/web/_next/static/css/577dbf61f141a630.css +0 -1
- /package/dist/web/_next/static/{u29HK3zWfDC3mM40skU_h → ITbZGdTwGNGLSLeCfLywp}/_buildManifest.js +0 -0
- /package/dist/web/_next/static/{u29HK3zWfDC3mM40skU_h → ITbZGdTwGNGLSLeCfLywp}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9121],{9121:(e,t,o)=>{"use strict";o.d(t,{s:()=>m});var a=o(7620),n=o(94245),s=o(33879),r=o(24890);let i=s.dI.map(e=>e.code),l=new Map,c=(e,t)=>{if(!i.includes(e)||e===s.Xn||d.getState().dicts[e]||l.has(e))return;let a=o(49262)(`./${e}.js`).then(o=>{l.delete(e);let a=o.default;return t(t=>({dicts:{...t.dicts,[e]:a}})),a}).catch(()=>{l.delete(e)});l.set(e,a)},d=(0,n.v)(e=>({locale:s.Xn,dicts:{[s.Xn]:r.default},hydrated:!1,hydrate:()=>{let t=function(){try{let e=window.localStorage.getItem(s.zl);if(e&&i.includes(e))return e}catch{}return s.Xn}();c(t,e),e({locale:t,hydrated:!0})},setLocale:t=>{if(i.includes(t)){try{window.localStorage.setItem(s.zl,t)}catch{}c(t,e),e({locale:t})}}}));function p(e,t){if(e)return t.split(".").reduce((e,t)=>null==e?e:e[t],e)}function m(){let{locale:e,dicts:t,hydrated:o,hydrate:n,setLocale:r}=d();(0,a.useEffect)(()=>{o||n()},[o,n]);let i=t[e]||t[s.Xn],l=t[s.Xn];return{t:(0,a.useMemo)(()=>(e,t)=>{var o;return o=p(i,e)??p(l,e)??e,"string"==typeof o&&t?o.replace(/\{(\w+)\}/g,(e,o)=>null!=t[o]?t[o]:`{${o}}`):o},[i,l]),locale:e,setLocale:r,hydrated:o}}},24890:(e,t,o)=>{"use strict";o.r(t),o.d(t,{default:()=>a});let a={common:{statusIdle:"Idle",statusWorking:"Working",statusBlocked:"Needs input",statusDone:"Your turn",statusSleep:"Sleeping",connect:"Connect",disconnect:"Disconnect",loading:"Loading...",cancel:"Cancel",confirm:"Confirm",save:"Save",delete:"Delete",close:"Close",back:"Back",next:"Next",edit:"Edit",rename:"Rename",remove:"Remove",open:"Open",clear:"Clear",yes:"Yes",no:"No",ok:"OK",error:"Error",success:"Success",failed:"Failed",retry:"Retry",refresh:"Refresh",clipboard:"Clipboard",clipboardCopy:"Copy",clipboardEmpty:"Clipboard is empty",search:"Search",create:"Create",new:"New",add:"Add",copy:"Copy",copied:"Copied",promptNotSent:"Prompt didn't reach the host",resend:"Resend",sending:"Sending…",promptRecovered:"Not confirmed before reload",inputNotSent:"Not sent — tap Send to retry",dismiss:"Dismiss",download:"Download",upload:"Upload",enabled:"Enabled",disabled:"Disabled",on:"on",off:"off",minute:"min",hour:"h",day:"d",minutesAgo:"{n} min ago",hoursAgo:"{n} hours ago",daysAgo:"{n} days ago",done:"Done",moveUp:"Move up",moveDown:"Move down"},agentSwitcher:{title:"Your devices",active:"ACTIVE",unnamed:"Untitled",connecting:"Connecting…",unreachable:"Can't reach this device. Is it online?"},hosts:{title:"Hosts",openHost:"Open host",connecting:"Connecting…",lastSeen:"Last seen",online:"Online",offline:"Offline",sessions:"sessions",working:"working",attention:"need you",noSessions:"No sessions",addHost:"Add host",removeHost:"Remove host",removeHostMessage:'Remove "{name}" from your saved hosts? The machine itself is not affected.',disconnectMessage:'Disconnect from "{name}"? Its terminals keep running; the key stays saved.'},login:{tagline:"Access your terminal from anywhere",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:"Access Key",placeholder:"sk-xxx... or One-Time Key (ABC123)",rememberKey:"Remember this key",connect:"Connect",connecting:"Connecting...",authenticating:"Authenticating with 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.",agentOffline:"This machine isn't running 9remote. Start the host, then try again.",legacyKeyUpdateRequired:"Host update required",legacyKeyUpdateHint:"This device uses an older key format. Update 9remote on that machine to connect:",legacyKeyError:"This access key uses an older format. Please update 9remote to the latest version on your host machine.",updateRequired:"Update required",savedKeys:"Saved Keys",login:"Login",lastLogin:"Last login",namePlaceholder:"Name this key (optional)",rename:"Rename",deleteKeyTitle:"Delete key",deleteKeyConfirm:'Are you sure you want to delete "{name}"?',justNow:"Just now",minutesAgo:"{n}m ago",hoursAgo:"{n}h ago",daysAgo:"{n}d ago",tapToScan:"Tap to scan",orEnterManually:"or enter key manually",addKey:"Add Key",secureTitle:"Secure & Encrypted",secureDesc:"All connections are end-to-end encrypted and secure.",featAccessTitle:"Access Anywhere",featAccessDesc:"Connect from any device, anywhere.",featSecureTitle:"Secure Connection",featSecureDesc:"End-to-end encryption keeps you safe.",featFastTitle:"Fast & Reliable",featFastDesc:"Low latency and high performance.",featSessionsTitle:"Multiple Sessions",featSessionsDesc:"Manage and switch between sessions.",home:"Home",docs:"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:"Menu",language:"Language",theme:"Theme",notifications:"Notifications",webgl:"GPU Render (Faster)",webglHint:"Turn off if text looks wrong",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:"Remote Browser",terminalSettings:"Terminal Settings",fontSize:"Font Size",terminalTheme:"Terminal Theme",terminalBackground:"Background",bgDim:"Background dim",bgApplyAll:"Apply to all",bgUrlPlaceholder:"Image URL (https://…)",bgSave:"Save",bgSaveFailed:"Could not save background",bgFromDevice:"Choose from device",bgFromUrl:"Paste image URL",bgChange:"Change image",bgAdd:"Add",bgCustomLabel:"Custom",bgDeleteFailed:"Could not delete background",bgCustomTitle:"Custom background",commandNotes:"Command Notes",showButtons:"Quick Buttons",showFolder:"Folder & Git Button",showNote:"Checklist Button",artifactHint:"The AI can preview html, docx, pdf, images and more instantly, beside your terminal.",artifactPanel:"Artifact preview",settingsJarvis:"Jarvis",jarvisToggle:"Jarvis coordinator",jarvisToggleHint:"Show the Jarvis button in the header. Its tools need the MCP switch in Plugins.",jarvisMcpOff:"The MCP switch in Plugins is off - Jarvis will start without its coordinator tools.",community:"Community",rateApp:"Rate App",starChip:"Help me star",installApp:"Install App",upgrade:"Upgrade",upgradeExpires:"Expires",upgradeRestore:"Restore Purchases",codespace:"Codespace",logout:"Logout",settingsGeneral:"General",settingsAgent:"Host",settingsSystem:"System",settingsVoice:"Voice",settingsBrowser:"Browser Use",extGuide1:"Open this link, then turn on Developer mode (top right):",extGuide2:'Click "Load unpacked" and pick this folder:',extGuide3:"Status flips to connected in a few seconds",voiceInput:"Voice Input",preventSleep:"Prevent Sleep",agentSystem:"System",agentAutoStart:"Launch on Startup",agentAutoStartHint:"Start the host when you log in",agentUnlock:"Remote Unlock",agentUnlockHint:"Allow control from the Windows lock screen",agentUnlockStale:"Worker state stale — re-checking",agentUnlockReady:"Running — works on the lock screen",agentLogs:"Logs",agentLogsOpen:"Host Logs",settingsDebug:"Debug",debugSource:"Source",debugLevel:"Level",debugAll:"All",debugHost:"Host",debugWeb:"Web",debugRefresh:"Refresh",debugCopy:"Copy",debugClear:"Clear",debugEmpty:"No logs",agentPower:"Power",agentRestart:"Restart host",agentShutdown:"Shutdown host",agentShutdownConfirmTitle:"Shutdown host?",agentShutdownConfirmMsg:"The host stops and every remote session drops until it is started again on this machine.",settingsAppearance:"Appearance",settingsTerminalTab:"Terminal",settingsMcp:"Plugins",settingsRemote:"Remote",mcpIntro:"Extra abilities you can give your AI coding tools.",mcpTools:"Allow",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:"Reload App",remoteDesktop:"Remote Desktop",headerButtons:"Header buttons",settingsButtons:"Buttons",notificationsButton:"Notifications",bellButton:"Bell Button",bellButtonHint:"Show the bell in the terminal header",notificationsButtonHint:"Alerts when a terminal finishes or needs you.",remoteDesktopHint:"Control this machine's screen from your phone.",sitesHint:"Browse the host's Chrome and local sites.",settings:"Settings",enablePush:"Enable Push Notifications",disablePush:"Disable Push Notifications",pushHint:"Enable push notifications to get alerted when AI completes tasks",pushActiveHint:"Push notifications are on for this device. You'll be alerted when AI completes tasks.",versionMismatch:"9remote {version} is outdated",versionMismatchHint:"Some features may not work. Run:",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",updateConfirmTitle:"Update 9remote?",updateConfirmMessage:"This installs the latest version and restarts the connection. It takes about a minute.",updateStarting:"Starting update…",updateInstalling:"Installing new version…",updateTimeout:"Update is taking too long",updateTimeoutHint:"Reload manually if it doesn't recover.",updateRestarting:"Updating 9remote…",updateReconnecting:"Reconnecting…",updateDone:"Updated! Reloading…",version:"Version",orientation:"Screen Orientation",orientationPortrait:"Portrait",orientationLandscape:"Landscape",orientationAuto:"Auto"},workspace:{loading:"Loading...",logoutTitle:"Logout",logoutMessage:"Are you sure you want to logout?",failedCreateSession:"Failed to create session: {error}",failedRenameSession:"Failed to rename session: {error}"},sessions:{headerTitle:"9remote.cc",connected:"Connected",disconnected:"Disconnected",codespaceStopped:"Codespace stopped",placeholder:"Terminal name (optional)",newButton:"+ New",empty:"No active sessions",emptyHint:"Create a new session to get started",created:"Created {time}",deleteTitle:"Delete Session",deleteMessage:'Are you sure you want to delete "{name}"?',editName:"Edit name",sessionActions:"Session actions",maximize:"Maximize",restoreSplit:"Restore split",split:"Split",hidePanel:"Hide panel",showPanel:"Show panel",resumeSession:"Resume session",restartAi:"Restart AI",markRead:"Mark as read",openAsUi:"Open as chat UI",openAsTerminal:"Open as terminal",modeSwitchFailed:"Could not switch this terminal",newTerminal:"New terminal",options:"Options"},agentHistory:{title:"History",empty:"No past conversations here yet",untitled:"Untitled",openNow:"Running",minutesAgo:"{n}m",hoursAgo:"{n}h",daysAgo:"{n}d",showAll:"View all history",searchPlaceholder:"Search conversations…",allAgents:"All agents",delete:"Delete session",deleteTitle:"Delete conversation",deleteMessage:'Delete "{title}"? This permanently deletes the conversation transcript.',noResults:"No matching conversations",searchingAll:"Searching all folders…",searchTruncated:"Newest matches shown — refine the query to search deeper"},workspaces:{title:"Workspaces",newWorkspace:"Add workspace",newWorkspacePrompt:"Workspace name",newFolderName:"Folder name",createFolderTitle:"New folder",defaultName:"New workspace",ungrouped:"No workspace",addTerminal:"New terminal here",moveToWorkspace:"Move to workspace",rename:"Rename workspace",delete:"Remove workspace",emptyWorkspace:"No terminals here",selectFolder:"Choose folder",emptyTagVibe:"code \xb7 now",emptyWordVibe:"VibeCode Now",emptyMetaVibe:"Pick a workspace and start coding \xb7 <b>sessions persist</b>",emptyGoVibe:"Choose workspace",emptyTagPair:"connect \xb7 other pc",emptyWordPair:"Remote Other PC",emptyMetaPair:"terminal \xb7 <b>screen</b> \xb7 files — from web, app or pc",emptyGoPair:"Add another PC",browse:"Browse",recentFolders:"Recent",searchFolders:"Search folders...",parentFolder:"Up one level",drives:"Drives",homeFolder:"Home",hiddenFolders:"Hidden folders",selectNamed:'Choose "{name}"',enterPath:"Type a path and press Enter",pathNotFolder:"That path is not a folder",filterOrPath:"Search, or type a path like /home/me",notADirectory:'"{name}" is not a folder in {dir}',multipleDirMatches:'"{name}" matches several folders in {dir}',invalidPath:"Invalid path",openHere:"New terminal here",tabFiles:"Files",tabGit:"Git",tabTrees:"Trees",refreshRepos:"Rescan repos",onlyChanged:"Only changed files",openFullFiles:"Open full file explorer",emptyTitle:"Nothing open yet",cardWorkspaceTitle:"Workspace",cardWorkspaceDesc:"Open a folder and run terminals in it",cardRemoteTitle:"Remote desktop",cardRemoteDesc:"Control this machine's screen",emptyWordTerminal:"Remote Terminal",emptyWordRemote:"Remote Desktop",emptyTagWorkspace:"workspace \xb7 pty",emptyTagRemote:"remote \xb7 webrtc",emptyMetaWorkspace:"open a folder \xb7 <b>sessions persist</b>",emptyMetaRemote:"control this machine \xb7 <b>low latency</b>",worktrees:"Worktrees",branches:"Branches",newWorktree:"New worktree",worktreeName:"Branch name",worktreeRepoLabel:"Repo to add the worktree in",worktreeNameAscii:"This name can't become a branch — type it in Latin letters.",addWorktree:"Add worktree",removeWorktree:"Remove worktree",removeWorktreeMessage:'Remove worktree at "{path}"?',removeWorktreeFolder:"Folder: {path}",removeWorktreeBranchDelete:"Branch: {branch} (fully merged — deleted too)",removeWorktreeBranchKeep:"Branch: {branch} (not fully merged — kept)",removeWorktreeSessions:"{count} session(s) inside: {names}",removeWorktreeBranch:'Branch "{branch}" is deleted too (when fully merged).',worktreeBranchKept:'Branch "{branch}" kept: not fully merged.',worktreeBusy:"{count} terminal(s) still run in this worktree: {names}",worktreeDirty:"This worktree has modified or untracked files — forcing the removal deletes them for good. Continue?",checkedOut:"checked out",newBranch:"New branch",checkout:"Checkout",searchBranch:"Search branches",worktreePath:"Worktree path",nestedRepos:"{count} repos",showCleanRepos:"Show {count} unchanged repo(s)",showHiddenRepos:"Unhide {count} repo(s)",hideRepo:"Hide this repo",scanDeeper:"Scan subfolders deeper",deleteTitle:"Remove workspace",deleteMessage:'Remove workspace "{name}"? Its terminals are closed. Files on disk are untouched.'},terminal:{quotaNoData:"No quota data",quotaUsageTitle:"usage",back:"Back",menu:"Menu",newTerminal:"New terminal",remoteDesktop:"Remote Desktop",defaultName:"Term",searchAgents:"Search terminal or agent",noAgentsFound:"No match",skipPermissions:"Skip permission prompts",plainShell:"Terminal",nameLabel:"Name (optional)",workspaceRoot:"Workspace root",detachedHead:"detached",browseFolders:"Browse folders…",shell:"Shell"},ai:{newChatTitle:"Start a new chat?",newChatMessage:"The current chat will be closed and replaced by a new one.",newChatConfirm:"New chat"},files:{selectWorkspace:"Select Workspace",recentWorkspaces:"Recent Workspaces",home:"Home",root:"Root",drive:"Drive {letter}",codespaces:"Codespaces",removeRecent:"Remove from recent",removeTitle:"Remove Workspace",removeMessage:'Remove "{name}" from recent workspaces?',setAsWorkspace:"Set as Workspace",openFolder:"Open Folder",newFile:"New File",newFolder:"New Folder",rename:"Rename",delete:"Delete",deleteFile:"Delete File",deleteFolder:"Delete Folder",deleteFileMessage:'Delete "{name}"?',deleteFolderMessage:'Delete folder "{name}" and all its contents?',emptyFolder:"Empty folder",git:"Git",parent:"Parent folder",workspace:"Workspace",failedLoad:"Failed to load: {error}",failedDelete:"Failed to delete: {error}",failedCreate:"Failed to create: {error}",failedRename:"Failed to rename: {error}",enterName:"Enter name",confirmRename:"Rename to:",setWorkspace:"Set Workspace",setAsWorkspaceTitle:"Set as workspace",switchWorkspace:"Switch workspace",searchFiles:"Search files",toggleHidden:"Toggle hidden files",searchPlaceholder:"Search files...",searching:"Searching...",noFilesFound:"No files found",noGitRepo:"No git repository",cannotOpenBinary:"Cannot open binary file",createNew:"Create New",file:"File",folder:"Folder",placeholderFile:"filename.js",placeholderFolder:"folder-name",pickFile:"Choose files",pickFolder:"Choose folder",copyPath:"Copy path",copyRelPath:"Copy Relative Path",copyName:"Copy Filename",delete:"Delete",rename:"Rename",deleteConfirmTitle:"Delete",deleteConfirmMessage:'Delete "{name}"?'},fileKind:{web:"Web pages",document:"Documents",sheet:"Spreadsheets",image:"Images",media:"Audio & video",diagram:"Diagrams",code:"Code & text"},editor:{save:"Save",saving:"Saving...",saved:"Saved",unsaved:"Unsaved changes",close:"Close",discard:"Discard",discardTitle:"Discard Changes",discardMessage:"You have unsaved changes. Discard them?",unsavedTitle:"Save changes to {name}?",unsavedBody:"Your changes will be lost if you don't save them.",failedLoad:"Failed to load file: {error}",failedSave:"Failed to save: {error}",openFull:"Open in full editor",artifact:"Artifact",preview:"Preview",editCode:"Edit code",reload:"Reload",previewFailed:"Preview failed",previewInBrowser:"Open in Browser",previewNoRoute:"No LAN or tunnel route to the host",previewBack:"Back",previewForward:"Forward",previewOpenTab:"Open in a new tab",changedOnDisk:"Changed on disk",reloadFromDisk:"Reload",mermaidEmpty:"Nothing to draw",readOnly:"Read only",line:"Line",column:"Column",gitDiff:"Git Diff",typeText:"Type text and insert...",insert:"Insert",statusModified:"Modified",statusAdded:"Added",statusUntracked:"Untracked"},git:{title:"Git",branch:"Branch",changes:"Changes",staged:"Staged",unstaged:"Unstaged",untracked:"Untracked",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 message",push:"Push",pull:"Pull",fetch:"Fetch",stage:"Stage",stageAll:"Stage All",unstage:"Unstage",discard:"Discard",discardChanges:"Discard Changes",discardMessage:'Discard changes to "{name}"?',noChanges:"No changes",diff:"Diff",pushing:"Pushing...",pulling:"Pulling...",committing:"Committing...",failedCommit:"Failed to commit: {error}",failedPush:"Failed to push: {error}",failedPull:"Failed to pull: {error}",status:"Status",diffTab:"Diff",modified:"Modified",added:"Added",deleted:"Deleted",untrackedTitle:"Untracked",openFile:"Open file",discardChangesTitle:"Discard changes",discardConfirmTitle:"Discard Changes",discardConfirmDelete:'Are you sure you want to delete "{name}"? This cannot be undone.',discardConfirmDiscard:'Are you sure you want to discard changes in "{name}"? This cannot be undone.',addToGitignore:"Add to .gitignore",showMore:"Show {count} more"},fileExplorer:{explorer:"Explorer",search:"Search",sourceControl:"Source Control",settings:"Settings",outline:"Outline",noFolderOpen:"No folder open",uploadingCount:"Uploading {{n}}/{{total}}…",uploadFailedCount:"{{n}} of {{total}} files failed to upload",openFolder:"Open Folder",recentWorkspaces:"Recent Workspaces",openedEditors:"Open Editors",closeEditor:"Close",closeOthers:"Close Others",closeAll:"Close All",closeAllSaved:"Close All Saved",saveAll:"Save All",newFile:"New File",newFolder:"New Folder",refreshExplorer:"Refresh Explorer",collapseAll:"Collapse All",searchInFiles:"Search in files",replaceInFiles:"Replace in files",searchPlaceholder:"Search",replacePlaceholder:"Replace",caseSensitive:"Match Case",wholeWord:"Match Whole Word",useRegex:"Use Regular Expression",filesToInclude:"files to include",filesToExclude:"files to exclude",noResults:"No results found",resultCount:"{count} results in {fileCount} files",replaceAll:"Replace All",replaceConfirmTitle:"Replace in Files",replaceConfirmMessage:"Replace {count} occurrences in {fileCount} files?",commandPalette:"Command Palette",quickOpen:"Quick Open File",typeCommand:"Type a command",typeFileName:"Type a file name",noCommandsFound:"No commands found",workspaceSwitcher:"Switch Workspace",pinWorkspace:"Pin",unpinWorkspace:"Unpin",renameWorkspace:"Rename Workspace",workspaceNamePlaceholder:"Workspace display name",pinned:"Pinned",recent:"Recent",searchWorkspaces:"Search workspaces",welcomeTitle:"Welcome",welcomeSubtitle:"Open a folder to start working",welcomeOpenFolder:"Open Folder",welcomeRecent:"Recent",toggleSidebar:"Toggle Sidebar",togglePanel:"Toggle Panel",togglePanelBottom:"Toggle Bottom Panel",toggleWordWrap:"Toggle Word Wrap",zoomIn:"Zoom In",zoomOut:"Zoom Out",resetZoom:"Reset Zoom",formatDocument:"Format Document",findInFile:"Find",replaceInFile:"Replace",goToLine:"Go to Line",goToFile:"Go to File",revealInOS:"Reveal in Finder/Explorer",openInTerminal:"Open in Terminal",copyPath:"Copy Path",copyRelativePath:"Copy Relative Path",duplicate:"Duplicate",cut:"Cut",paste:"Paste",autoSave:"Auto Save",autoSaveOff:"Off",autoSaveAfterDelay:"After Delay",autoSaveOnFocusChange:"On Focus Change",fontSize:"Font Size",wordWrap:"Word Wrap",language:"Language",encoding:"Encoding",spaces:"Spaces",branch:"Branch",noBranch:"No branch",commitMessage:"Commit Message",commitMessagePlaceholder:"Message (Cmd+Enter to commit)",stage:"Stage",stageAll:"Stage All",unstage:"Unstage",push:"Push",pull:"Pull",sync:"Sync",staged:"Staged Changes",changes:"Changes",untracked:"Untracked",bottomPanelTerminal:"Terminal",bottomPanelOutput:"Output",bottomPanelProblems:"Problems",expandAll:"Expand All",recentFiles:"Recent Files",closedTabReopen:"Reopen Closed Tab",unsavedDot:"●",loadingTree:"Loading...",fileWatcherActive:"Watching for changes"},mobile:{title:"Android Device",refreshDevices:"Refresh devices",pickDevice:"Pick a device to mirror",noDevices:"No Android device found. Start an emulator or attach a device with USB debugging on.",starting:"Starting stream…",stoppingDevice:"Stopping…",streamEnded:"Stream ended",streamFailed:"Stream failed",streamGone:"Device is no longer connected",retry:"Retry",unsupportedBrowser:"This browser cannot decode the video stream. Use Chrome, Edge, or Safari 16.4+.",back:"Back",home:"Home",recents:"Recents",power:"Lock screen",shutdownDevice:"Shut down the emulator",shutdownTitle:"Shut down emulator?",shutdownMessage:"{name} will stop, losing anything running on it. Starting it again takes around 20 seconds.",shutdownConfirm:"Shut down",androidDevice:"Remote Android",androidDeviceHint:"Mirror and control an Android emulator or device.",deviceRunning:"Remote Android — {count} running",rotate:"Rotate",stopped:"Stopped",startDevice:"Start device",stopDevice:"Stop device",switchDevice:"Switch device",lowPower:"Low power mode",lowPowerHint:"No emulator window — much less CPU, fewer frames",noDevicesWithSdk:"No device running. Start an emulator below, or attach a phone with USB debugging on.",phaseLaunching:"Starting emulator…",phaseBooting:"Booting Android…",phaseReady:"Almost ready…",backToScreen:"Back to the device screen",tabApps:"Apps",tabLogs:"Logs",dropApk:"Install an APK",dropApkHint:"Drop a file here, or tap to choose",installing:"Installing…",installedApps:"Installed apps",noApps:"No user apps installed",launch:"Launch",forceStop:"Force stop",clearData:"Clear data",uninstall:"Uninstall",deepLinkPlaceholder:"myapp://path or https://…",filterByApp:"Filter by app",allApps:"All apps",minLevel:"Level",clearLog:"Clear log",pauseLog:"Pause",resumeLog:"Resume",logPaused:"Paused — new lines are not shown",noLogs:"Waiting for log output…",hideNoise:"Hide driver noise",showNoise:"Show driver noise (hidden by default)",modeFloat:"Unpin (float over the page)",modePin:"Pin to the right",resize:"Resize",setupTitle:"Android tooling",setupInstall:"Install",setupExtracting:"Extracting…",setupInstallTo:"Installs to",setupLowDisk:"Not enough disk space at the install location",setupRequires:"Needs {deps} first",setupDepsCmdline:"command line tools",setupDepsJdk:"Java 17",setupDepsEmulator:"emulator",setupBannerHint:"Some Android tools are missing — tap to install",addDevice:"Add device",noDevicesHint:"No device yet — tap + to create one, or plug in a phone with USB debugging on.",presetReady:"Ready — nothing to download",presetDownload:"Android 16 \xb7 ~1.5 GB download","provisionStep_platform-tools":"Downloading adb…",provisionStep_jdk:"Downloading Java…","provisionStep_cmdline-tools":"Downloading SDK tools…",provisionStep_emulator:"Downloading the emulator…",provisionStep_image:"Downloading Android…",provisionStep_create:"Creating the device…",imagesTitle:"System images",imagesSearch:"Search system images…",imagesNone:"No system images match",imageInstall:"Install image",imageRemove:"Remove image",imageRemoveTitle:"Remove system image?",imageRemoveMessage:"{path} will be deleted from the host. AVDs using it will no longer start.",avdCreateTitle:"Create Virtual Device",avdStep1:"Hardware",avdStep2:"System Image",avdStep3:"Name",avdNoProfiles:"No device profiles available",avdNamePlaceholder:"AVD name",avdInstalledBelow:"Installed images are marked",avdMenu:"AVD options",avdWipe:"Wipe data",avdWipeTitle:"Wipe AVD data?",avdWipeMessage:"{name} will lose all apps, accounts and files — back to a fresh device.",avdDelete:"Delete",avdDeleteTitle:"Delete AVD?",avdDeleteMessage:"{name} and its storage on the host will be removed permanently."},remote:{title:"Remote Desktop",connecting:"Connecting...",disconnected:"Disconnected",fullscreen:"Fullscreen",exitFullscreen:"Exit Fullscreen",receivingImage:"Receiving screen…",keyboard:"Keyboard",mouse:"Mouse",fps:"FPS",debug:"Debug",help:"Help",close:"Close",sendKey:"Send Key",helpTitle:"Remote Desktop Help",notAvailable:"Remote desktop is not available",unavailableTitle:"Remote Desktop isn't ready",unavailableUnknown:"On {host}, open the 9Remote host window (Pair Device page) → Services → turn on Remote Desktop.",unavailableNoCapture:"This machine has no screen to capture (headless, SSH or Codespaces), so Remote Desktop can't run on it.",unavailableDisabled:"On {host}, open the 9Remote host window (Pair Device page) → Services → turn on Remote Desktop.",unavailableScreenRecording:"Screen Recording is missing. On {host}: 9Remote → Services → Grant next to Screen Recording (or System Settings → Privacy & Security → Screen Recording → enable 9Remote), then turn on Remote Desktop.",unavailableAccessibility:"Accessibility is missing. On {host}: 9Remote → Services → Grant next to Accessibility (or System Settings → Privacy & Security → Accessibility → enable 9Remote), then turn on Remote Desktop.",unavailableMacRestart:"On macOS, if capture still fails after granting, quit and reopen 9Remote on the host.",unavailableFailed:"The host refused to start screen capture. Check the 9Remote host window on {host} for details.",unavailableOtherHosts:"Ready now",customizeKeys:"Customize keys",back:"Back",resetZoom:"Reset zoom",refresh:"Refresh",rectangleSelection:"Rectangle selection",handMode:"Hand mode",toggleKeyboard:"Toggle native keyboard",hideControls:"Hide controls",showControls:"Show controls",textBatchInput:"Text batch input",extraKeys:"Extra keys",customizeRemoteKeys:"Customize Remote Keys",exitRemote:"Exit remote desktop",debugTitle:"Debug Stats",minimize:"Minimize",transport:"Transport",latency:"Latency",tilesPerSec:"Tiles/sec",bandwidth:"Bandwidth",clearStats:"Clear Stats",lockTitle:"Windows is locked",lockGrantDesc:'Turn on "Unlock PC remotely" in 9remote host on this PC.',lockDesc:"Enter the Windows PIN or password for this computer",lockPlaceholder:"Windows PIN or password",unlock:"Unlock",unlocking:"Unlocking…",unlockFailed:"Unlock failed — check your PIN/password and try again."},remoteHelp:{modePc:"PC / Mouse",modeTrackpad:"Touch \xb7 Trackpad",modeDirect:"Touch \xb7 Direct",mouseTitle:"Mouse",keyboardTitle:"Keyboard",gesturesTrackpadTitle:"Gestures (Trackpad ✋)",gesturesDirectTitle:"Gestures (Direct)",toolbarTitle:"Toolbar",mouseClickKey:"Click / Drag",mouseClickDesc:"Left-click, drag to select/move",mouseRightKey:"Right-click",mouseRightDesc:"Context menu on remote",mouseWheelKey:"Wheel",mouseWheelDesc:"Scroll remote (Shift + Wheel = horizontal)",mouseDoubleKey:"Double-click",mouseDoubleDesc:"Double-click on remote",keyPhysicalKey:"Physical keys",keyPhysicalDesc:"Sent directly (Tab, F-keys, etc. captured)",keyModifierKey:"Ctrl / Alt / Shift / ⌘",keyModifierDesc:"Sticky modifier — combine with next key",trackpadSwipeKey:"1 finger swipe",trackpadSwipeDesc:"Move virtual cursor",trackpadTapKey:"1 finger tap",trackpadTapDesc:"Left-click at cursor",trackpad2TapKey:"2 fingers tap",trackpad2TapDesc:"Right-click at cursor",trackpad2SwipeKey:"2 fingers swipe",trackpad2SwipeDesc:"Scroll at cursor position",trackpadPinchKey:"2 fingers pinch",trackpadPinchDesc:"Zoom canvas",trackpadScrollLockKey:"Hold + drag",trackpadScrollLockDesc:"Hold to lock scroll, drag any direction",directTapKey:"1 finger tap",directTapDesc:"Click at tap position",directLongKey:"1 finger long-press",directLongDesc:"Right-click",directDoubleKey:"1 finger double-tap",directDoubleDesc:"Double-click",directScrollKey:"2 fingers swipe",directScrollDesc:"Scroll remote",directPinchKey:"2 fingers pinch",directPinchDesc:"Zoom canvas",directPanKey:"1 finger drag (zoom>1)",directPanDesc:"Pan canvas",toolbarHandDesc:"Hold left-click (drag mode) — tap again to release",toolbarMouseDirectDesc:"Switch to Direct mode",toolbarMouseTrackpadDesc:"Switch to Trackpad (virtual cursor)",toolbarKeyboardDesc:"Native keyboard / text batch input",toolbarRectDesc:"Rectangle selection mode"},remoteControls:{enterToSend:"Tab or Ctrl+Num to switch tab",typeToSend:"Type text to send...",send:"Send",trackpadMode:"Trackpad mode",directMode:"Direct mode",bottomRow:"Bottom Row",extraPanel:"Extra Panel",exitConfirmMessage:"Are you sure you want to exit the current remote desktop session?"},connection:{retrying:"Reconnecting...",waitingApproval:"Waiting for Approval",approvalDescription:"The 9Remote host needs to approve this device before you can connect.",approvalHint:"Check the terminal on your machine.",rejectedTitle:"Device Rejected",rejectedDescription:"This device was not approved by the 9Remote host.",backToLogin:"Back to Login",failed:"Connection Failed",failedDescription:"Unable to connect after {n} attempts",hostOfflineTitle:"Host is Offline",hostOfflineDescription:"The 9Remote host on this machine is not running. Start it on your machine, then retry.",attemptOf:"Attempt {n} of {total}",pairTab:"Paired Device",pairScanToSignIn:"Scan to sign in",pairOneTimeKey:"One-Time Key",pairPermanentKey:"Permanent Key",pairKeyNotSet:"— not set —",pairExpired:"Expired",pairUnavailable:"Device pairing is only available in the host's local view.",pairGenOneTimeTitle:"New one-time key?",pairGenOneTimeMsg:"Generate a new one-time key? The current one will expire immediately.",pairRegenTitle:"Regenerate permanent key?",pairRegenMsg:"Regenerate permanent key? All existing sessions will be disconnected.",exit:"Exit",cancel:"Cancel",retry:"Retry now"},notifications:{claudeCode:"Claude Code",codex:"Codex",geminiCli:"Gemini CLI",openCode:"OpenCode",title:"Notifications",empty:"No notifications",needsInput:"needs input",badgeTitle:"{blocked} needs input, {done} your turn",replied:"replied",agent:"Agent"},sites:{title:"Sites",localSites:"Local Sites",selectSitePreview:"Select a site to preview",browserNewTab:"New tab",browserAddressPlaceholder:"localhost:3000 or /path",browserNotConnected:"Connect to your host first",portPlaceholder:"port",loadingSites:"Loading Sites...",notConnected:"Not connected to the host",noSitesFound:"No sites found",startServerHint:"Start a local dev server to see it here",siteNamePlaceholder:"Site name",saveTitle:"Save",editNameTitle:"Edit name",removeTitle:"Remove",removePortTitle:"Remove Port",removePortMessage:"Remove port {port} from saved list?",popupBlocked:"Popup blocked! Please allow popups for this site.",startProxyFailed:"Failed to start proxy session for {name}",foundCount:"{n} site{suffix} found",focusOpenedTab:"Focus opened tab",openInNewTab:"Open in new tab",goBack:"Go back",goForward:"Go forward",loadingSite:"Loading...",empty:"No active sites",emptyHint:"Run a local server to see it here",open:"Open",refresh:"Refresh",newTabTitle:"Open local site",errorSwBlocked:"This browser blocked the service worker the site view needs",errorNoBridge:"Connect to your host first",errorNoSession:"Port {port} is no longer open — reopen the site",errorTimeout:"The site did not answer in time",errorNoReply:"No reply from the host",errorGeneric:"The site could not be loaded",browserTab:"Browser",browserPaneNotConnected:"Connect to your host first",browserPaneLocalSites:"Local sites",browserPaneIntroTitle:"Remote browser",browserPaneIntroDesc:"A real Chrome running on your host, streamed to this screen.",browserPaneTipPick:"Open a page, tap Pick, then tap or drag over elements to select them and send to your AI to fix.",browserPaneSearchOrUrl:"Search or type URL",browserPaneLoading:"Connecting to the browser…",browserPaneNoTabs:"No browser tabs open",browserPaneNewTabHint:"Type a URL to open a tab on the host browser",browserPaneReconnect:"Reconnect",browserPaneCopyUrl:"Copy page URL",browserPaneSendText:"Send text",browserPaneLoadError:"Can't reach this page",browserPaneRetry:"Retry",browserPaneCopyAddress:"Copy address",browserCtxCopyLink:"Copy link address",browserCtxCopyUrl:"Copy page URL",browserCtxInspect:"Inspect element",browserCtxHardReload:"Hard reload (ignore cache)",browserCtxImportCookies:"Import cookies",browserPaneSearchFor:"Search",browserCtxOpenNewTab:"Open link in new tab",browserPanePick:"Pick",browserPanePickTitle:"Pick page elements",browserPaneDevice:"Device",browserPaneDeviceTitle:"Device size"},commandNotes:{title:"Command Notes",noSavedCommands:"No saved commands",addFirstBelow:"Add your first command below",clickToCopy:"Click to copy",copiedBang:"Copied!",copy:"Copy",edit:"Edit",delete:"Delete",editCommandPlaceholder:"Edit command...",addCommandPlaceholder:"Add command...",update:"Update",add:"Add",empty:"No notes yet",emptyHint:"Save commands for quick access",add:"Add Note",edit:"Edit Note",delete:"Delete Note",deleteMessage:"Delete this note?",name:"Name",command:"Command",save:"Save",placeholderName:"e.g. Start dev server",placeholderCommand:"e.g. npm run dev"},mobileKeyboard:{pasteHere:"Paste here (Cmd+V)",enterToSend:"{shortcut} to switch tab",typeCommand:"Type command and send...",send:"Send",toggleExtraKeys:"Toggle extra keys",toggleTextInput:"Toggle text input",customizeTerminalKeys:"Customize Terminal Keys",mainBar:"Main Bar",extraPanel:"Extra Panel",fileTooLarge:"File too large (max 5MB)",readFileFailed:"Failed to read file",uploadFailed:"Failed to upload file: {error}"},terminalPane:{scrollToBottom:"Scroll to bottom",refresh:"Refresh terminal",openFolder:"Open folder",openFolderHere:"Open files here",changedFiles:"Changed files",pasteOrType:"Paste or type here",paste:"Paste",note:"Checklist",addToNote:"Add to checklist"},note:{title:"Checklist",placeholder:"No tasks yet",copy:"Copy",clear:"Clear",saved:"Saved",addSuccess:"Added to checklist",copyTodo:"Copy to-do items",multilinePlaceholder:"One task per line…",addLines:"Add each line as an item",copyItem:"Copy — taps stack rows in list order",edit:"Edit",drag:"Drag to reorder",pin:"Pin above the terminal",unpin:"Unpin",expand:"Open the full checklist",allDone:"All done",clearDone:"Clear done",sendHint:"Send to terminal with checklist",addChip:"Add chip",removeChip:"Remove chip",chipPlaceholder:"Chip text…"},pwaGuide:{copyYourKey:"Copy Your Key",copyKeyHint:"Tap the key below to copy — you'll need it to login after installing",tapToCopyApiKey:"Tap to copy API key",copiedBang:"Copied!",copy:"Copy",tapShareButton:"Tap Share Button",tapShareHint:"Tap the share button at the bottom of Safari",addToHome:"Add to Home Screen",addToHomeHint:'Scroll down and tap "Add to Home Screen"',openAppPasteKey:"Open App & Paste Key",openAppPasteKeyHint:"Open the installed app and paste your key to login",openMenu:"Open Menu",openMenuHint:"Tap the menu button (three dots) in Chrome",installApp:"Install App",installAppHint:'Tap "Install app" or "Add to Home screen"',lookInstallIcon:"Look for Install Icon",lookInstallIconHint:"Look for the install icon in the address bar",clickInstallPaste:"Click Install & Paste Key",installNow:"Install Now",installNowHint:"Install 9Remote as an app for quick access",installing:"Installing...",clickInstallPasteHint:"Click install, open the app, and paste your key to login",alternativeHint:'Alternative: Open browser menu → "Install 9Remote" or "Create shortcut"',loadingPlatform:"Loading platform detection...",iosPlatform:"iOS (iPhone/iPad)",androidPlatform:"Android",macosPlatform:"macOS",windowsPlatform:"Windows",desktopPlatform:"Desktop",alreadyInstalled:"Already Installed!",alreadyInstalledHint:"You're already using 9Remote as an installed app",installationGuide:"Installation Guide",installationSteps:"Installation Steps:"},community:{title:"Community",description:"Join the 9Remote community"},pwa:{title:"Install as App",description:"Install 9Remote on your device for the best experience",iosTitle:"iOS Safari",androidTitle:"Android Chrome",desktopTitle:"Desktop"},codespace:{title:"Codespace",name:"Name",status:"Status",running:"Running",autoStart:"Auto Start 9Remote",autoStartHint:"Start 9Remote when codespace opens",stop:"Stop Codespace",stopHint:"Stop to save usage",restartHint:"To restart, go to GitHub",unknown:"Unknown"},history:{title:"Command history",empty:"No commands yet",clearAll:"Clear all",snippets:"Snippets",history:"History",pin:"Pin as snippet",unpin:"Unpin",editSnippet:"Edit snippet",aliasLabel:"Alias",aliasHint:"Type this shortcut then send to run the command",commandLabel:"Command",aliasPlaceholder:"e.g. nrd"},voice:{dictate:"Voice input",language:"Voice language",clear:"Clear",denied:"Microphone blocked — allow mic access in your browser settings",network:"Voice endpoint unreachable — check Voice settings",micTimeout:"Mic did not respond — try again"},shortcuts:{title:"Keyboard shortcuts",menuLabel:"Keyboard shortcuts",switchTerminal:"Switch terminal",switchWorkspace:"Switch workspace",terminalActions:"New / Close terminal",togglePanels:"Toggle side panels",palette:"Search files",help:"Keyboard shortcuts",sessionPrev:"Previous terminal",sessionNext:"Next terminal",workspacePrev:"Previous workspace",workspaceNext:"Next workspace",sessionIndex:"Go to terminal 1-9",closeTerminal:"Close terminal",fitPanes:"Auto-fit panes",toggleFocus:"Toggle terminal / input focus",newTerminal:"New terminal",toggleSidebar:"Toggle sidebar",toggleRightPanel:"Toggle side panel"},appUpdate:{title:"Update required",body:"This version of the app is too old to connect. Update it from the store to continue.",action:"Update app"}}},33879:(e,t,o)=>{"use strict";o.d(t,{Xn:()=>n,dI:()=>a,zl:()=>s});let a=[{code:"en",label:"English",flag:"\uD83C\uDDFA\uD83C\uDDF8",country:"us"},{code:"vi",label:"Tiếng Việt",flag:"\uD83C\uDDFB\uD83C\uDDF3",country:"vn"},{code:"zh",label:"中文",flag:"\uD83C\uDDE8\uD83C\uDDF3",country:"cn"},{code:"es",label:"Espa\xf1ol",flag:"\uD83C\uDDEA\uD83C\uDDF8",country:"es"},{code:"hi",label:"हिन्दी",flag:"\uD83C\uDDEE\uD83C\uDDF3",country:"in"},{code:"ar",label:"العربية",flag:"\uD83C\uDDF8\uD83C\uDDE6",country:"sa"},{code:"pt",label:"Portugu\xeas",flag:"\uD83C\uDDE7\uD83C\uDDF7",country:"br"},{code:"ru",label:"Русский",flag:"\uD83C\uDDF7\uD83C\uDDFA",country:"ru"},{code:"ja",label:"日本語",flag:"\uD83C\uDDEF\uD83C\uDDF5",country:"jp"},{code:"de",label:"Deutsch",flag:"\uD83C\uDDE9\uD83C\uDDEA",country:"de"},{code:"fr",label:"Fran\xe7ais",flag:"\uD83C\uDDEB\uD83C\uDDF7",country:"fr"},{code:"ko",label:"한국어",flag:"\uD83C\uDDF0\uD83C\uDDF7",country:"kr"},{code:"it",label:"Italiano",flag:"\uD83C\uDDEE\uD83C\uDDF9",country:"it"},{code:"tr",label:"T\xfcrk\xe7e",flag:"\uD83C\uDDF9\uD83C\uDDF7",country:"tr"},{code:"id",label:"Bahasa Indonesia",flag:"\uD83C\uDDEE\uD83C\uDDE9",country:"id"},{code:"th",label:"ไทย",flag:"\uD83C\uDDF9\uD83C\uDDED",country:"th"},{code:"pl",label:"Polski",flag:"\uD83C\uDDF5\uD83C\uDDF1",country:"pl"},{code:"nl",label:"Nederlands",flag:"\uD83C\uDDF3\uD83C\uDDF1",country:"nl"},{code:"uk",label:"Українська",flag:"\uD83C\uDDFA\uD83C\uDDE6",country:"ua"},{code:"fa",label:"فارسی",flag:"\uD83C\uDDEE\uD83C\uDDF7",country:"ir"},{code:"ms",label:"Bahasa Melayu",flag:"\uD83C\uDDF2\uD83C\uDDFE",country:"my"},{code:"sv",label:"Svenska",flag:"\uD83C\uDDF8\uD83C\uDDEA",country:"se"},{code:"el",label:"Ελληνικά",flag:"\uD83C\uDDEC\uD83C\uDDF7",country:"gr"},{code:"he",label:"עברית",flag:"\uD83C\uDDEE\uD83C\uDDF1",country:"il"}],n="en",s="9remote_locale"},49262:(e,t,o)=>{var a={"./ar.js":[15714,5714],"./de.js":[67646,7646],"./en.js":[24890],"./es.js":[37369,7369],"./fa.js":[80236,236],"./fr.js":[76485,6485],"./he.js":[20482,482],"./hi.js":[52934,2934],"./id.js":[52488,2488],"./it.js":[23704,3704],"./ja.js":[99736,9736],"./ko.js":[87207,7207],"./ms.js":[4929,4929],"./nl.js":[72427,2427],"./pl.js":[95757,5757],"./pt.js":[2581,2581],"./ru.js":[37812,7812],"./sv.js":[3428,3428],"./th.js":[10101,101],"./tr.js":[41879,1879],"./uk.js":[74129,4129],"./vi.js":[84964,4964],"./zh.js":[43443,3443]};function n(e){if(!o.o(a,e))return Promise.resolve().then(()=>{var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=a[e],n=t[0];return Promise.all(t.slice(1).map(o.e)).then(()=>o(n))}n.keys=()=>Object.keys(a),n.id=49262,e.exports=n}}]);
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9121],{9121:(e,t,o)=>{"use strict";o.d(t,{s:()=>m});var a=o(7620),n=o(94245),s=o(33879),r=o(24890);let i=s.dI.map(e=>e.code),l=new Map,c=(e,t)=>{if(!i.includes(e)||e===s.Xn||d.getState().dicts[e]||l.has(e))return;let a=o(49262)(`./${e}.js`).then(o=>{l.delete(e);let a=o.default;return t(t=>({dicts:{...t.dicts,[e]:a}})),a}).catch(()=>{l.delete(e)});l.set(e,a)},d=(0,n.v)(e=>({locale:s.Xn,dicts:{[s.Xn]:r.default},hydrated:!1,hydrate:()=>{let t=function(){try{let e=window.localStorage.getItem(s.zl);if(e&&i.includes(e))return e}catch{}return s.Xn}();c(t,e),e({locale:t,hydrated:!0})},setLocale:t=>{if(i.includes(t)){try{window.localStorage.setItem(s.zl,t)}catch{}c(t,e),e({locale:t})}}}));function p(e,t){if(e)return t.split(".").reduce((e,t)=>null==e?e:e[t],e)}function m(){let{locale:e,dicts:t,hydrated:o,hydrate:n,setLocale:r}=d();(0,a.useEffect)(()=>{o||n()},[o,n]);let i=t[e]||t[s.Xn],l=t[s.Xn];return{t:(0,a.useMemo)(()=>(e,t)=>{var o;return o=p(i,e)??p(l,e)??e,"string"==typeof o&&t?o.replace(/\{(\w+)\}/g,(e,o)=>null!=t[o]?t[o]:`{${o}}`):o},[i,l]),locale:e,setLocale:r,hydrated:o}}},24890:(e,t,o)=>{"use strict";o.r(t),o.d(t,{default:()=>a});let a={common:{statusIdle:"Idle",statusWorking:"Working",statusBlocked:"Needs input",statusDone:"Your turn",statusSleep:"Sleeping",connect:"Connect",disconnect:"Disconnect",loading:"Loading...",cancel:"Cancel",confirm:"Confirm",save:"Save",delete:"Delete",close:"Close",back:"Back",next:"Next",edit:"Edit",rename:"Rename",remove:"Remove",open:"Open",clear:"Clear",yes:"Yes",no:"No",ok:"OK",error:"Error",success:"Success",failed:"Failed",retry:"Retry",refresh:"Refresh",clipboard:"Clipboard",clipboardCopy:"Copy",clipboardEmpty:"Clipboard is empty",search:"Search",create:"Create",new:"New",add:"Add",copy:"Copy",copied:"Copied",promptNotSent:"Prompt didn't reach the host",resend:"Resend",sending:"Sending…",promptRecovered:"Not confirmed before reload",inputNotSent:"Not sent — tap Send to retry",dismiss:"Dismiss",download:"Download",upload:"Upload",enabled:"Enabled",disabled:"Disabled",on:"on",off:"off",minute:"min",hour:"h",day:"d",minutesAgo:"{n} min ago",hoursAgo:"{n} hours ago",daysAgo:"{n} days ago",done:"Done",moveUp:"Move up",moveDown:"Move down"},agentSwitcher:{title:"Your devices",active:"ACTIVE",unnamed:"Untitled",connecting:"Connecting…",unreachable:"Can't reach this device. Is it online?"},hosts:{title:"Hosts",openHost:"Open host",connecting:"Connecting…",lastSeen:"Last seen",online:"Online",offline:"Offline",sessions:"sessions",working:"working",attention:"need you",noSessions:"No sessions",addHost:"Add host",removeHost:"Remove host",removeHostMessage:'Remove "{name}" from your saved hosts? The machine itself is not affected.',disconnectMessage:'Disconnect from "{name}"? Its terminals keep running; the key stays saved.'},login:{tagline:"Access your terminal from anywhere",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:"Access Key",placeholder:"sk-xxx... or One-Time Key (ABC123)",rememberKey:"Remember this key",connect:"Connect",connecting:"Connecting...",authenticating:"Authenticating with 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.",agentOffline:"This machine isn't running 9remote. Start the host, then try again.",legacyKeyUpdateRequired:"Host update required",legacyKeyUpdateHint:"This device uses an older key format. Update 9remote on that machine to connect:",legacyKeyError:"This access key uses an older format. Please update 9remote to the latest version on your host machine.",updateRequired:"Update required",savedKeys:"Saved Keys",login:"Login",lastLogin:"Last login",namePlaceholder:"Name this key (optional)",rename:"Rename",deleteKeyTitle:"Delete key",deleteKeyConfirm:'Are you sure you want to delete "{name}"?',justNow:"Just now",minutesAgo:"{n}m ago",hoursAgo:"{n}h ago",daysAgo:"{n}d ago",tapToScan:"Tap to scan",orEnterManually:"or enter key manually",addKey:"Add Key",secureTitle:"Secure & Encrypted",secureDesc:"All connections are end-to-end encrypted and secure.",featAccessTitle:"Access Anywhere",featAccessDesc:"Connect from any device, anywhere.",featSecureTitle:"Secure Connection",featSecureDesc:"End-to-end encryption keeps you safe.",featFastTitle:"Fast & Reliable",featFastDesc:"Low latency and high performance.",featSessionsTitle:"Multiple Sessions",featSessionsDesc:"Manage and switch between sessions.",home:"Home",docs:"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:"Menu",language:"Language",theme:"Theme",notifications:"Notifications",webgl:"GPU Render (Faster)",webglHint:"Turn off if text looks wrong",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:"Remote Browser",terminalSettings:"Terminal Settings",fontSize:"Font Size",terminalTheme:"Terminal Theme",terminalBackground:"Background",bgDim:"Background dim",bgApplyAll:"Apply to all",bgUrlPlaceholder:"Image URL (https://…)",bgSave:"Save",bgSaveFailed:"Could not save background",bgFromDevice:"Choose from device",bgFromUrl:"Paste image URL",bgChange:"Change image",bgAdd:"Add",bgCustomLabel:"Custom",bgDeleteFailed:"Could not delete background",bgCustomTitle:"Custom background",commandNotes:"Command Notes",showButtons:"Quick Buttons",showFolder:"Folder & Git Button",showNote:"Checklist Button",artifactHint:"The AI can preview html, docx, pdf, images and more instantly, beside your terminal.",artifactPanel:"Artifact preview",settingsJarvis:"Jarvis",jarvisToggle:"Jarvis coordinator",jarvisToggleHint:"Show the Jarvis button in the header. Its tools need the MCP switch in Plugins.",jarvisMcpOff:"The MCP switch in Plugins is off - Jarvis will start without its coordinator tools.",community:"Community",rateApp:"Rate App",starChip:"Help me star",installApp:"Install App",upgrade:"Upgrade",upgradeExpires:"Expires",upgradeRestore:"Restore Purchases",codespace:"Codespace",logout:"Logout",settingsGeneral:"General",settingsAgent:"Host",settingsSystem:"System",settingsVoice:"Voice",settingsBrowser:"Browser Use",extGuide1:"Open this link, then turn on Developer mode (top right):",extGuide2:'Click "Load unpacked" and pick this folder:',extGuide3:"Status flips to connected in a few seconds",voiceInput:"Voice Input",preventSleep:"Prevent Sleep",agentSystem:"System",agentAutoStart:"Launch on Startup",agentAutoStartHint:"Start the host when you log in",agentUnlock:"Remote Unlock",agentUnlockHint:"Allow control from the Windows lock screen",agentUnlockStale:"Worker state stale — re-checking",agentUnlockReady:"Running — works on the lock screen",agentLogs:"Logs",agentLogsOpen:"Host Logs",settingsDebug:"Debug",debugSource:"Source",debugLevel:"Level",debugAll:"All",debugHost:"Host",debugWeb:"Web",debugRefresh:"Refresh",debugCopy:"Copy",debugClear:"Clear",debugEmpty:"No logs",agentPower:"Power",agentRestart:"Restart host",agentShutdown:"Shutdown host",agentShutdownConfirmTitle:"Shutdown host?",agentShutdownConfirmMsg:"The host stops and every remote session drops until it is started again on this machine.",settingsAppearance:"Appearance",settingsTerminalTab:"Terminal",settingsMcp:"Plugins",settingsRemote:"Remote",mcpIntro:"Extra abilities you can give your AI coding tools.",mcpTools:"Allow",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:"Reload App",remoteDesktop:"Remote Desktop",headerButtons:"Header buttons",settingsButtons:"Buttons",notificationsButton:"Notifications",bellButton:"Bell Button",bellButtonHint:"Show the bell in the terminal header",notificationsButtonHint:"Alerts when a terminal finishes or needs you.",remoteDesktopHint:"Control this machine's screen from your phone.",sitesHint:"Browse the host's Chrome and local sites.",settings:"Settings",enablePush:"Enable Push Notifications",disablePush:"Disable Push Notifications",pushHint:"Enable push notifications to get alerted when AI completes tasks",pushActiveHint:"Push notifications are on for this device. You'll be alerted when AI completes tasks.",versionMismatch:"9remote {version} is outdated",versionMismatchHint:"Some features may not work. Run:",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",updateConfirmTitle:"Update 9remote?",updateConfirmMessage:"This installs the latest version and restarts the connection. It takes about a minute.",updateStarting:"Starting update…",updateInstalling:"Installing new version…",updateTimeout:"Update is taking too long",updateTimeoutHint:"Reload manually if it doesn't recover.",updateRestarting:"Updating 9remote…",updateReconnecting:"Reconnecting…",updateDone:"Updated! Reloading…",version:"Version",orientation:"Screen Orientation",orientationPortrait:"Portrait",orientationLandscape:"Landscape",orientationAuto:"Auto"},workspace:{loading:"Loading...",logoutTitle:"Logout",logoutMessage:"Are you sure you want to logout?",failedCreateSession:"Failed to create session: {error}",failedRenameSession:"Failed to rename session: {error}"},sessions:{headerTitle:"9remote.cc",connected:"Connected",disconnected:"Disconnected",codespaceStopped:"Codespace stopped",placeholder:"Terminal name (optional)",newButton:"+ New",empty:"No active sessions",emptyHint:"Create a new session to get started",created:"Created {time}",deleteTitle:"Delete Session",deleteMessage:'Are you sure you want to delete "{name}"?',editName:"Edit name",sessionActions:"Session actions",maximize:"Maximize",restoreSplit:"Restore split",split:"Split",hidePanel:"Hide panel",showPanel:"Show panel",resumeSession:"Resume session",restartAi:"Restart AI",markRead:"Mark as read",openAsUi:"Open as chat UI",openAsTerminal:"Open as terminal",modeSwitchFailed:"Could not switch this terminal",newTerminal:"New terminal",options:"Options"},agentHistory:{title:"History",empty:"No past conversations here yet",untitled:"Untitled",openNow:"Running",minutesAgo:"{n}m",hoursAgo:"{n}h",daysAgo:"{n}d",showAll:"View all history",searchPlaceholder:"Search conversations…",allAgents:"All agents",delete:"Delete session",deleteTitle:"Delete conversation",deleteMessage:'Delete "{title}"? This permanently deletes the conversation transcript.',noResults:"No matching conversations",searchingAll:"Searching all folders…",searchTruncated:"Newest matches shown — refine the query to search deeper"},workspaces:{title:"Workspaces",newWorkspace:"Add workspace",newWorkspacePrompt:"Workspace name",newFolderName:"Folder name",createFolderTitle:"New folder",defaultName:"New workspace",ungrouped:"No workspace",addTerminal:"New terminal here",moveToWorkspace:"Move to workspace",rename:"Rename workspace",delete:"Remove workspace",emptyWorkspace:"No terminals here",selectFolder:"Choose folder",emptyTagVibe:"code \xb7 now",emptyWordVibe:"VibeCode Now",emptyMetaVibe:"Pick a workspace and start coding \xb7 <b>sessions persist</b>",emptyGoVibe:"Choose workspace",emptyTagPair:"connect \xb7 other pc",emptyWordPair:"Remote Other PC",emptyMetaPair:"terminal \xb7 <b>screen</b> \xb7 files — from web, app or pc",emptyGoPair:"Add another PC",browse:"Browse",recentFolders:"Recent",searchFolders:"Search folders...",parentFolder:"Up one level",drives:"Drives",homeFolder:"Home",hiddenFolders:"Hidden folders",selectNamed:'Choose "{name}"',enterPath:"Type a path and press Enter",pathNotFolder:"That path is not a folder",filterOrPath:"Search, or type a path like /home/me",notADirectory:'"{name}" is not a folder in {dir}',multipleDirMatches:'"{name}" matches several folders in {dir}',invalidPath:"Invalid path",openHere:"New terminal here",tabFiles:"Files",tabGit:"Git",tabTrees:"Trees",refreshRepos:"Rescan repos",onlyChanged:"Only changed files",openFullFiles:"Open full file explorer",emptyTitle:"Nothing open yet",cardWorkspaceTitle:"Workspace",cardWorkspaceDesc:"Open a folder and run terminals in it",cardRemoteTitle:"Remote desktop",cardRemoteDesc:"Control this machine's screen",emptyWordTerminal:"Remote Terminal",emptyWordRemote:"Remote Desktop",emptyTagWorkspace:"workspace \xb7 pty",emptyTagRemote:"remote \xb7 webrtc",emptyMetaWorkspace:"open a folder \xb7 <b>sessions persist</b>",emptyMetaRemote:"control this machine \xb7 <b>low latency</b>",worktrees:"Worktrees",branches:"Branches",newWorktree:"New worktree",worktreeName:"Branch name",worktreeRepoLabel:"Repo to add the worktree in",worktreeNameAscii:"This name can't become a branch — type it in Latin letters.",addWorktree:"Add worktree",removeWorktree:"Remove worktree",removeWorktreeMessage:'Remove worktree at "{path}"?',removeWorktreeFolder:"Folder: {path}",removeWorktreeBranchDelete:"Branch: {branch} (fully merged — deleted too)",removeWorktreeBranchKeep:"Branch: {branch} (not fully merged — kept)",removeWorktreeSessions:"{count} session(s) inside: {names}",removeWorktreeBranch:'Branch "{branch}" is deleted too (when fully merged).',worktreeBranchKept:'Branch "{branch}" kept: not fully merged.',worktreeBusy:"{count} terminal(s) still run in this worktree: {names}",worktreeDirty:"This worktree has modified or untracked files — forcing the removal deletes them for good. Continue?",checkedOut:"checked out",newBranch:"New branch",checkout:"Checkout",searchBranch:"Search branches",worktreePath:"Worktree path",nestedRepos:"{count} repos",showCleanRepos:"Show {count} unchanged repo(s)",showHiddenRepos:"Unhide {count} repo(s)",hideRepo:"Hide this repo",scanDeeper:"Scan subfolders deeper",deleteTitle:"Remove workspace",deleteMessage:'Remove workspace "{name}"? Its terminals are closed. Files on disk are untouched.'},terminal:{quotaNoData:"No quota data",quotaUsageTitle:"usage",back:"Back",menu:"Menu",newTerminal:"New terminal",remoteDesktop:"Remote Desktop",defaultName:"Term",searchAgents:"Search terminal or agent",noAgentsFound:"No match",skipPermissions:"Skip permission prompts",plainShell:"Terminal",nameLabel:"Name (optional)",workspaceRoot:"Workspace root",detachedHead:"detached",browseFolders:"Browse folders…",shell:"Shell"},ai:{newChatTitle:"Start a new chat?",newChatMessage:"The current chat will be closed and replaced by a new one.",newChatConfirm:"New chat"},files:{selectWorkspace:"Select Workspace",recentWorkspaces:"Recent Workspaces",home:"Home",root:"Root",drive:"Drive {letter}",codespaces:"Codespaces",removeRecent:"Remove from recent",removeTitle:"Remove Workspace",removeMessage:'Remove "{name}" from recent workspaces?',setAsWorkspace:"Set as Workspace",openFolder:"Open Folder",newFile:"New File",newFolder:"New Folder",rename:"Rename",delete:"Delete",deleteFile:"Delete File",deleteFolder:"Delete Folder",deleteFileMessage:'Delete "{name}"?',deleteFolderMessage:'Delete folder "{name}" and all its contents?',emptyFolder:"Empty folder",git:"Git",parent:"Parent folder",workspace:"Workspace",failedLoad:"Failed to load: {error}",failedDelete:"Failed to delete: {error}",failedCreate:"Failed to create: {error}",failedRename:"Failed to rename: {error}",enterName:"Enter name",confirmRename:"Rename to:",setWorkspace:"Set Workspace",setAsWorkspaceTitle:"Set as workspace",switchWorkspace:"Switch workspace",searchFiles:"Search files",toggleHidden:"Toggle hidden files",searchPlaceholder:"Search files...",searching:"Searching...",noFilesFound:"No files found",noGitRepo:"No git repository",cannotOpenBinary:"Cannot open binary file",createNew:"Create New",file:"File",folder:"Folder",placeholderFile:"filename.js",placeholderFolder:"folder-name",pickFile:"Choose files",pickFolder:"Choose folder",copyPath:"Copy path",copyRelPath:"Copy Relative Path",copyName:"Copy Filename",delete:"Delete",rename:"Rename",deleteConfirmTitle:"Delete",deleteConfirmMessage:'Delete "{name}"?'},fileKind:{web:"Web pages",document:"Documents",sheet:"Spreadsheets",image:"Images",media:"Audio & video",diagram:"Diagrams",code:"Code & text"},editor:{save:"Save",saving:"Saving...",saved:"Saved",unsaved:"Unsaved changes",close:"Close",discard:"Discard",discardTitle:"Discard Changes",discardMessage:"You have unsaved changes. Discard them?",unsavedTitle:"Save changes to {name}?",unsavedBody:"Your changes will be lost if you don't save them.",failedLoad:"Failed to load file: {error}",failedSave:"Failed to save: {error}",openFull:"Open in full editor",artifact:"Artifact",preview:"Preview",editCode:"Edit code",reload:"Reload",previewFailed:"Preview failed",previewInBrowser:"Open in Browser",previewNoRoute:"No LAN or tunnel route to the host",previewBack:"Back",previewForward:"Forward",previewOpenTab:"Open in a new tab",changedOnDisk:"Changed on disk",reloadFromDisk:"Reload",mermaidEmpty:"Nothing to draw",readOnly:"Read only",line:"Line",column:"Column",gitDiff:"Git Diff",typeText:"Type text and insert...",insert:"Insert",statusModified:"Modified",statusAdded:"Added",statusUntracked:"Untracked"},git:{title:"Git",branch:"Branch",changes:"Changes",staged:"Staged",unstaged:"Unstaged",untracked:"Untracked",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 message",push:"Push",pull:"Pull",fetch:"Fetch",stage:"Stage",stageAll:"Stage All",unstage:"Unstage",discard:"Discard",discardChanges:"Discard Changes",discardMessage:'Discard changes to "{name}"?',noChanges:"No changes",diff:"Diff",pushing:"Pushing...",pulling:"Pulling...",committing:"Committing...",failedCommit:"Failed to commit: {error}",failedPush:"Failed to push: {error}",failedPull:"Failed to pull: {error}",status:"Status",diffTab:"Diff",modified:"Modified",added:"Added",deleted:"Deleted",untrackedTitle:"Untracked",openFile:"Open file",discardChangesTitle:"Discard changes",discardConfirmTitle:"Discard Changes",discardConfirmDelete:'Are you sure you want to delete "{name}"? This cannot be undone.',discardConfirmDiscard:'Are you sure you want to discard changes in "{name}"? This cannot be undone.',addToGitignore:"Add to .gitignore",showMore:"Show {count} more"},fileExplorer:{explorer:"Explorer",search:"Search",sourceControl:"Source Control",settings:"Settings",outline:"Outline",noFolderOpen:"No folder open",uploadingCount:"Uploading {{n}}/{{total}}…",uploadFailedCount:"{{n}} of {{total}} files failed to upload",openFolder:"Open Folder",recentWorkspaces:"Recent Workspaces",openedEditors:"Open Editors",closeEditor:"Close",closeOthers:"Close Others",closeAll:"Close All",closeAllSaved:"Close All Saved",saveAll:"Save All",newFile:"New File",newFolder:"New Folder",refreshExplorer:"Refresh Explorer",collapseAll:"Collapse All",searchInFiles:"Search in files",replaceInFiles:"Replace in files",searchPlaceholder:"Search",replacePlaceholder:"Replace",caseSensitive:"Match Case",wholeWord:"Match Whole Word",useRegex:"Use Regular Expression",filesToInclude:"files to include",filesToExclude:"files to exclude",noResults:"No results found",resultCount:"{count} results in {fileCount} files",replaceAll:"Replace All",replaceConfirmTitle:"Replace in Files",replaceConfirmMessage:"Replace {count} occurrences in {fileCount} files?",commandPalette:"Command Palette",quickOpen:"Quick Open File",typeCommand:"Type a command",typeFileName:"Type a file name",noCommandsFound:"No commands found",workspaceSwitcher:"Switch Workspace",pinWorkspace:"Pin",unpinWorkspace:"Unpin",renameWorkspace:"Rename Workspace",workspaceNamePlaceholder:"Workspace display name",pinned:"Pinned",recent:"Recent",searchWorkspaces:"Search workspaces",welcomeTitle:"Welcome",welcomeSubtitle:"Open a folder to start working",welcomeOpenFolder:"Open Folder",welcomeRecent:"Recent",toggleSidebar:"Toggle Sidebar",togglePanel:"Toggle Panel",togglePanelBottom:"Toggle Bottom Panel",toggleWordWrap:"Toggle Word Wrap",zoomIn:"Zoom In",zoomOut:"Zoom Out",resetZoom:"Reset Zoom",formatDocument:"Format Document",findInFile:"Find",replaceInFile:"Replace",goToLine:"Go to Line",goToFile:"Go to File",revealInOS:"Reveal in Finder/Explorer",openInTerminal:"Open in Terminal",copyPath:"Copy Path",copyRelativePath:"Copy Relative Path",duplicate:"Duplicate",cut:"Cut",paste:"Paste",autoSave:"Auto Save",autoSaveOff:"Off",autoSaveAfterDelay:"After Delay",autoSaveOnFocusChange:"On Focus Change",fontSize:"Font Size",wordWrap:"Word Wrap",language:"Language",encoding:"Encoding",spaces:"Spaces",branch:"Branch",noBranch:"No branch",commitMessage:"Commit Message",commitMessagePlaceholder:"Message (Cmd+Enter to commit)",stage:"Stage",stageAll:"Stage All",unstage:"Unstage",push:"Push",pull:"Pull",sync:"Sync",staged:"Staged Changes",changes:"Changes",untracked:"Untracked",bottomPanelTerminal:"Terminal",bottomPanelOutput:"Output",bottomPanelProblems:"Problems",expandAll:"Expand All",recentFiles:"Recent Files",closedTabReopen:"Reopen Closed Tab",unsavedDot:"●",loadingTree:"Loading...",fileWatcherActive:"Watching for changes"},mobile:{title:"Android Device",refreshDevices:"Refresh devices",pickDevice:"Pick a device to mirror",noDevices:"No Android device found. Start an emulator or attach a device with USB debugging on.",starting:"Starting stream…",stoppingDevice:"Stopping…",streamEnded:"Stream ended",streamFailed:"Stream failed",streamGone:"Device is no longer connected",retry:"Retry",unsupportedBrowser:"This browser cannot decode the video stream. Use Chrome, Edge, or Safari 16.4+.",back:"Back",home:"Home",recents:"Recents",power:"Lock screen",shutdownDevice:"Shut down the emulator",shutdownTitle:"Shut down emulator?",shutdownMessage:"{name} will stop, losing anything running on it. Starting it again takes around 20 seconds.",shutdownConfirm:"Shut down",androidDevice:"Remote Android",androidDeviceHint:"Mirror and control an Android emulator or device.",deviceRunning:"Remote Android — {count} running",rotate:"Rotate",stopped:"Stopped",startDevice:"Start device",stopDevice:"Stop device",switchDevice:"Switch device",lowPower:"Low power mode",lowPowerHint:"No emulator window — much less CPU, fewer frames",noDevicesWithSdk:"No device running. Start an emulator below, or attach a phone with USB debugging on.",phaseLaunching:"Starting emulator…",phaseBooting:"Booting Android…",phaseReady:"Almost ready…",backToScreen:"Back to the device screen",tabApps:"Apps",tabLogs:"Logs",dropApk:"Install an APK",dropApkHint:"Drop a file here, or tap to choose",installing:"Installing…",installedApps:"Installed apps",noApps:"No user apps installed",launch:"Launch",forceStop:"Force stop",clearData:"Clear data",uninstall:"Uninstall",deepLinkPlaceholder:"myapp://path or https://…",filterByApp:"Filter by app",allApps:"All apps",minLevel:"Level",clearLog:"Clear log",pauseLog:"Pause",resumeLog:"Resume",logPaused:"Paused — new lines are not shown",noLogs:"Waiting for log output…",hideNoise:"Hide driver noise",showNoise:"Show driver noise (hidden by default)",modeFloat:"Unpin (float over the page)",modePin:"Pin to the right",resize:"Resize",setupTitle:"Android tooling",setupInstall:"Install",setupExtracting:"Extracting…",setupInstallTo:"Installs to",setupLowDisk:"Not enough disk space at the install location",setupRequires:"Needs {deps} first",setupDepsCmdline:"command line tools",setupDepsJdk:"Java 17",setupDepsEmulator:"emulator",setupBannerHint:"Some Android tools are missing — tap to install",addDevice:"Add device",noDevicesHint:"No device yet — tap + to create one, or plug in a phone with USB debugging on.",presetReady:"Ready — nothing to download",presetDownload:"Android 16 \xb7 ~1.5 GB download","provisionStep_platform-tools":"Downloading adb…",provisionStep_jdk:"Downloading Java…","provisionStep_cmdline-tools":"Downloading SDK tools…",provisionStep_emulator:"Downloading the emulator…",provisionStep_image:"Downloading Android…",provisionStep_create:"Creating the device…",imagesTitle:"System images",imagesSearch:"Search system images…",imagesNone:"No system images match",imageInstall:"Install image",imageRemove:"Remove image",imageRemoveTitle:"Remove system image?",imageRemoveMessage:"{path} will be deleted from the host. AVDs using it will no longer start.",avdCreateTitle:"Create Virtual Device",avdStep1:"Hardware",avdStep2:"System Image",avdStep3:"Name",avdNoProfiles:"No device profiles available",avdNamePlaceholder:"AVD name",avdInstalledBelow:"Installed images are marked",avdMenu:"AVD options",avdWipe:"Wipe data",avdWipeTitle:"Wipe AVD data?",avdWipeMessage:"{name} will lose all apps, accounts and files — back to a fresh device.",avdDelete:"Delete",avdDeleteTitle:"Delete AVD?",avdDeleteMessage:"{name} and its storage on the host will be removed permanently."},remote:{title:"Remote Desktop",connecting:"Connecting...",disconnected:"Disconnected",fullscreen:"Fullscreen",exitFullscreen:"Exit Fullscreen",receivingImage:"Receiving screen…",keyboard:"Keyboard",mouse:"Mouse",fps:"FPS",debug:"Debug",help:"Help",close:"Close",sendKey:"Send Key",helpTitle:"Remote Desktop Help",notAvailable:"Remote desktop is not available",unavailableTitle:"Remote Desktop isn't ready",unavailableUnknown:"On {host}, open the 9Remote host window (Pair Device page) → Services → turn on Remote Desktop.",unavailableNoCapture:"This machine has no screen to capture (headless, SSH or Codespaces), so Remote Desktop can't run on it.",unavailableDisabled:"On {host}, open the 9Remote host window (Pair Device page) → Services → turn on Remote Desktop.",unavailableScreenRecording:"Screen Recording is missing. On {host}: 9Remote → Services → Grant next to Screen Recording (or System Settings → Privacy & Security → Screen Recording → enable 9Remote), then turn on Remote Desktop.",unavailableAccessibility:"Accessibility is missing. On {host}: 9Remote → Services → Grant next to Accessibility (or System Settings → Privacy & Security → Accessibility → enable 9Remote), then turn on Remote Desktop.",unavailableMacRestart:"On macOS, if capture still fails after granting, quit and reopen 9Remote on the host.",unavailableFailed:"The host refused to start screen capture. Check the 9Remote host window on {host} for details.",unavailableOtherHosts:"Ready now",customizeKeys:"Customize keys",back:"Back",resetZoom:"Reset zoom",refresh:"Refresh",rectangleSelection:"Rectangle selection",handMode:"Hand mode",toggleKeyboard:"Toggle native keyboard",hideControls:"Hide controls",showControls:"Show controls",textBatchInput:"Text batch input",extraKeys:"Extra keys",customizeRemoteKeys:"Customize Remote Keys",exitRemote:"Exit remote desktop",debugTitle:"Debug Stats",minimize:"Minimize",transport:"Transport",latency:"Latency",tilesPerSec:"Tiles/sec",bandwidth:"Bandwidth",clearStats:"Clear Stats",lockTitle:"Windows is locked",lockGrantDesc:'Turn on "Unlock PC remotely" in 9remote host on this PC.',lockDesc:"Enter the Windows PIN or password for this computer",lockPlaceholder:"Windows PIN or password",unlock:"Unlock",unlocking:"Unlocking…",unlockFailed:"Unlock failed — check your PIN/password and try again."},remoteHelp:{modePc:"PC / Mouse",modeTrackpad:"Touch \xb7 Trackpad",modeDirect:"Touch \xb7 Direct",mouseTitle:"Mouse",keyboardTitle:"Keyboard",gesturesTrackpadTitle:"Gestures (Trackpad ✋)",gesturesDirectTitle:"Gestures (Direct)",toolbarTitle:"Toolbar",mouseClickKey:"Click / Drag",mouseClickDesc:"Left-click, drag to select/move",mouseRightKey:"Right-click",mouseRightDesc:"Context menu on remote",mouseWheelKey:"Wheel",mouseWheelDesc:"Scroll remote (Shift + Wheel = horizontal)",mouseDoubleKey:"Double-click",mouseDoubleDesc:"Double-click on remote",keyPhysicalKey:"Physical keys",keyPhysicalDesc:"Sent directly (Tab, F-keys, etc. captured)",keyModifierKey:"Ctrl / Alt / Shift / ⌘",keyModifierDesc:"Sticky modifier — combine with next key",trackpadSwipeKey:"1 finger swipe",trackpadSwipeDesc:"Move virtual cursor",trackpadTapKey:"1 finger tap",trackpadTapDesc:"Left-click at cursor",trackpad2TapKey:"2 fingers tap",trackpad2TapDesc:"Right-click at cursor",trackpad2SwipeKey:"2 fingers swipe",trackpad2SwipeDesc:"Scroll at cursor position",trackpadPinchKey:"2 fingers pinch",trackpadPinchDesc:"Zoom canvas",trackpadScrollLockKey:"Hold + drag",trackpadScrollLockDesc:"Hold to lock scroll, drag any direction",directTapKey:"1 finger tap",directTapDesc:"Click at tap position",directLongKey:"1 finger long-press",directLongDesc:"Right-click",directDoubleKey:"1 finger double-tap",directDoubleDesc:"Double-click",directScrollKey:"2 fingers swipe",directScrollDesc:"Scroll remote",directPinchKey:"2 fingers pinch",directPinchDesc:"Zoom canvas",directPanKey:"1 finger drag (zoom>1)",directPanDesc:"Pan canvas",toolbarHandDesc:"Hold left-click (drag mode) — tap again to release",toolbarMouseDirectDesc:"Switch to Direct mode",toolbarMouseTrackpadDesc:"Switch to Trackpad (virtual cursor)",toolbarKeyboardDesc:"Native keyboard / text batch input",toolbarRectDesc:"Rectangle selection mode"},remoteControls:{enterToSend:"Tab or Ctrl+Num to switch tab",typeToSend:"Type text to send...",send:"Send",trackpadMode:"Trackpad mode",directMode:"Direct mode",bottomRow:"Bottom Row",extraPanel:"Extra Panel",exitConfirmMessage:"Are you sure you want to exit the current remote desktop session?"},connection:{retrying:"Reconnecting...",waitingApproval:"Waiting for Approval",approvalDescription:"The 9Remote host needs to approve this device before you can connect.",approvalHint:"Check the terminal on your machine.",rejectedTitle:"Device Rejected",rejectedDescription:"This device was not approved by the 9Remote host.",backToLogin:"Back to Login",failed:"Connection Failed",failedDescription:"Unable to connect after {n} attempts",hostOfflineTitle:"Host is Offline",hostOfflineDescription:"The 9Remote host on this machine is not running. Start it on your machine, then retry.",attemptOf:"Attempt {n} of {total}",pairTab:"Paired Device",pairScanToSignIn:"Scan to sign in",pairOneTimeKey:"One-Time Key",pairPermanentKey:"Permanent Key",pairKeyNotSet:"— not set —",pairExpired:"Expired",pairUnavailable:"Device pairing is only available in the host's local view.",pairGenOneTimeTitle:"New one-time key?",pairGenOneTimeMsg:"Generate a new one-time key? The current one will expire immediately.",pairRegenTitle:"Regenerate permanent key?",pairRegenMsg:"Regenerate permanent key? All existing sessions will be disconnected.",exit:"Exit",cancel:"Cancel",retry:"Retry now"},notifications:{claudeCode:"Claude Code",codex:"Codex",geminiCli:"Gemini CLI",openCode:"OpenCode",title:"Notifications",empty:"No notifications",needsInput:"needs input",badgeTitle:"{blocked} needs input, {done} your turn",replied:"replied",agent:"Agent"},sites:{title:"Sites",localSites:"Local Sites",selectSitePreview:"Select a site to preview",browserNewTab:"New tab",browserAddressPlaceholder:"localhost:3000 or /path",browserNotConnected:"Connect to your host first",portPlaceholder:"port",loadingSites:"Loading Sites...",notConnected:"Not connected to the host",noSitesFound:"No sites found",startServerHint:"Start a local dev server to see it here",siteNamePlaceholder:"Site name",saveTitle:"Save",editNameTitle:"Edit name",removeTitle:"Remove",removePortTitle:"Remove Port",removePortMessage:"Remove port {port} from saved list?",popupBlocked:"Popup blocked! Please allow popups for this site.",startProxyFailed:"Failed to start proxy session for {name}",foundCount:"{n} site{suffix} found",focusOpenedTab:"Focus opened tab",openInNewTab:"Open in new tab",goBack:"Go back",goForward:"Go forward",loadingSite:"Loading...",empty:"No active sites",emptyHint:"Run a local server to see it here",open:"Open",refresh:"Refresh",newTabTitle:"Open local site",errorSwBlocked:"This browser blocked the service worker the site view needs",errorNoBridge:"Connect to your host first",errorNoSession:"Port {port} is no longer open — reopen the site",errorTimeout:"The site did not answer in time",errorNoReply:"No reply from the host",errorGeneric:"The site could not be loaded",browserTab:"Browser",browserPaneNotConnected:"Connect to your host first",browserPaneLocalSites:"Local sites",browserPaneIntroTitle:"Remote browser",browserPaneIntroDesc:"A real Chrome running on your host, streamed to this screen.",browserPaneTipPick:"Open a page, tap Pick, then tap or drag over elements to select them and send to your AI to fix.",browserPaneSearchOrUrl:"Search or type URL",browserPaneLoading:"Connecting to the browser…",browserPaneNoTabs:"No browser tabs open",browserPaneNewTabHint:"Type a URL to open a tab on the host browser",browserPaneReconnect:"Reconnect",browserPaneCopyUrl:"Copy page URL",browserPaneSendText:"Send text",browserPaneLoadError:"Can't reach this page",browserPaneRetry:"Retry",browserPaneCopyAddress:"Copy address",browserCtxCopyLink:"Copy link address",browserCtxCopyUrl:"Copy page URL",browserCtxInspect:"Inspect element",browserCtxHardReload:"Hard reload (ignore cache)",browserCtxImportCookies:"Import cookies",browserPaneSearchFor:"Search",browserCtxOpenNewTab:"Open link in new tab",browserPanePick:"Pick",browserPanePickTitle:"Pick page elements",browserPaneDevice:"Device",browserPaneDeviceTitle:"Device size"},commandNotes:{title:"Command Notes",noSavedCommands:"No saved commands",addFirstBelow:"Add your first command below",clickToCopy:"Click to copy",copiedBang:"Copied!",copy:"Copy",edit:"Edit",delete:"Delete",editCommandPlaceholder:"Edit command...",addCommandPlaceholder:"Add command...",update:"Update",add:"Add",empty:"No notes yet",emptyHint:"Save commands for quick access",add:"Add Note",edit:"Edit Note",delete:"Delete Note",deleteMessage:"Delete this note?",name:"Name",command:"Command",save:"Save",placeholderName:"e.g. Start dev server",placeholderCommand:"e.g. npm run dev"},mobileKeyboard:{pasteHere:"Paste here (Cmd+V)",enterToSend:"{shortcut} to switch tab",typeCommand:"Type command and send...",send:"Send",toggleExtraKeys:"Toggle extra keys",toggleTextInput:"Toggle text input",customizeTerminalKeys:"Customize Terminal Keys",mainBar:"Main Bar",extraPanel:"Extra Panel",fileTooLarge:"File too large (max 5MB)",readFileFailed:"Failed to read file",uploadFailed:"Failed to upload file: {error}"},terminalPane:{scrollToBottom:"Scroll to bottom",refresh:"Refresh terminal",openFolder:"Open folder",openFolderHere:"Open files here",changedFiles:"Changed files",pasteOrType:"Paste or type here",paste:"Paste",note:"Checklist",addToNote:"Add to checklist"},note:{title:"Checklist",placeholder:"No tasks yet",copy:"Copy",clear:"Clear",saved:"Saved",addSuccess:"Added to checklist",copyTodo:"Copy to-do items",multilinePlaceholder:"One task per line…",addLines:"Add each line as an item",copyItem:"Copy — taps stack rows in list order",edit:"Edit",drag:"Drag to reorder",pin:"Pin above the terminal",unpin:"Unpin",expand:"Open the full checklist",allDone:"All done",clearDone:"Clear done",sendHint:"Send to terminal with checklist",addChip:"Add chip",removeChip:"Remove chip",chipPlaceholder:"Chip text…"},pwaGuide:{copyYourKey:"Copy Your Key",copyKeyHint:"Tap the key below to copy — you'll need it to login after installing",tapToCopyApiKey:"Tap to copy API key",copiedBang:"Copied!",copy:"Copy",tapShareButton:"Tap Share Button",tapShareHint:"Tap the share button at the bottom of Safari",addToHome:"Add to Home Screen",addToHomeHint:'Scroll down and tap "Add to Home Screen"',openAppPasteKey:"Open App & Paste Key",openAppPasteKeyHint:"Open the installed app and paste your key to login",openMenu:"Open Menu",openMenuHint:"Tap the menu button (three dots) in Chrome",installApp:"Install App",installAppHint:'Tap "Install app" or "Add to Home screen"',lookInstallIcon:"Look for Install Icon",lookInstallIconHint:"Look for the install icon in the address bar",clickInstallPaste:"Click Install & Paste Key",installNow:"Install Now",installNowHint:"Install 9Remote as an app for quick access",installing:"Installing...",clickInstallPasteHint:"Click install, open the app, and paste your key to login",alternativeHint:'Alternative: Open browser menu → "Install 9Remote" or "Create shortcut"',loadingPlatform:"Loading platform detection...",iosPlatform:"iOS (iPhone/iPad)",androidPlatform:"Android",macosPlatform:"macOS",windowsPlatform:"Windows",desktopPlatform:"Desktop",alreadyInstalled:"Already Installed!",alreadyInstalledHint:"You're already using 9Remote as an installed app",installationGuide:"Installation Guide",installationSteps:"Installation Steps:"},community:{title:"Community",description:"Join the 9Remote community"},pwa:{title:"Install as App",description:"Install 9Remote on your device for the best experience",iosTitle:"iOS Safari",androidTitle:"Android Chrome",desktopTitle:"Desktop"},codespace:{title:"Codespace",name:"Name",status:"Status",running:"Running",autoStart:"Auto Start 9Remote",autoStartHint:"Start 9Remote when codespace opens",stop:"Stop Codespace",stopHint:"Stop to save usage",restartHint:"To restart, go to GitHub",unknown:"Unknown"},history:{title:"Command history",empty:"No commands yet",clearAll:"Clear all",snippets:"Snippets",history:"History",pin:"Pin as snippet",unpin:"Unpin",editSnippet:"Edit snippet",aliasLabel:"Alias",aliasHint:"Type this shortcut then send to run the command",commandLabel:"Command",aliasPlaceholder:"e.g. nrd"},voice:{dictate:"Voice input",language:"Voice language",clear:"Clear",denied:"Microphone blocked — allow mic access in your browser settings",network:"Voice endpoint unreachable — check Voice settings",micTimeout:"Mic did not respond — try again"},shortcuts:{title:"Keyboard shortcuts",menuLabel:"Keyboard shortcuts",switchTerminal:"Switch terminal",switchWorkspace:"Switch workspace",terminalActions:"New / Close terminal",togglePanels:"Toggle side panels",palette:"Search files",help:"Keyboard shortcuts",sessionPrev:"Previous terminal",sessionNext:"Next terminal",workspacePrev:"Previous workspace",workspaceNext:"Next workspace",sessionIndex:"Go to terminal 1-9",closeTerminal:"Close terminal",fitPanes:"Auto-fit panes",reloadApp:"Reload App",toggleFocus:"Toggle terminal / input focus",newTerminal:"New terminal",toggleSidebar:"Toggle sidebar",toggleRightPanel:"Toggle side panel"},appUpdate:{title:"Update required",body:"This version of the app is too old to connect. Update it from the store to continue.",action:"Update app"}}},33879:(e,t,o)=>{"use strict";o.d(t,{Xn:()=>n,dI:()=>a,zl:()=>s});let a=[{code:"en",label:"English",flag:"\uD83C\uDDFA\uD83C\uDDF8",country:"us"},{code:"vi",label:"Tiếng Việt",flag:"\uD83C\uDDFB\uD83C\uDDF3",country:"vn"},{code:"zh",label:"中文",flag:"\uD83C\uDDE8\uD83C\uDDF3",country:"cn"},{code:"es",label:"Espa\xf1ol",flag:"\uD83C\uDDEA\uD83C\uDDF8",country:"es"},{code:"hi",label:"हिन्दी",flag:"\uD83C\uDDEE\uD83C\uDDF3",country:"in"},{code:"ar",label:"العربية",flag:"\uD83C\uDDF8\uD83C\uDDE6",country:"sa"},{code:"pt",label:"Portugu\xeas",flag:"\uD83C\uDDE7\uD83C\uDDF7",country:"br"},{code:"ru",label:"Русский",flag:"\uD83C\uDDF7\uD83C\uDDFA",country:"ru"},{code:"ja",label:"日本語",flag:"\uD83C\uDDEF\uD83C\uDDF5",country:"jp"},{code:"de",label:"Deutsch",flag:"\uD83C\uDDE9\uD83C\uDDEA",country:"de"},{code:"fr",label:"Fran\xe7ais",flag:"\uD83C\uDDEB\uD83C\uDDF7",country:"fr"},{code:"ko",label:"한국어",flag:"\uD83C\uDDF0\uD83C\uDDF7",country:"kr"},{code:"it",label:"Italiano",flag:"\uD83C\uDDEE\uD83C\uDDF9",country:"it"},{code:"tr",label:"T\xfcrk\xe7e",flag:"\uD83C\uDDF9\uD83C\uDDF7",country:"tr"},{code:"id",label:"Bahasa Indonesia",flag:"\uD83C\uDDEE\uD83C\uDDE9",country:"id"},{code:"th",label:"ไทย",flag:"\uD83C\uDDF9\uD83C\uDDED",country:"th"},{code:"pl",label:"Polski",flag:"\uD83C\uDDF5\uD83C\uDDF1",country:"pl"},{code:"nl",label:"Nederlands",flag:"\uD83C\uDDF3\uD83C\uDDF1",country:"nl"},{code:"uk",label:"Українська",flag:"\uD83C\uDDFA\uD83C\uDDE6",country:"ua"},{code:"fa",label:"فارسی",flag:"\uD83C\uDDEE\uD83C\uDDF7",country:"ir"},{code:"ms",label:"Bahasa Melayu",flag:"\uD83C\uDDF2\uD83C\uDDFE",country:"my"},{code:"sv",label:"Svenska",flag:"\uD83C\uDDF8\uD83C\uDDEA",country:"se"},{code:"el",label:"Ελληνικά",flag:"\uD83C\uDDEC\uD83C\uDDF7",country:"gr"},{code:"he",label:"עברית",flag:"\uD83C\uDDEE\uD83C\uDDF1",country:"il"}],n="en",s="9remote_locale"},49262:(e,t,o)=>{var a={"./ar.js":[15714,5714],"./de.js":[67646,7646],"./en.js":[24890],"./es.js":[37369,7369],"./fa.js":[80236,236],"./fr.js":[76485,6485],"./he.js":[20482,482],"./hi.js":[52934,2934],"./id.js":[52488,2488],"./it.js":[23704,3704],"./ja.js":[99736,9736],"./ko.js":[87207,7207],"./ms.js":[4929,4929],"./nl.js":[72427,2427],"./pl.js":[95757,5757],"./pt.js":[2581,2581],"./ru.js":[37812,7812],"./sv.js":[3428,3428],"./th.js":[10101,101],"./tr.js":[41879,1879],"./uk.js":[74129,4129],"./vi.js":[84964,4964],"./zh.js":[43443,3443]};function n(e){if(!o.o(a,e))return Promise.resolve().then(()=>{var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=a[e],n=t[0];return Promise.all(t.slice(1).map(o.e)).then(()=>o(n))}n.keys=()=>Object.keys(a),n.id=49262,e.exports=n}}]);
|
package/dist/web/_next/static/chunks/app/{layout-fc9671123388edff.js → layout-a65a70a4500177c7.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7177],{36629:(e,t,a)=>{"use strict";a.d(t,{default:()=>l});var r=a(7620);function l(){let[e,t]=(0,r.useState)(!1),[a,l]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{let e=window.matchMedia("(pointer: coarse) and (max-width: 900px)"),a=window.matchMedia("(orientation: landscape)"),r=()=>{t(e.matches),l(a.matches)};return r(),e.addEventListener("change",r),a.addEventListener("change",r),()=>{e.removeEventListener("change",r),a.removeEventListener("change",r)}},[]),(0,r.useEffect)(()=>{let t=!!window.ReactNativeWebView||/9Remote-Mobile/i.test(navigator.userAgent);if(!e||t)return;let a=!1;return(async()=>{try{await window.screen?.orientation?.lock?.("portrait"),a=!0}catch{}})(),()=>{a&&window.screen?.orientation?.unlock?.()}},[e]),null}},38118:(e,t,a)=>{"use strict";a.d(t,{D:()=>s,ThemeProvider:()=>o});var r=a(54568),l=a(7620),c=a(86377);let n=(0,l.createContext)({theme:c.SS,setTheme:()=>{},toggleTheme:()=>{}}),u=e=>{if("u"<typeof document)return;let t=document.documentElement;t.classList.remove("light","dark"),t.classList.add(e),t.style.colorScheme=e;try{let t=window.__TAURI__?.window?.getCurrentWindow?.();t&&(t.setTheme?.(e)?.catch?.(()=>{}),t.setBackgroundColor?.("light"===e?"#e7e7e9":"#2a2a2a")?.catch?.(()=>{}))}catch{}},i=e=>{if(window.ReactNativeWebView)try{window.ReactNativeWebView.postMessage(JSON.stringify({type:"THEME_CHANGE",theme:e}))}catch(e){}};function o(e){let{children:t}=e,[a,o]=(0,l.useState)(c.SS);(0,l.useEffect)(()=>{let e=localStorage.getItem(c.AQ)||localStorage.getItem("9remote-theme"),t=c.$.includes(e)?e:c.SS;o(t),u(t),i(t)},[]);let s=(0,l.useCallback)(e=>{c.$.includes(e)&&(o(e),u(e),i(e),localStorage.setItem(c.AQ,e),localStorage.setItem("9remote-theme",e))},[]),F=(0,l.useCallback)(()=>{s("dark"===a?"light":"dark")},[a,s]),A=(0,l.useMemo)(()=>({theme:a,setTheme:s,toggleTheme:F}),[a,s,F]);return(0,r.jsx)(n.Provider,{value:A,children:t})}let s=()=>(0,l.useContext)(n)},74255:(e,t,a)=>{Promise.resolve().then(a.bind(a,5092)),Promise.resolve().then(a.bind(a,22546)),Promise.resolve().then(a.bind(a,87341)),Promise.resolve().then(a.t.bind(a,10594,23)),Promise.resolve().then(a.t.bind(a,36138,23)),Promise.resolve().then(a.t.bind(a,10918,23)),Promise.resolve().then(a.t.bind(a,76944,23)),Promise.resolve().then(a.bind(a,82355)),Promise.resolve().then(a.bind(a,36629)),Promise.resolve().then(a.bind(a,88654)),Promise.resolve().then(a.bind(a,38118))},76944:()=>{},82355:(e,t,a)=>{"use strict";a.d(t,{default:()=>s});var r=a(54568),l=a(7620),c=a(9121);let n=/9Remote-Mobile\/(\d+(?:\.\d+){0,2})/i,u=/^\d+(?:\.\d+){0,2}$/,i={android:"market://details?id=cc.remote9.app",ios:"itms-apps://apps.apple.com/app/id6796664210"};function o(){return"u"<typeof navigator?"android":window.DEVICE_INFO?.platform?window.DEVICE_INFO.platform:/iPhone|iPad|iPod/i.test(navigator.userAgent)||/^iP/.test(navigator.platform||"")||window.webkit?.messageHandlers?"ios":"android"}function s(){let{t:e}=(0,c.s)(),[t,a]=(0,l.useState)(!1);if((0,l.useEffect)(()=>{let e=navigator.userAgent;if(!window.ReactNativeWebView&&!n.test(String(e||"")))return;let t=o(),r=!1;return(async()=>{try{let l=await fetch(`/api/version?platform=${t}&_t=${Date.now()}`);if(!l.ok||r)return;let c=await l.json(),i=c?.minAppVersion;if(r||!i)return;let o=function(e,t){let a=t?.version;if("string"==typeof a&&u.test(a))return a;let r=n.exec(String(e||""));return r?r[1]:null}(e,window.DEVICE_INFO);(null===o||function(e,t){if(!u.test(String(e))||!u.test(String(t)))return!1;let a=String(e).split(".").map(Number),r=String(t).split(".").map(Number);for(let e=0;e<3;e++){let t=(a[e]||0)-(r[e]||0);if(0!==t)return t<0}return!1}(o,i))&&a(!0)}catch{}})(),()=>{r=!0}},[]),!t)return null;let s=i[o()]||i.android;return(0,r.jsxs)("div",{className:"fixed inset-0 z-[300] flex flex-col items-center justify-center gap-4 bg-[#0b0d0c] px-8 text-center fade-in",children:[(0,r.jsx)("span",{className:"material-symbols-rounded text-[56px] text-[#E56A4A]",children:"system_update_alt"}),(0,r.jsx)("h2",{className:"text-lg font-semibold text-white",children:e("appUpdate.title")}),(0,r.jsx)("p",{className:"max-w-xs text-sm text-white/60",children:e("appUpdate.body")}),(0,r.jsx)("a",{href:s,className:"mt-2 rounded-brand bg-[#E56A4A] px-6 py-2.5 text-sm font-semibold text-white",children:e("appUpdate.action")})]})}},86377:(e,t,a)=>{"use strict";a.d(t,{$:()=>r,AQ:()=>c,In:()=>s,SS:()=>l,aC:()=>u,g4:()=>o});let r=["dark","light"],l="dark",c="app_theme_v2";function n(e){return{background:e.bg,foreground:e.text,cursor:e.accent||e.peach||e.blue,cursorAccent:e.bg,selectionBackground:e.surface1,black:e.surfaceDim||e.bg,red:e.red,green:e.green,yellow:e.yellow,blue:e.blue,magenta:e.mauve,cyan:e.teal,white:e.subtext0||e.text,brightBlack:e.overlay0,brightRed:e.red,brightGreen:e.green,brightYellow:e.yellow,brightBlue:e.blue,brightMagenta:e.mauve,brightCyan:e.teal,brightWhite:e.text}}let u={dark:n({bg:"#1A1A1A",surface0:"#232323",surface1:"#2A2A2A",surfaceDim:"#101010",overlay0:"#5C5C5C",text:"#FFFFFF",subtext0:"#A0A0A0",red:"#FF8080",green:"#99FFE4",yellow:"#FFC799",blue:"#B0B0B0",mauve:"#FFD1A8",teal:"#66DDCC",peach:"#FFC799",accent:"#FFC799"}),light:n({bg:"#F5F5F5",surface0:"#E8E8E8",surface1:"#DDDDDD",surfaceDim:"#EFEFEF",overlay0:"#999999",text:"#1A1A1A",subtext0:"#5A5A5A",red:"#D9534F",green:"#2A9D8F",yellow:"#E07A3C",blue:"#6B6B6B",mauve:"#C97B5A",teal:"#3A9B8E",peach:"#E07A3C",accent:"#E07A3C"})},i={catppuccinMocha:n({bg:"#181825",surface0:"#31324A",surface1:"#45475A",surfaceDim:"#1E1E2E",overlay0:"#6C708E",text:"#CDD6F4",subtext0:"#A6ADC8",red:"#F38BA8",green:"#A6E3A1",yellow:"#F9E2AF",blue:"#89B4FA",mauve:"#CBA7F7",teal:"#94E2D5",peach:"#FAB387",accent:"#89B4FA"}),monokaiPro:n({bg:"#2D2A2E",surface0:"#353034",surface1:"#3D383C",surfaceDim:"#221F22",overlay0:"#72696A",text:"#FFF1F3",subtext0:"#C8C5C8",red:"#FD6883",green:"#ADDA78",yellow:"#F9CC6C",blue:"#F38D70",mauve:"#A8A9EB",teal:"#85DACC",peach:"#F38D70",accent:"#A8A9EB"}),gruvboxMaterial:n({bg:"#282828",surface0:"#3C3836",surface1:"#504945",surfaceDim:"#1D2021",overlay0:"#928374",text:"#D4BE98",subtext0:"#A89984",red:"#EA6962",green:"#A9B665",yellow:"#D8A657",blue:"#7DAEA3",mauve:"#D3869B",teal:"#89B482",peach:"#E78A4E",accent:"#E78A4E"}),dracula:n({bg:"#282A36",surface0:"#44475A",surface1:"#6272A4",surfaceDim:"#282A36",overlay0:"#6272A4",text:"#F8F8F2",subtext0:"#D2D2DC",red:"#FF5555",green:"#50FA7B",yellow:"#F1FA8C",blue:"#8BE9FD",mauve:"#FF79C6",teal:"#8BE9FD",peach:"#FFB86C",accent:"#BD93F9"}),everforest:n({bg:"#2D353B",surface0:"#343F44",surface1:"#3D484D",surfaceDim:"#232A2E",overlay0:"#7A8478",text:"#D3C6AA",subtext0:"#9DA9A0",red:"#E67E80",green:"#A7C080",yellow:"#DBBC7F",blue:"#7FBBB3",mauve:"#D699B6",teal:"#83C092",peach:"#E69875",accent:"#A7C080"}),linear:n({bg:"#08090A",surface0:"#0F1011",surface1:"#141516",surfaceDim:"#010102",overlay0:"#3E3E44",text:"#F7F8F8",subtext0:"#B4B4B8",red:"#F34E52",green:"#27A644",yellow:"#E4F222",blue:"#8FA6FF",mauve:"#8B5CF6",teal:"#02B8CC",peach:"#F7BF8B",accent:"#5E6AD2"}),synthwave:n({bg:"#262335",surface0:"#241B2F",surface1:"#34294F",surfaceDim:"#171520",overlay0:"#9D8BCA",text:"#FFFFFF",subtext0:"#FFFFFF99",red:"#FE4450",green:"#72F1B8",yellow:"#FEDE5D",blue:"#03EDF9",mauve:"#FF7EDB",teal:"#03EDF9",peach:"#F97E72",accent:"#FF7EDB"}),poimandres:n({bg:"#1B1E28",surface0:"#303340",surface1:"#3A4050",surfaceDim:"#14161F",overlay0:"#506477",text:"#E4F0FB",subtext0:"#A6ACCD",red:"#D0679D",green:"#5DE4C7",yellow:"#FFFAC2",blue:"#ADD7FF",mauve:"#F087BD",teal:"#5DE4C7",peach:"#F087BD",accent:"#5DE4C7"}),ayuMirage:n({bg:"#1F2430",surface0:"#212733",surface1:"#272D3A",surfaceDim:"#161B26",overlay0:"#686868",text:"#CBCCC6",subtext0:"#9A9B95",red:"#F08778",green:"#53BF97",yellow:"#FDCC60",blue:"#60B8D6",mauve:"#EC7171",teal:"#98E6CA",peach:"#FFA759",accent:"#FFCC66"}),githubDarkDimmed:n({bg:"#22272E",surface0:"#2D333B",surface1:"#373E47",surfaceDim:"#1C2128",overlay0:"#545D68",text:"#CDD9E5",subtext0:"#909DAB",red:"#F47067",green:"#57AB5A",yellow:"#C69026",blue:"#539BF5",mauve:"#B083F0",teal:"#39C5CF",peach:"#DAAA3F",accent:"#539BF5"}),palenight:n({bg:"#292D3E",surface0:"#313553",surface1:"#3A3F5F",surfaceDim:"#1F2233",overlay0:"#676E95",text:"#D0D0D0",subtext0:"#A0A0C0",red:"#E05252",green:"#2BE8A8",yellow:"#FFCB6B",blue:"#3FD0E0",mauve:"#C792EA",teal:"#3FD0E0",peach:"#FFCB6B",accent:"#82AAFF"}),nordDark:n({bg:"#2E3440",surface0:"#3B4252",surface1:"#434C5E",surfaceDim:"#232831",overlay0:"#4C566A",text:"#ECEFF4",subtext0:"#D8DEE9",red:"#BF616A",green:"#A3BE8C",yellow:"#EBCB8B",blue:"#81A1C1",mauve:"#B48EAD",teal:"#88C0D0",peach:"#D08770",accent:"#88C0D0"}),horizon:n({bg:"#1C1E26",surface0:"#232530",surface1:"#2E303E",surfaceDim:"#16161C",overlay0:"#6B6F8A",text:"#E0E0E0",subtext0:"#C5C8DA",red:"#E95678",green:"#29D398",yellow:"#FAB795",blue:"#26BBD9",mauve:"#EE64AC",teal:"#59E1E3",peach:"#FAB795",accent:"#EE64AC"}),kanagawaDragon:n({bg:"#181616",surface0:"#1D1C1C",surface1:"#252424",surfaceDim:"#0D0C0C",overlay0:"#7A6F7A",text:"#C5C9C5",subtext0:"#A6A69C",red:"#C4746E",green:"#87A987",yellow:"#E6C384",blue:"#8BA4B0",mauve:"#938AA9",teal:"#7AA89F",peach:"#FFA066",accent:"#8BA4B0"}),catppuccinLatte:n({bg:"#EFF1F5",surface0:"#CCD0DA",surface1:"#BCC0CC",surfaceDim:"#E6E9EF",overlay0:"#9CA0B0",text:"#4C4F69",subtext0:"#6C6F85",red:"#D20F39",green:"#40A02B",yellow:"#DF8E1D",blue:"#1E66F5",mauve:"#8839EF",teal:"#179299",peach:"#FE640B",accent:"#1E66F5"}),gruvboxLight:n({bg:"#FBF1C7",surface0:"#EBDBB2",surface1:"#D5C4A1",surfaceDim:"#F2E5BC",overlay0:"#928374",text:"#3C3836",subtext0:"#504945",red:"#9D0006",green:"#79740E",yellow:"#B57614",blue:"#076678",mauve:"#8F3F71",teal:"#427B58",peach:"#AF3A03",accent:"#B57614"}),githubLight:n({bg:"#FFFFFF",surface0:"#F6F8FA",surface1:"#EAEEF2",surfaceDim:"#EFF2F5",overlay0:"#8C959F",text:"#24292F",subtext0:"#57606A",red:"#CF222E",green:"#1A7F37",yellow:"#9A6700",blue:"#0969DA",mauve:"#8250DF",teal:"#1B7C83",peach:"#BC4C00",accent:"#0969DA"}),everforestLight:n({bg:"#FDF6E3",surface0:"#F4F0D9",surface1:"#EFEBD4",surfaceDim:"#E6E2CC",overlay0:"#9DA9A0",text:"#5C6A72",subtext0:"#7A8478",red:"#F85552",green:"#8DA101",yellow:"#DFA000",blue:"#3A94C5",mauve:"#DF69BA",teal:"#35A77C",peach:"#F57D3A",accent:"#8DA101"}),ayuLight:n({bg:"#FCFCFC",surface0:"#F3F3F3",surface1:"#E8E8E8",surfaceDim:"#F7F7F7",overlay0:"#C1C1C1",text:"#5C6166",subtext0:"#8A8F94",red:"#E7666A",green:"#80AB24",yellow:"#EBA54D",blue:"#4196DF",mauve:"#9870C3",teal:"#51B891",peach:"#E78F4D",accent:"#FF8552"}),tokyoDay:n({bg:"#D6D8DF",surface0:"#C8CBD4",surface1:"#B5B8C5",surfaceDim:"#E1E3EA",overlay0:"#9699AE",text:"#343B58",subtext0:"#565C70",red:"#C24242",green:"#41A6B5",yellow:"#8F5E15",blue:"#2959AA",mauve:"#7B43BA",teal:"#006C86",peach:"#D68910",accent:"#2959AA"}),roseDawn:n({bg:"#FAF4ED",surface0:"#F2E9E1",surface1:"#E9DDD2",surfaceDim:"#F5EBE0",overlay0:"#9893A5",text:"#576279",subtext0:"#797593",red:"#B4637A",green:"#618774",yellow:"#EA9D34",blue:"#286983",mauve:"#907AA9",teal:"#56949F",peach:"#D7827E",accent:"#D7827E"}),lavenderMist:n({bg:"#F6F3FB",surface0:"#EAE5F5",surface1:"#DDD6EE",surfaceDim:"#F0ECF8",overlay0:"#9B95B8",text:"#4A4467",subtext0:"#6B6491",red:"#C95D77",green:"#5FA17A",yellow:"#D9A441",blue:"#5B7FBE",mauve:"#8B7AB8",teal:"#5FA6A8",peach:"#D08A66",accent:"#8B7AB8"}),mintCream:n({bg:"#ECF6F0",surface0:"#DCEEE3",surface1:"#C9E3D2",surfaceDim:"#E2F1E9",overlay0:"#7FA396",text:"#2F4A40",subtext0:"#4E6B5F",red:"#C76B6B",green:"#3FA17A",yellow:"#C9A93E",blue:"#4A8DB8",mauve:"#9B6FA8",teal:"#3FA17A",peach:"#D58560",accent:"#3FA17A"})},o=[{key:"catppuccinMocha",label:"Catppuccin Mocha",mode:"dark"},{key:"monokaiPro",label:"Monokai Pro",mode:"dark"},{key:"dracula",label:"Dracula",mode:"dark"},{key:"everforest",label:"Everforest",mode:"dark"},{key:"gruvboxMaterial",label:"Gruvbox Material",mode:"dark"},{key:"linear",label:"Linear",mode:"dark"},{key:"synthwave",label:"Synthwave '84",mode:"dark"},{key:"poimandres",label:"Poimandres",mode:"dark"},{key:"ayuMirage",label:"Ayu Mirage",mode:"dark"},{key:"githubDarkDimmed",label:"GitHub Dimmed",mode:"dark"},{key:"palenight",label:"Palenight",mode:"dark"},{key:"nordDark",label:"Nord",mode:"dark"},{key:"horizon",label:"Horizon",mode:"dark"},{key:"kanagawaDragon",label:"Kanagawa Dragon",mode:"dark"},{key:"catppuccinLatte",label:"Catppuccin Latte",mode:"light"},{key:"gruvboxLight",label:"Gruvbox Light",mode:"light"},{key:"githubLight",label:"GitHub Light",mode:"light"},{key:"everforestLight",label:"Everforest Light",mode:"light"},{key:"ayuLight",label:"Ayu Light",mode:"light"},{key:"tokyoDay",label:"Tokyo Day",mode:"light"},{key:"roseDawn",label:"Rose Dawn",mode:"light"},{key:"lavenderMist",label:"Lavender Mist",mode:"light"},{key:"mintCream",label:"Mint Cream",mode:"light"}];function s(e,t){let a="light"===e?i.everforestLight:i.palenight;return t&&"default"!==t&&o.find(a=>a.key===t&&a.mode===e)&&i[t]||a}},88654:(e,t,a)=>{"use strict";a.d(t,{default:()=>n});var r=a(54568),l=a(7620);let c=()=>()=>{};function n(e){let{id:t,html:a}=e;return(0,l.useSyncExternalStore)(c,()=>!1,()=>!0)?(0,r.jsx)("script",{id:t,dangerouslySetInnerHTML:{__html:a}}):null}}},e=>{e.O(0,[5675,1317,6221,9121,587,1968,7358],()=>e(e.s=74255)),_N_E=e.O()}]);
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7177],{36629:(e,t,a)=>{"use strict";a.d(t,{default:()=>l});var r=a(7620);function l(){let[e,t]=(0,r.useState)(!1),[a,l]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{let e=window.matchMedia("(pointer: coarse) and (max-width: 900px)"),a=window.matchMedia("(orientation: landscape)"),r=()=>{t(e.matches),l(a.matches)};return r(),e.addEventListener("change",r),a.addEventListener("change",r),()=>{e.removeEventListener("change",r),a.removeEventListener("change",r)}},[]),(0,r.useEffect)(()=>{let t=!!window.ReactNativeWebView||/9Remote-Mobile/i.test(navigator.userAgent);if(!e||t)return;let a=!1;return(async()=>{try{await window.screen?.orientation?.lock?.("portrait"),a=!0}catch{}})(),()=>{a&&window.screen?.orientation?.unlock?.()}},[e]),null}},38118:(e,t,a)=>{"use strict";a.d(t,{D:()=>s,ThemeProvider:()=>o});var r=a(54568),l=a(7620),c=a(86377);let n=(0,l.createContext)({theme:c.SS,setTheme:()=>{},toggleTheme:()=>{}}),u=e=>{if("u"<typeof document)return;let t=document.documentElement;t.classList.remove("light","dark"),t.classList.add(e),t.style.colorScheme=e;try{let t=window.__TAURI__?.window?.getCurrentWindow?.();t&&(t.setTheme?.(e)?.catch?.(()=>{}),t.setBackgroundColor?.("light"===e?"#F2F1ED":"#2a2a2a")?.catch?.(()=>{}))}catch{}},i=e=>{if(window.ReactNativeWebView)try{window.ReactNativeWebView.postMessage(JSON.stringify({type:"THEME_CHANGE",theme:e}))}catch(e){}};function o(e){let{children:t}=e,[a,o]=(0,l.useState)(c.SS);(0,l.useEffect)(()=>{let e=localStorage.getItem(c.AQ)||localStorage.getItem("9remote-theme"),t=c.$.includes(e)?e:c.SS;o(t),u(t),i(t)},[]);let s=(0,l.useCallback)(e=>{c.$.includes(e)&&(o(e),u(e),i(e),localStorage.setItem(c.AQ,e),localStorage.setItem("9remote-theme",e))},[]),F=(0,l.useCallback)(()=>{s("dark"===a?"light":"dark")},[a,s]),A=(0,l.useMemo)(()=>({theme:a,setTheme:s,toggleTheme:F}),[a,s,F]);return(0,r.jsx)(n.Provider,{value:A,children:t})}let s=()=>(0,l.useContext)(n)},74255:(e,t,a)=>{Promise.resolve().then(a.bind(a,5092)),Promise.resolve().then(a.bind(a,22546)),Promise.resolve().then(a.bind(a,87341)),Promise.resolve().then(a.t.bind(a,10594,23)),Promise.resolve().then(a.t.bind(a,36138,23)),Promise.resolve().then(a.t.bind(a,10918,23)),Promise.resolve().then(a.t.bind(a,76944,23)),Promise.resolve().then(a.bind(a,82355)),Promise.resolve().then(a.bind(a,36629)),Promise.resolve().then(a.bind(a,88654)),Promise.resolve().then(a.bind(a,38118))},76944:()=>{},82355:(e,t,a)=>{"use strict";a.d(t,{default:()=>s});var r=a(54568),l=a(7620),c=a(9121);let n=/9Remote-Mobile\/(\d+(?:\.\d+){0,2})/i,u=/^\d+(?:\.\d+){0,2}$/,i={android:"market://details?id=cc.remote9.app",ios:"itms-apps://apps.apple.com/app/id6796664210"};function o(){return"u"<typeof navigator?"android":window.DEVICE_INFO?.platform?window.DEVICE_INFO.platform:/iPhone|iPad|iPod/i.test(navigator.userAgent)||/^iP/.test(navigator.platform||"")||window.webkit?.messageHandlers?"ios":"android"}function s(){let{t:e}=(0,c.s)(),[t,a]=(0,l.useState)(!1);if((0,l.useEffect)(()=>{let e=navigator.userAgent;if(!window.ReactNativeWebView&&!n.test(String(e||"")))return;let t=o(),r=!1;return(async()=>{try{let l=await fetch(`/api/version?platform=${t}&_t=${Date.now()}`);if(!l.ok||r)return;let c=await l.json(),i=c?.minAppVersion;if(r||!i)return;let o=function(e,t){let a=t?.version;if("string"==typeof a&&u.test(a))return a;let r=n.exec(String(e||""));return r?r[1]:null}(e,window.DEVICE_INFO);(null===o||function(e,t){if(!u.test(String(e))||!u.test(String(t)))return!1;let a=String(e).split(".").map(Number),r=String(t).split(".").map(Number);for(let e=0;e<3;e++){let t=(a[e]||0)-(r[e]||0);if(0!==t)return t<0}return!1}(o,i))&&a(!0)}catch{}})(),()=>{r=!0}},[]),!t)return null;let s=i[o()]||i.android;return(0,r.jsxs)("div",{className:"fixed inset-0 z-[300] flex flex-col items-center justify-center gap-4 bg-[#0b0d0c] px-8 text-center fade-in",children:[(0,r.jsx)("span",{className:"material-symbols-rounded text-[56px] text-[#E56A4A]",children:"system_update_alt"}),(0,r.jsx)("h2",{className:"text-lg font-semibold text-white",children:e("appUpdate.title")}),(0,r.jsx)("p",{className:"max-w-xs text-sm text-white/60",children:e("appUpdate.body")}),(0,r.jsx)("a",{href:s,className:"mt-2 rounded-brand bg-[#E56A4A] px-6 py-2.5 text-sm font-semibold text-white",children:e("appUpdate.action")})]})}},86377:(e,t,a)=>{"use strict";a.d(t,{$:()=>r,AQ:()=>c,In:()=>s,SS:()=>l,aC:()=>u,g4:()=>o});let r=["dark","light"],l="dark",c="app_theme_v2";function n(e){return{background:e.bg,foreground:e.text,cursor:e.accent||e.peach||e.blue,cursorAccent:e.bg,selectionBackground:e.surface1,black:e.surfaceDim||e.bg,red:e.red,green:e.green,yellow:e.yellow,blue:e.blue,magenta:e.mauve,cyan:e.teal,white:e.subtext0||e.text,brightBlack:e.overlay0,brightRed:e.red,brightGreen:e.green,brightYellow:e.yellow,brightBlue:e.blue,brightMagenta:e.mauve,brightCyan:e.teal,brightWhite:e.text}}let u={dark:n({bg:"#1A1A1A",surface0:"#232323",surface1:"#2A2A2A",surfaceDim:"#101010",overlay0:"#5C5C5C",text:"#FFFFFF",subtext0:"#A0A0A0",red:"#FF8080",green:"#99FFE4",yellow:"#FFC799",blue:"#B0B0B0",mauve:"#FFD1A8",teal:"#66DDCC",peach:"#FFC799",accent:"#FFC799"}),light:n({bg:"#F5F5F5",surface0:"#E8E8E8",surface1:"#DDDDDD",surfaceDim:"#EFEFEF",overlay0:"#999999",text:"#1A1A1A",subtext0:"#5A5A5A",red:"#D9534F",green:"#2A9D8F",yellow:"#E07A3C",blue:"#6B6B6B",mauve:"#C97B5A",teal:"#3A9B8E",peach:"#E07A3C",accent:"#E07A3C"})},i={catppuccinMocha:n({bg:"#181825",surface0:"#31324A",surface1:"#45475A",surfaceDim:"#1E1E2E",overlay0:"#6C708E",text:"#CDD6F4",subtext0:"#A6ADC8",red:"#F38BA8",green:"#A6E3A1",yellow:"#F9E2AF",blue:"#89B4FA",mauve:"#CBA7F7",teal:"#94E2D5",peach:"#FAB387",accent:"#89B4FA"}),monokaiPro:n({bg:"#2D2A2E",surface0:"#353034",surface1:"#3D383C",surfaceDim:"#221F22",overlay0:"#72696A",text:"#FFF1F3",subtext0:"#C8C5C8",red:"#FD6883",green:"#ADDA78",yellow:"#F9CC6C",blue:"#F38D70",mauve:"#A8A9EB",teal:"#85DACC",peach:"#F38D70",accent:"#A8A9EB"}),gruvboxMaterial:n({bg:"#282828",surface0:"#3C3836",surface1:"#504945",surfaceDim:"#1D2021",overlay0:"#928374",text:"#D4BE98",subtext0:"#A89984",red:"#EA6962",green:"#A9B665",yellow:"#D8A657",blue:"#7DAEA3",mauve:"#D3869B",teal:"#89B482",peach:"#E78A4E",accent:"#E78A4E"}),dracula:n({bg:"#282A36",surface0:"#44475A",surface1:"#6272A4",surfaceDim:"#282A36",overlay0:"#6272A4",text:"#F8F8F2",subtext0:"#D2D2DC",red:"#FF5555",green:"#50FA7B",yellow:"#F1FA8C",blue:"#8BE9FD",mauve:"#FF79C6",teal:"#8BE9FD",peach:"#FFB86C",accent:"#BD93F9"}),everforest:n({bg:"#2D353B",surface0:"#343F44",surface1:"#3D484D",surfaceDim:"#232A2E",overlay0:"#7A8478",text:"#D3C6AA",subtext0:"#9DA9A0",red:"#E67E80",green:"#A7C080",yellow:"#DBBC7F",blue:"#7FBBB3",mauve:"#D699B6",teal:"#83C092",peach:"#E69875",accent:"#A7C080"}),linear:n({bg:"#08090A",surface0:"#0F1011",surface1:"#141516",surfaceDim:"#010102",overlay0:"#3E3E44",text:"#F7F8F8",subtext0:"#B4B4B8",red:"#F34E52",green:"#27A644",yellow:"#E4F222",blue:"#8FA6FF",mauve:"#8B5CF6",teal:"#02B8CC",peach:"#F7BF8B",accent:"#5E6AD2"}),synthwave:n({bg:"#262335",surface0:"#241B2F",surface1:"#34294F",surfaceDim:"#171520",overlay0:"#9D8BCA",text:"#FFFFFF",subtext0:"#FFFFFF99",red:"#FE4450",green:"#72F1B8",yellow:"#FEDE5D",blue:"#03EDF9",mauve:"#FF7EDB",teal:"#03EDF9",peach:"#F97E72",accent:"#FF7EDB"}),poimandres:n({bg:"#1B1E28",surface0:"#303340",surface1:"#3A4050",surfaceDim:"#14161F",overlay0:"#506477",text:"#E4F0FB",subtext0:"#A6ACCD",red:"#D0679D",green:"#5DE4C7",yellow:"#FFFAC2",blue:"#ADD7FF",mauve:"#F087BD",teal:"#5DE4C7",peach:"#F087BD",accent:"#5DE4C7"}),ayuMirage:n({bg:"#1F2430",surface0:"#212733",surface1:"#272D3A",surfaceDim:"#161B26",overlay0:"#686868",text:"#CBCCC6",subtext0:"#9A9B95",red:"#F08778",green:"#53BF97",yellow:"#FDCC60",blue:"#60B8D6",mauve:"#EC7171",teal:"#98E6CA",peach:"#FFA759",accent:"#FFCC66"}),githubDarkDimmed:n({bg:"#22272E",surface0:"#2D333B",surface1:"#373E47",surfaceDim:"#1C2128",overlay0:"#545D68",text:"#CDD9E5",subtext0:"#909DAB",red:"#F47067",green:"#57AB5A",yellow:"#C69026",blue:"#539BF5",mauve:"#B083F0",teal:"#39C5CF",peach:"#DAAA3F",accent:"#539BF5"}),palenight:n({bg:"#292D3E",surface0:"#313553",surface1:"#3A3F5F",surfaceDim:"#1F2233",overlay0:"#676E95",text:"#D0D0D0",subtext0:"#A0A0C0",red:"#E05252",green:"#2BE8A8",yellow:"#FFCB6B",blue:"#3FD0E0",mauve:"#C792EA",teal:"#3FD0E0",peach:"#FFCB6B",accent:"#82AAFF"}),nordDark:n({bg:"#2E3440",surface0:"#3B4252",surface1:"#434C5E",surfaceDim:"#232831",overlay0:"#4C566A",text:"#ECEFF4",subtext0:"#D8DEE9",red:"#BF616A",green:"#A3BE8C",yellow:"#EBCB8B",blue:"#81A1C1",mauve:"#B48EAD",teal:"#88C0D0",peach:"#D08770",accent:"#88C0D0"}),horizon:n({bg:"#1C1E26",surface0:"#232530",surface1:"#2E303E",surfaceDim:"#16161C",overlay0:"#6B6F8A",text:"#E0E0E0",subtext0:"#C5C8DA",red:"#E95678",green:"#29D398",yellow:"#FAB795",blue:"#26BBD9",mauve:"#EE64AC",teal:"#59E1E3",peach:"#FAB795",accent:"#EE64AC"}),kanagawaDragon:n({bg:"#181616",surface0:"#1D1C1C",surface1:"#252424",surfaceDim:"#0D0C0C",overlay0:"#7A6F7A",text:"#C5C9C5",subtext0:"#A6A69C",red:"#C4746E",green:"#87A987",yellow:"#E6C384",blue:"#8BA4B0",mauve:"#938AA9",teal:"#7AA89F",peach:"#FFA066",accent:"#8BA4B0"}),catppuccinLatte:n({bg:"#EFF1F5",surface0:"#CCD0DA",surface1:"#BCC0CC",surfaceDim:"#E6E9EF",overlay0:"#9CA0B0",text:"#4C4F69",subtext0:"#6C6F85",red:"#D20F39",green:"#40A02B",yellow:"#DF8E1D",blue:"#1E66F5",mauve:"#8839EF",teal:"#179299",peach:"#FE640B",accent:"#1E66F5"}),gruvboxLight:n({bg:"#FBF1C7",surface0:"#EBDBB2",surface1:"#D5C4A1",surfaceDim:"#F2E5BC",overlay0:"#928374",text:"#3C3836",subtext0:"#504945",red:"#9D0006",green:"#79740E",yellow:"#B57614",blue:"#076678",mauve:"#8F3F71",teal:"#427B58",peach:"#AF3A03",accent:"#B57614"}),githubLight:n({bg:"#FFFFFF",surface0:"#F6F8FA",surface1:"#EAEEF2",surfaceDim:"#EFF2F5",overlay0:"#8C959F",text:"#24292F",subtext0:"#57606A",red:"#CF222E",green:"#1A7F37",yellow:"#9A6700",blue:"#0969DA",mauve:"#8250DF",teal:"#1B7C83",peach:"#BC4C00",accent:"#0969DA"}),everforestLight:n({bg:"#FDF6E3",surface0:"#F4F0D9",surface1:"#EFEBD4",surfaceDim:"#E6E2CC",overlay0:"#9DA9A0",text:"#5C6A72",subtext0:"#7A8478",red:"#F85552",green:"#8DA101",yellow:"#DFA000",blue:"#3A94C5",mauve:"#DF69BA",teal:"#35A77C",peach:"#F57D3A",accent:"#8DA101"}),ayuLight:n({bg:"#FCFCFC",surface0:"#F3F3F3",surface1:"#E8E8E8",surfaceDim:"#F7F7F7",overlay0:"#C1C1C1",text:"#5C6166",subtext0:"#8A8F94",red:"#E7666A",green:"#80AB24",yellow:"#EBA54D",blue:"#4196DF",mauve:"#9870C3",teal:"#51B891",peach:"#E78F4D",accent:"#FF8552"}),tokyoDay:n({bg:"#D6D8DF",surface0:"#C8CBD4",surface1:"#B5B8C5",surfaceDim:"#E1E3EA",overlay0:"#9699AE",text:"#343B58",subtext0:"#565C70",red:"#C24242",green:"#41A6B5",yellow:"#8F5E15",blue:"#2959AA",mauve:"#7B43BA",teal:"#006C86",peach:"#D68910",accent:"#2959AA"}),roseDawn:n({bg:"#FAF4ED",surface0:"#F2E9E1",surface1:"#E9DDD2",surfaceDim:"#F5EBE0",overlay0:"#9893A5",text:"#576279",subtext0:"#797593",red:"#B4637A",green:"#618774",yellow:"#EA9D34",blue:"#286983",mauve:"#907AA9",teal:"#56949F",peach:"#D7827E",accent:"#D7827E"}),lavenderMist:n({bg:"#F6F3FB",surface0:"#EAE5F5",surface1:"#DDD6EE",surfaceDim:"#F0ECF8",overlay0:"#9B95B8",text:"#4A4467",subtext0:"#6B6491",red:"#C95D77",green:"#5FA17A",yellow:"#D9A441",blue:"#5B7FBE",mauve:"#8B7AB8",teal:"#5FA6A8",peach:"#D08A66",accent:"#8B7AB8"}),mintCream:n({bg:"#ECF6F0",surface0:"#DCEEE3",surface1:"#C9E3D2",surfaceDim:"#E2F1E9",overlay0:"#7FA396",text:"#2F4A40",subtext0:"#4E6B5F",red:"#C76B6B",green:"#3FA17A",yellow:"#C9A93E",blue:"#4A8DB8",mauve:"#9B6FA8",teal:"#3FA17A",peach:"#D58560",accent:"#3FA17A"})},o=[{key:"catppuccinMocha",label:"Catppuccin Mocha",mode:"dark"},{key:"monokaiPro",label:"Monokai Pro",mode:"dark"},{key:"dracula",label:"Dracula",mode:"dark"},{key:"everforest",label:"Everforest",mode:"dark"},{key:"gruvboxMaterial",label:"Gruvbox Material",mode:"dark"},{key:"linear",label:"Linear",mode:"dark"},{key:"synthwave",label:"Synthwave '84",mode:"dark"},{key:"poimandres",label:"Poimandres",mode:"dark"},{key:"ayuMirage",label:"Ayu Mirage",mode:"dark"},{key:"githubDarkDimmed",label:"GitHub Dimmed",mode:"dark"},{key:"palenight",label:"Palenight",mode:"dark"},{key:"nordDark",label:"Nord",mode:"dark"},{key:"horizon",label:"Horizon",mode:"dark"},{key:"kanagawaDragon",label:"Kanagawa Dragon",mode:"dark"},{key:"catppuccinLatte",label:"Catppuccin Latte",mode:"light"},{key:"gruvboxLight",label:"Gruvbox Light",mode:"light"},{key:"githubLight",label:"GitHub Light",mode:"light"},{key:"everforestLight",label:"Everforest Light",mode:"light"},{key:"ayuLight",label:"Ayu Light",mode:"light"},{key:"tokyoDay",label:"Tokyo Day",mode:"light"},{key:"roseDawn",label:"Rose Dawn",mode:"light"},{key:"lavenderMist",label:"Lavender Mist",mode:"light"},{key:"mintCream",label:"Mint Cream",mode:"light"}];function s(e,t){let a="light"===e?i.everforestLight:i.palenight;return t&&"default"!==t&&o.find(a=>a.key===t&&a.mode===e)&&i[t]||a}},88654:(e,t,a)=>{"use strict";a.d(t,{default:()=>n});var r=a(54568),l=a(7620);let c=()=>()=>{};function n(e){let{id:t,html:a}=e;return(0,l.useSyncExternalStore)(c,()=>!1,()=>!0)?(0,r.jsx)("script",{id:t,dangerouslySetInnerHTML:{__html:a}}):null}}},e=>{e.O(0,[5675,1317,6221,9121,587,1968,7358],()=>e(e.s=74255)),_N_E=e.O()}]);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8974],{29261:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>L});var a=s(54568),r=s(65587),l=s(39634),o=s(85317),n=s(14916),i=s(71049);let c=[{name:"Every Harness \xb7 One UI",path:"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"},{name:"Remote IDE",path:"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"},{name:"Remote Vibe Coding",path:"M13 10V3L4 14h7v7l9-11h-7z"},{name:"Remote Desktop",path:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"},{name:"Remote Files",path:"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"},{name:"Remote Emulator",path:"M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"},{name:"Remote Localhost",path:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"},{name:"PC \xb7 Web \xb7 iPad \xb7 Mobile",path:"M12 18h.01M7 21h10a2 2 0 002-2V5a2 2 0 00-2-2H7a2 2 0 00-2 2v14a2 2 0 002 2z"}],d=[{src:"/screenshots/mobile-1.webp",alt:"Claude Code running in 9Remote on a phone"},{src:"/screenshots/mobile-2.webp",alt:"File explorer in 9Remote on a phone"},{src:"/screenshots/mobile-3.webp",alt:"System dashboard in 9Remote on a phone"}];function m(){return(0,a.jsxs)("section",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" relative min-h-screen flex items-center px-4 sm:px-6 lg:px-8 pt-24 pb-16 overflow-hidden",children:[(0,a.jsx)("div",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" max-w-7xl mx-auto relative z-10 w-full min-w-0",children:(0,a.jsxs)("div",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" grid lg:grid-cols-2 gap-12 items-center min-w-0",children:[(0,a.jsxs)("div",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" text-center lg:text-left",children:[(0,a.jsxs)("h1",{style:{fontWeight:900,lineHeight:1.1},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" mb-5 animate-fade-in-delay-1",children:[(0,a.jsx)("span",{style:{color:i.CV.text},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" block text-2xl sm:text-3xl lg:text-4xl xl:text-5xl mb-2",children:"Remote Everything,"}),(0,a.jsx)("span",{style:{background:`linear-gradient(to right, ${i.CV.text}, ${i.CV.textDim})`,WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" block text-2xl sm:text-3xl lg:text-4xl xl:text-5xl mb-3",children:"Vibecode Everywhere"})]}),(0,a.jsx)("div",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" flex flex-wrap gap-2 mb-6 justify-center lg:justify-start animate-fade-in-delay-2",children:c.map(e=>(0,a.jsxs)("span",{style:{borderColor:i.CV.border,background:i.CV.bgPanel,color:i.CV.text},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-mono font-medium border transition-colors hover:border-text-subtle",children:[(0,a.jsx)("svg",{style:{color:i.CV.accent},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" w-3.5 h-3.5",children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.8,d:e.path,className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])})}),(0,a.jsx)("span",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]]),children:e.name})]},e.name))}),(0,a.jsx)("p",{style:{color:i.CV.accent},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" font-mono text-xs sm:text-sm mb-3 max-w-xl mx-auto lg:mx-0",children:"Codex CLI looks like 1995? Claude Code's TUI hurts? Forget them. Same agents, one UI you'll actually love."}),(0,a.jsx)("p",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" hero-gloss text-sm sm:text-base mb-8 max-w-xl mx-auto lg:mx-0",children:"Leave your laptop behind. Your entire dev workstation goes wherever you go — remote IDE, 60fps desktop, visual file explorer, live mobile emulator, and every AI harness in one UI: Claude Code, Codex, Cursor & 30+ agents on PC, Web, iPad, or phone."}),(0,a.jsx)("div",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" grid grid-cols-2 sm:grid-cols-4 gap-4 sm:gap-6 max-w-lg mx-auto lg:mx-0 mt-7 animate-fade-in-delay-6",children:[{val:"Direct P2P",label:"WebRTC DataChannel"},{val:"<20ms",label:"Ultra-Low Latency"},{val:"30+ AI Agents",label:"Vibe Coding Ready"},{val:"Persistent",label:"PTY Daemon Sessions"}].map(e=>(0,a.jsxs)("div",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" text-center lg:text-left",children:[(0,a.jsx)("div",{style:{color:i.CV.text},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" text-base sm:text-lg font-bold mb-0.5",children:e.val}),(0,a.jsx)("div",{style:{color:i.CV.textDim},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" text-xs font-mono",children:e.label})]},e.label))})]}),(0,a.jsx)("div",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" relative w-full flex justify-center items-center lg:justify-end animate-fade-in-delay-2 min-w-0 mt-4 lg:mt-0",children:(0,a.jsxs)("div",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" relative w-full max-w-full sm:max-w-[620px] -translate-y-2 sm:-translate-y-5",children:[(0,a.jsx)("div",{style:{background:"radial-gradient(ellipse at center, rgba(255,255,255,0.10) 0%, transparent 70%)"},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" absolute -inset-8 opacity-50 blur-3xl pointer-events-none"}),(0,a.jsxs)("div",{style:{background:i.CV.bgElevated,borderColor:i.CV.border},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" relative rounded-xl overflow-hidden border shadow-2xl",children:[(0,a.jsxs)("div",{style:{background:i.CV.bgPanel,borderColor:i.CV.border},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" flex items-center gap-2 px-3 sm:px-4 py-2.5 sm:py-3 border-b",children:[(0,a.jsxs)("div",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" flex gap-1.5 sm:gap-2 flex-shrink-0",children:[(0,a.jsx)("div",{style:{background:"#FF5F57"},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" w-2.5 h-2.5 sm:w-3 sm:h-3 rounded-full"}),(0,a.jsx)("div",{style:{background:"#FEBC2E"},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" w-2.5 h-2.5 sm:w-3 sm:h-3 rounded-full"}),(0,a.jsx)("div",{style:{background:"#28C840"},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" w-2.5 h-2.5 sm:w-3 sm:h-3 rounded-full"})]}),(0,a.jsxs)("span",{style:{color:i.CV.textDim},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" ml-2 sm:ml-3 text-[10px] sm:text-xs font-mono truncate min-w-0",children:["9remote",(0,a.jsx)("span",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" hidden sm:inline",children:" — desktop"})]})]}),(0,a.jsx)("img",{src:"/screenshots/desktop-ide.webp",alt:"9Remote desktop workspace: terminal, editor and AI agent panes side by side",className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" w-full block"})]}),(0,a.jsx)("div",{className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" mt-5 flex w-max mx-auto items-end gap-2 sm:absolute sm:mt-0 sm:mx-0 sm:-bottom-[134px] sm:-right-8 sm:gap-3 sm:origin-bottom-right sm:scale-[0.66]",children:d.map((e,t)=>(0,a.jsx)("div",{style:{background:i.CV.bg,border:`1px solid ${i.CV.borderStrong}`,animationDelay:`${.9*t}s`},className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" relative w-[100px] sm:w-[180px] rounded-[1.1rem] p-0.5 shadow-2xl animate-float-phone",children:(0,a.jsx)("img",{src:e.src,alt:e.alt,loading:"lazy",className:n.dynamic([["7f7961168ae3d94",[i.CV.textDim]]])+" w-full block rounded-[0.95rem]"})},e.src))})]})})]})}),(0,a.jsx)(n,{id:"7f7961168ae3d94",dynamic:[i.CV.textDim],children:`@keyframes fadeIn{from{opacity:0;transform:translatey(20px)}to{opacity:1;transform:translatey(0)}}.animate-fade-in-delay-1.__jsx-style-dynamic-selector{opacity:0;animation:fadeIn.8s ease-out.1s forwards}.hero-gloss.__jsx-style-dynamic-selector{color:${i.CV.textDim}}.animate-fade-in-delay-4.__jsx-style-dynamic-selector{opacity:0;animation:fadeIn.8s ease-out.4s forwards}.animate-fade-in-delay-5.__jsx-style-dynamic-selector{opacity:0;animation:fadeIn.8s ease-out.5s forwards}.animate-fade-in-delay-6.__jsx-style-dynamic-selector{opacity:0;animation:fadeIn.8s ease-out.6s forwards}`})]})}var x=s(7620);let h={Host:[{id:"app",label:"App"},{id:"npm",label:"npm"}],Client:[{id:"browser",label:"Browser"},{id:"desktop",label:"Desktop"},{id:"mobile",label:"Mobile"}]},p={macos:"macOS",windows:"Windows"},u={macos:".dmg",windows:".exe"};function b(){let e="2.4.0",t=(0,i.E4)(i.Ji.tag),s=(0,x.useSyncExternalStore)(()=>()=>{},i.UH,()=>"other"),[l,o]=(0,x.useState)(!1),[n,c]=(0,x.useState)({}),d=()=>{navigator.clipboard?.writeText("npm i -g 9remote").catch(()=>{}),o(!0),setTimeout(()=>o(!1),2e3)};return(0,a.jsx)("section",{id:"how-it-works",className:"relative py-24 px-4 sm:px-6 lg:px-8",children:(0,a.jsxs)("div",{className:"max-w-5xl mx-auto",children:[(0,a.jsxs)("div",{className:"text-center mb-14",children:[(0,a.jsx)("h2",{className:"text-3xl sm:text-4xl lg:text-5xl font-bold mb-3",style:{color:i.CV.text},children:"Two halves. One session."}),(0,a.jsx)("p",{className:"text-base sm:text-lg max-w-xl mx-auto",style:{color:i.CV.textDim},children:"One command on your machine — then any browser joins it. Direct connection, no relay."})]}),(0,a.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-[1fr_auto_1fr] gap-4 md:gap-6 items-stretch",children:i.uI.map((o,m)=>{let b=h[o.role],y=n[o.role]||("Client"===o.role?"browser":"app");return(0,a.jsxs)(x.Fragment,{children:[1===m&&(0,a.jsxs)("div",{className:"flex md:flex-col items-center justify-center gap-2 py-2 md:py-0",children:[(0,a.jsx)("span",{className:"text-[11px] font-mono px-2 py-0.5 rounded border whitespace-nowrap",style:{borderColor:i.CV.border,background:i.CV.bgPanel,color:i.CV.accent},children:"WebRTC"}),(0,a.jsx)("svg",{className:"w-6 h-6 rotate-90 md:rotate-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",style:{color:i.CV.textMuted},children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.8,d:"M4 12h16m0 0l-6-6m6 6l-6 6"})})]}),(0,a.jsxs)("div",{className:"p-6 sm:p-7 rounded-2xl border flex flex-col transition-all duration-300 hover:-translate-y-1",style:{background:i.CV.bgElevated,borderColor:i.CV.border},children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,a.jsx)("span",{className:"text-[11px] font-mono font-bold px-2 py-0.5 rounded border uppercase tracking-wider",style:{borderColor:i.CV.border,background:i.CV.bgPanel,color:i.CV.accent},children:o.role}),e&&(0,a.jsxs)("span",{className:"text-[10px] font-mono px-1.5 py-0.5 rounded border",style:{borderColor:i.CV.border,background:i.CV.bgPanel,color:i.CV.textDim},children:["v",e]})]}),(0,a.jsx)("h3",{className:"text-xl font-bold mb-1.5",style:{color:i.CV.text},children:o.title}),(0,a.jsx)("p",{className:"text-sm mb-5",style:{color:i.CV.textDim},children:o.desc}),(0,a.jsxs)("div",{className:"mt-auto flex flex-col items-center",children:[(0,a.jsx)("div",{className:"flex gap-0.5 p-1 rounded-lg border mb-6 w-full",style:{background:i.CV.bgPanel,borderColor:i.CV.border},children:b.map(e=>(0,a.jsx)("button",{onClick:()=>{let t;return t=e.id,c(e=>({...e,[o.role]:t}))},className:`flex-1 px-2.5 py-1.5 rounded-md text-xs font-medium transition-colors ${y===e.id?"":"hover:text-text"}`,style:y===e.id?{background:i.CV.bgElevated,color:i.CV.text,boxShadow:"0 1px 2px rgba(0,0,0,0.2)"}:{color:i.CV.textMuted},children:e.label},e.id))}),(0,a.jsx)("div",{className:"inline-block rounded-lg border overflow-hidden",style:{borderColor:i.CV.border},children:"npm"===y?(0,a.jsxs)("button",{onClick:d,title:l?"Copied":"Copy",className:"w-full flex items-center gap-2 px-3 py-1.5 font-mono text-[13px] text-left transition-colors hover:bg-surface-2",style:{background:i.CV.bgPanel},children:[(0,a.jsx)("span",{style:{color:i.CV.textMuted},children:"$"}),(0,a.jsx)("code",{className:"font-bold",style:{color:i.CV.text},children:"npm i -g 9remote"}),(0,a.jsx)("span",{className:"ml-auto text-xs font-sans",style:{color:l?i.CV.success:i.CV.textMuted},children:l?"Copied":"Copy"})]}):"mobile"===y?(0,a.jsxs)("div",{className:"flex gap-2 w-full",children:[(0,a.jsxs)("a",{href:i.od,target:"_blank",rel:"noopener noreferrer",className:"flex-1 flex items-center justify-center gap-1.5 px-3 py-1.5 text-[13px] font-semibold transition-opacity hover:opacity-90 whitespace-nowrap",style:{background:"var(--color-text)",color:"var(--color-bg)"},children:[(0,a.jsx)("svg",{className:"w-3.5 h-3.5 flex-shrink-0",viewBox:"0 0 24 24",fill:"currentColor",children:(0,a.jsx)("path",{d:"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M15.97 6.38c.62-.75 1.04-1.8 0.92-2.85-.9.04-2 .6-2.65 1.35-.58.66-1.09 1.73-.95 2.76.99.08 2.03-.51 2.68-1.26z"})}),"App Store"]}),(0,a.jsxs)("a",{href:i.JN,target:"_blank",rel:"noopener noreferrer",className:"flex-1 flex items-center justify-center gap-1.5 px-3 py-1.5 text-[13px] font-semibold transition-opacity hover:opacity-90 whitespace-nowrap",style:{background:"var(--color-text)",color:"var(--color-bg)"},children:[(0,a.jsx)("svg",{className:"w-3.5 h-3.5 flex-shrink-0",viewBox:"0 0 24 24",fill:"currentColor",children:(0,a.jsx)("path",{d:"M3.609 1.814L13.793 12 3.61 22.186a2.128 2.128 0 0 1-.22-.964V2.778c0-.36.08-.694.22-.964zm11.233 11.234l2.584 2.584-11.834 6.83 9.25-9.414zm0-2.096L5.592 1.538l11.834 6.83-2.584 2.584zm1.485 1.048l3.633 2.098a1.328 1.328 0 0 0 0-2.296l-3.633-2.098-1.048 1.048 1.048 1.048z"})}),"Google Play"]})]}):(0,a.jsx)(r,{href:"browser"===y?"/login":i.KC,className:"w-full flex items-center justify-center gap-2 px-4 py-1.5 text-[13px] font-semibold transition-opacity hover:opacity-90",style:{background:"var(--color-text)",color:"var(--color-bg)"},children:"browser"===y?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("svg",{className:"w-4 h-4 flex-shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M21 12a9 9 0 11-9-9m9 9H3m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9"})}),"Open in Browser",(0,a.jsx)("span",{className:"ml-auto text-xs font-mono opacity-70",children:"→"})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("svg",{className:"w-4 h-4 flex-shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 3v12m0 0l-4-4m4 4l4-4M4 21h16"})}),p[s]&&"desktop"!==y?`Download v${t} for ${p[s]}`:`Download v${t}`,u[s]&&(0,a.jsx)("span",{className:"ml-auto text-xs font-mono opacity-70",children:u[s]})]})})})]})]})]},o.role)})})]})})}let y=[{title:"Every Harness, One UI",tag:"AI-Ready",desc:"Run Claude Code, Codex, Gemini CLI, Cursor & 30+ AI agents in one UI with live artifact previews.",path:"M13 10V3L4 14h7v7l9-11h-7z"},{title:"Every Screen, Everywhere",tag:"Any Device",desc:"Seamless across PC, Web, iPad keyboard shortcuts, and mobile dev keys.",path:"M12 18h.01M7 21h10a2 2 0 002-2V5a2 2 0 00-2-2H7a2 2 0 00-2 2v14a2 2 0 002 2z"},{title:"60fps Remote Desktop",tag:"Encrypted P2P",desc:"Ultra-smooth PC & Mac control over encrypted WebRTC with host approval.",path:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"},{title:"Full Remote IDE",tag:"All-in-One",desc:"Multi-pane terminal, code editor, and Git diffs in your pocket.",path:"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"},{title:"Live Mobile Emulator",tag:"Mobile Dev",desc:"Test and interact with Android & iOS emulators directly from your phone.",path:"M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"},{title:"Zero-Config Localhost",tag:"Zero-Exposure",desc:"Preview localhost without opening ports, ngrok, or exposing to the public internet.",path:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"},{title:"Visual File Explorer",tag:"Path-Jailed",desc:"Fuzzy search files (⌘⇧P) and edit code inside a secure, jailed workspace.",path:"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"},{title:"Zero-Trust & 100% Private",tag:"Self-Hosted",desc:"Physical host approval, direct P2P, zero cloud storage. Your code never leaves your machine.",path:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"}],g=[{name:"Zero Config",nine:!0,claude:!0,teamviewer:!0,chrome:!0,termius:!1},{name:"Remote IDE",nine:!0,claude:!1,teamviewer:!1,chrome:!1,termius:!1},{name:"Every Harness in One UI",nine:!0,claude:!1,teamviewer:!1,chrome:!1,termius:!1},{name:"Terminal Access",nine:!0,claude:!0,teamviewer:!1,chrome:!1,termius:!0},{name:"Persistent Daemon",nine:!0,claude:!0,teamviewer:!1,chrome:!1,termius:!0},{name:"Remote Localhost Preview",nine:!0,claude:!1,teamviewer:!1,chrome:!1,termius:!1},{name:"Touch File Explorer & Editor",nine:!0,claude:!1,teamviewer:!0,chrome:!1,termius:!0},{name:"Remote Desktop",nine:!0,claude:!1,teamviewer:!0,chrome:!0,termius:!1},{name:"Remote Emulator",nine:!0,claude:!1,teamviewer:!1,chrome:!1,termius:!1},{name:"AI Agent Artifacts",nine:!0,claude:!0,teamviewer:!1,chrome:!1,termius:!1},{name:"Physical Host Approval",nine:!0,claude:!1,teamviewer:!0,chrome:!1,termius:!1},{name:"Git Integration",nine:!0,claude:!1,teamviewer:!1,chrome:!1,termius:!1},{name:"Mobile & iPad Optimized",nine:!0,claude:!0,teamviewer:!1,chrome:!1,termius:!0},{name:"Browser-Based",nine:!0,claude:!0,teamviewer:!1,chrome:!0,termius:!1},{name:"QR Login",nine:!0,claude:!0,teamviewer:!1,chrome:!1,termius:!1},{name:"Auto Tunnel",nine:!0,claude:!0,teamviewer:!0,chrome:!0,termius:!1},{name:"No Port Forwarding",nine:!0,claude:!0,teamviewer:!0,chrome:!0,termius:!1},{name:"No Account Required",nine:!0,claude:!1,teamviewer:!1,chrome:!1,termius:!1},{name:"Free & Open Source",nine:!0,claude:!1,teamviewer:!1,chrome:!0,termius:!1}],f=[{key:"nine",name:"9Remote",highlight:!0},{key:"claude",name:"Claude Remote"},{key:"teamviewer",name:"TeamViewer"},{key:"chrome",name:"Chrome Remote"},{key:"termius",name:"Termius"}];function v(e){let{ok:t}=e;return t?(0,a.jsxs)("svg",{className:"w-4 h-4 sm:w-[18px] sm:h-[18px] mx-auto",viewBox:"0 0 20 20",style:{color:i.CV.text},children:[(0,a.jsx)("circle",{cx:"10",cy:"10",r:"9",fill:"currentColor"}),(0,a.jsx)("path",{d:"M6.5 10.5l2.5 2.5 4.5-5.5",fill:"none",stroke:"var(--color-bg)",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]}):(0,a.jsx)("svg",{className:"w-3.5 h-3.5 sm:w-4 sm:h-4 mx-auto opacity-50",viewBox:"0 0 20 20",style:{color:i.CV.textMuted},children:(0,a.jsx)("path",{d:"M6 6l8 8m0-8l-8 8",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round"})})}function j(){return(0,a.jsxs)("section",{id:"features",className:"jsx-469167ead414021 relative py-24 px-4 sm:px-6 lg:px-8",children:[(0,a.jsxs)("div",{className:"jsx-469167ead414021 max-w-7xl mx-auto",children:[(0,a.jsxs)("div",{className:"jsx-469167ead414021 text-center mb-16",children:[(0,a.jsx)("div",{style:{borderColor:i.CV.border,background:i.CV.bgPanel,color:i.CV.accent},className:"jsx-469167ead414021 inline-flex items-center gap-2 px-3 py-1 mb-4 rounded-full border text-xs font-mono",children:"Remote Everything \xb7 Everywhere"}),(0,a.jsxs)("h2",{style:{color:i.CV.text},className:"jsx-469167ead414021 text-3xl sm:text-4xl lg:text-5xl font-bold mb-4",children:["Why Choose ",(0,a.jsx)("span",{style:{color:i.CV.text},className:"jsx-469167ead414021",children:"9Remote?"})]}),(0,a.jsx)("p",{style:{color:i.CV.textDim},className:"jsx-469167ead414021 text-base sm:text-lg max-w-2xl mx-auto",children:"All your dev superpowers on any screen — zero config, zero lag, zero trust."})]}),(0,a.jsx)("div",{className:"jsx-469167ead414021 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-20",children:y.map((e,t)=>(0,a.jsxs)("div",{style:{background:i.CV.bgElevated,borderColor:i.CV.border,animation:`fadeInUp 0.4s ease-out ${.04*t}s both`},className:"jsx-469167ead414021 group relative p-6 rounded-xl border flex flex-col justify-between",children:[(0,a.jsxs)("div",{className:"jsx-469167ead414021",children:[(0,a.jsxs)("div",{className:"jsx-469167ead414021 flex items-center justify-between mb-4",children:[(0,a.jsx)("div",{style:{background:i.CV.bgPanel,color:i.CV.text},className:"jsx-469167ead414021 w-10 h-10 rounded-lg flex items-center justify-center",children:(0,a.jsx)("svg",{fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",className:"jsx-469167ead414021 w-5 h-5",children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.8,d:e.path,className:"jsx-469167ead414021"})})}),(0,a.jsx)("span",{style:{borderColor:i.CV.border,background:i.CV.bgPanel,color:i.CV.textDim},className:"jsx-469167ead414021 text-[11px] font-mono px-2 py-0.5 rounded border",children:e.tag})]}),(0,a.jsx)("h3",{style:{color:i.CV.text},className:"jsx-469167ead414021 text-lg font-bold mb-2",children:e.title})]}),(0,a.jsx)("p",{style:{color:i.CV.textDim},className:"jsx-469167ead414021 text-sm leading-relaxed",children:e.desc})]},e.title))}),(0,a.jsxs)("div",{className:"jsx-469167ead414021 pt-8",children:[(0,a.jsxs)("div",{className:"jsx-469167ead414021 text-center mb-10",children:[(0,a.jsx)("h3",{style:{color:i.CV.text},className:"jsx-469167ead414021 text-2xl sm:text-3xl font-bold mb-2",children:"How 9Remote Compares"}),(0,a.jsx)("p",{style:{color:i.CV.textDim},className:"jsx-469167ead414021 text-sm sm:text-base max-w-xl mx-auto",children:"Built from scratch for modern developers who need both power and mobility."})]}),(0,a.jsx)("div",{style:{background:i.CV.bgElevated,borderColor:i.CV.border},className:"jsx-469167ead414021 overflow-x-auto rounded-2xl border",children:(0,a.jsxs)("table",{className:"jsx-469167ead414021 min-w-full",children:[(0,a.jsx)("thead",{className:"jsx-469167ead414021",children:(0,a.jsxs)("tr",{style:{borderBottom:`1px solid ${i.CV.border}`},className:"jsx-469167ead414021",children:[(0,a.jsx)("th",{style:{color:i.CV.text,background:i.CV.bgElevated},className:"jsx-469167ead414021 px-3 sm:px-4 py-3 sm:py-4 text-left text-xs sm:text-sm font-semibold sticky left-0 z-10 min-w-[140px] sm:min-w-[200px]",children:"Feature"}),f.map(e=>(0,a.jsx)("th",{style:{color:e.highlight?i.CV.accent:i.CV.text,background:e.highlight?i.CV.accentSoft:"transparent"},className:"jsx-469167ead414021 px-2 sm:px-4 py-3 sm:py-4 text-center text-xs sm:text-sm font-semibold min-w-[80px] sm:min-w-[110px]",children:e.name},e.key))]})}),(0,a.jsx)("tbody",{className:"jsx-469167ead414021",children:g.map((e,t)=>(0,a.jsxs)("tr",{style:{borderBottom:t<g.length-1?`1px solid ${i.CV.border}`:"none"},onMouseEnter:e=>e.currentTarget.style.background=i.CV.bgPanel,onMouseLeave:e=>e.currentTarget.style.background="transparent",className:"jsx-469167ead414021 transition-colors",children:[(0,a.jsx)("td",{style:{color:i.CV.text,background:i.CV.bgElevated},className:"jsx-469167ead414021 px-3 sm:px-4 py-2.5 sm:py-3 text-xs sm:text-sm font-medium sticky left-0 z-10",children:e.name}),f.map(t=>(0,a.jsx)("td",{style:{background:t.highlight?i.CV.accentSoft:"transparent"},className:"jsx-469167ead414021 px-2 sm:px-4 py-2.5 sm:py-3 text-center",children:(0,a.jsx)(v,{ok:e[t.key]})},t.key))]},e.name))})]})}),(0,a.jsx)("div",{className:"jsx-469167ead414021 mt-8 text-center",children:(0,a.jsxs)("div",{style:{background:i.CV.bgPanel,borderColor:i.CV.border},className:"jsx-469167ead414021 inline-flex items-center gap-2 px-4 py-2 rounded-full border text-xs sm:text-sm",children:[(0,a.jsxs)("svg",{viewBox:"0 0 20 20",style:{color:i.CV.text},className:"jsx-469167ead414021 w-4 h-4 flex-shrink-0",children:[(0,a.jsx)("circle",{cx:"10",cy:"10",r:"8",fill:"currentColor",className:"jsx-469167ead414021"}),(0,a.jsx)("path",{d:"M6.5 10.5l2.5 2.5 4.5-5.5",fill:"none",stroke:"var(--color-bg)",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",className:"jsx-469167ead414021"})]}),(0,a.jsx)("span",{style:{color:i.CV.text},className:"jsx-469167ead414021 font-semibold",children:"9Remote: Complete 19/19 capabilities \xb7 100% self-hosted & private"})]})})]})]}),(0,a.jsx)(n,{id:"469167ead414021",children:"@keyframes fadeInUp{from{opacity:0;transform:translatey(30px)}to{opacity:1;transform:translatey(0)}}"})]})}var C=s(38118),w=s(81851);let k=null,N=`
|
|
2
|
+
sequenceDiagram
|
|
3
|
+
autonumber
|
|
4
|
+
participant Client as Mobile / Web Client
|
|
5
|
+
participant Server as 9Remote Signaling Relay
|
|
6
|
+
participant Host as Host Machine (Agent)
|
|
7
|
+
|
|
8
|
+
Host->>Server: 1. Register HEAD (TAIL stays private on Host)
|
|
9
|
+
Client->>Server: 2. Request Host lookup with HEAD
|
|
10
|
+
Server-->>Client: 3. Return Host Public Key (Relay steps aside)
|
|
11
|
+
Note over Client,Host: Direct P2P Connection (WebRTC DataChannel)
|
|
12
|
+
Client->>Host: 4. Send encrypted TAIL (X25519 + AES-GCM)
|
|
13
|
+
Note over Host: Host verifies TAIL secret
|
|
14
|
+
Host-->>Host: 5. Physical Security Prompt: "Approve Device?"
|
|
15
|
+
Note over Host: You click Approve on host screen
|
|
16
|
+
Host-->>Client: 6. Secure P2P Session Established (<20ms latency)
|
|
17
|
+
`,V=[{step:"01",title:"Split-Key Zero-Trust",desc:"The pairing key is split into HEAD and TAIL. The relay server only sees HEAD to broker the WebRTC handshake and never receives or knows your secret TAIL.",iconPath:"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"},{step:"02",title:"Direct P2P Verification",desc:"Clients connect directly to your machine via WebRTC. Your secret TAIL is sealed with the host's public key (X25519 + AES-256-GCM) — unreadable to any intermediate relay.",iconPath:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"},{step:"03",title:"Physical Host Approval",desc:"Even if someone knows your key, new devices cannot access your machine until you physically click 'Approve' on your computer screen.",iconPath:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"}];function M(){let{theme:e}=(0,C.D)(),[t,r]=(0,x.useState)(""),l=(0,x.useRef)(null);return(0,x.useEffect)(()=>{let t=!1;return(!k&&(k=Promise.all([s.e(515),s.e(2269),s.e(8390)]).then(s.bind(s,74811)).then(e=>e.default)),k).then(async s=>{if(!t){s.initialize({startOnLoad:!1,theme:"dark"===e?"dark":"neutral",securityLevel:w.Ic,sequence:{useMaxWidth:!0,showSequenceNumbers:!0,actorFontSize:13,messageFontSize:12,noteFontSize:12}});try{let e=`security-flow-${Date.now()}`,{svg:a}=await s.render(e,N);if(t)return;r(a)}catch{}}}).catch(()=>{}),()=>{t=!0}},[e]),(0,x.useEffect)(()=>{t&&l.current&&l.current.querySelectorAll("text").forEach(e=>{let t=e.textContent?.trim()||"",s=null;if(t.includes("Mobile / Web Client")?s='<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#38bdf8" stroke-width="2.2"><rect x="5" y="2" width="14" height="20" rx="2" ry="2"/><line x1="12" y1="18" x2="12.01" y2="18"/></svg>':t.includes("9Remote Signaling Relay")?s='<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#a855f7" stroke-width="2.2"><path d="M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z"/></svg>':t.includes("Host Machine (Agent)")&&(s='<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="#22c55e" stroke-width="2.2"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>'),!s)return;let a=e.parentElement,r=a?.querySelector("rect")||e.previousElementSibling;if(!r||"rect"!==r.tagName||a.querySelector("foreignObject"))return;let l=r.getAttribute("x"),o=r.getAttribute("y"),n=r.getAttribute("width"),i=r.getAttribute("height");if(!l||!o||!n||!i)return;let c=document.createElementNS("http://www.w3.org/2000/svg","foreignObject");c.setAttribute("x",l),c.setAttribute("y",o),c.setAttribute("width",n),c.setAttribute("height",i),c.style.pointerEvents="none",c.innerHTML=`
|
|
18
|
+
<div xmlns="http://www.w3.org/1999/xhtml" style="display:flex;align-items:center;justify-content:center;width:100%;height:100%;gap:6px;font-family:ui-monospace,monospace;font-size:12px;font-weight:600;color:currentColor;">
|
|
19
|
+
<span style="display:flex;align-items:center;opacity:0.9;">${s}</span>
|
|
20
|
+
<span>${t}</span>
|
|
21
|
+
</div>
|
|
22
|
+
`,e.style.display="none",a.appendChild(c)})},[t]),(0,a.jsx)("section",{id:"security",className:"relative py-24 px-4 sm:px-6 lg:px-8",children:(0,a.jsxs)("div",{className:"max-w-7xl mx-auto",children:[(0,a.jsxs)("div",{className:"text-center mb-16",children:[(0,a.jsx)("div",{className:"inline-flex items-center gap-2 px-3 py-1 rounded-full border mb-4 text-xs font-mono",style:{borderColor:i.CV.border,background:i.CV.bgPanel,color:i.CV.textDim},children:"Zero-Trust Architecture"}),(0,a.jsxs)("h2",{className:"text-3xl sm:text-4xl lg:text-5xl font-bold mb-4",style:{color:i.CV.text},children:["3-Layer Security & ",(0,a.jsx)("span",{style:{color:i.CV.text},children:"Zero-Trust Verification"})]}),(0,a.jsx)("p",{className:"text-base sm:text-lg max-w-2xl mx-auto",style:{color:i.CV.textDim},children:"Split-Key pairing, direct WebRTC encryption, and physical host approval — your machine stays completely protected."})]}),(0,a.jsx)("div",{className:"p-4 sm:p-8 rounded-xl border mb-12 overflow-x-auto flex justify-center",style:{background:i.CV.bgElevated,borderColor:i.CV.border},children:t?(0,a.jsx)("div",{ref:l,className:"w-full max-w-4xl min-w-[320px] [&_svg]:w-full [&_svg]:h-auto",dangerouslySetInnerHTML:{__html:t}}):(0,a.jsx)("div",{className:"py-20 text-sm font-mono",style:{color:i.CV.textDim},children:"Loading security flow diagram..."})}),(0,a.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-6",children:V.map(e=>(0,a.jsxs)("div",{className:"p-6 rounded-xl border flex flex-col justify-between",style:{background:i.CV.bgElevated,borderColor:i.CV.border},children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,a.jsx)("div",{className:"w-9 h-9 rounded-lg flex items-center justify-center border",style:{borderColor:i.CV.border,background:i.CV.bgPanel,color:i.CV.accent},children:(0,a.jsx)("svg",{className:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.8,d:e.iconPath})})}),(0,a.jsxs)("span",{className:"text-xs font-mono",style:{color:i.CV.accent},children:["STEP ",e.step]})]}),(0,a.jsx)("h3",{className:"text-lg font-bold mb-2",style:{color:i.CV.text},children:e.title})]}),(0,a.jsx)("p",{className:"text-sm leading-relaxed",style:{color:i.CV.textDim},children:e.desc})]},e.step))})]})})}var D=s(71632);function P(){let{formattedStars:e}=(0,D.w)();return(0,a.jsx)("section",{className:"relative py-24 px-4 sm:px-6 lg:px-8",children:(0,a.jsx)("div",{className:"max-w-4xl mx-auto text-center",children:(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("div",{className:"absolute inset-0 blur-3xl pointer-events-none animate-pulse-glow",style:{background:"rgba(255,255,255,0.05)"}}),(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsxs)("h2",{className:"text-3xl sm:text-4xl lg:text-5xl font-bold mb-5",style:{color:i.CV.text},children:["Remote everything.",(0,a.jsx)("br",{}),"On any screen, ",(0,a.jsx)("span",{style:{color:i.CV.text},children:"everywhere"}),"."]}),(0,a.jsx)("p",{className:"font-mono text-xs sm:text-sm mb-3",style:{color:i.CV.accent},children:"Codex CLI looks like 1995? Claude Code's TUI hurts? Forget them. Same agents, one UI you'll actually love."}),(0,a.jsx)("p",{className:"text-base sm:text-lg mb-8 max-w-2xl mx-auto",style:{color:i.CV.textDim},children:"IDE, 60fps desktop, files, emulator & 30+ AI vibe coding agents on PC, Web, iPad, and mobile. Ready in 30 seconds."}),(0,a.jsxs)("div",{className:"flex flex-row gap-2.5 sm:gap-3 justify-center items-center flex-wrap",children:[(0,a.jsx)(r,{href:"/login",className:"btn-cta group px-5 sm:px-8 py-3 sm:py-4 rounded-lg font-semibold text-sm sm:text-base transition-transform duration-300 hover:scale-[1.03]",style:{background:i.CV.accent,color:"#FFF"},children:(0,a.jsxs)("span",{className:"flex items-center justify-center gap-2",children:["Get Remote",(0,a.jsx)("svg",{className:"w-5 h-5 group-hover:translate-x-1 transition-transform",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,a.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 7l5 5m0 0l-5 5m5-5H6"})})]})}),(0,a.jsxs)("a",{href:"https://github.com/decolua/9remote",target:"_blank",rel:"noopener noreferrer",className:"px-5 sm:px-8 py-3 sm:py-4 rounded-lg font-semibold text-sm sm:text-base transition-all duration-300 hover:scale-[1.03] flex items-center justify-center gap-2 border",style:{background:i.CV.bgPanel,color:i.CV.text,borderColor:i.CV.border},children:[(0,a.jsx)("svg",{className:"w-4 h-4 sm:w-5 sm:h-5",fill:"currentColor",viewBox:"0 0 24 24",children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z",clipRule:"evenodd"})}),(0,a.jsx)("span",{children:"Star on GitHub"}),e&&(0,a.jsxs)("span",{className:"text-xs font-mono px-2 py-0.5 rounded-full border border-border-subtle bg-surface-2 text-text",children:["★ ",e]})]})]}),(0,a.jsx)("p",{className:"mt-8 text-xs sm:text-sm font-mono",style:{color:i.CV.textMuted},children:"✓ 100% Free \xb7 Open source MIT \xb7 Zero tracking or telemetry"})]})]})})})}var A=s(54024),E=s(96605);function S(){let[e,t]=(0,x.useState)(null),[s,r]=(0,x.useState)(!0);return((0,x.useEffect)(()=>{try{if("1"===sessionStorage.getItem("9remote_dismiss_store_banner"))return}catch{}let e=navigator.userAgent||"";/iPhone|iPad|iPod/i.test(e)?(t({storeName:"Apple App Store",url:i.od,btnLabel:"Get"}),r(!1)):/Android/i.test(e)&&(t({storeName:"Google Play",url:i.JN,btnLabel:"Install"}),r(!1))},[]),s||!e)?null:(0,a.jsxs)("div",{className:"fixed bottom-0 inset-x-0 z-40 sm:hidden px-4 py-2.5 bg-surface/90 backdrop-blur-lg border-t border-border-subtle shadow-2xl flex items-center justify-between gap-3 pb-[max(0.65rem,env(safe-area-inset-bottom))]",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,a.jsx)("img",{src:"/icon-192.png",alt:"9Remote",className:"w-9 h-9 rounded-xl object-contain shadow-md shrink-0 border border-border-subtle/50"}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("p",{className:"text-sm font-semibold text-text truncate leading-tight",children:"9Remote"}),(0,a.jsx)("p",{className:"text-[11px] text-text-muted truncate leading-tight mt-0.5",children:e.storeName})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 shrink-0",children:[(0,a.jsx)("a",{href:e.url,target:"_blank",rel:"noopener noreferrer",className:"px-3.5 py-1.5 bg-brand-500 hover:bg-brand-600 active:scale-95 text-white text-xs font-semibold rounded-full shadow-md shadow-brand-500/20 transition-all duration-150",children:e.btnLabel}),(0,a.jsx)("button",{onClick:()=>{r(!0);try{sessionStorage.setItem("9remote_dismiss_store_banner","1")}catch{}},className:"p-1 text-text-muted hover:text-text active:scale-90 transition-colors","aria-label":"Close",children:(0,a.jsx)(E.X,{size:16})})]})]})}function H(){return(0,a.jsxs)("div",{className:"min-h-screen overflow-x-hidden safe-area-insets",style:{color:i.CV.text},children:[(0,a.jsx)(l.A,{}),(0,a.jsx)("div",{className:"landing-light","aria-hidden":!0}),(0,a.jsx)(o.A,{}),(0,a.jsxs)("main",{className:"relative z-10",children:[(0,a.jsx)(m,{}),(0,a.jsx)(b,{}),(0,a.jsx)(j,{}),(0,a.jsx)(M,{}),(0,a.jsx)(P,{})]}),(0,a.jsx)(A.A,{}),(0,a.jsx)(S,{})]})}function L(){return(0,a.jsx)(H,{})}},80619:(e,t,s)=>{Promise.resolve().then(s.bind(s,29261))},81851:(e,t,s)=>{"use strict";s.d(t,{AC:()=>p,An:()=>d,BF:()=>y,El:()=>N,HE:()=>R,HJ:()=>u,Ic:()=>P,J2:()=>w,Jd:()=>D,KF:()=>c,KP:()=>S,ML:()=>C,N0:()=>M,Of:()=>z,QS:()=>b,QZ:()=>l,Rh:()=>E,Tr:()=>f,UT:()=>g,ZN:()=>n,aS:()=>V,b4:()=>h,bg:()=>j,cx:()=>o,dE:()=>H,dT:()=>r,fP:()=>x,gI:()=>v,j3:()=>I,l_:()=>a,mH:()=>L,mk:()=>m,o_:()=>A,qM:()=>k,si:()=>i});let a={control:"control",binary:"binary",file:"file",mobile:"mobile",browser:"browser"},r=65536,l={ackTimeoutMs:5e3,maxAttempts:3,backoffMs:[500,1500,3e3],probeBackoffMs:[3e4,6e4,12e4,3e5],classifyAfterProbes:3},o={urls:["stun:stun.l.google.com:19302","stun:stun1.l.google.com:19302"],timeoutMs:2500,minIntervalMs:15e3},n=500,i=3,c=3e3,d=9e3,m=25e3,x=3,h=1e3,p=4e3,u=15e3,b=1e3,y=12e3,g=2e3,f=1e4,v={enabled:!0,pingMs:25e3},j={pending:"pending-approval",rejected:"device-rejected"},C={mismatch:"mismatch",sealUnreadable:"seal-unreadable",timeout:"proof-timeout"},w={pending:"pending",approved:"approved",rejected:"rejected",reconnect:"reconnect"},k=8,N="9remote_pending_save",V="9remote_wants_save",M="9remote:keys-changed",D="9remote_login_error",P="strict",A={debounceMs:500},E=3e4,S=15e3,H="not-admitted",L={admitRetryMax:2,admitKickMinMs:3e3,ringMaxBytes:4194304,maxEntries:2e3,holdMax:256,gapDeadlineMs:3e3,ackMaxLives:3},R={chunkSize:65528,windowSize:64,dcBufferThreshold:8388608,maxUploadSize:0x3200000,maxDownloadSize:0xc800000,maxStreamMediaSize:524288e3},z={idle:"idle",connecting:"connecting",open:"open",degraded:"degraded",closed:"closed"},I={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"},browser:{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"},browser:{strategy:"priority",prefer:"rtc"}},rtc:{enableTurn:!0,dcControl:{ordered:!0}}}}}},e=>{e.O(0,[820,5587,1772,556,1920,587,1968,7358],()=>e(e.s=80619)),_N_E=e.O()}]);
|