9remote 3.0.34 → 3.0.39
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 +144 -142
- package/dist/extension/background.js +55 -19
- package/dist/extension/manifest.json +1 -1
- package/dist/ptyDaemon.cjs +2 -2
- package/dist/server.cjs +729 -517
- package/dist/ui/assets/index-BKC13tXO.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/1222.16edfbb0beb9081f.js +1 -0
- package/dist/web/_next/static/chunks/1228.c4aa83586b3730b6.js +1 -0
- package/dist/web/_next/static/chunks/1243.3f23d89283c156ea.js +1 -0
- package/dist/web/_next/static/chunks/132.71f657e5a607b7d3.js +1 -0
- package/dist/web/_next/static/chunks/1750.ea89a41e86ac2790.js +1 -0
- package/dist/web/_next/static/chunks/2038.b77e2c3d38385a76.js +1 -0
- package/dist/web/_next/static/chunks/213.ae43f03862ad9cc1.js +1 -0
- package/dist/web/_next/static/chunks/2180.edcf5dc3d77ceee8.js +1 -0
- package/dist/web/_next/static/chunks/2849.d810c3fdb2054b14.js +1 -0
- package/dist/web/_next/static/chunks/3429.e69c6bd48e1207a9.js +1 -0
- package/dist/web/_next/static/chunks/3514.20bd03c8194dec25.js +1 -0
- package/dist/web/_next/static/chunks/{4300-7d6c9b3328075562.js → 4300-a66b52c9e1a27db3.js} +1 -1
- package/dist/web/_next/static/chunks/4643.1e356e007756e19d.js +1 -0
- package/dist/web/_next/static/chunks/5788-f0c87f9c14fa0ff9.js +1 -0
- package/dist/web/_next/static/chunks/6419.34fdd4aa97c5cc5d.js +1 -0
- package/dist/web/_next/static/chunks/674.b2f5d5fc3fb84c4a.js +1 -0
- package/dist/web/_next/static/chunks/6742.88fddf128fbeb43d.js +1 -0
- package/dist/web/_next/static/chunks/7507.77d9ac9eb03518f7.js +1 -0
- package/dist/web/_next/static/chunks/7960.2754ce9111bef59e.js +1 -0
- package/dist/web/_next/static/chunks/8467.c2c0273ac5e97e34.js +1 -0
- package/dist/web/_next/static/chunks/8638.f44546e4532d76e8.js +1 -0
- package/dist/web/_next/static/chunks/{8762-cb470d05070f5ead.js → 8762-e88a7f91d20d82bd.js} +1 -1
- package/dist/web/_next/static/chunks/8922-4c589850b01d2e12.js +1 -0
- package/dist/web/_next/static/chunks/925.7cfb725e605559a0.js +1 -0
- package/dist/web/_next/static/chunks/9259.97e2f3306fc149c7.js +1 -0
- package/dist/web/_next/static/chunks/9299.e37149b455be7e9d.js +1 -0
- package/dist/web/_next/static/chunks/app/dev/question/page-c7128ddf798789f1.js +1 -0
- package/dist/web/_next/static/chunks/app/login/{page-edc7457ddecf9262.js → page-2a046d10af50c87a.js} +1 -1
- package/dist/web/_next/static/chunks/app/{page-b76772608a876c23.js → page-8387dba850541259.js} +2 -2
- package/dist/web/_next/static/chunks/app/workspace/layout-9b28454945238595.js +20 -0
- package/dist/web/_next/static/chunks/webpack-beef15eb580fc66b.js +1 -0
- package/dist/web/_next/static/css/c48f9629be2a67b4.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/dev/question/__next._full.txt +8 -8
- package/dist/web/dev/question/__next._head.txt +1 -1
- package/dist/web/dev/question/__next._index.txt +7 -7
- package/dist/web/dev/question/__next._tree.txt +2 -2
- package/dist/web/dev/question/__next.dev.question.__PAGE__.txt +2 -2
- package/dist/web/dev/question/__next.dev.question.txt +1 -1
- package/dist/web/dev/question/__next.dev.txt +1 -1
- package/dist/web/dev/question.html +1 -1
- package/dist/web/dev/question.txt +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 +8 -8
- 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 +2 -2
- package/dist/web/workspace/__next.workspace.__PAGE__.txt +1 -1
- package/dist/web/workspace/__next.workspace.txt +2 -2
- package/dist/web/workspace/browse/__next._full.txt +8 -8
- 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 +2 -2
- 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 +2 -2
- package/dist/web/workspace/browse.html +1 -1
- package/dist/web/workspace/browse.txt +8 -8
- package/dist/web/workspace/editor/__next._full.txt +8 -8
- 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 +2 -2
- 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 +2 -2
- package/dist/web/workspace/editor.html +1 -1
- package/dist/web/workspace/editor.txt +8 -8
- package/dist/web/workspace/files/__next._full.txt +8 -8
- 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 +2 -2
- 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 +2 -2
- package/dist/web/workspace/files.html +1 -1
- package/dist/web/workspace/files.txt +8 -8
- package/dist/web/workspace/git/__next._full.txt +8 -8
- 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 +2 -2
- 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 +2 -2
- package/dist/web/workspace/git.html +1 -1
- package/dist/web/workspace/git.txt +8 -8
- package/dist/web/workspace/mobile/__next._full.txt +8 -8
- 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 +2 -2
- 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 +2 -2
- package/dist/web/workspace/mobile.html +1 -1
- package/dist/web/workspace/mobile.txt +8 -8
- package/dist/web/workspace/pair/__next._full.txt +8 -8
- 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 +2 -2
- 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 +2 -2
- package/dist/web/workspace/pair.html +1 -1
- package/dist/web/workspace/pair.txt +8 -8
- package/dist/web/workspace/remote/__next._full.txt +8 -8
- 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 +2 -2
- 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 +2 -2
- package/dist/web/workspace/remote.html +1 -1
- package/dist/web/workspace/remote.txt +8 -8
- package/dist/web/workspace/terminal/default/__next._full.txt +22 -21
- 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 +2 -2
- 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 +2 -2
- package/dist/web/workspace/terminal/default.html +1 -1
- package/dist/web/workspace/terminal/default.txt +22 -21
- package/dist/web/workspace/welcome/__next._full.txt +8 -8
- 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 +2 -2
- package/dist/web/workspace/welcome/__next.workspace.txt +2 -2
- 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 +8 -8
- package/dist/web/workspace/workspaces/__next._full.txt +8 -8
- 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 +2 -2
- package/dist/web/workspace/workspaces/__next.workspace.txt +2 -2
- 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 +8 -8
- package/dist/web/workspace.html +1 -1
- package/dist/web/workspace.txt +8 -8
- package/package.json +1 -1
- package/dist/ui/assets/index-DbuftNJF.js +0 -8
- package/dist/web/_next/static/chunks/1222.a2ce7d7f04241e2a.js +0 -1
- package/dist/web/_next/static/chunks/1228.046ad5fd038f5192.js +0 -1
- package/dist/web/_next/static/chunks/1243.1d11020940b8a88b.js +0 -1
- package/dist/web/_next/static/chunks/132.1ed2fce3a4b6f7ee.js +0 -1
- package/dist/web/_next/static/chunks/1750.09ca4eade7a6e5d3.js +0 -1
- package/dist/web/_next/static/chunks/2038.b7c72b442a1b2d92.js +0 -1
- package/dist/web/_next/static/chunks/213.f07a816120a320ba.js +0 -1
- package/dist/web/_next/static/chunks/2180.23585bd3f3308f3a.js +0 -1
- package/dist/web/_next/static/chunks/2849.360e2c64521fa795.js +0 -1
- package/dist/web/_next/static/chunks/3429.98d7e79ff6d2a6ce.js +0 -1
- package/dist/web/_next/static/chunks/3514.9079bf49bb3e05c9.js +0 -1
- package/dist/web/_next/static/chunks/4643.ddf3ea3a760e73a5.js +0 -1
- package/dist/web/_next/static/chunks/5788-d4b8dc2ab68396b6.js +0 -1
- package/dist/web/_next/static/chunks/6419.99aa173d83f20370.js +0 -1
- package/dist/web/_next/static/chunks/674.97a7237f011fb986.js +0 -1
- package/dist/web/_next/static/chunks/6742.bc3783b9784ead96.js +0 -1
- package/dist/web/_next/static/chunks/7507.28a3807b5d02a5c1.js +0 -1
- package/dist/web/_next/static/chunks/7960.026e07028dd25edb.js +0 -1
- package/dist/web/_next/static/chunks/8467.290e9bde34b58e7c.js +0 -1
- package/dist/web/_next/static/chunks/8638.237712645dcdcb8a.js +0 -1
- package/dist/web/_next/static/chunks/8922-8660f73e9cd42406.js +0 -1
- package/dist/web/_next/static/chunks/925.fe600c6039a3201d.js +0 -1
- package/dist/web/_next/static/chunks/9259.c450f561db04037d.js +0 -1
- package/dist/web/_next/static/chunks/9299.83236781dfa74eb0.js +0 -1
- package/dist/web/_next/static/chunks/app/dev/question/page-bdedfcfce7a3c516.js +0 -1
- package/dist/web/_next/static/chunks/app/workspace/layout-0fd9ea03182e9c89.js +0 -15
- package/dist/web/_next/static/chunks/webpack-f3500fd1fae71c88.js +0 -1
- package/dist/web/_next/static/css/1b307dedbb687210.css +0 -1
- package/dist/web/proxy.html +0 -179
- package/dist/web/sw-site.js +0 -283
- package/dist/web/swBridgeClaim.js +0 -57
- /package/dist/web/_next/static/{DdbafQkcX_ZaKRMjMeNKp → hFRLMLaLieW6POo9cLvLQ}/_buildManifest.js +0 -0
- /package/dist/web/_next/static/{DdbafQkcX_ZaKRMjMeNKp → hFRLMLaLieW6POo9cLvLQ}/_ssgManifest.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5788],{2163:(e,t,r)=>{r.d(t,{o:()=>n});function n(e){if(!e)return"";if(e.length<=14)return e;let t=e.substring(0,8),r=e.substring(e.length-6),n="•".repeat(12);return`${t}${n}${r}`}},2805:(e,t,r)=>{r.d(t,{Yr:()=>o,_r:()=>s,gJ:()=>l,rh:()=>c,sP:()=>a});var n=r(90076);let i=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;function s(){let e=window.location.hostname;return"localhost"===e||"::1"===e||"[::1]"===e||e.startsWith("127.")||e.endsWith(".localhost")}function a(){return s()||!!window.__TAURI__}function l(){return!!window.__TAURI__||window.location.port===String(n._8)||!0}function o(){if(s())return!0;let e=i.exec(window.location.hostname);if(!e||e.slice(1).some(e=>Number(e)>255))return!1;let t=Number(e[1]),r=Number(e[2]);return 10===t||192===t&&168===r||172===t&&!!(r>=16)&&!!(r<=31)}function c(e){return s()&&window.location.port!==String(n._8)?e?.loopbackOrigin||n.w||n.lE:null}},4018:(e,t,r)=>{r.d(t,{N:()=>i.N0,u:()=>o});var n=r(1521),i=r(86129);let s="9remote_api_keys",a=()=>{window.dispatchEvent(new Event(i.N0))};function l(e){try{return btoa(e)}catch{return e}}function o(){let e=(0,n.useCallback)(()=>{try{let e=localStorage.getItem(s);if(!e)return[];return JSON.parse(e).map(e=>({...e,key:function(e){try{return atob(e)}catch{return e}}(e.key)}))}catch(e){return console.error("Failed to load API keys:",e),[]}},[!0]),t=(0,n.useCallback)((t,r="")=>{if(t&&1)try{let n=e(),i=n.findIndex(e=>e.key===t);if(-1!==i){let e=n.map((e,t)=>({...e,key:l(e.key),lastLoginDate:t===i?new Date().toISOString():e.lastLoginDate}));localStorage.setItem(s,JSON.stringify(e));return}let o={id:Date.now().toString(),key:l(t),label:r||`Key ${n.length+1}`,createdAt:new Date().toISOString(),lastLoginDate:new Date().toISOString()},c=[...n.map(e=>({...e,key:l(e.key)})),o];localStorage.setItem(s,JSON.stringify(c)),a()}catch(e){console.error("Failed to save API key:",e)}},[!0,e]),r=(0,n.useCallback)((t,r)=>{try{let n=e(),i=n.findIndex(e=>e.id===t),o=i+r;if(-1===i||o<0||o>=n.length)return;[n[i],n[o]]=[n[o],n[i]],localStorage.setItem(s,JSON.stringify(n.map(e=>({...e,key:l(e.key)})))),a()}catch(e){console.error("Failed to move API key:",e)}},[!0,e]),i=(0,n.useCallback)(t=>{try{let r=e().filter(e=>e.id!==t).map(e=>({...e,key:l(e.key)}));localStorage.setItem(s,JSON.stringify(r)),a()}catch(e){console.error("Failed to remove API key:",e)}},[!0,e]),o=(0,n.useCallback)(()=>{try{localStorage.removeItem(s)}catch(e){console.error("Failed to clear API keys:",e)}},[!0]),c=(0,n.useCallback)(()=>{try{let e=localStorage.getItem(s);if(!e)return!1;return JSON.parse(e).length>0}catch{return!1}},[!0]),d=(0,n.useCallback)((t,r)=>{try{let n=e().map(e=>({...e,key:l(e.key),label:e.id===t?r:e.label||""}));localStorage.setItem(s,JSON.stringify(n)),a()}catch(e){console.error("Failed to rename API key:",e)}},[!0,e]),u=(0,n.useCallback)(t=>{if(t&&1)try{let r=e().map(e=>({...e,key:l(e.key),lastLoginDate:e.key===t?new Date().toISOString():e.lastLoginDate}));localStorage.setItem(s,JSON.stringify(r))}catch(e){console.error("Failed to update last login date:",e)}},[!0,e]);return{saveKey:t,loadKeys:e,moveKey:r,removeKey:i,renameKey:d,clearKeys:o,hasStoredKeys:c,updateLastLogin:u}}},7938:(e,t,r)=>{r.d(t,{D5:()=>a,FO:()=>c,I9:()=>o,Ic:()=>l,eR:()=>n,ij:()=>s,tC:()=>i});let n={namespace:"/remote",enableWebRTC:!0,enableTurn:!1,debug:{transport:!1,remote:!1,panel:!1,showButton:!1},dcChunkSize:8,dcReliable:!1,dcOrdered:!1,hashRequestInterval:1500,lastDataThreshold:500,restreamDelay:200,mouseThrottle:8,keyThrottle:25,scrollInterval:100,tileLoadTimeout:600,batchSize:16,batchDelay:3,decodeQueueCap:48,resizeDebounceMs:100,resizeStableFrames:3,resizeMaxFrames:30,focusDebounce:50,longPressDelay:1e3,doubleClickDelay:300,moveThreshold:10,edgeScrollThreshold:15,edgeScrollMultiplier:1.5,momentumFriction:.94,momentumMinVelocity:.3,pointerMode:"trackpad",trackpadSensitivity:1.3,trackpadAcceleration:1.5,trackpadTapMaxMove:8,trackpadTapMaxDuration:220,trackpadCursorSize:20,trackpadEdgeMarginRatio:.25,clipboardBadgeTimeout:1e4,gestureLockDelay:80,gestureDistanceThreshold:15,gestureCentroidThreshold:10,gestureDominanceRatio:2,wheelScrollMultiplier:2.5,wheelLineHeight:40,wheelPageHeight:400,wheelZoomStep:.1,wheelBoostInterval:250,mouseButtonMap:{0:"left",1:"middle",2:"right"},pcModeControls:{rectangleSelect:!1,pointerModeToggle:!1,handMode:!1,keyboardToggle:!1,textPanel:!0,modifierRow:!0,help:!0}},i={ctrl:"control",cmd:"command",alt:"alt",shift:"shift"},s=[{id:"ctrl",label:"Ctrl",modifier:"ctrl",type:"modifier"},{id:"alt",label:"Alt",modifier:"alt",type:"modifier"},{id:"shift",label:"Shift",modifier:"shift",type:"modifier"},{id:"cmd",label:"⌘",modifier:"cmd",type:"modifier"},{id:"esc",label:"Esc",key:"escape",type:"key"},{id:"tab",label:"Tab",key:"tab",type:"key"},{id:"enter",label:"↵",key:"enter",type:"key",primary:!0},{id:"backspace",label:"⌫",key:"backspace",type:"key"},{id:"undo",label:"Undo",key:"z",modifiers:["control"],type:"combo",osAdaptive:!0},{id:"redo",label:"Redo",key:"z",modifiers:["control","shift"],type:"combo",osAdaptive:!0},{id:"up",label:"↑",key:"up",type:"arrow"},{id:"down",label:"↓",key:"down",type:"arrow"},{id:"left",label:"←",key:"left",type:"arrow"},{id:"right",label:"→",key:"right",type:"arrow"},{id:"home",label:"Home",key:"home",type:"key"},{id:"end",label:"End",key:"end",type:"key"},{id:"pgup",label:"PgUp",key:"pageup",type:"key"},{id:"pgdn",label:"PgDn",key:"pagedown",type:"key"},{id:"del",label:"Del",key:"delete",type:"key"},{id:"ins",label:"Ins",key:"insert",type:"key"},{id:"f1",label:"F1",key:"f1",type:"key"},{id:"f2",label:"F2",key:"f2",type:"key"},{id:"f3",label:"F3",key:"f3",type:"key"},{id:"f4",label:"F4",key:"f4",type:"key"},{id:"f5",label:"F5",key:"f5",type:"key"},{id:"f6",label:"F6",key:"f6",type:"key"},{id:"f7",label:"F7",key:"f7",type:"key"},{id:"f8",label:"F8",key:"f8",type:"key"},{id:"f9",label:"F9",key:"f9",type:"key"},{id:"f10",label:"F10",key:"f10",type:"key"},{id:"f11",label:"F11",key:"f11",type:"key"},{id:"f12",label:"F12",key:"f12",type:"key"},{id:"ctrlAltDel",label:"Ctl+Alt+Del",key:"delete",modifiers:["control","alt"],type:"combo"},{id:"ctrlShiftEsc",label:"Task Mgr",key:"escape",modifiers:["control","shift"],type:"combo"},{id:"altTab",label:"Alt+Tab",key:"tab",modifiers:["alt"],type:"combo"},{id:"altF4",label:"Alt+F4",key:"f4",modifiers:["alt"],type:"combo"},{id:"winKey",label:"Win",key:"command",type:"key"},{id:"printScreen",label:"PrtSc",key:"printscreen",type:"key"},{id:"paste",label:"Paste",key:"v",modifiers:["control"],type:"combo",osAdaptive:!0},{id:"cut",label:"Cut",key:"x",modifiers:["control"],type:"combo",osAdaptive:!0},{id:"selectAll",label:"All",key:"a",modifiers:["control"],type:"combo",osAdaptive:!0},{id:"desktopPrev",label:"◀ Desk",type:"desktop",direction:"prev"},{id:"desktopNext",label:"Desk ▶",type:"desktop",direction:"next"},{id:"desktopNew",label:"+ Desk",type:"desktop",direction:"new"}],a=["esc","undo","up","down","tab","ctrl","alt","shift","cmd","backspace"],l="enter",o=[["left","right","home","end","pgup","pgdn","del"],["f1","f2","f3","f4","f5","f6","f7","altTab"],["f9","f10","f11","f12","ctrlAltDel",,"desktopPrev","desktopNext","desktopNew"]],c={enter:"enter",return:"enter",space:" ",backspace:"backspace",tab:"tab",escape:"escape",Enter:"enter"," ":"space",Backspace:"backspace",Tab:"tab",Escape:"escape",ArrowUp:"up",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right",Home:"home",End:"end",PageUp:"pageup",PageDown:"pagedown",Delete:"delete",Insert:"insert",F1:"f1",F2:"f2",F3:"f3",F4:"f4",F5:"f5",F6:"f6",F7:"f7",F8:"f8",F9:"f9",F10:"f10",F11:"f11",F12:"f12",CapsLock:"capslock",NumLock:"numlock",ScrollLock:"scrolllock",PrintScreen:"printscreen",ContextMenu:"menu"}},11155:(e,t,r)=>{function n(e){return"string"==typeof e&&!!e&&/^sk-[a-z0-9]{8}-[a-z0-9]{4}-[0-9a-f]{6}$/.test(e.trim().toLowerCase())}function i(e){if("string"!=typeof e||!/^sk-[a-z0-9]{8}-[a-np-z1-9]{8}-[a-np-z1-9]{8}$/.test(e))return e||null;let t=e.split("-");return`${t[0]}-${t[1]}-${t[2]}`}function s(e){return"string"==typeof e&&/^sk-[a-z0-9]{8}-[a-np-z1-9]{8}-[a-np-z1-9]{8}$/.test(e)?e.split("-")[3]:null}r.d(t,{Cj:()=>s,PF:()=>n,Uo:()=>i})},11865:(e,t,r)=>{r.d(t,{A:()=>o});var n=r(73365),i=r(1521),s=r(64683),a=r(80186),l=r(78762);function o({isOpen:e,onClose:t,onScan:c}){let{t:d}=(0,l.s)(),u=(0,i.useRef)(null),h=(0,i.useRef)(null),p=(0,i.useRef)(null),m=(0,i.useRef)(null),f=(0,i.useRef)(null),[g,y]=(0,i.useState)(""),[_,b]=(0,i.useState)(""),w=(0,i.useCallback)(async e=>{if(h.current)try{await h.current.stop()}catch(e){}b("detected"),await new Promise(e=>setTimeout(e,300)),b("authenticating"),await c(e)||(b(""),f.current?.())},[c]),k=(0,i.useCallback)(async()=>{if(!p.current){let e=await Promise.all([r.e(3446),r.e(6075)]).then(r.bind(r,16075)).catch(()=>null);if(!e)return void y(d("login.qrLibFail"));p.current=e.Html5Qrcode}let e=document.getElementById("qr-reader");if(!e)return void y(d("login.qrInitFail"));try{e.innerHTML="";let t=new p.current("qr-reader");h.current=t,await t.start({facingMode:"environment"},{fps:10,qrbox:{width:250,height:250}},e=>{m.current?.(e)},()=>{})}catch(t){let e=t.toString();e.includes("NotAllowedError")?y(d("login.qrCamDenied")):e.includes("NotFoundError")?y(d("login.qrNoCamera")):e.includes("NotReadableError")?y(d("login.qrCamBusy")):y(d("login.qrCamError"))}},[d]),v=(0,i.useCallback)(async()=>{if(h.current){try{await h.current.stop()}catch(e){}h.current=null}y(""),b(""),t()},[t]);return((0,i.useEffect)(()=>{m.current=w},[w]),(0,i.useEffect)(()=>{if(!e)return;let t=!1;f.current=async()=>{h.current=null,await new Promise(e=>setTimeout(e,400)),t||k()};let r=setTimeout(()=>{t||k()},200);return()=>{if(t=!0,clearTimeout(r),f.current=null,h.current){try{h.current.stop()}catch(e){}h.current=null}}},[e,k]),e)?(0,n.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm",children:(0,n.jsxs)("div",{className:"relative card-elev max-w-md w-full mx-4 overflow-hidden",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between p-4 border-b border-border",children:[(0,n.jsx)("h2",{className:"text-xl font-bold text-text",children:d("login.qrScanTitle")}),(0,n.jsx)("button",{onClick:v,className:"text-text-muted hover:text-text transition-colors p-1",children:(0,n.jsx)(s.X,{size:24})})]}),(0,n.jsx)("div",{className:"relative bg-black",children:(0,n.jsx)("div",{id:"qr-reader",ref:u,className:"w-full",style:{minHeight:"300px"}})}),(0,n.jsxs)("div",{className:"p-4",children:[g?(0,n.jsxs)("div",{className:"flex items-start gap-2 p-3 bg-red-500/10 rounded-brand text-red-400",children:[(0,n.jsx)(s.RI,{size:20,className:"flex-shrink-0 mt-0.5"}),(0,n.jsx)("p",{className:"text-sm",children:g})]}):"detected"===_?(0,n.jsxs)("div",{className:"flex items-center justify-center gap-2 p-3 bg-green-500/10 rounded-brand text-green-400",children:[(0,n.jsx)(s.vW,{size:22}),(0,n.jsx)("p",{className:"text-sm font-medium",children:d("login.qrDetected")})]}):"authenticating"===_?(0,n.jsx)("div",{className:"flex items-center justify-center gap-2 p-3 bg-brand-500/10 rounded-brand text-brand-400",children:(0,n.jsx)("p",{className:"text-sm font-medium",children:d("login.qrAuthenticating")})}):(0,n.jsx)("p",{className:"text-sm text-text-muted text-center",children:d("login.qrHint")}),(0,n.jsx)(a.A,{variant:"secondary",onClick:v,disabled:"authenticating"===_,className:"w-full mt-4",children:"authenticating"===_?d("login.qrPleaseWait"):d("common.cancel")})]})]})}):null}},18057:(e,t,r)=>{r.d(t,{A:()=>c});var n=r(73365),i=r(1521),s=r(64683),a=r(8910),l=r(78762),o=r(52345);function c({isOpen:e,onClose:t}){let{t:r,locale:d,setLocale:u}=(0,l.s)();return((0,i.useEffect)(()=>{if(!e)return;let r=e=>{"Escape"===e.key&&t()};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[e,t]),e)?(0,n.jsxs)("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",children:[(0,n.jsx)("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-[2px] animate-in fade-in duration-200",onClick:t}),(0,n.jsxs)("div",{className:"relative card-elev max-w-lg w-full max-h-[90dvh] flex flex-col animate-in zoom-in-95 duration-200",children:[(0,n.jsxs)("div",{className:"px-5 py-4 flex items-center justify-between flex-shrink-0",children:[(0,n.jsx)("h3",{className:"text-lg font-semibold text-text",children:r("menu.language")}),(0,n.jsx)("button",{onClick:t,className:"p-2 text-text-muted hover:text-text hover:bg-surface-2 rounded-brand transition-all duration-150 ease-out","aria-label":r("common.close"),children:(0,n.jsx)(s.X,{size:20})})]}),(0,n.jsx)("div",{className:"flex-1 overflow-y-auto modal-scrollable p-3",children:(0,n.jsx)("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-2",children:o.dI.map(e=>{let r=e.code===d;return(0,n.jsxs)("button",{onClick:()=>{var r;return r=e.code,void((0,a.e)(),u(r),t())},className:`px-2 py-2 rounded-brand flex items-center gap-2 transition-all duration-150 ease-out active:scale-[0.97] min-w-0 ${r?"bg-brand-500 text-white":"text-text hover:bg-surface-2"}`,children:[(0,n.jsx)("img",{src:`https://flagcdn.com/w80/${e.country}.png`,alt:e.label,className:"w-5 h-[14px] object-cover rounded-[2px] flex-shrink-0",loading:"lazy"}),(0,n.jsx)("span",{className:"flex-1 text-sm font-medium truncate text-left",children:e.label}),r&&(0,n.jsx)(s.aJ,{size:14,className:"flex-shrink-0"})]},e.code)})})})]})]}):null}},20464:(e,t,r)=>{r.d(t,{As:()=>f,zg:()=>u});var n=r(1521),i=r(29717),s=r(90076),a=r(11155),l=r(90084),o=r(2805),c=r(97711);let d="wrong-key-tail";async function u(e,t,r=s.qn){try{let t=new AbortController,n=setTimeout(()=>t.abort(),r),i=await fetch(`${e}/api/health`,{signal:t.signal});return clearTimeout(n),i.ok}catch{return!1}}async function h(e,{tail:t,tempKey:r},n=s.qn){try{let i=new AbortController,s=setTimeout(()=>i.abort(),n),a=await fetch(`${e}/api/verify-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({tail:t||null,tempKey:r||null}),signal:i.signal});if(clearTimeout(s),!a.ok)return null;return(await a.json())?.ok===!0}catch{return null}}async function p(){return(0,o._r)()?(0,o.rh)(await m()):(0,o.Yr)()?window.location.origin:null}async function m(){try{let e=await fetch(s.TR);return e.ok?await e.json():null}catch{return null}}function f(){let[e,t]=(0,n.useState)(!1),[r,o]=(0,n.useState)(""),u=(0,i.useRouter)(),{setAuth:f}=(0,c.Fo)(),g=(0,n.useCallback)(async(e,{persistSession:r=!0}={})=>{t(!0),o("");try{let t,n=await p();if(n){let t=e.tail||(0,a.Cj)(e.apiKey||""),i=e.tempKey||(e.token?.length<=8?e.token:null),s=await m(),c=(0,a.Uo)(s?.permanentKey||""),u=(0,a.Uo)(e.apiKey||e.token||""),p=String(s?.oneTimeKey||"").slice(0,6).toUpperCase(),g=i?!!p&&p===i.toUpperCase():!!c&&!!u&&(0,a.Uo)(c)===u;try{let s=g?await h(n,{tail:t,tempKey:i}):null;if(!0===s){let s=e.apiKey||i||"",o=(0,a.Uo)(s)||"direct";return t&&(0,l.LG)(o,{tail:t}),r&&f({apiKey:o,tunnelUrl:n,mode:"local",tempKey:i?i.toUpperCase():null,localIp:null}),{success:!0,shouldAskToSave:!0,apiKey:o}}if(!1===s)return o(d),{success:!1,wrongTail:!0}}catch{}}let i=new AbortController,c=setTimeout(()=>i.abort(),s.cC);try{t=await fetch(s.Sn.connect,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...e,apiKey:(0,a.Uo)(e.apiKey)}),signal:i.signal})}catch(e){throw Error(e?.name==="AbortError"?"Connection timed out. Please try again.":"Network error. Please try again.")}finally{clearTimeout(c)}if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error||"Authentication failed")}let u=await t.json(),g=(0,a.Uo)(e.apiKey||u.apiKey);u.hostKeys?.x&&(0,l.LG)(g,{hostSealKey:u.hostKeys.x,hostPubKey:u.hostKeys.ed||null});let y=e.tail||(0,a.Cj)(e.apiKey||"");if(u.tunnelUrl&&(y||e.tempKey)){let t=await h(u.tunnelUrl,{tail:y,tempKey:e.tempKey||null});if(!1===t)return o(d),{success:!1,wrongTail:!0}}return r&&f({apiKey:g,tunnelUrl:u.tunnelUrl||null,mode:"remote",tempKey:e.tempKey?e.tempKey.toUpperCase():null,localIp:u.localIp||null}),{success:!0,shouldAskToSave:!0,apiKey:g}}catch(e){return o(e.message),{success:!1,error:e.message}}finally{t(!1)}},[u,f]);return{loading:e,error:r,setError:o,authenticateWithToken:(0,n.useCallback)(async(e,t=!1,r=null,n)=>t?g({token:e,tempKey:e,tail:r},n):g({token:e},n),[g]),authenticateWithApiKey:(0,n.useCallback)((e,t)=>g({apiKey:e},t),[g])}}},27520:(e,t,r)=>{r.d(t,{FQ:()=>o,Lq:()=>m,UX:()=>l,k_:()=>d,yO:()=>c});var n=r(2805);let i=[],s=new Set,a=location.hostname.startsWith("dev.")||"localhost"===location.hostname&&!(0,n.gJ)()||"1"===localStorage.getItem("9remote:termLog");function l(){return a}function o(){return i}function c(e){return s.add(e),()=>s.delete(e)}function d(){for(let e of(i.length=0,s))try{e(null)}catch(e){}}function u(e){if(null==e)return"";if(e instanceof Uint8Array||ArrayBuffer.isView(e)||e instanceof ArrayBuffer)return`<${e.byteLength}b>`;if("string"==typeof e)return e.length>120?`${e.slice(0,60)}…${e.length}b`:e;if("object"==typeof e)try{return JSON.stringify(e)}catch(e){}return String(e)}let h=new Set(["recv"]),p=null;function m(e,...t){if(!a)return;let r=Date.now(),n=t.map(u).join(" ");if(p&&p.category===e&&p.baseMsg===n&&r-p.ts<3e3||h.has(e)&&p&&p.category===e&&r-p.ts<300){p.count=(p.count||1)+1,p.ts=r,p.msg=`${n} \xd7${p.count}`,queueMicrotask(()=>{for(let e of s)try{e(p)}catch(e){}});return}let l={ts:r,category:e,msg:n,baseMsg:n,count:1};p=l,i.push(l),i.length>800&&i.shift();try{console.log(`[termLog ${e}] ${n}`)}catch{}queueMicrotask(()=>{for(let e of s)try{e(l)}catch(e){}})}},29091:(e,t,r)=>{r.d(t,{B:()=>p});var n=r(2074),i=r(11472),s=r(34277),a=r(61826),l=r(33897);let o=(e,{min:t,max:r})=>Math.max(t,Math.min(r,Math.round(e)));var c=r(79253);let d={name:null,value:null},u=null,h=()=>{if(u&&(clearTimeout(u),u=null),null===d.name)return;let{name:e,value:t}=d;d.name=null,d.value=null;try{localStorage.setItem(e,JSON.stringify(t))}catch{}};window.addEventListener("pagehide",h),document.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&h()});let p=(0,n.v)((0,i.Zr)((e,t,r)=>({...{viewStack:[{type:"list"}],openedSessions:[],activeWorkspaceId:null,setActiveWorkspaceId:t=>e(e=>({activeWorkspaceId:t,fullMode:!!e.fullModes?.[t??l.AD]})),livePanes:[],touchLivePane:t=>e(e=>{let r=Array.isArray(t)?t:[t];return{livePanes:[...e.livePanes.filter(e=>!r.includes(e)),...r].slice(-s.kn)}}),mountedWorkspaces:{},markWorkspaceMounted:t=>e(e=>{let r=t??l.AD;return e.mountedWorkspaces[r]?e:{mountedWorkspaces:{...e.mountedWorkspaces,[r]:!0}}}),isWorkspaceMounted:e=>{let r=e??l.AD;return!!t().mountedWorkspaces[r]},drafts:{},setDraft:(t,r)=>e(e=>({drafts:{...e.drafts,[t]:r}})),collapsedWorkspaces:{},toggleWorkspace:t=>e(e=>({collapsedWorkspaces:{...e.collapsedWorkspaces,[t]:!e.collapsedWorkspaces[t]}})),cwdBySession:{},setCwd:(t,r)=>{if(!t||!r)return;let n=(0,c.kb)(r);e(e=>e.cwdBySession[t]===n?e:{cwdBySession:{...e.cwdBySession,[t]:n}})},pushView:t=>e(e=>{let r=Array.isArray(e.viewStack)?e.viewStack:[];return{viewStack:[...a.yP.includes(t?.type)?r:r.filter((e,t)=>!(a.yP.includes(e?.type)&&t===r.length-1)),t]}}),popView:()=>e(e=>{let t=Array.isArray(e.viewStack)?e.viewStack:[];return{viewStack:t.length>1?t.slice(0,-1):[{type:"list"}]}}),setViewStack:t=>e({viewStack:t}),addOpenedSession:t=>e(e=>({openedSessions:e.openedSessions.includes(t)?e.openedSessions:[...e.openedSessions,t]})),removeOpenedSession:t=>e(e=>{let{[t]:r,...n}=e.drafts,{[t]:i,...s}=e.pendingStartup,{[t]:a,...l}=e.artifactsBySession;return{artifactsBySession:l,openedSessions:e.openedSessions.filter(e=>e!==t),livePanes:e.livePanes.filter(e=>e!==t),hiddenPaneSessionIds:e.hiddenPaneSessionIds?e.hiddenPaneSessionIds.filter(e=>e!==t):[],drafts:n,pendingStartup:s}}),replaceOpenedSession:(t,r)=>e(e=>{if(!r||t===r)return e;let n=e=>e===t?r:e;return{openedSessions:!t||e.openedSessions.includes(t)?e.openedSessions.map(n):e.openedSessions.includes(r)?e.openedSessions:[...e.openedSessions,r],livePanes:e.livePanes.map(n)}}),clearOpenedSessions:()=>e({openedSessions:[],livePanes:[]}),reorderOpenedSessions:t=>e(e=>{let r=new Set(t),n=t.filter(t=>e.openedSessions.includes(t));if(n.length<2)return{};let i=0;return{openedSessions:e.openedSessions.map(e=>r.has(e)?n[i++]:e)}}),closeSession:t=>e(e=>{let{[t]:r,...n}=e.drafts,{[t]:i,...s}=e.pendingStartup,{[t]:a,...l}=e.agentBySession,o=((e,t)=>{let r={};for(let[n,i]of Object.entries(e))r[n]={at:0,sessions:t?i.sessions.map(t):i.sessions};return r})(e.agentHistory,e=>e.openSessionId===t?{...e,openSessionId:null}:e);return{openedSessions:e.openedSessions.filter(e=>e!==t),livePanes:e.livePanes.filter(e=>e!==t),drafts:n,pendingStartup:s,agentBySession:l,agentHistory:o}}),getCurrentView:()=>{let{viewStack:e}=t();return e[e.length-1]},getSelectedSession:()=>{let{viewStack:e}=t();for(let t=e.length-1;t>=0;t--)if("terminal"===e[t].type)return e[t].sessionId;return null},reset:()=>e({viewStack:[{type:"list"}],openedSessions:[],livePanes:[],activeWorkspaceId:null})},...{sidebarCollapsed:!1,toggleSidebar:()=>e(e=>({sidebarCollapsed:!e.sidebarCollapsed})),setSidebarCollapsed:t=>e({sidebarCollapsed:!!t}),sidebarWidth:s.gH.default,setSidebarWidth:t=>e({sidebarWidth:o(t,s.gH)}),fullModes:{},fullMode:!1,toggleFullMode:t=>e(e=>{let r=t??e.activeWorkspaceId??l.AD,n=!e.fullModes[r];return{fullModes:{...e.fullModes,[r]:n},fullMode:r===(e.activeWorkspaceId??l.AD)?n:e.fullMode}}),setFullMode:(t,r)=>e(e=>{let n="boolean"==typeof t?e.activeWorkspaceId??l.AD:t??e.activeWorkspaceId??l.AD,i="boolean"==typeof t?t:!!r;return{fullModes:{...e.fullModes,[n]:i},fullMode:n===(e.activeWorkspaceId??l.AD)?i:e.fullMode}}),hiddenPaneSessionIds:[],toggleHidePane:t=>e(e=>({hiddenPaneSessionIds:e.hiddenPaneSessionIds.includes(t)?e.hiddenPaneSessionIds.filter(e=>e!==t):[...e.hiddenPaneSessionIds,t]})),unhidePane:t=>e(e=>({hiddenPaneSessionIds:e.hiddenPaneSessionIds.filter(e=>e!==t)})),paneWidths:{},setPaneWidth:(t,r)=>e(e=>({paneWidths:{...e.paneWidths,[t]:null==r?null:o(r,s.k9)}})),rightPanelOpen:window.innerWidth>=s.jK,rightPanelTabs:{},rightPanelWidth:s.Ds.default,toggleRightPanel:()=>e(e=>({rightPanelOpen:!e.rightPanelOpen,rightPanelWasOpen:null})),closeRightPanel:()=>e({rightPanelOpen:!1,rightPanelWasOpen:null}),openRightPanel:()=>e({rightPanelOpen:!0,rightPanelWasOpen:null}),setRightPanelTab:(t,r)=>e(e=>({rightPanelOpen:!0,rightPanelWasOpen:null,...null!=r?{rightPanelTabs:{...e.rightPanelTabs,[r]:t}}:{}})),rightPanelRoots:{},setRightPanelRoot:(t,r)=>e(e=>{if(null==t)return e;let n=e.rightPanelRoots[t],i=r&&r!==t?r:void 0;if(n===i)return e;let s={...e.rightPanelRoots};return i?s[t]=i:delete s[t],{rightPanelRoots:s}}),setRightPanelWidth:t=>e({rightPanelWidth:o(t,s.Ds)}),editorFilePath:null,editorPanelWidth:s.Ao.default,setEditorPanelWidth:t=>e({editorPanelWidth:o(t,s.Ao)}),editorPreviewSeq:0,artifactTitle:null,rightPanelWasOpen:null,artifactSessionId:null,editorJump:null,openEditorFile:(t,r={})=>e(e=>({editorFilePath:t,editorPreviewSeq:r.preview?e.editorPreviewSeq+1:0,artifactTitle:r.artifactTitle||null,artifactSessionId:r.artifactSessionId||null,editorJump:r.line?{line:r.line,column:r.column,seq:(e.editorJump?.seq||0)+1}:null,...r.artifactTitle?{rightPanelWasOpen:e.rightPanelWasOpen??e.rightPanelOpen,rightPanelOpen:!1}:{}})),closeEditorFile:()=>e(e=>({editorFilePath:null,editorPreviewSeq:0,artifactTitle:null,artifactSessionId:null,rightPanelWasOpen:null,...e.rightPanelWasOpen?{rightPanelOpen:!0}:{},...e.artifactSessionId&&e.editorFilePath?{artifactsBySession:((e,t,r)=>{let n=e[t];if(!n)return e;let i=n.filter(e=>e.path!==r);if(i.length===n.length)return e;let{[t]:s,...a}=e;return i.length?{...a,[t]:i}:a})(e.artifactsBySession,e.artifactSessionId,e.editorFilePath)}:{}})),hiddenHeaderButtons:["mobile"],hiddenHeaderButtonsMigrated:!1,toggleHeaderButton:t=>e(e=>({hiddenHeaderButtons:e.hiddenHeaderButtons.includes(t)?e.hiddenHeaderButtons.filter(e=>e!==t):[...e.hiddenHeaderButtons,t]})),mobileLowPower:!1,setMobileLowPower:t=>e({mobileLowPower:!!t}),mobileOpen:!1,mobileMode:"float",mobilePanelWidth:s.b5.default,mobileFloatRect:null,setMobileOpen:t=>e({mobileOpen:!!t}),setMobileMode:t=>e({mobileMode:t,mobileOpen:!0}),setMobilePanelWidth:t=>e({mobilePanelWidth:o(t,s.b5)}),setMobileFloatRect:t=>e({mobileFloatRect:t}),mobileSession:null,setMobileSession:t=>e(e=>({mobileSession:"function"==typeof t?t(e.mobileSession):t}))},...{webglEnabled:!1,setWebglEnabled:t=>e({webglEnabled:!!t}),fontSize:null,setFontSize:t=>e({fontSize:t?Math.max(10,Math.min(18,Math.round(t))):null}),terminalTheme:"default",setTerminalTheme:t=>e({terminalTheme:t||"default"}),terminalBackgrounds:["art8"],setTerminalBackgrounds:t=>e({terminalBackgrounds:Array.isArray(t)?t.filter(Boolean):[]}),terminalBackgroundOpacity:null,setTerminalBackgroundOpacity:t=>e({terminalBackgroundOpacity:null==t?s._z:Number(Math.max(s.DW.min,Math.min(s.DW.max,Math.round(t/s.DW.step)*s.DW.step)).toFixed(2))}),customBackgrounds:[],setCustomBackgrounds:t=>e({customBackgrounds:Array.isArray(t)?t.filter(e=>e?.id&&e?.dataUrl):[]}),backgroundBySession:{},setSessionBackground:(t,r)=>e(e=>{let n={...e.backgroundBySession};return r?n[t]=r:delete n[t],{backgroundBySession:n}}),showFolderButton:!0,showNoteButton:!1,setShowFolderButton:t=>e({showFolderButton:!!t}),setShowNoteButton:t=>e({showNoteButton:!!t}),noteChips:[],addNoteChip:t=>e(e=>({noteChips:[...e.noteChips,t]})),removeNoteChip:t=>e(e=>({noteChips:e.noteChips.filter(e=>e!==t)})),pinnedNotes:{},setNotePinned:(t,r)=>e(e=>{let n={...e.pinnedNotes};return r?n[t]=!0:delete n[t],{pinnedNotes:n}})},...{agentCaps:{},setAgentCaps:t=>e({agentCaps:t||{}}),artifactEnabled:!1,setArtifactEnabled:t=>e({artifactEnabled:!!t}),mcpClients:[],setMcpClients:t=>e({mcpClients:Array.isArray(t)?t:[]}),agentClisBy:{},setAgentClis:(t,r)=>e(e=>({agentClisBy:{...e.agentClisBy,[t]:{list:Array.isArray(r)?r:[],at:Date.now()}}})),agentHistory:{},setAgentHistory:(t,r)=>e(e=>({agentHistory:{...e.agentHistory,[t]:{at:Date.now(),sessions:Array.isArray(r)?r:[]}}})),invalidateAgentHistory:()=>e(e=>({agentHistory:(e=>{let t={};for(let[r,n]of Object.entries(e))t[r]={at:0,sessions:n.sessions};return t})(e.agentHistory)})),agentBySession:{},setSessionAgent:(t,r)=>e(e=>e.agentBySession[t]===r?e:{agentBySession:{...e.agentBySession,[t]:r}}),pendingStartup:{},queueStartup:(t,r)=>e(e=>({pendingStartup:{...e.pendingStartup,[t]:r}})),consumeStartup:r=>{let n=t().pendingStartup[r];return void 0===n?null:(e(e=>{let{[r]:t,...n}=e.pendingStartup;return{pendingStartup:n}}),n)},artifactsBySession:{},pushArtifact:(t,r)=>e(e=>{if(!t||!r?.path)return{};let n=(e.artifactsBySession[t]||[]).filter(e=>e.path!==r.path);return{artifactsBySession:{...e.artifactsBySession,[t]:[r,...n].slice(0,s.zv)}}}),removeArtifact:(t,r)=>e(e=>({artifactsBySession:((e,t,r)=>{let n=e[t];if(!n)return e;let i=n.filter(e=>e.path!==r);if(i.length===n.length)return e;let{[t]:s,...a}=e;return i.length?{...a,[t]:i}:a})(e.artifactsBySession,t,r)}))}}),{name:"terminal-ui-state",partialize:e=>({viewStack:e.viewStack,openedSessions:e.openedSessions,agentBySession:e.agentBySession,activeWorkspaceId:e.activeWorkspaceId,collapsedWorkspaces:e.collapsedWorkspaces,webglEnabled:e.webglEnabled,fontSize:e.fontSize,terminalTheme:e.terminalTheme,terminalBackgrounds:e.terminalBackgrounds,terminalBackgroundOpacity:e.terminalBackgroundOpacity,backgroundBySession:e.backgroundBySession,showFolderButton:e.showFolderButton,showNoteButton:e.showNoteButton,noteChips:e.noteChips,pinnedNotes:e.pinnedNotes,sidebarCollapsed:e.sidebarCollapsed,sidebarWidth:e.sidebarWidth,fullModes:e.fullModes||{},fullMode:e.fullMode,hiddenPaneSessionIds:e.hiddenPaneSessionIds||[],paneWidths:e.paneWidths,rightPanelOpen:e.rightPanelOpen,rightPanelTabs:e.rightPanelTabs,rightPanelWidth:e.rightPanelWidth,editorPanelWidth:e.editorPanelWidth,hiddenHeaderButtons:e.hiddenHeaderButtons,hiddenHeaderButtonsMigrated:e.hiddenHeaderButtonsMigrated,mobileLowPower:e.mobileLowPower,mobileMode:e.mobileMode,mobilePanelWidth:e.mobilePanelWidth,mobileFloatRect:e.mobileFloatRect,artifactsBySession:e.artifactsBySession}),storage:{getItem:e=>{try{let t=localStorage.getItem(e);if(!t)return null;let r=JSON.parse(t);return r&&!Array.isArray(r.viewStack)&&(r.viewStack=[{type:"list"}]),r}catch{return null}},setItem:(e,t)=>{d.name=e,d.value=t,u||(u=setTimeout(h,s.eu))},removeItem:e=>{d.name===e&&(d.name=null,d.value=null),localStorage.removeItem(e)}},onRehydrateStorage:()=>e=>{e&&(Array.isArray(e.viewStack)&&0!==e.viewStack.length||(e.viewStack=[{type:"list"}]),window.location.pathname.replace(/\/+$/,"")===a.U2&&(e.viewStack=[{type:"list"}]),e.viewStack=e.viewStack.filter(e=>!a.yP.includes(e?.type)),0===e.viewStack.length&&(e.viewStack=[{type:"list"}]),Array.isArray(e.terminalBackgrounds)||(e.terminalBackgrounds=[]),e.terminalBackground&&"none"!==e.terminalBackground&&0===e.terminalBackgrounds.length&&(e.terminalBackgrounds=[e.terminalBackground]),e.agentBySession&&"object"==typeof e.agentBySession||(e.agentBySession={}),window.innerWidth<s.jK&&(e.rightPanelOpen=!1),!e.hiddenHeaderButtonsMigrated&&(e.hiddenHeaderButtonsMigrated=!0,Array.isArray(e.hiddenHeaderButtons)?e.hiddenHeaderButtons.includes("mobile")||(e.hiddenHeaderButtons=[...e.hiddenHeaderButtons,"mobile"]):e.hiddenHeaderButtons=["mobile"]))}}))},31408:(e,t,r)=>{function n(e,t){if(e===t)return!0;if(!e||!t||"object"!=typeof e||"object"!=typeof t)return!1;let r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let n of r)if(!(n in t)||e[n]!==t[n])return!1;return!0}function i(e,t){if(e===t)return!0;if(!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!n(e[r],t[r]))return!1;return!0}function s(e,t){if(e===t)return!0;if(!e||!t)return!1;let r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let i of r)if(!(i in t)||!n(e[i],t[i]))return!1;return!0}r.d(t,{dI:()=>n,h3:()=>s,nk:()=>i})},31735:(e,t,r)=>{r.d(t,{H$:()=>a,d6:()=>s});var n=r(1521),i=r(29717);let s=(e,t)=>{if(e&&t)try{localStorage.setItem("9remote_nav:"+e,t)}catch{}};function a(e){let t=(0,i.usePathname)(),r=(0,i.useSearchParams)();(0,n.useEffect)(()=>{if(!e||!t?.startsWith("/workspace"))return;let n=function(e,t){if(!e)return"";let r=t?.toString();return r?`${e}?${r}`:e}(t,r);n&&s(e,n)},[e,t,r])}},33897:(e,t,r)=>{r.d(t,{AD:()=>n,Jc:()=>o,Mt:()=>a,g4:()=>l,gk:()=>s,xs:()=>i});let n="__ungrouped__",i=e=>e?.workspaceId??e?.groupId??null;function s({sessions:e,openedSessions:t,livePanes:r,mountedWorkspaces:a,activeWorkspaceId:l,isDesktop:o}){let c=new Set(e.filter(e=>i(e)===(l??null)).map(e=>e.id)),d=t.filter(e=>c.has(e)),u=new Set([...d,...r.filter(e=>t.includes(e))]),h=t.filter(e=>u.has(e)),p=new Map(e.map(e=>[e.id,i(e)])),m=new Set(t.filter(e=>!!c.has(e)||!!o&&!!a[p.get(e)??n])),f=new Map(d.map((e,t)=>[e,t]));return{workspaceSessionIds:c,workspaceOpenedSessions:d,renderedSessions:h,mountedSet:m,workspaceIndex:f}}let a=(e,t,r)=>!t&&r.has(e)?120*r.get(e):0;function l({container:e,pane:t}){if(!e||!t||t.offsetWidth<=0)return null;let r=t.getBoundingClientRect().left-e.getBoundingClientRect().left;return Math.max(0,Math.min(e.scrollLeft+r-(e.clientWidth-t.offsetWidth)/2,e.scrollWidth-e.clientWidth))}function o({rowWidth:e,paneCount:t,sidebarWidth:r,sidePx:n,gapPx:i,paddingPx:s,minWidth:a}){return!(e>0)||t<=0?null:Math.max(a,Math.floor((e-r-s-n-(t-1)*i)/t))}},34277:(e,t,r)=>{r.d(t,{$Z:()=>ee,A_:()=>c,Ao:()=>p,B$:()=>K,BM:()=>es,DW:()=>H,Ds:()=>h,EE:()=>P,FC:()=>eg,Fz:()=>m,GL:()=>f,Gp:()=>et,IJ:()=>Y,Il:()=>ef,Jv:()=>l,KA:()=>b,KN:()=>$,Lo:()=>X,M8:()=>er,Mg:()=>eS,Nz:()=>ew,OM:()=>eu,Pj:()=>j,Pz:()=>Z,Qe:()=>d,RF:()=>ey,RS:()=>V,TM:()=>D,Tb:()=>v,Tk:()=>w,Uc:()=>ea,VE:()=>ec,W$:()=>E,YA:()=>em,YS:()=>x,ZU:()=>U,_C:()=>eT,_O:()=>Q,_z:()=>B,aD:()=>L,am:()=>T,ar:()=>N,b5:()=>g,b9:()=>eb,bl:()=>e_,bs:()=>C,c:()=>W,cK:()=>ev,dU:()=>ei,de:()=>eR,dt:()=>n,eE:()=>ed,eu:()=>I,fw:()=>eh,g$:()=>eA,gH:()=>u,hp:()=>R,i5:()=>ep,iW:()=>k,j4:()=>en,jK:()=>i,k9:()=>s,kn:()=>o,ll:()=>S,ok:()=>eC,pS:()=>a,pZ:()=>q,pt:()=>J,qQ:()=>A,qj:()=>y,qw:()=>el,t:()=>F,vP:()=>M,vk:()=>z,wu:()=>O,y:()=>ek,zm:()=>eo,zv:()=>_});let n=["git status","git add .",'git commit -m ""',"git push","git pull","git fetch","git diff","git log --oneline","git branch","git checkout","git checkout -b","git switch","git stash","git stash pop","git merge","git rebase","git clone","git remote -v","git restore","npm install","npm ci","npm run dev","npm run build","npm run test","npm run lint","npm outdated","pnpm install","pnpm dev","yarn dev","bun install","cd ..","cd ~","cd -","ls -la","ll","mkdir -p","cp -r","find . -name","du -sh","chmod +x","ln -s","grep -rn","grep -i","wc -l","tail -f","ps aux","df -h","free -h","lsof -i","netstat -tlnp","docker ps","docker ps -a","docker images","docker logs -f","docker exec -it","docker compose up -d","docker compose down","docker build -t","code .","claude","claude --continue","claude --resume","claude --dangerously-skip-permissions","claude mcp","codex","codex --full-auto"],i=760,s={min:400,max:1/0},a=2,l=0,o=12,c=250,d=8,u={default:190,min:180,max:1/0},h={default:190,min:190,max:1/0},p={default:420,min:280,max:1/0},m=[{id:"remote",labelKey:"menu.remoteDesktop",group:"header"},{id:"mobile",labelKey:"mobile.androidDevice",group:"header"},{id:"sites",labelKey:"menu.sites",group:"header"},{id:"notifications",labelKey:"menu.notificationsButton",group:"header"},{id:"folder",labelKey:"menu.showFolder",group:"pane",storeKey:"showFolderButton",setterKey:"setShowFolderButton"},{id:"note",labelKey:"menu.showNote",group:"pane",storeKey:"showNoteButton",setterKey:"setShowNoteButton"}],f=[{group:"header",titleKey:"menu.headerButtons"},{group:"pane",titleKey:"menu.showButtons"}],g={default:300,min:240,max:1/0},y={width:{default:300,min:240,max:900},height:{default:620,min:320},margin:12,defaultOffset:24},_=20,b=1e4,w={maxDepth:1,deepMaxDepth:3,cacheTtlMs:3e4},k={topThresholdLines:5,guardMs:600,minFetchBytes:256,chainMax:3,chainDebounceMs:300,disabled:!1},v=5242880,A=5,S=3e3,T=150,x=100,C=101,R=200,P={Escape:{data:"\x1b"},c:{ctrl:!0,data:"\x03",requireNoSelection:!0},d:{ctrl:!0,data:"\x04"},z:{ctrl:!0,data:"\x1a"},l:{ctrl:!0,data:"\f"}},I=250,$=999,D=["check again","continue","summarize"],L="terminal:noteSync",M="terminal:openSession",O=5e3,U=250,E=90,j={cursorBlink:!0,fontSize:12,fontSizeMobile:12,fontFamily:'ui-monospace, "SF Mono", "Cascadia Code", "Roboto Mono", "Noto Sans Mono", Menlo, Monaco, "Courier New", monospace',scrollback:15e3,convertEol:!0,allowProposedApi:!0,scrollOnUserInput:!0,fastScrollModifier:"none",smoothScrollDuration:0,rescaleOverlappingGlyphs:!0,minimumContrastRatio:4.5,macOptionIsMeta:!0};function N(e){return null!=e?e:window.innerWidth<768?j.fontSizeMobile:j.fontSize}let B=.8,F=.25,W="16,16,20",q="116,120,136",K=.28,H={min:.3,max:.95,step:.01},z={none:{label:"None"},art1:{label:"Anime 1",src:"/backgrounds/bg9.jpg"},art2:{label:"Anime 2",src:"/backgrounds/bg2.jpg"},art3:{label:"Anime 3",src:"/backgrounds/bg3.jpg"},art4:{label:"Anime 4",src:"/backgrounds/bg4.jpg"},art5:{label:"Anime 5",src:"/backgrounds/bg5.jpg"},art7:{label:"Anime 7",src:"/backgrounds/bg7.jpg"},art8:{label:"Anime 8",src:"/backgrounds/bg8.jpg"},art9:{label:"Anime 9",src:"/backgrounds/bg10.jpg"},art10:{label:"Anime 10",src:"/backgrounds/bg11.jpg"},art11:{label:"Anime 11",src:"/backgrounds/bg12.jpg"},art12:{label:"Anime 12",src:"/backgrounds/bg13.jpg"}};function J(e,t){return e&&t&&"none"!==t&&(z[t]||String(t).startsWith("custom"))?{...e,background:"#10101400"}:e}function G(e){return"custom"===e?"custom":"string"==typeof e&&e.startsWith("custom:")?e.slice(7):null}function V(e,t=[]){let r=G(e);return r?t.find(e=>e?.id===r)?.dataUrl||null:z[e]?.src||null}function Z(e){return z[e]?.label||(G(e)?"Custom":z.none.label)}let Q=4e3,X=2e4;function Y(e,t=[]){return Array.isArray(e)?e.filter(e=>{let r=G(e);return r?t.some(e=>e?.id===r):"none"===e||!!z[e]}):[]}function ee(e,t,r=[],n=0){var i;return Y([e],r)[0]||(i=Y(t,r),Array.isArray(i)&&0!==i.length&&i[n%i.length]||"none")}let et={gpuAcceleration:"auto",smoothScrollDuration:125},er={clipboard:!0,search:!0,image:!0},en=30,ei=2,es=100,ea=600,el=150,eo=4e3,ec=3e3,ed=8e3,eu=6e4,eh=3e4,ep="28%",em=400,ef={lineHeight:18,sensitivity:1,friction:.95,minVelocity:.3,maxVelocity:55,wheelStepLines:1,tuiThrottleMs:50,momentumRenderCadenceMs:33,tuiBackpressureTimeoutMs:120,sgrUp:(e,t)=>`\x1b[<64;${e};${t}M`,sgrDown:(e,t)=>`\x1b[<65;${e};${t}M`},eg={longPressMs:450,moveTolerance:10,wordChars:/[A-Za-z0-9._\-/~:@]/},ey={verbs:["cd","ls","ll","cat","less","more","head","tail","vim","nvim","nano","bat","code","code-insiders","rm","cp","mv","mkdir","touch","chmod","open","grep"],ttlMs:3e5,debounceMs:120,maxDirs:20,maxResults:8},e_={minDistance:60,ratio:1.5,maxDuration:500},eb=e=>!!e&&27!==e.charCodeAt(0),ew=e=>"string"==typeof e&&(/^\x1b\[[?>=][0-9;]*c$/.test(e)||/^\x1b\[[0-9]+;[0-9]+R$/.test(e)||/^\x1b\[0n$/.test(e)||/^\x1b\]\d+;/.test(e)),ek=[{id:"ctrl",label:"Ctrl",key:"Ctrl",type:"modifier"},{id:"opt",label:"Opt",key:"Alt",type:"modifier"},{id:"shift",label:"Shift",key:"Shift",type:"modifier"},{id:"meta",label:"⌘",key:"Meta",type:"modifier"},{id:"esc",label:"Esc",key:"Escape",type:"key"},{id:"tab",label:"Tab",key:"Tab",type:"key"},{id:"enter",label:"↵",key:"Enter",type:"key"},{id:"backspace",label:"⌫",key:"Backspace",type:"key"},{id:"up",label:"↑",key:"ArrowUp",type:"arrow"},{id:"down",label:"↓",key:"ArrowDown",type:"arrow"},{id:"left",label:"←",key:"ArrowLeft",type:"arrow"},{id:"right",label:"→",key:"ArrowRight",type:"arrow"},{id:"home",label:"Home",key:"Home",type:"key"},{id:"end",label:"End",key:"End",type:"key"},{id:"pgup",label:"PgUp",key:"PageUp",type:"key"},{id:"pgdn",label:"PgDn",key:"PageDown",type:"key"},{id:"del",label:"Del",key:"Delete",type:"key"},{id:"ins",label:"Ins",key:"Insert",type:"key"},{id:"ctrlA",label:"^A",key:"a",type:"ctrl"},{id:"ctrlC",label:"^C",key:"c",type:"ctrl"},{id:"ctrlD",label:"^D",key:"d",type:"ctrl"},{id:"ctrlE",label:"^E",key:"e",type:"ctrl"},{id:"ctrlK",label:"^K",key:"k",type:"ctrl"},{id:"ctrlL",label:"^L",key:"l",type:"ctrl"},{id:"ctrlN",label:"^N",key:"n",type:"ctrl"},{id:"ctrlP",label:"^P",key:"p",type:"ctrl"},{id:"ctrlR",label:"^R",key:"r",type:"ctrl"},{id:"ctrlT",label:"^T",key:"t",type:"ctrl"},{id:"ctrlU",label:"^U",key:"u",type:"ctrl"},{id:"ctrlW",label:"^W",key:"w",type:"ctrl"},{id:"ctrlX",label:"^X",key:"x",type:"ctrl"},{id:"ctrlY",label:"^Y",key:"y",type:"ctrl"},{id:"ctrlZ",label:"^Z",key:"z",type:"ctrl"},{id:"f1",label:"F1",key:"F1",type:"key"},{id:"f2",label:"F2",key:"F2",type:"key"},{id:"f3",label:"F3",key:"F3",type:"key"},{id:"f4",label:"F4",key:"F4",type:"key"},{id:"f5",label:"F5",key:"F5",type:"key"},{id:"f6",label:"F6",key:"F6",type:"key"},{id:"f7",label:"F7",key:"F7",type:"key"},{id:"f8",label:"F8",key:"F8",type:"key"},{id:"f9",label:"F9",key:"F9",type:"key"},{id:"f10",label:"F10",key:"F10",type:"key"},{id:"f11",label:"F11",key:"F11",type:"key"},{id:"f12",label:"F12",key:"F12",type:"key"},{id:"pipe",label:"|",key:"|",type:"key"},{id:"tilde",label:"~",key:"~",type:"key"},{id:"slash",label:"/",key:"/",type:"key"},{id:"backslash",label:"\\",key:"\\",type:"key"},{id:"dash",label:"-",key:"-",type:"key"},{id:"underscore",label:"_",key:"_",type:"key"}],ev=["esc","up","down","ctrlC","ctrl","opt","shift","tab","slash"],eA="enter",eS=[["left","right","home","end","pgup","pgdn","del"],["ctrlZ","ctrlR","ctrlL","ctrlA","ctrlE","ctrlW","ctrlD"],["f1","f2","f3","f4","f5","f10","f11"]],eT={base:"flex items-center justify-center rounded-brand font-semibold transition-all duration-150 ease-out active:scale-[0.94]",textNormal:"text-xs",textSmall:"text-[11px]",normal:"bg-surface-2 hover:bg-surface-3 text-text",arrow:"bg-surface-2 hover:bg-surface-3 text-text text-sm",modifierActive:"bg-brand-500 text-white shadow-sm",pinned:"bg-brand-500/15 hover:bg-brand-500/25 text-brand-400",size:{minWidth:"34px",height:"32px",paddingLeft:"6px",paddingRight:"6px"},sizeLarge:{minWidth:"38px",height:"32px",paddingLeft:"8px",paddingRight:"8px"},sizeSmall:{width:"28px",height:"28px"}},ex=["main","master"],eC=e=>ex.includes(e),eR={DELAY_MS:400,GAP_PX:6,EDGE_PX:8,MAX_WIDTH_PX:320,EST_HEIGHT_PX:48,SLACK_PX:.5}},38415:(e,t,r)=>{r.d(t,{Gf:()=>c,Gi:()=>p,Hu:()=>o,Nn:()=>u,O8:()=>s,cu:()=>d,el:()=>a,ij:()=>h,l7:()=>l,no:()=>m,pe:()=>n,rl:()=>i,xO:()=>f});let n="https://api.github.com",i="https://github.com/decolua/9remote",s=`${n}/repos/decolua/9remote`,a=`${s}/releases?per_page=100`,l=!1,o=".devcontainer/devcontainer.json",c="NREMOTE_API_KEY",d={name:"9Remote",image:"mcr.microsoft.com/devcontainers/universal:latest",postCreateCommand:"npm install -g 9remote@latest",postAttachCommand:"nohup 9remote start > /tmp/9remote.log 2>&1 &",forwardPorts:[2208],portsAttributes:{2208:{label:"9Remote Server",onAutoForward:"silent",visibility:"public"}}},u=3e3,h=60,p={available:"Available",starting:"Starting",shutdown:"Shutdown",unknown:"Unknown"},m={user:"/user",codespaces:"/user/codespaces",codespaceByName:e=>`/user/codespaces/${e}`,startCodespace:e=>`/user/codespaces/${e}/start`,userReposList:"/user/repos?per_page=100&sort=updated&affiliation=owner,collaborator",repoContents:(e,t,r)=>`/repos/${e}/${t}/contents/${r}`,createCodespaceForRepo:(e,t)=>`/repos/${e}/${t}/codespaces`,codespaceSecretsPublicKey:"/user/codespaces/secrets/public-key",codespaceSecret:e=>`/user/codespaces/secrets/${e}`,codespaceSecretRepos:(e,t)=>`/user/codespaces/secrets/${e}/repositories/${t}`};function f(e){return`https://${e}-2208.app.github.dev`}},42174:(e,t,r)=>{r.d(t,{A:()=>c});var n=r(73365),i=r(1521),s=r(98196),a=r(8910),l=r(78762),o=r(64683);function c({isOpen:e,onClose:t,onConfirm:r,title:d,message:u,confirmText:h,cancelText:p}){let{t:m}=(0,l.s)(),f=(0,i.useRef)(null),g=(0,i.useRef)(null),y=h??m("common.confirm"),_=p??m("common.cancel");return((0,i.useEffect)(()=>{if(!e)return;let t=requestAnimationFrame(()=>{g.current?.focus()});return()=>cancelAnimationFrame(t)},[e]),(0,i.useEffect)(()=>{if(!e)return;let n=e=>{if("Escape"===e.key)e.preventDefault(),e.stopPropagation(),t();else if("Enter"===e.key){if(f.current&&document.activeElement===f.current){e.preventDefault(),e.stopPropagation(),t();return}e.preventDefault(),e.stopPropagation(),(0,a.e)(),r?.(),t()}};return window.addEventListener("keydown",n,!0),()=>window.removeEventListener("keydown",n,!0)},[e,t,r]),!e||"u"<typeof document)?null:(0,s.createPortal)((0,n.jsxs)("div",{className:"fixed inset-0 z-[100] flex items-center justify-center px-4",style:{paddingTop:"max(1rem, env(safe-area-inset-top))",paddingBottom:"max(1rem, env(safe-area-inset-bottom))"},children:[(0,n.jsx)("div",{className:"absolute inset-0 bg-black/60 backdrop-blur-[2px] animate-in fade-in duration-150",onClick:t}),(0,n.jsxs)("div",{role:"dialog","aria-modal":"true",className:"relative card-elev max-w-md w-full my-auto max-h-[min(85%,calc(var(--app-height,85vh)-2rem))] overflow-y-auto animate-in zoom-in-95 duration-200",onClick:e=>e.stopPropagation(),onKeyDown:e=>e.stopPropagation(),children:[(0,n.jsx)("div",{className:"px-6 py-4",children:(0,n.jsx)("h3",{className:"text-lg font-semibold text-text",children:d})}),(0,n.jsx)("div",{className:"px-6 pb-4",children:(0,n.jsx)("p",{className:"text-text whitespace-pre-line",children:u})}),(0,n.jsxs)("div",{className:"px-6 py-4 flex justify-end gap-3",children:[(0,n.jsxs)("button",{ref:f,onClick:()=>{(0,a.e)(),t()},className:"px-4 py-2 bg-surface-2 hover:bg-surface-3 text-text rounded-brand transition-all duration-150 ease-out active:scale-[0.98] font-medium flex items-center gap-1.5",children:[(0,n.jsx)("span",{children:_}),(0,n.jsx)("kbd",{className:"hidden sm:inline-flex items-center text-[10px] font-mono px-1 py-0.5 rounded bg-surface-3 text-text-muted leading-none",children:"Esc"})]}),(0,n.jsxs)("button",{ref:g,onClick:()=>{(0,a.e)(),r?.(),t()},className:"px-4 py-2 bg-red-600 hover:bg-red-700 text-white rounded-brand transition-all duration-150 ease-out active:scale-[0.98] font-medium flex items-center gap-1.5 focus:outline-none focus:ring-2 focus:ring-red-500/50",children:[(0,n.jsx)("span",{children:y}),(0,n.jsx)("kbd",{className:"hidden sm:inline-flex items-center justify-center w-4 h-4 rounded bg-white/20 text-white",children:(0,n.jsx)(o.Lt,{size:10,strokeWidth:2.5})})]})]})]})]}),document.body)}},45111:(e,t,r)=>{r.d(t,{A:()=>i});var n=r(73365);function i({size:e="md",text:t,className:r=""}){return(0,n.jsxs)("div",{className:`flex flex-col items-center justify-center gap-3 ${r}`,children:[(0,n.jsx)("div",{className:`animate-spin rounded-full border-brand-500 border-t-transparent ${{sm:"h-4 w-4 border-2",md:"h-8 w-8 border-2",lg:"h-12 w-12 border-b-2"}[e]}`}),t&&(0,n.jsx)("p",{className:"text-brand-500 text-sm font-medium",children:t})]})}},51627:(e,t,r)=>{r.d(t,{U:()=>n});function n(e,t){if(!e||!t)return!1;let r=String(e).split(".").map(Number),n=String(t).split(".").map(Number);for(let e=0;e<3;e++){let t=r[e]||0,i=n[e]||0;if(t!==i)return t>i}return!1}},52159:(e,t,r)=>{r.d(t,{c:()=>i});var n=r(7938);function i(e,...t){n.eR.debug?.[e]&&console.log(...t)}},61826:(e,t,r)=>{r.d(t,{O5:()=>c,U2:()=>n,dX:()=>d,mn:()=>o,yP:()=>s});let n="/workspace",i={list:()=>n,terminal:e=>`${n}/terminal/${encodeURIComponent(e.sessionId||"")}`,files:e=>l(`${n}/files`,{ws:e.workspace,p:e.currentPath}),editor:e=>l(`${n}/editor`,{path:e.path,line:e.line,col:e.column}),git:e=>l(`${n}/git`,{ws:e.workspace}),remote:()=>`${n}/remote`,mobile:()=>`${n}/mobile`,workspaces:()=>`${n}/workspaces`,browse:e=>l(`${n}/browse`,{path:e.path}),pair:()=>`${n}/pair`,welcome:()=>`${n}/welcome`},s=["site"],a={"":"list",terminal:"terminal",files:"files",editor:"editor",git:"git",remote:"remote",mobile:"mobile",workspaces:"workspaces",browse:"browse",pair:"pair",welcome:"welcome"};function l(e,t){let r=Object.entries(t).filter(([,e])=>null!=e&&""!==e).map(([e,t])=>`${e}=${encodeURIComponent(t)}`).join("&");return r?`${e}?${r}`:e}function o(e,t){if(!e?.startsWith(n))return null;let[r,i]=e.slice(n.length).replace(/^\//,"").split("/"),s=a[r||""];if(!s)return null;let l=e=>t?.get(e)||void 0;switch(s){case"terminal":return{type:s,sessionId:i?decodeURIComponent(i):void 0};case"files":return{type:s,workspace:l("ws"),currentPath:l("p")};case"editor":return{type:s,path:l("path"),line:u(l("line")),column:u(l("col"))};case"git":return{type:s,workspace:l("ws")};case"browse":return{type:s,path:l("path")};default:return{type:s}}}function c(e){return(i[e?.type]||i.list)(e)}function d(e,t){let r=c(t),n=e.findIndex(e=>c(e)===r);if(-1!==n)return e.slice(0,n+1);if("terminal"===t.type&&e[e.length-1]?.type==="terminal"){let r=[...e];return r[r.length-1]=t,r}return null}function u(e){let t=Number(e);return Number.isFinite(t)?t:void 0}},63977:(e,t,r)=>{r.d(t,{freshAuth:()=>s});var n=r(90084),i=r(86251);async function s(e={},t){let r={...e,connectionMode:t},a=(0,n.lz)(e.apiKey),l=e.tempKey?(0,n.lz)(e.tempKey):null,o=l?.tail?l:a?.tail?a:a||l,c=o?.tail;if(delete r.keyTail,delete r.keyTailSealed,!c)return r;if(o?.hostSealKey){let e=await (0,i.Y)(c,o.hostSealKey);if(e)return r.keyTailSealed=e,r}return r.keyTail=c,r}},64683:(e,t,r)=>{r.d(t,{$o:()=>ej.A,AX:()=>e_.A,Ay:()=>to,BK:()=>e8.A,BZ:()=>X.A,Bm:()=>W.A,Cp:()=>z.A,Do:()=>l.A,F1:()=>o.A,FE:()=>e1.A,FW:()=>eU.A,Fc:()=>eO.A,GD:()=>O.A,GO:()=>ef.A,Gr:()=>I.A,Gv:()=>ew.A,Hx:()=>es.A,Ir:()=>d.A,J4:()=>e0.A,JG:()=>g.A,JU:()=>q.A,Jl:()=>m.A,Kq:()=>ta.A,LM:()=>ec.A,Lt:()=>x.A,M6:()=>eY.A,MA:()=>c.A,Mr:()=>eE.A,P6:()=>et.A,QR:()=>T.A,Qp:()=>a.A,RI:()=>i.A,TB:()=>e9.A,Ud:()=>V.A,VA:()=>ey.A,Vn:()=>ez.A,W1:()=>em.A,WE:()=>b.A,We:()=>e5.A,Wn:()=>S.A,X:()=>ts.A,X_:()=>D.A,ZH:()=>M.A,ZU:()=>e6.A,Ze:()=>eL.A,Zr:()=>K.A,_O:()=>te.A,_V:()=>ee.A,a4:()=>eb.A,aJ:()=>p.A,ak:()=>Z.A,bE:()=>e7.A,bd:()=>e3.A,cC:()=>u.A,c_:()=>y.A,dJ:()=>B.A,de:()=>ti.A,dx:()=>H.A,e6:()=>eS.A,e9:()=>eB.A,eM:()=>eq.A,ek:()=>eZ.A,es:()=>eA.A,f2:()=>G.A,f5:()=>P.A,gH:()=>eI.A,h1:()=>eh.A,iU:()=>j.A,jG:()=>eM.A,jj:()=>eg.A,jl:()=>w.A,jz:()=>eC.A,kU:()=>$.A,kV:()=>er.A,kr:()=>eo.A,kt:()=>eW.A,lM:()=>e4.A,lP:()=>ev.A,m0:()=>k.A,mN:()=>Q.A,nU:()=>eu.A,qz:()=>J.A,rX:()=>_.A,s3:()=>en.A,sU:()=>eX.A,sv:()=>N.A,ue:()=>eT.A,vR:()=>eP.A,vW:()=>eN.A,vd:()=>F.A,vj:()=>eH.A,vv:()=>ea.A,wB:()=>eG.A,wO:()=>eQ.A,ww:()=>Y.A,xq:()=>ep.A,xv:()=>eR.A,y8:()=>el.A,yQ:()=>f.A,yU:()=>eD.A,yd:()=>s.A,zP:()=>h.A,zW:()=>tt.A});var n=r(73365),i=r(87821),s=r(21878),a=r(79376),l=r(61659),o=r(6504),c=r(19307),d=r(74739),u=r(29967),h=r(17836),p=r(67494),m=r(66687),f=r(95188),g=r(54453),y=r(34582),_=r(70453),b=r(10949),w=r(64570),k=r(31258),v=r(59907),A=r(13374),S=r(17406),T=r(46431),x=r(29260),C=r(88433),R=r(49553),P=r(20478),I=r(17568),$=r(87831),D=r(1916),L=r(29418),M=r(18272),O=r(10550),U=r(9271),E=r(14251),j=r(50068),N=r(98173),B=r(10194),F=r(70362),W=r(17909),q=r(59437),K=r(33109),H=r(48433),z=r(86877),J=r(34271),G=r(60919),V=r(35723),Z=r(41046),Q=r(64629),X=r(6534),Y=r(5370),ee=r(59711),et=r(39831),er=r(9560),en=r(44159),ei=r(41098),es=r(20021),ea=r(14797),el=r(15504),eo=r(93292),ec=r(92165),ed=r(94304),eu=r(40789),eh=r(64871),ep=r(31805),em=r(19621),ef=r(40081),eg=r(38781),ey=r(88768),e_=r(68395),eb=r(88793),ew=r(25406),ek=r(10998),ev=r(64446),eA=r(12925),eS=r(93354),eT=r(73243),ex=r(89317),eC=r(12283),eR=r(1578),eP=r(90612),eI=r(43959),e$=r(24337),eD=r(76621),eL=r(59833),eM=r(67236),eO=r(37266),eU=r(97038),eE=r(72147),ej=r(68859),eN=r(93285),eB=r(20178),eF=r(65062),eW=r(87030),eq=r(67519),eK=r(457),eH=r(58450),ez=r(48088),eJ=r(56023),eG=r(59311),eV=r(38177),eZ=r(60659),eQ=r(1838),eX=r(34969),eY=r(42685),e0=r(99707),e1=r(6830),e2=r(20248),e3=r(11384),e5=r(50211),e8=r(64342),e9=r(60151),e4=r(81610),e6=r(11990),e7=r(52715),te=r(49387),tt=r(894),tr=r(2031),tn=r(58573),ti=r(51328),ts=r(3382),ta=r(57717);let tl={AlertCircle:i.A,ArrowDown:s.A,ArrowRight:a.A,ArrowUp:l.A,ArrowUpRight:o.A,Ban:c.A,Bell:d.A,Bot:u.A,Bug:h.A,Check:p.A,CheckCircle2:m.A,ChevronDown:f.A,ChevronLeft:g.A,ChevronRight:y.A,ChevronUp:_.A,ChevronsDownUp:b.A,Circle:w.A,ClipboardPaste:k.A,Command:v.A,Compass:A.A,Columns2:S.A,Copy:T.A,CornerDownLeft:x.A,Crown:C.A,Delete:R.A,Download:P.A,ExternalLink:I.A,Eye:$.A,EyeOff:D.A,Facebook:L.A,File:M.A,FileCode:O.A,FileJson:U.A,FilePlus:E.A,FileText:j.A,Files:N.A,Filter:B.A,Folder:F.A,FolderOpen:W.A,FolderPlus:q.A,GitBranch:K.A,GitFork:H.A,Github:z.A,Globe:J.A,GripVertical:G.A,Hand:V.A,HardDrive:Z.A,HelpCircle:Q.A,History:X.A,Home:Y.A,Image:ee.A,ImageOff:et.A,KeyRound:er.A,Keyboard:en.A,Laptop:ei.A,LayoutDashboard:es.A,Link2:ea.A,ListChecks:el.A,Loader2:eo.A,Lock:ec.A,LogIn:ed.A,LogOut:eu.A,Maximize2:eh.A,Minimize2:ep.A,Menu:em.A,Mic:ef.A,MicOff:eg.A,Monitor:ey.A,Moon:e_.A,MoreHorizontal:eb.A,MoreVertical:ew.A,MousePointer2:ek.A,Package:ev.A,Palette:eA.A,PanelLeft:eS.A,PanelLeftClose:eT.A,PanelLeftOpen:ex.A,PanelRight:eC.A,Paperclip:eR.A,Pause:eP.A,Pencil:eI.A,Pi:e$.A,Pin:eD.A,PinOff:eL.A,Play:eM.A,Plug:eO.A,Plus:eU.A,Power:eE.A,PowerOff:ej.A,QrCode:eN.A,RefreshCw:eB.A,Replace:eF.A,RotateCw:eW.A,Save:eq.A,Scissors:eK.A,Search:eH.A,Send:ez.A,SendHorizontal:eJ.A,Settings:eG.A,Share:eV.A,Shield:eZ.A,Smartphone:eQ.A,Sparkles:eX.A,Square:eY.A,SquarePen:e0.A,Star:e1.A,StickyNote:e2.A,Sun:e3.A,Target:e5.A,Terminal:e8.A,Trash2:e9.A,Triangle:e4.A,Type:e6.A,Undo2:e7.A,Upload:te.A,Users:tt.A,Volume2:tr.A,VolumeX:tn.A,Wallpaper:ti.A,X:ts.A,Zap:ta.A};function to({name:e,size:t=20,className:r="",...i}){let s=tl[e];return s?(0,n.jsx)(s,{size:t,className:r,strokeWidth:2,...i}):(console.warn(`Icon "${e}" not found in the icon registry`),null)}},73426:(e,t,r)=>{r.d(t,{U:()=>p,x$:()=>h,zm:()=>m});var n=r(90076),i=r(20464),s=r(31735),a=r(97711),l=r(11155),o=r(98988),c=r(90084),d=r(86129);let u=0;async function h(e,{currentKey:t}={}){let r=++u,c=o.rh.getState(),d=t||c.hosts[c.currentKey]?.full||c.currentKey;d&&((0,s.d6)(d,window.location.pathname+window.location.search),o.rh.getState().setAutoConnect((0,l.Uo)(d),!0));let p=await fetch(n.Sn.connect,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e})});if(!p.ok)throw Error("connect failed");let m=await p.json(),f=!1;for(let t=0;t<n.jP&&!f;t++)(f=await (0,i.zg)(m.tunnelUrl,e))||!(t<n.jP-1)||await new Promise(e=>setTimeout(e,n.dM));if(!f)throw Error("unreachable");r===u&&(0,a.vd)({apiKey:e,tunnelUrl:m.tunnelUrl,mode:"remote",localIp:m.localIp||null})}function p(e){try{e?sessionStorage.setItem(d.aS,"1"):sessionStorage.removeItem(d.aS)}catch{}}function m(e,{remember:t=!0,leavingHead:r=null,navigate:n=!0}={}){e?.tail&&e.tempKey&&(0,c.LG)(e.tempKey,{tail:e.tail}),p(t),r&&((0,s.d6)(r,window.location.pathname+window.location.search),o.rh.getState().setAutoConnect((0,l.Uo)(r),!0)),n&&(window.location.href="/workspace/")}},75687:(e,t,r)=>{r.d(t,{k:()=>n});function n(e){let t=String(e||"").trim(),r=e=>({tempKey:e.slice(0,6).toUpperCase(),tail:e.slice(6,8).toUpperCase()}),n=/#([A-NP-Z1-9]{6}-?[a-np-z1-9]{2})$/i.exec(t);if(n)return r(n[1].replace(/-/g,""));let i=/^([A-NP-Z1-9]{6}-?[a-np-z1-9]{2})$/i.exec(t);if(i)return r(i[1].replace(/-/g,""));let s=/[?&]k=([A-NP-Z1-9]{6})(?:[^A-NP-Z1-9]|$)/i.exec(t);return s?{tempKey:s[1].toUpperCase()}:/^[A-NP-Z1-9]{6}$/i.test(t)?{tempKey:t.toUpperCase()}:null}},79253:(e,t,r)=>{r.d(t,{$b:()=>b,A0:()=>z,AE:()=>g,Ax:()=>$,Dk:()=>P,GW:()=>q,Jl:()=>W,Kr:()=>H,L0:()=>Q,L8:()=>y,LN:()=>j,Qw:()=>M,RV:()=>function e(t){let r;if(!t||"object"!=typeof t)return t;if(Array.isArray(t)){let r=!1,n=t.map(t=>{let n=e(t);return n!==t&&(r=!0),n});return r?n:t}for(let s of Object.keys(t)){let a=t[s];if(i.has(s)&&"string"==typeof a&&a.includes("\\"))(r||={...t})[s]=n(a);else if(a&&"object"==typeof a){let n=e(a);n!==a&&((r||={...t})[s]=n)}}return r||t},W5:()=>X,YO:()=>k,ZH:()=>_,_C:()=>B,bd:()=>Z,cv:()=>F,d5:()=>K,fQ:()=>v,gh:()=>C,hh:()=>O,iB:()=>w,kS:()=>N,kb:()=>n,mv:()=>x,n2:()=>D,pA:()=>I,qu:()=>L,rL:()=>G,so:()=>A,u:()=>f,vd:()=>U,vs:()=>S,xW:()=>T,xl:()=>J,xr:()=>V,zT:()=>E});let n=e=>"string"==typeof e?e.replace(/\\/g,"/"):e,i=new Set(["path","currentPath","parentPath","dirPath","filePath","repoPath","oldPath","newPath","fullPath","relativePath"]),s=[".png",".jpg",".jpeg",".gif",".webp",".ico",".bmp",".svg",".avif",".apng",".tif",".tiff",".heic",".heif"],a=[".mp4",".m4v",".webm",".ogv",".mov",".mkv",".avi",".3gp"],l=[".mp3",".wav",".ogg",".oga",".flac",".m4a",".aac",".opus"],o=[".pdf"],c=[".docx"],d=[".xlsx",".xls",".csv",".tsv"],u=[".html",".htm",".xhtml"],h=[".mmd",".mermaid"],p=[".md",".markdown",".mdx"];function m(e,t){if(!e)return!1;let r=e.toLowerCase();return t.some(e=>r.endsWith(e))}let f=e=>m(e,s),g=e=>m(e,a),y=e=>m(e,l),_=e=>m(e,o),b=e=>m(e,c),w=e=>m(e,d);function k(e){return e?m(e,u)?"html":m(e,p)?"markdown":m(e,h)?"mermaid":null:null}let v="9remote-preview",A={".js":"javascript",".jsx":"javascript",".ts":"javascript",".tsx":"javascript",".mjs":"javascript",".cjs":"javascript",".html":"html",".htm":"html",".xhtml":"html",".css":"css",".scss":"css",".sass":"css",".less":"css",".styl":"css",".json":"json",".json5":"json",".jsonc":"json",".md":"markdown",".markdown":"markdown",".mdx":"markdown",".py":"python",".pyw":"python",".rb":"ruby",".php":"php",".go":"go",".rs":"rust",".java":"java",".kt":"kotlin",".kts":"kotlin",".swift":"swift",".scala":"scala",".clj":"clojure",".cljs":"clojure",".ex":"elixir",".exs":"elixir",".erl":"erlang",".hs":"haskell",".ml":"ocaml",".mli":"ocaml",".jl":"julia",".pl":"perl",".pm":"perl",".tcl":"tcl",".lua":"lua",".r":"r",".dart":"dart",".groovy":"groovy",".gradle":"groovy",".c":"c",".h":"c",".cpp":"cpp",".cc":"cpp",".cxx":"cpp",".hpp":"cpp",".hh":"cpp",".cs":"csharp",".m":"objectivec",".sh":"shell",".bash":"shell",".zsh":"shell",".fish":"shell",".ps1":"powershell",".bat":"batch",".cmd":"batch",".yml":"yaml",".yaml":"yaml",".toml":"toml",".ini":"ini",".cfg":"ini",".conf":"ini",".properties":"ini",".xml":"xml",".sql":"sql",".graphql":"graphql",".gql":"graphql",".proto":"protobuf",".vue":"vue",".svelte":"svelte",".csv":"csv",".tsv":"csv",".log":"log",".diff":"diff",".patch":"diff",".dockerfile":"dockerfile",".makefile":"makefile",".mk":"makefile",".env":"env",".gitignore":"gitignore"},S={M:"text-git-modified",A:"text-git-added",D:"text-git-deleted","?":"text-git-untracked",U:"text-git-modified"},T={normal:{indentBase:12,indentStep:12,icon:16,chevron:14,text:"text-[15px] sm:text-sm",padY:"py-1 sm:py-0.5"},compact:{indentBase:8,indentStep:8,icon:14,chevron:12,text:"text-[13px] sm:text-[12px]",padY:"py-0.5 sm:py-[1px]"}},x=e=>e?"folder-changed"===e?22:32:4,C=768,R="git-diff:",P=(e,t)=>`${R}${e}:${t}`,I=e=>"string"==typeof e&&e.startsWith(R),$=e=>{let t=e.slice(R.length),r=t.indexOf(":");return{status:t.slice(0,r),absPath:t.slice(r+1)}},D=(e,t,r)=>`${R}${e}:${t}\u0000${r}`,L=e=>{let{status:t,absPath:r}=$(e),n=r.indexOf("\0");return -1===n?{status:t,repoPath:null,filePath:r}:{status:t,repoPath:r.slice(0,n),filePath:r.slice(n+1)}},M=18,O=12,U=40,E=48,j=30,N=10,B=70,F=20,W={MAX_DIRS:40,DEBOUNCE_MS:300,PREVIEW_DEBOUNCE_MS:1e3,IDLE_UNWATCH_MS:6e4},q="fileExplorer:gitRefresh",K={sidebarWidth:"fileExplorer.sidebarWidth",sidebarVisible:"fileExplorer.sidebarVisible",bottomPanelVisible:"fileExplorer.bottomPanelVisible",bottomPanelHeight:"fileExplorer.bottomPanelHeight",activityPanel:"fileExplorer.activityPanel",recentFiles:"fileExplorer.recentFiles",openTabs:"fileExplorer.openTabs",editorFontSize:"fileExplorer.editorFontSize",wordWrap:"fileExplorer.wordWrap",expandedFolders:"fileExplorer.expandedFolders",showHidden:"fileExplorer.showHidden"},H={explorer:"explorer",search:"search",scm:"scm",settings:"settings"},z=14,J=4,G=9,V=10,Z=28,Q=5,X=4194304},79453:(e,t,r)=>{r.d(t,{g:()=>J});var n=r(86129);class i{static{this.id="base"}static{this.capabilities={control:!1,binary:!1,signaling:"none"}}static{this.priority={control:0,binary:0}}constructor(){this._listeners=new Map,this._state=n.Of.idle}get state(){return this._state}get ready(){return this._state===n.Of.open}supports(e){return!!this.constructor.capabilities[e]}getPriority(e){return this.constructor.priority[e]??0}on(e,t){this._listeners.has(e)||this._listeners.set(e,new Set),this._listeners.get(e).add(t)}off(e,t){this._listeners.get(e)?.delete(t)}_emit(e,...t){let r=this._listeners.get(e);if(r)for(let e of r)e(...t)}_setState(e){this._state!==e&&(this._state=e,this._emit("stateChange",e))}connect(e){throw Error("Not implemented: connect")}disconnect(){throw Error("Not implemented: disconnect")}send(e,t){throw Error("Not implemented: send")}}var s=r(48193),a=r(63977);let l={transports:["websocket"],reconnection:!1,reconnectionDelay:1e3,reconnectionDelayMax:5e3};class o{constructor({tunnelUrl:e,namespace:t="",socketOptions:r={}}){this._tunnelUrl=e,this._namespace=t,this._socketOptions=r}connect({onSocket:e,onFail:t}){let r=this._namespace?`${this._tunnelUrl}${this._namespace}`:this._tunnelUrl,n=this._tunnelUrl===window.location.origin?"local":"tunnel",i=(0,s.io)(r,{...l,...this._socketOptions,path:"/socket.io",auth:e=>{(0,a.freshAuth)(this._socketOptions.auth,n).then(e)}}),o=!1;i.once("connect",()=>{o||(o=!0,e(i,n))}),i.once("connect_error",()=>{o||(o=!0,t?.())})}}let c={transports:["websocket"],reconnection:!1};class d{constructor({tunnelUrl:e,localIp:t,namespace:r="",socketOptions:n={}}){this._tunnelUrl=e,this._localIp=t,this._namespace=r,this._socketOptions=n}connect({onSocket:e,onFail:t}){let r=!1,n=(t,n)=>{if(r){try{t.disconnect()}catch{}return}r=!0,e(t,n)},i=e=>this._namespace?`${e}${this._namespace}`:e,l=e=>({...c,...this._socketOptions,path:"/socket.io",auth:t=>{(0,a.freshAuth)(this._socketOptions.auth,e).then(t)}}),o=()=>{let e=this._tunnelUrl===window.location.origin?"local":"tunnel",a=(0,s.io)(i(this._tunnelUrl),l(e));a.once("connect",()=>n(a,e)),a.once("connect_error",()=>void(!r&&(r=!0,t?.())))};if(!this._localIp||"https:"===window.location.protocol)return void o();let d=(0,s.io)(i(`http://${this._localIp}`),l("local"));d.once("connect",()=>n(d,"local")),d.once("connect_error",()=>{r||(d.disconnect(),o())})}}var u=r(90076);let h=3;var p=r(52159),m=r(27520);let f=2e3,g=15,y=15,_=15,b=45;class w extends i{static{this.id="ws"}static{this.capabilities={control:!0,binary:!0,file:!0,signaling:"ws"}}static{this.priority={control:100,binary:10,file:10}}constructor(){super(),this._socket=null,this._connectionMode="local",this._retryTimer=null,this._retryAttempt=0,this._retryScheduled=!1,this._retryNowTimer=null,this._destroyed=!1,this._blocked=!1,this._updating=!1,this._connecting=!1,this._visibilityHandler=null,this._lastInboundAt=Date.now(),this._lastMsgAt=0,this._zombieWatchdogTimer=null,this._retrySeq=0}get lastInboundAt(){return this._lastInboundAt}get lastMsgAt(){return this._lastMsgAt}get socket(){return this._socket}get connectionMode(){return this._connectionMode}get blocked(){return this._blocked}setUpdating(e){this._updating=e,e&&(this._maxAttempts=b,this._retryAttempt=0,(0,p.c)("transport",`[ws] updating=true maxAttempts=${this._maxAttempts}`))}forceReconnect(){this._destroyed||this._forceReconnect()}retryNow(e="?"){if(this._blocked)return void(0,m.Lq)("switch",`ws retryNow SKIP by=${e} (blocked)`);let t=Date.now(),r=t-(this._lastRetryNowAt||0);if(r<3e3){this._retryNowTimer||(this._retryNowTimer=setTimeout(()=>{this._retryNowTimer=null,this.retryNow(`${e}-deferred`)},3e3-r)),(0,p.c)("transport","[ws] retryNow throttled → deferred"),(0,m.Lq)("switch",`ws retryNow DEFER by=${e} (${3e3-r}ms left)`);return}(0,m.Lq)("switch",`ws retryNow GO by=${e} (drops attempt ${this._retryAttempt})`),this._retrySeq++,this._lastRetryNowAt=t,clearTimeout(this._retryNowTimer),this._retryNowTimer=null,clearTimeout(this._retryTimer),clearTimeout(this._connectingTimer),this._retryTimer=null,this._retryScheduled=!1,this._retryAttempt=0,this._connecting=!1,this._destroyed=!0,this._detachSocketEvents(),this._socket?.disconnect(),this._socket=null,this._destroyed=!1,this._ctx?.onRetryStatus?.({isRetrying:!0,attempt:1,maxAttempts:this._maxAttempts,failed:!1}),this._setState(n.Of.connecting),this._connectInternal()}setBlocked(e){this._blocked=e,(0,p.c)("transport",`[ws] blocked=${e}`),e?(this._cancelRetry(),this._socket?.disconnect()):this._socket?.connected||this._destroyed||this._connectInternal()}connect(e){this._ctx=e,this._auth=e.auth,this._maxAttempts=this._auth.tempKey?g:y,this._reconnectMaxAttempts=_,this._destroyed=!1,this._attachNetworkListeners(),this._setState(n.Of.connecting),this._connectInternal()}disconnect(){this._destroyed=!0,this._retrySeq++,this._cancelRetry(),clearTimeout(this._zombieWatchdogTimer),this._removeNetworkListeners(),this._detachSocketEvents(),this._socket?.disconnect(),this._socket=null,this._setState(n.Of.closed)}send(e,t){if(!this._socket?.connected)return!1;if(e===n.l_.control){let{event:e,args:r=[],cb:n}=t;return n?this._socket.emit(e,...r,n):this._socket.emit(e,...r),!0}return e===n.l_.binary?(this._socket.emit("tiles-bin-v2",t),!0):e===n.l_.file&&(this._socket.emit("file-bin",t),!0)}_connectInternal(){if(this._connecting||this._socket?.connected||this._destroyed)return;if(!this._auth.tunnelUrl&&!this._auth.localIp){(0,p.c)("transport","[ws] connect HOLD (no tunnelUrl/localIp yet) → retry"),(0,m.Lq)("switch","ws connect HOLD (no url yet) → fetch on retry"),this._setState(n.Of.degraded),this._scheduleRetry();return}this._connecting=!0,clearTimeout(this._connectingTimer),this._connectingTimer=setTimeout(()=>{this._connecting=!1},f);let e={tunnelUrl:this._auth.tunnelUrl,namespace:this._auth.namespace||"",socketOptions:this._auth.socketOptions||{}};(0,p.c)("transport",`[ws] connect: tunnelUrl=${this._auth.tunnelUrl} localIp=${this._auth.localIp||"none"}`),new o(e).connect({onSocket:(e,t)=>{if(this._connecting=!1,clearTimeout(this._connectingTimer),this._socket?.connected&&this._socket!==e){try{e.disconnect()}catch{}return}this._connectionMode=t,this._socket=e,this._retryAttempt=0,this._updating=!1,this._maxAttempts=this._reconnectMaxAttempts,this._cancelRetry(),this._attachSocketEvents(e),(0,p.c)("transport",`[ws] connect mode=${t}`),(0,m.Lq)("switch",`ws open mode=${t}`),this._setState(n.Of.open)},onFail:()=>{this._connecting=!1,clearTimeout(this._connectingTimer),(0,p.c)("transport","[ws] connect FAIL → schedule retry"),this._scheduleRetry()}})}_attachSocketEvents(e){e.on("disconnect",e=>{(0,p.c)("transport",`[ws] disconnect reason=${e}`),(0,m.Lq)("switch",`ws disconnect reason=${e}`),this._setState(n.Of.degraded),this._destroyed||this._forceReconnect()}),e.on("connect_error",e=>{(0,p.c)("transport",`[ws] connect_error ${e?.message||e}`),this._setState(n.Of.degraded),this._forceReconnect()});let t=()=>{clearTimeout(this._zombieWatchdogTimer),this._zombieWatchdogTimer=setTimeout(()=>{if(!this._destroyed&&this._socket===e){if(Date.now()-this._lastInboundAt<n.Rh)return void t();(0,m.Lq)("switch","ws zombie watchdog → force reconnect"),this.forceReconnect()}},n.Rh)};t(),e.io?.on?.("ping",()=>{this._lastInboundAt=Date.now(),t()}),e.on("connect",()=>{this._lastInboundAt=Date.now(),t()}),e.onAny((e,t)=>{this._lastMsgAt=Date.now(),this._emit("message",{event:e,data:t,source:"ws"})})}_attachNetworkListeners(){this._visibilityHandler||(this._visibilityHandler=()=>{"visible"!==document.visibilityState||this._socket?.connected||this._connecting||this.retryNow("visible")},this._offlineHandler=()=>{(0,m.Lq)("switch","ws offline event → drop socket, degraded"),this._socket?.disconnect(),this._socket=null,this._setState(n.Of.degraded)},this._onlineHandler=()=>{this._socket?.connected||this._connecting?(0,m.Lq)("switch",`ws online event → skip (${this._connecting?"handshaking":"already up"})`):this.retryNow("online")},this._pagehideHandler=()=>{try{this._socket?.disconnect()}catch{}},window.addEventListener("pagehide",this._pagehideHandler),document.addEventListener("visibilitychange",this._visibilityHandler),window.addEventListener("offline",this._offlineHandler),window.addEventListener("online",this._onlineHandler))}_detachSocketEvents(){if(this._socket)try{this._socket.offAny()}catch{}}_removeNetworkListeners(){this._pagehideHandler&&(window.removeEventListener("pagehide",this._pagehideHandler),this._pagehideHandler=null),this._visibilityHandler&&(document.removeEventListener("visibilitychange",this._visibilityHandler),this._visibilityHandler=null),this._offlineHandler&&(window.removeEventListener("offline",this._offlineHandler),this._offlineHandler=null),this._onlineHandler&&(window.removeEventListener("online",this._onlineHandler),this._onlineHandler=null)}_forceReconnect(){if(!this._destroyed&&!this._blocked&&!this._retryScheduled&&!this._connecting){if(this._retrySeq++,this._retryAttempt++,this._retryAttempt>h){this._retryAttempt=0,this._scheduleRetry();return}this._socket?.disconnect(),this._socket=null,this._connectInternal()}}_scheduleRetry(){this._retryScheduled||this._destroyed||this._blocked||(this._retryScheduled=!0,this._retryTimer=setTimeout(()=>this._doRetry(),f))}async _doRetry(){if(this._destroyed)return;if("u">typeof document&&"hidden"===document.visibilityState){(0,m.Lq)("switch",`ws retry HOLD (hidden, still at ${this._retryAttempt}/${this._maxAttempts})`),this._retryScheduled=!1,this._scheduleRetry();return}this._retryAttempt++;let e=this._retryAttempt,t=this._retrySeq;if(e>this._maxAttempts){this._retryScheduled=!1,(0,m.Lq)("switch",`ws GAVE UP after ${this._maxAttempts} attempts → closed`),this._ctx?.onRetryStatus?.({isRetrying:!1,attempt:e,maxAttempts:this._maxAttempts,failed:!0}),this._setState(n.Of.closed);return}(0,p.c)("transport",`[ws] retry attempt=${e}/${this._maxAttempts}`),(0,m.Lq)("switch",`ws retry ${e}/${this._maxAttempts}`),this._ctx?.onRetryStatus?.({isRetrying:!0,attempt:e,maxAttempts:this._maxAttempts,failed:!1});try{let e=await fetch(u.Sn.connect,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:this._auth.apiKey})});if(!e.ok)throw Error("Failed");let{tunnelUrl:r,localIp:n}=await e.json();if(t!==this._retrySeq)return void(0,m.Lq)("switch","ws retry ABORT (superseded mid-fetch)");this._auth.tunnelUrl=r,this._auth.localIp=n||null,this._connectionMode="local",this._ctx?.onUrlUpdate?.({tunnelUrl:r,localIp:n}),this._socket?.disconnect(),this._retryScheduled=!1,this._connectInternal()}catch{if(t!==this._retrySeq)return;this._retryScheduled=!1,this._scheduleRetry()}}_cancelRetry(){clearTimeout(this._retryTimer),this._retryTimer=null,clearTimeout(this._retryNowTimer),this._retryNowTimer=null,this._retrySeq++,this._retryAttempt=0,this._retryScheduled=!1,this._ctx?.onRetryStatus?.({isRetrying:!1,attempt:0,maxAttempts:this._maxAttempts,failed:!1})}}function k(e,t){if(t instanceof Uint8Array){let e="";for(let r=0;r<t.length;r++)e+=String.fromCharCode(t[r]);return{__b:btoa(e)}}return t}function v(e,t){if(t&&"object"==typeof t&&"string"==typeof t.__b){let e=atob(t.__b),r=new Uint8Array(e.length);for(let t=0;t<e.length;t++)r[t]=e.charCodeAt(t);return r}return t}function A(e){return JSON.stringify(e,k)}function S(e,t=null){let r=[],n={event:e.event,args:function e(t,r){if(t instanceof ArrayBuffer)return r.push(new Uint8Array(t)),{__B:r.length-1};if(ArrayBuffer.isView(t))return r.push(new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),{__B:r.length-1};if(Array.isArray(t))return t.map(t=>e(t,r));if(t&&"object"==typeof t){let n={};for(let i of Object.keys(t))n[i]=e(t[i],r);return n}return t}(e.args||[],r),ackId:e.ackId??null,lens:r.map(e=>e.length)};t&&(n.frag=t.id,n.part=t.part,n.parts=t.parts);let i=new TextEncoder().encode(JSON.stringify(n)),s=new Uint8Array(4+i.length+r.reduce((e,t)=>e+t.length,0));new DataView(s.buffer).setUint32(0,i.length,!0),s.set(i,4);let a=4+i.length;for(let e of r)s.set(e,a),a+=e.length;return s}function T(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<4)throw Error("frame too short");let r=4+new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0);if(r>t.length)throw Error("frame header truncated");let n=JSON.parse(new TextDecoder().decode(t.subarray(4,r))),i=[],s=r;for(let e of n.lens||[]){if(s+e>t.length)throw Error("frame part truncated");i.push(t.subarray(s,s+e)),s+=e}return{event:n.event,args:function e(t,r){if(Array.isArray(t))return t.map(t=>e(t,r));if(t&&"object"==typeof t){if("number"==typeof t.__B)return r[t.__B]??null;let n={};for(let i of Object.keys(t))n[i]=e(t[i],r);return n}return t}(n.args||[],i),ackId:n.ackId??null,frag:n.frag,part:n.part,parts:n.parts}}function x(){let e=new Map;return{push(t){let{frag:r,part:n,parts:i}=t;if(null==r)return t;if(!Number.isInteger(n)||!Number.isInteger(i)||n<0||i<1||n>=i||i>4096)return null;let s=e.get(r);s||(e.size>=4&&e.delete(e.keys().next().value),s={slices:Array(i),got:0},e.set(r,s));let a=t.args?.[0];if(null==a||(!s.slices[n]&&(s.slices[n]=a,s.got++),s.got<i))return null;e.delete(r);let l=new Uint8Array(s.slices.reduce((e,t)=>e+t.byteLength,0)),o=0;for(let e of s.slices)l.set(e,o),o+=e.byteLength;return T(l)}}}var C=r(90084),R=r(7938);let P=null,I=0,$=new Map,D=0;async function L(e,t){let r=`9remote_turn_cache_${t?.slice(0,12)||"anon"}`;try{let e="u">typeof localStorage?localStorage.getItem(r):null;if(e){let t=JSON.parse(e);if(t?.expiresAt>Date.now()&&Array.isArray(t.iceServers)&&t.iceServers.length)return t.iceServers}}catch{}try{let n=await fetch(e,{headers:{"X-API-Key":t},signal:AbortSignal.timeout(4e3)});if(n.ok){let e=await n.json();if(e?.iceServers?.length){try{"u">typeof localStorage&&localStorage.setItem(r,JSON.stringify({iceServers:e.iceServers,expiresAt:Date.now()+828e5}))}catch{}return e.iceServers}}}catch(e){console.warn("[WebRtcProtocol] TURN fetch failed:",e.message)}return null}class M extends i{static{this.id="rtc"}static{this.capabilities={control:!0,binary:!0,file:!0,signaling:"external"}}static{this.priority={control:50,binary:100,file:100}}constructor(){super(),this._pc=null,this._dcControl=null,this._dcBinary=null,this._dcFile=null,this._dcMobile=null,this._typeDetail="dc-stun",this._localCandidateTypes=new Set,this._answerApplied=!1,this._pendingCandidates=[],this._iceReachedChecking=!1,this._everOpened=!1,this._isLoopback=!1,this._pendingEmit=null,this._flushTimer=null,this._latestTileTs=new Map,this._hbTimer=null,this._hbLastPing=0,this._hbFastCadence=!1,this._dcStallCount=0,this._dcStallSince=0,this._dcPrevQueued=0,this._peerEnv2=!1,this._peerFragCtl=!1,this._v2Announced=!1,this._v2RxSeen=!1,this._fragSeq=0,this._reassemble=x(),this._lastInboundAt=0,this._signalingHandlers={},this._signaling=null,this._useTurn=!1}get lastInboundAt(){return this._lastInboundAt}getPriority(e){return"dc-turn"===this._typeDetail?5:150}async connect(e){this._ctx=e,this._cleanupPeer(),this._peerEpoch=(this._peerEpoch??0)+1,this._localCandidateTypes=new Set,this._answerApplied=!1,this._pendingCandidates=[],this._iceReachedChecking=!1,this._everOpened=!1,this._isLoopback=!1,this._hbFastCadence=!1,this._dcStallCount=0,this._dcStallSince=0,this._dcPrevQueued=0,this._typeDetail="dc-stun",this._lastMid=null,this._remoteGatheringDone=!1,this._setState(n.Of.connecting),this.connectingSince=Date.now(),this.connectDeadline=this.connectingSince+n.AC,clearTimeout(this._connectTimer),this._connectTimer=setTimeout(()=>{this._state!==n.Of.open&&((0,p.c)("transport",`[rtc] connect timeout (${n.AC}ms, state=${this._state}) → close + retry`),this._closePeer(`connect-timeout (state=${this._state})`))},n.AC);let t=[{urls:["stun:stun.l.google.com:19302","stun:stun1.l.google.com:19302","stun:stun2.l.google.com:19302","stun:stun3.l.google.com:19302","stun:stun4.l.google.com:19302"]},{urls:"stun:global.stun.twilio.com:3478"},{urls:"stun:stun.cloudflare.com:3478"}];if(this._useTurn=!!(e.useTurn||e.profile?.rtc?.enableTurn),e.iceServers?.length)t=e.iceServers;else if(this._useTurn){let r=await L(u.Sn.turnCredentials,e.auth?.apiKey);r?.length&&(t=r)}let r=new RTCPeerConnection({iceServers:t,iceCandidatePoolSize:4,bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});this._pc=r;let i=e.profile?.rtc?.dcControl?.ordered??!0,s=r.createDataChannel("control",{ordered:i}),a=r.createDataChannel("binary",{ordered:!1,maxPacketLifeTime:500}),l=r.createDataChannel("file",{ordered:!0}),o=r.createDataChannel("mobile",{ordered:!0});a.binaryType="arraybuffer",s.binaryType="arraybuffer",l.binaryType="arraybuffer",o.binaryType="arraybuffer",this._dcControl=s,this._dcBinary=a,this._dcFile=l,this._dcMobile=o;let c=async()=>{if("open"!==s.readyState||"open"!==a.readyState)return;let e="";try{let t=await r.getStats();t.forEach(r=>{if("candidate-pair"===r.type&&"succeeded"===r.state){let n=[...t.values()].find(e=>e.id===r.localCandidateId),i=[...t.values()].find(e=>e.id===r.remoteCandidateId);(n?.candidateType==="relay"||i?.candidateType==="relay")&&(this._typeDetail="dc-turn");let s=n?.address||n?.ip||"",a=i?.address||i?.ip||"";("127.0.0.1"===s||"::1"===s||"127.0.0.1"===a||"::1"===a)&&(this._isLoopback=!0),e=`local=${n?.candidateType}/${n?.protocol} remote=${i?.candidateType}/${i?.protocol}`}})}catch{}this.send(n.l_.control,{event:"rtc:linkType",args:[this._typeDetail]}),(0,p.c)("transport",`[rtc] dc OPEN type=${this._typeDetail} ${e}`),(0,m.Lq)("switch",`rtc dc OPEN (${this._typeDetail} ${e})`),clearTimeout(this._connectTimer),this._connectTimer=null,this._everOpened=!0,this._lastInboundAt=Date.now(),this._setState(n.Of.open)};s.onopen=c,a.onopen=c;let d=()=>{let e=!this._dcControl||"closed"===this._dcControl.readyState,t=!this._dcBinary||"closed"===this._dcBinary.readyState;(0,m.Lq)("switch",`rtc dc-close (ctrl=${this._dcControl?.readyState} bin=${this._dcBinary?.readyState})`),e&&t?this._setState(n.Of.closed):this._setState(n.Of.degraded)};s.onclose=d,a.onclose=d,l.onclose=()=>{this._dcFile=null},o.onclose=()=>{this._dcMobile=null},s.onerror=e=>{let t=e.error?.message??"unknown";t.includes("User-Initiated")||console.error("[rtc] dcControl ERROR:",t)},a.onerror=e=>{let t=e.error?.message??"unknown";t.includes("User-Initiated")||console.error("[rtc] dcBinary ERROR:",t)},l.onerror=e=>{let t=e.error?.message??"unknown";t.includes("User-Initiated")||console.error("[rtc] dcFile ERROR:",t)},s.onmessage=({data:e})=>{let t;this._lastInboundAt=Date.now();try{let r;if("string"==typeof e)r=JSON.parse("string"==typeof e?e:new TextDecoder().decode(e),v);else r=T(e),this._v2RxSeen||(this._v2RxSeen=!0,(0,m.Lq)("switch","env2: first v2 binary frame DECODED from agent (mutual upgrade confirmed)"));t=this._reassemble.push(r)}catch(e){console.error("[rtc] control parse error:",e.message);return}if(t){if("__ping"===t.event){this._hbTimer||this._startHeartbeatWatch(),(this._hbLastPing?Date.now()-this._hbLastPing:1/0)<=2*n.KF&&(this._hbFastCadence=!0),this._hbLastPing=Date.now();try{s.send(A({event:"__pong",args:t.args||[]}))}catch{}return}this._emit("message",{event:t.event,data:t,source:"rtc"})}},a.onmessage=({data:e})=>{this._lastInboundAt=Date.now(),e instanceof ArrayBuffer&&this._receiveTile(e)},l.onmessage=({data:e})=>{this._lastInboundAt=Date.now(),e instanceof ArrayBuffer&&this._emit("binary",{channel:"file",buffer:e,source:"rtc"})},o.onmessage=({data:e})=>{this._lastInboundAt=Date.now(),e instanceof ArrayBuffer&&this._emit("binary",{channel:"mobile",buffer:e,source:"rtc"})},r.onicecandidate=({candidate:e})=>{var t;if(!e)return void this._sendSignaling({type:"ice",candidate:"",mid:this._lastMid||"0"});this._lastMid=e.sdpMid;let r=/typ (host|srflx|relay|prflx)/.exec(e.candidate||"");r&&this._localCandidateTypes.add(r[1]);let n=(t=e.candidate)&&t.includes("typ srflx")&&t.split(" ")[4]||null;n&&this._emit("netFingerprint",n),this._sendSignaling({type:"ice",candidate:e.candidate,mid:e.sdpMid})},r.oniceconnectionstatechange=()=>{(0,p.c)("transport",`[rtc] iceState=${r.iceConnectionState}`),(0,m.Lq)("switch",`rtc ice=${r.iceConnectionState} types=[${[...this._localCandidateTypes].join(",")}]`),"checking"===r.iceConnectionState&&(this._iceReachedChecking=!0),"disconnected"===r.iceConnectionState?this._setState(n.Of.degraded):"failed"===r.iceConnectionState?this._closePeer("ice-failed"):"connected"===r.iceConnectionState&&this._dcControl?.readyState==="open"&&this._dcBinary?.readyState==="open"&&this._setState(n.Of.open)},this._signaling=e.signaling,this._signaling?.on?.(e=>this._handleSignal(e));try{let e=await r.createOffer();await r.setLocalDescription(e),(0,p.c)("transport","[rtc] offer sent"),(0,m.Lq)("switch","rtc offer sent"),this._sendSignaling({type:"offer",sdp:e.sdp,useTurn:this._useTurn})}catch(e){console.error("[rtc] createOffer error:",e.message),this._closePeer(`create-offer:${e.message}`)}}disconnect(e="?"){this._closePeer(`manual-disconnect by=${e} state=${this._state}`),this._signaling?.off?.(),this._signaling=null}send(e,t){if(e===n.l_.control){if(this._dcControl?.readyState!=="open")return!1;let e={event:t.event,args:t.args||[],ackId:t.ackId||null},r=this._sendControlStallChecked(this._dcControl,e);return r&&this._peerEnv2&&!this._v2Announced&&(this._v2Announced=!0,(0,m.Lq)("switch","env2: client→agent control now SENT as v2 binary frames")),r}if(e===n.l_.binary){if(this._dcBinary?.readyState!=="open")return!1;try{return this._dcBinary.send(t),!0}catch(e){return console.error("[rtc] send binary error:",e.message),!1}}if(e===n.l_.file){if(this._dcFile?.readyState!=="open")return!1;try{if(this._dcFile.bufferedAmount>n.HE.dcBufferThreshold)return!1;return this._dcFile.send(t),!0}catch(e){console.error("[rtc] send file error:",e.message)}}return!1}_sendControlStallChecked(e,t){let r,i=e.bufferedAmount;if(i>0&&i>=this._dcPrevQueued){0===this._dcStallCount&&(this._dcStallSince=Date.now()),this._dcStallCount++;let e=Date.now()-this._dcStallSince;if(this._dcStallCount>=n.fP&&e>=n.b4)return this._closePeer(`dc-drain-stall (${i}B stuck ${e}ms)`),!1}else this._dcStallCount=0;if(this._peerEnv2)r=this._sendFramed(t);else try{e.send(A(t)),r=!0}catch(e){r=!1}return this._dcPrevQueued=e.bufferedAmount,r}get typeDetail(){return this._typeDetail}get isLoopback(){return this._isLoopback}_closePeer(e){(0,m.Lq)("switch",`rtc→closed reason=${e}`),this._cleanupPeer(),this._setState(n.Of.closed)}setPeerCaps(e){this._peerEnv2=!!e?.env2,this._peerFragCtl=!!e?.fragCtl}get maxControlBytes(){return this._pc?.sctp?.maxMessageSize||n.dT}_sendFramed(e){var t;let r,n,i=this._peerFragCtl?this.maxControlBytes:1/0,s=(t=++this._fragSeq,(n=function(e,t){if(e.byteLength<=t)return[e];let r=t-192;if(r<=0)return null;let n=Math.ceil(e.byteLength/r);if(n>4096)return null;let i=[];for(let t=0;t<n;t++)i.push(e.subarray(t*r,Math.min((t+1)*r,e.byteLength)));return i}(r=S(e),i))?1===n.length?[r]:n.map((r,i)=>S({event:e.event,args:[r]},{id:t,part:i,parts:n.length})):null);if(!s)return!1;try{for(let e of s)this._dcControl.send(e);return!0}catch(e){return(0,p.c)("transport",`[rtc] control send refused: ${e.message}`),!1}}_startHeartbeatWatch(){this._hbTimer&&(clearInterval(this._hbTimer),this._hbTimer=null),this._hbLastPing=Date.now(),this._hbTimer=setInterval(()=>{if(this._state!==n.Of.open){clearInterval(this._hbTimer),this._hbTimer=null;return}let e=Date.now()-this._hbLastPing;e>(this._hbFastCadence?n.An:n.mk)&&((0,p.c)("transport",`[rtc] heartbeat: no ping for ${e}ms → closing stalled peer`),this._closePeer(`heartbeat-stale (${e}ms)`))},n.KF)}async _addRemoteCandidate({candidate:e,mid:t}){e||(this._remoteGatheringDone=!0),await this._pc.addIceCandidate(new RTCIceCandidate(e?{candidate:e,sdpMid:t}:{candidate:"",sdpMid:t||"0"})).catch(()=>{})}_startDeadPathWatch(){clearInterval(this._deadPathTimer),this._deadPathTimer=setInterval(async()=>{if(this._state===n.Of.open||!this._pc)return this._stopDeadPathWatch();if(!this._remoteGatheringDone||"complete"!==this._pc.iceGatheringState)return;let e=0,t=0;try{(await this._pc.getStats()).forEach(r=>{"candidate-pair"===r.type&&(e++,"failed"===r.state&&t++)})}catch{return}e&&!(t<e)&&(this._stopDeadPathWatch(),this._closePeer(`dead-path (${t} pair(s) failed)`))},n.QS)}_stopDeadPathWatch(){clearInterval(this._deadPathTimer),this._deadPathTimer=null}_sendSignaling(e){this._signaling?.send?.(e)}async _handleSignal(e){if((0,p.c)("transport",`[rtc] signal: ${e.type}`),(0,m.Lq)("switch",`rtc signal recv=${e.type}`),this._pc)try{if("answer"===e.type){if(this._answerApplied||"stable"===this._pc.signalingState){(0,p.c)("transport","[rtc] duplicate answer ignored"),(0,m.Lq)("switch","rtc duplicate answer ignored");return}if(e.pub&&e.sig){let t=await this._verifyHostAnswer(e);if(t){console.error(`[rtc] host key verification FAILED (${t}) — relayed answer rejected`),this._closePeer(`host-key-rejected:${t}`);return}}await this._pc.setRemoteDescription(new RTCSessionDescription({type:"answer",sdp:e.sdp})),this._answerApplied=!0,(0,p.c)("transport","[rtc] answer set"),(0,m.Lq)("switch","rtc answer applied");let t=this._pendingCandidates;for(let e of(this._pendingCandidates=[],t))await this._addRemoteCandidate(e);clearTimeout(this._connectTimer),this.connectDeadline=Date.now()+n.HJ,this._startDeadPathWatch(),this._connectTimer=setTimeout(async()=>{if(this._state!==n.Of.open){try{let e=await this._pc.getStats();e.forEach(t=>{if("candidate-pair"!==t.type)return;let r=e.get(t.localCandidateId),n=e.get(t.remoteCandidateId),i=(r?.address||r?.ip||"?").split(":")[0].slice(-12),s=n?.address||n?.ip||"?";(0,m.Lq)("switch",`pair ${t.state} ${r?.candidateType}:${i}→${n?.candidateType}:${s}`)})}catch{}this._closePeer(`ice-timeout (state=${this._state})`)}},n.HJ)}else if("ice"===e.type){if(!this._answerApplied)return void this._pendingCandidates.push(e);await this._addRemoteCandidate(e)}else"error"===e.type&&((0,p.c)("transport",`[rtc] server error: ${e.message}`),this._closePeer(`server-error:${e.message}`))}catch(e){console.error("[rtc] signal handle error:",e.message)}}async _verifyHostAnswer(e){let t=this._ctx?.auth?.apiKey;if(!t)return null;let r=(0,C.lz)(t),n=r?.hostPubKey?r:null,i=!!r?.hostSealKey;if((0,p.c)("auth","[seal] verify answer:",{hostSentXpub:!!e.xpub,agentSentXpub:!!e.xpub,pinned:!!n,stalePin:!!(r?.hostPubKey&&!i),pendingFp2:(0,C.e1)()}),n){if(n.hostPubKey!==e.pub){let r=(0,C.e1)();return r&&await (0,C.t8)(e.pub,e.xpub)===r?((0,C.LG)(t,{hostPubKey:e.pub,hostSealKey:e.xpub,fp2:r}),(0,p.c)("transport","[rtc] host key re-pinned via fresh pairing fp2"),null):((0,p.c)("auth","[seal] REJECT answer — pinned pub differs (host key rotated?) and no fresh fp2 to re-pin"),"pinned-pub-mismatch")}let r=await (0,C.D5)(e.pub,e.sdp,e.sig);if(!1===r)return(0,p.c)("auth","[seal] REJECT answer — signature invalid (relay tampering?)"),"sig-invalid";if(null===r){if(!i)return(0,p.c)("auth","[seal] REJECT answer — no Ed25519 in browser and pinned fp2 predates sealing"),"no-ed25519-old-pin";let t=await (0,C.t8)(e.pub,e.xpub)===n.fp2;return t||(0,p.c)("auth","[seal] REJECT answer — fp2 fallback mismatch vs pinned",n.fp2),t?null:"fp2-mismatch"}return null}let s=(0,C.e1)();if(s){let r=await (0,C.t8)(e.pub,e.xpub);if(r!==s)return(0,p.c)("auth","[seal] REJECTED — fp2",r,"!= code",s,e.xpub?"":"(agent sent no sealing key — needs the source build)"),(0,C.HY)(),"pairing-fp2-mismatch";(0,C.LG)(t,{hostPubKey:e.pub,hostSealKey:e.xpub,fp2:r}),(0,p.c)("auth","[seal] pinned via RTC — fp2",r,"sealing key stored"),(0,p.c)("transport","[rtc] host key pinned via pairing fp2")}return null}natVerdict(){let e=this._localCandidateTypes;return this._everOpened||e.has("relay")?"ok":0===e.size||e.has("srflx")&&(!this._answerApplied||this._iceReachedChecking)?"unknown":"hard"}_cleanupPeer(){for(let e of(clearTimeout(this._connectTimer),this._connectTimer=null,this._stopDeadPathWatch(),this._hbTimer&&(clearInterval(this._hbTimer),this._hbTimer=null),[this._dcControl,this._dcBinary,this._dcFile,this._dcMobile]))if(e){e.onopen=null,e.onclose=null,e.onerror=null,e.onmessage=null;try{e.close()}catch{}}if(this._dcControl=null,this._dcBinary=null,this._dcFile=null,this._dcMobile=null,this._dcStallCount=0,this._dcStallSince=0,this._dcPrevQueued=0,this._isLoopback=!1,this._typeDetail="dc-stun",this._pc){this._pc.onicecandidate=null,this._pc.oniceconnectionstatechange=null;try{this._pc.close()}catch{}this._pc=null}this._pendingEmit=null,this._flushTimer&&(clearTimeout(this._flushTimer),this._flushTimer=null),this._latestTileTs.clear(),this._reassemble=x()}_receiveTile(e){let t=++I,n=e.byteLength;new Promise(n=>{let i=setTimeout(()=>{$.has(t)&&($.delete(t),n(null))},8e3),s=R.eR.decodeQueueCap;for(;$.size>=s;){let e=$.keys().next().value,t=$.get(e);if(!t)break;clearTimeout(t.timer),$.delete(e),t.resolve(null)}let a=function(){if(!1===P)return null;if(P)return P;try{P=new Worker(r.tu(new URL(r.p+r.u(3692),r.b)))}catch{return P=!1,null}return P.onmessage=({data:{tiles:e,timestamp:t,id:r,hasBitmap:n,error:i}})=>{D=0;let s=$.get(r);if(!s){if(e)for(let t of e)t.bitmap?.close?.();return}clearTimeout(s.timer),$.delete(r),s.resolve(i?null:{tiles:e,timestamp:t,hasBitmap:n})},P.onerror=e=>{console.error("[Worker] tileDecoder:",e.message),function(){if(P)try{P.terminate()}catch{}for(let{resolve:e}of(P=null,$.values()))try{e(null)}catch{}$.clear()}(),++D>=3&&(P=!1)},P}();if(!a){clearTimeout(i),$.delete(t),n(null);return}$.set(t,{resolve:n,timer:i}),a.postMessage({buffer:e,id:t,v:2},[e])}).then(e=>{if(!e)return;let{tiles:t,timestamp:r,hasBitmap:i}=e;for(let e of(this._pendingEmit||(this._pendingEmit={tiles:new Map,timestamp:r,hasBitmap:i,bytes:0}),this._pendingEmit.bytes+=n,t))r>=(this._latestTileTs.get(e.tileIndex)??0)?(this._latestTileTs.set(e.tileIndex,r),this._pendingEmit.tiles.get(e.tileIndex)?.bitmap?.close?.(),this._pendingEmit.tiles.set(e.tileIndex,e),r>this._pendingEmit.timestamp&&(this._pendingEmit.timestamp=r)):e.bitmap?.close?.();this._flushTimer&&clearTimeout(this._flushTimer),this._flushTimer=setTimeout(()=>{if(this._flushTimer=null,!this._pendingEmit)return;let{tiles:e,timestamp:t,hasBitmap:r,bytes:n}=this._pendingEmit;this._pendingEmit=null;let i=[...e.values()];i.length&&this._emit("message",{event:"tiles-data",data:{tiles:i,timestamp:t,hasBitmap:r,bytes:n,transport:this._typeDetail},source:"rtc"})},0)})}}let O=new Map;function U(e){if(!e?.id)throw Error("Adapter missing static id");O.set(e.id,e)}function E({urls:e,timeoutMs:t,PeerConnection:r}={}){let i=r||("u">typeof RTCPeerConnection?RTCPeerConnection:null);if(!i)return Promise.resolve(null);let s=[{urls:e||n.cx.urls}];return new Promise(e=>{let r,a,l=!1,o=t=>{if(!l){l=!0,clearTimeout(a);try{r.onicecandidate=null,r.close()}catch{}e(t)}};try{r=new i({iceServers:s,iceCandidatePoolSize:0})}catch{return e(null)}a=setTimeout(()=>o(null),t??n.cx.timeoutMs),r.onicecandidate=({candidate:e})=>{var t;if(!e)return o(null);let r=(t=e.candidate)&&t.includes("typ srflx")&&t.split(" ")[4]||null;r&&o(r)};try{r.createDataChannel("probe"),r.createOffer().then(e=>r.setLocalDescription(e)).catch(()=>o(null))}catch{o(null)}})}let j="no-public-ip";function N(e){let t=0,r=!1;for(let n of e.values())"candidate-pair"===n.type&&(n.nominated||n.selected)&&(r=!0,t+=(n.bytesReceived??0)+(n.responsesReceived??0));return r?t:null}function B(e,t="stale"){let r=e._adapters.get("ws"),i=Math.max(r?.lastInboundAt??0,r?.lastMsgAt??0),s=r?.ready&&function({ready:e=!0,lastInboundAt:t=0,now:r}={}){return!!e&&(!t||r-t>=n.Rh)}({ready:!0,lastInboundAt:i,now:Date.now()});if(r){let e=r.lastInboundAt??0,n=r.lastMsgAt??0,i=Date.now();(0,m.Lq)("switch",`zombie check (${t}): verdict=${!!s} ready=${!!r.ready} lastPong=${e?`${i-e}ms`:"never"} lastMsg=${n?`${i-n}ms`:"never"}`)}if(!s)return!1;(0,p.c)("transport",`[pm] ws zombie (${t}) → force reconnect`);try{r.forceReconnect?.()}catch{}return!0}function F(e,t){let r=e._adapters.get("rtc"),i=r?._pc;if(!i||"failed"===i.connectionState)return void e._forceRestartRtc(`${t}-pc-failed`);if(e._probeLive?.rtc===r)return void(0,m.Lq)("switch",`${t} probe shared (already measuring this peer)`);clearTimeout(e._resumeProbeTimer);let s=++e._probeToken;e._probeLive={rtc:r,token:s},(async()=>{let t=N(await i.getStats());return null==t||(await new Promise(t=>{e._resumeProbeTimer=setTimeout(t,n.UT)}),s!==e._probeToken)?null:N(await i.getStats())-t})().then(i=>{if(s!==e._probeToken)return;let a=r?.lastInboundAt&&Date.now()-r.lastInboundAt<n.mk;null!=i&&i>0||a?(0,m.Lq)("switch",`${t} probe alive (Δ=${i}, recent=${!!a})`):((0,m.Lq)("switch",`${t} probe DEAD (Δ=${i}) → forceRestartRtc`),e._forceRestartRtc(`${t}-probe-dead`))}).catch(()=>{s!==e._probeToken||(r?.lastInboundAt&&Date.now()-r.lastInboundAt<n.mk?(0,m.Lq)("switch",`${t} probe error ignored (rtc recently active)`):((0,m.Lq)("switch",`${t} probe error → forceRestartRtc`),e._forceRestartRtc(`${t}-probe-error`)))}).finally(()=>{e._probeLive?.token===s&&(e._probeLive=null)})}function W(e,t){if(t?.type!=="error")return!1;let r=t.message===n.bg.pending?"pending":t.message===n.bg.rejected?"rejected":null;return!!r&&((0,p.c)("transport",`[pm] device ${r} → approval UI`),e._awaitingApproval=!0,e._wsCallbacks.onApproval?.(r),!0)}function q(e){if((0,m.Lq)("switch","signaling ready"),H(e),e._awaitingApproval)return;let t=e._adapters.get("rtc");if(!t){(0,m.Lq)("switch","sig-ready → start rtc (was deferred)"),e._startSecondaryAdapters();return}t.state===n.Of.closed&&((0,m.Lq)("switch","sig-ready → restartRtc (rtc was closed)"),e._restartRtc("sig-ready"))}function K(e,t){!(e._sig?.ready&&e._sig.send(t))&&("offer"===t.type&&(e._sigBuffer=e._sigBuffer.filter(e=>"offer"!==e.type&&"ice"!==e.type)),e._sigBuffer.push(t),e._sigBuffer.length>32&&e._sigBuffer.shift())}function H(e){if(!e._sigBuffer.length)return;let t=e._sigBuffer;for(let r of(e._sigBuffer=[],t))K(e,r)}async function z(e){if(e._auth.tunnelUrl!==window.location.origin)try{(0,p.c)("transport",`[pm] refreshTunnelUrl: fetching from ${u.O}/api/connect`);let t=await fetch(`${u.O}/api/connect`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e._auth.apiKey})});if(!t.ok)return void(0,p.c)("transport",`[pm] refreshTunnelUrl: HTTP ${t.status}`);let r=await t.json();(0,p.c)("transport",`[pm] refreshTunnelUrl: got ${r.tunnelUrl} (was ${e._auth.tunnelUrl})`),r.tunnelUrl&&r.tunnelUrl!==e._auth.tunnelUrl&&(e._auth.tunnelUrl=r.tunnelUrl)}catch(e){(0,p.c)("transport",`[pm] refreshTunnelUrl: error ${e.message}`)}}U(w),U(M);class J{constructor(e,t){const{profile:r,auth:i,wsCallbacks:s,rtcCallbacks:a,peerId:l}=function(e,t){let r=t?.enableWebRTC?"remoteDesktop":"clientApp",i={...n.j3[r]};t?.enableWebRTC||(i.enabled=["ws"]),t?.enableTurn&&(i.rtc={...i.rtc,enableTurn:!0});let s={tunnelUrl:e.tunnelUrl,localIp:e.localIp,apiKey:e.apiKey,tempKey:e.tempKey,deviceId:e.deviceId,namespace:e.namespace,socketOptions:e.socketOptions},a={onConnect:e.onConnect,onDisconnect:e.onDisconnect,onRetryStatus:e.onRetryStatus,onUrlUpdate:e.onUrlUpdate,onApproval:e.onApproval},l=t?{onUpgrade:t.onUpgrade,onFallback:t.onFallback,onTransportChange:t.onTransportChange}:{},o=`${e.deviceId}:${Math.random().toString(36).slice(2,10)}`;return s.socketOptions?.auth&&(s.socketOptions.auth.peerId=o),{profile:i,auth:s,wsCallbacks:a,rtcCallbacks:l,peerId:o}}(e,t);for(const e of(this._profile=r,this._auth=i,this._wsCallbacks=s,this._rtcCallbacks=a,this._peerId=l,Object.assign(this,{_adapters:new Map,_buffer:[],_pendingAcks:new Map,_ackTimers:new Map,_ackSeq:0,_rtcRestartAttempts:0,_rtcRestartTimer:null,_rtcRestartDueAt:0,_probeAttempts:0,_rtcGivenUp:!1,_giveUpIp:null,_lastStunProbeAt:0,_rejoinDebounceTimer:null,_netFingerprint:null,_awaitingApproval:!1,_ackTimeoutMs:n.QZ.ackTimeoutMs,_hiddenAt:null,_resumeProbeTimer:null,_probeToken:0,_probeLive:null,_connected:!1,_type:"ws",_connectionMode:"tunnel",_lastWsState:null,_rawSocket:null,_onConnectFired:!1,_rtcSignalingHandler:null,_sig:null,_sigDestroyed:!1,_sigBuffer:[],_wsFallbackTimer:null}),this._bus=function(e){let t=new Map,r=(e,r)=>{t.has(e)||t.set(e,[]),t.get(e).push(r)},n=(e,r)=>{let n=t.get(e);if(!n)return;let i=n.findIndex(e=>e===r||e._original===r);-1!==i&&n.splice(i,1)};return{_listeners:t,get connected(){return e._anyAdapterReady()},get id(){return e._rawSocket?.id||null},emit(t,...r){e._sendControl(t,r)},on(e,t){r(e,t)},off(e,t){n(e,t)},once(e,t){let i=(...r)=>{n(e,i),t(...r)};i._original=t,r(e,i)},listeners:e=>[...t.get(e)||[]],dispatch(e,r=[]){let n=t.get(e);if(n?.length){for(let e of[...n])if(n.includes(e))try{e(...r)}catch{}}},clear(){t.clear()},disconnect(){e._rawSocket?.disconnect()},kickWsZombie:t=>e.kickWsZombie(t)}}(this),this.busRef={current:this._bus},C.IU))this._bus.on(e,t=>(0,C.lu)(this,e,t));this._watchers=function(e){let t=()=>{let t;if((0,m.Lq)("switch",`visibility=${document.visibilityState}`),"visible"!==document.visibilityState)return;let r=e._adapters.get("ws"),i=e._adapters.get("rtc");if((0,m.Lq)("switch",`resume check: ws=${r?.ready?"ready":r?.state} rtc=${i?.ready?"ready":i?.state}`),B(e,"resume"),e._awaitingApproval)return;if(e._rtcGivenUp)return void e._maybeRearmRtc();if(t=e._rtcRestartTimer?Math.max(e._rtcRestartDueAt-Date.now(),0):-1,(0,m.Lq)("switch",`RESET attempts (was ${e._rtcRestartAttempts}) reason=resume pendingIn=${t}ms`),e._rtcRestartAttempts=0,e._probeAttempts=0,t<=n.QZ.backoffMs[0]||((0,m.Lq)("switch",`resume: pending rung was ${t}ms out → re-arm fast`),e._disarmRestart(),e._scheduleRtcRestart("resume-rearm")),!e._canSignal())return void e._sig?.retryNow("resume-no-carrier");let s=i?.state;i&&s!==n.Of.closed&&s!==n.Of.degraded?function(e){let t=e._adapters.get("rtc");if(!t?.ready)return e._restartRtc("resume-not-ready");let r=e._hiddenAt?Date.now()-e._hiddenAt:0;if("function"==typeof matchMedia&&matchMedia("(pointer: coarse)").matches&&r>n.Tr){(0,m.Lq)("switch",`resume: hidden ${Math.round(r/1e3)}s on touch → skip probe, force restart`),(0,p.c)("transport",`[pm] resume: hidden ${Math.round(r/1e3)}s → immediate restart`),e._forceRestartRtc("resume-hidden-touch");return}F(e,"resume")}(e):((0,m.Lq)("switch",`visibility → restartRtc (rtc=${s||"absent"})`),e._restartRtc("resume-dead-rtc"))},r=()=>{if("hidden"===document.visibilityState){e._hiddenAt=Date.now();return}clearTimeout(e._resumeCoalesceTimer),e._resumeCoalesceTimer=setTimeout(t,150)};document.addEventListener("visibilitychange",r);let i=!1,s=r=>{let n=!!r.detail?.hidden;if(n!==i){if(i=n,n){e._hiddenAt=Date.now();return}clearTimeout(e._resumeCoalesceTimer),e._resumeCoalesceTimer=setTimeout(t,150)}};document.addEventListener("app-visibility",s);let a=()=>{"visible"===document.visibilityState&&r()},l=()=>{e._hiddenAt=Date.now()};document.addEventListener("resume",a),document.addEventListener("freeze",l);let o=()=>{clearTimeout(e._netDebounceTimer),e._netDebounceTimer=setTimeout(()=>{!1===navigator.onLine?(0,m.Lq)("switch","net-change: still offline → wait"):((0,p.c)("transport","[pm] network change → probe rtc"),(0,m.Lq)("switch",`net-change: online=${navigator.onLine} → kick sig + ws + rtc`),e._sig?.retryNow("net-change"),e.retryNow("net-change"),(0,m.Lq)("switch",`RESET attempts (was ${e._rtcRestartAttempts}) givenUp=${e._rtcGivenUp} reason=net-change`),e._rtcRestartAttempts=0,e._probeAttempts=0,e._rtcGivenUp=!1,e._giveUpIp=null,e._shouldRenegotiate()&&e._restartRtc("net-change"))},n.o_.debounceMs)};return window.addEventListener("online",o),navigator.connection?.addEventListener?.("change",o),{visibilityHandler:r,detach(){document.removeEventListener("visibilitychange",r),document.removeEventListener("app-visibility",s),document.removeEventListener("resume",a),document.removeEventListener("freeze",l),window.removeEventListener("online",o),navigator.connection?.removeEventListener?.("change",o),clearTimeout(e._netDebounceTimer),e._netDebounceTimer=null,clearTimeout(e._resumeCoalesceTimer),e._resumeCoalesceTimer=null}}}(this)}get type(){return this._type}get connected(){return this._connected}get connectionMode(){return this._connectionMode}get wsBlocked(){return this._adapters.get("ws")?.blocked||!1}setWsBlocked(e){this._adapters.get("ws")?.setBlocked(e)}setUpdating(e){this._adapters.get("ws")?.setUpdating(e)}retryNow(e="user"){let t=this._adapters.get("ws");t?t.retryNow?.(e):((0,m.Lq)("switch",`retryNow by=${e}: no ws adapter → full connect()`),this.connect())}kickWsZombie(e="stale"){return B(this,e)}emit(e,...t){this._sendControl(e,t)}sendBinary(e,t){let r=this._pickAdapter(e);return!!r&&r.send(e,t)}connect(){this._sigDestroyed=!1;let e=this._profile.enabled.includes("rtc");e&&this._initSignalingClient(),e&&(this._canSignal()?this._startSecondaryAdapters():((0,m.Lq)("switch","rtc deferred — waiting for signaling relay"),clearTimeout(this._rtcDeferTimer),this._rtcDeferTimer=setTimeout(()=>{this._sigDestroyed||this._adapters.has("rtc")||((0,m.Lq)("switch","rtc defer expired → start anyway"),this._startSecondaryAdapters())},n.BF))),this._startWsFallback(),(0,p.c)("transport","[pm] connect: RTC + WS parallel (RTC preferred, WS warm standby)."),(0,m.Lq)("switch","connect: RTC + WS parallel")}async _startWsFallback(){if(!(this._adapters.has("ws")||this._sigDestroyed||this._adapters.get("rtc")?.isLoopback)){if((0,m.Lq)("switch","ws-fallback: start (refresh url)"),await this._refreshTunnelUrl(),this._adapters.has("ws")||this._sigDestroyed||this._adapters.get("rtc")?.isLoopback)return void(0,m.Lq)("switch","ws-fallback: aborted (destroyed, loopback or already attached)");(0,m.Lq)("switch","ws-fallback: connecting"),this._instantiate("ws"),this._adapters.get("ws")?.connect(this._buildCtx("ws"))}}async _refreshTunnelUrl(){return z(this)}_initSignalingClient(){!function(e){if(!n.gI.enabled||e._sig||e._sigDestroyed||!e._auth.deviceId||!e._auth.apiKey)return;let t=u.O.replace(/^http/,"ws")+"/signaling";r.e(6739).then(r.bind(r,46739)).then(({SignalingClient:r})=>{e._sig||e._sigDestroyed||(e._sig=new r({url:t,role:"client",roomId:e._auth.apiKey,apiKey:e._auth.apiKey,from:e._peerId,onReady:()=>q(e),pingMs:n.gI.pingMs}),e._sig.on(t=>{if("error"===t.type&&"rtc-disabled"===t.message){e._rtcTestDisabled=!0,(0,m.Lq)("switch","rtc-disabled by host → stop RTC retry (use WS)");return}W(e,t)||e._rtcSignalingHandler?.(t)}),e._sig.connect())}).catch(e=>(0,p.c)("transport",`[pm] SignalingClient load failed: ${e?.message||e}`))}(this)}_instantiate(e){if(this._adapters.has(e))return;let t=O.get(e);if(!t)return;let r=new t;r.on("stateChange",t=>this._onAdapterStateChange(e,t)),r.on("message",({event:e,data:t,source:r})=>this._dispatch(e,t,r)),r.on("binary",e=>this._onBinary(e)),"rtc"===e&&(r.on("netFingerprint",e=>this._onNetFingerprint(e)),this._srvCaps&&r.setPeerCaps?.(this._srvCaps)),this._adapters.set(e,r)}_onNetFingerprint(e){if(!e||e===this._netFingerprint)return;let t=this._netFingerprint;this._netFingerprint=e,t&&(0,p.c)("transport",`[pm] net fingerprint ${t}→${e} (same network — no backoff reset)`)}_maybeRearmRtc(){if(!this._rtcGivenUp)return;let e=Date.now();e-this._lastStunProbeAt<n.cx.minIntervalMs||(this._lastStunProbeAt=e,E().then(e=>{var t;if(this._sigDestroyed||!this._rtcGivenUp)return;let r=e||(this._giveUpIp===j?j:null);(t=this._giveUpIp,r&&(!t||r!==t))?((0,m.Lq)("switch",`rearm check: ip ${this._giveUpIp||"unknown"}→${r} changed → re-arm RTC`),(0,p.c)("transport","[pm] public ip changed → re-arm rtc"),this._rtcGivenUp=!1,this._giveUpIp=null,this._probeAttempts=0,this._rtcRestartAttempts=0,this._netFingerprint=e,this._canSignal())?this._shouldRenegotiate()&&this._restartRtc("stun-rearm"):this._sig?.retryNow("stun-rearm"):(0,m.Lq)("switch",`rearm check: ip=${r||"unknown"} same as give-up → stay WS-only`)}).catch(()=>{}))}_startSecondaryAdapters(){for(let e of((0,p.c)("transport",`[pm] startSecondary enabled=${this._profile.enabled}`),(0,p.c)("transport",`[pm] startSecondary rtcTestDisabled=${!!this._rtcTestDisabled}`),this._profile.enabled))"ws"!==e&&("rtc"!==e||!this._rtcTestDisabled)&&(this._adapters.has(e)||((0,p.c)("transport",`[pm] start adapter ${e}`),this._instantiate(e),this._adapters.get(e)?.connect(this._buildCtx(e))))}_handleApprovalSignal(e){return W(this,e)}_onSignalingReady(){q(this)}_canSignal(){return!!this._sig?.ready}_shouldRenegotiate(){return!this._awaitingApproval&&this._canSignal()}_restartRtc(e="?"){(0,m.Lq)("switch",`restartRtc CALLED by=${e} attempts=${this._rtcRestartAttempts}`);let t=this._adapters.get("rtc"),r=function({testDisabled:e,givenUp:t,rtcState:r,hasRtc:i}){return e?"skip-test-disabled":t?"skip-given-up":i&&(r===n.Of.connecting||r===n.Of.open)?"skip-in-flight":i?"restart":"start-fresh"}({testDisabled:!!this._rtcTestDisabled,givenUp:this._rtcGivenUp,rtcState:t?.state,hasRtc:!!t});if("skip-test-disabled"===r)return void(0,m.Lq)("switch","restartRtc skipped (rtcTestDisabled)");if("skip-given-up"===r)return void(0,m.Lq)("switch","restartRtc skipped (hard NAT → WS-only)");if("skip-in-flight"===r)return void(0,m.Lq)("switch",`restartRtc skipped (rtc=${t.state})`);if("start-fresh"===r){(0,m.Lq)("switch","restartRtc: no rtc → startSecondary"),this._startSecondaryAdapters();return}(0,m.Lq)("switch","restartRtc: tear down + renegotiate"),(0,p.c)("transport","[pm] ws reconnected → restart rtc");try{t.disconnect(`restart:${e}`)}catch{}this._adapters.delete("rtc"),this._rtcSignalingHandler=null,this._startSecondaryAdapters()}_forceRestartRtc(e="?"){(0,m.Lq)("switch",`forceRestartRtc CALLED by=${e}`);let t=this._adapters.get("rtc");if(t){try{t.disconnect(`force:${e}`)}catch{}this._adapters.delete("rtc"),this._rtcSignalingHandler=null}this._rtcGivenUp?(0,m.Lq)("switch","forceRestartRtc: torn down, no renegotiate (hard NAT)"):this._startSecondaryAdapters()}disconnect(){this._watchers?.detach(),this._watchers=null,clearTimeout(this._resumeProbeTimer),this._resumeProbeTimer=null,clearTimeout(this._rtcDeferTimer),this._rtcDeferTimer=null,this._probeToken++;try{this._sig?.disconnect()}catch{}for(let e of(this._sig=null,this._sigDestroyed=!0,this._sigBuffer=[],clearTimeout(this._wsFallbackTimer),clearTimeout(this._rejoinDebounceTimer),this._rejoinDebounceTimer=null,this._adapters.values()))try{e.disconnect("pm-disconnect")}catch{}for(let e of(this._adapters.clear(),this._bus.clear(),this._buffer=[],this._connected=!1,this._rawSocket=null,this._disarmRestart(),(0,m.Lq)("switch",`RESET attempts (was ${this._rtcRestartAttempts}) reason=pm-disconnect`),this._rtcRestartAttempts=0,this._probeAttempts=0,this._rtcGivenUp=!1,this._giveUpIp=null,this._lastStunProbeAt=0,this._ackTimers.values()))clearTimeout(e);this._ackTimers.clear()}_buildCtx(e,t){let r={auth:this._auth,profile:this._profile};return"ws"===e&&(r.onRetryStatus=this._wsCallbacks.onRetryStatus,r.onUrlUpdate=e=>{e.tunnelUrl&&(this._auth.tunnelUrl=e.tunnelUrl),void 0!==e.localIp&&(this._auth.localIp=e.localIp),this._wsCallbacks.onUrlUpdate?.(e)}),"rtc"===e&&(r.signaling={send:e=>this._sendSignaling(e),on:e=>{this._rtcSignalingHandler=e},off:()=>{this._rtcSignalingHandler=null}}),r}_onAdapterStateChange(e,t){(0,p.c)("transport",`[pm] ${e} state=${t}`),("rtc"!==e||t!==n.Of.closed)&&(0,m.Lq)("switch",`${e}→${t}`),"ws"===e&&function(e,t){let r=e._adapters.get("ws");if(t===n.Of.open){let t=e._lastWsState===n.Of.degraded;e._connected=!0,e._connectionMode=r?.connectionMode||"tunnel",e._rawSocket=r?.socket||null,t&&e._maybeFireRejoin("ws","ws reconnect while rtc ready"),e._lastWsState!==n.Of.open&&(e._onConnectFired?e._wsCallbacks.onUrlUpdate?.({}):(e._onConnectFired=!0,(0,m.Lq)("switch",`onConnect FIRE (ws, mode=${e._connectionMode})`),e._wsCallbacks.onConnect?.(e._bus,e._connectionMode)))}else e._rawSocket=null,e._lastWsState===n.Of.open&&((0,m.Lq)("switch","ws down"),e._anyAdapterReady()&&(0,m.Lq)("switch","ws down but rtc alive → skip onDisconnect"));e._lastWsState=t}(this,t),"rtc"===e&&function(e,t){if(t===n.Of.open){let t=e._onConnectFired;clearTimeout(e._wsFallbackTimer),e._rtcCallbacks.onUpgrade?.(e._adapters.get("rtc")?.typeDetail||"dc-stun"),e._onConnectFired||(e._onConnectFired=!0,e._connected=!0,e._connectionMode="webrtc",(0,m.Lq)("switch","onConnect FIRE (rtc, mode=webrtc)"),e._wsCallbacks.onConnect?.(e._bus,e._connectionMode)),e._rtcRestartAttempts=0,e._probeAttempts=0,e._rtcGivenUp=!1,e._giveUpIp=null,e._disarmRestart(),clearTimeout(e._rejoinDebounceTimer),e._rejoinDebounceTimer=null;let r=e._adapters.get("rtc");if(r?.isLoopback){(0,m.Lq)("switch","rtc loopback detected (same machine) → drop ws standby");let t=e._adapters.get("ws");if(t){try{t.disconnect()}catch{}e._adapters.delete("ws")}}t&&e._maybeFireRejoin("rtc","rtc reconnect while ws ready")}if(t===n.Of.closed){for(let t of(e._rtcCallbacks.onFallback?.("ws"),(0,m.Lq)("switch","rtc closed → startWsFallback + scheduleRtcRestart"),e._startWsFallback(),clearTimeout(e._wsFallbackTimer),e._pendingAcks.values()))try{t({error:"rtc-closed"})}catch{}for(let t of(e._pendingAcks.clear(),e._ackTimers.values()))clearTimeout(t);e._ackTimers.clear(),e._scheduleRtcRestart("rtc-closed")}}(this,t),"rtc"===e&&t===n.Of.open&&((0,p.c)("auth","[seal] rtc OPEN → sending proof"),(0,C.pV)(this)),this._recomputeType();let r=this._anyAdapterReady();r!==this._connected&&(this._connected=r,r||(this._onConnectFired=!1,(0,m.Lq)("switch",`onDisconnect FIRE (last carrier gone: ${e}→${t})`),this._wsCallbacks.onDisconnect?.(`${e}-${t}`))),this._flushBuffer()}_maybeFireRejoin(e,t){let r="ws"===e?this._adapters.get("rtc"):this._adapters.get("ws");if(r?.ready){(0,p.c)("transport",`[pm] ${t} → skip rejoin (other ready)`),(0,m.Lq)("switch",`${t} → skip rejoin (other ready)`);return}if("ws"===e&&r&&r.state===n.Of.connecting){(0,p.c)("transport",`[pm] ${t} → debounce rejoin (rtc connecting)`),(0,m.Lq)("switch",`${t} → debounce rejoin ${n.ZN}ms (rtc connecting)`),clearTimeout(this._rejoinDebounceTimer),this._rejoinDebounceTimer=setTimeout(()=>{this._rejoinDebounceTimer=null;let e=this._adapters.get("rtc");e?.ready?(0,m.Lq)("switch","debounce: rtc opened → skip rejoin"):((0,m.Lq)("switch",`debounce expired → FIRE rejoin (rtc=${e?.state||"absent"})`),this._bus.dispatch("connect",[]))},n.ZN);return}(0,m.Lq)("switch",`${t} → FIRE rejoin`),this._bus.dispatch("connect",[])}_recomputeType(){let e=this._pickAdapter(n.l_.binary)||this._pickAdapter(n.l_.control),t=e&&"rtc"===e.constructor.id?e.typeDetail||"dc-stun":"ws";t!==this._type&&(this._type=t,this._rtcCallbacks.onTransportChange?.(t))}_anyAdapterReady(){for(let e of this._adapters.values())if(e.ready)return!0;return!1}_pickAdapter(e){return function(e,t,r){let n=t.channels[r];if(!n)return null;let i=[...e.values()].filter(e=>e.supports(r)&&e.ready);return i.length?(i.sort((e,t)=>{let i=t.getPriority?t.getPriority(r):t.constructor.priority[r]??0,s=e.getPriority?e.getPriority(r):e.constructor.priority[r]??0;if(i!==s)return i-s;if(n.prefer){if(t.constructor.id===n.prefer)return 1;if(e.constructor.id===n.prefer)return -1}return 0}),i[0]||null):null}(this._adapters,this._profile,e)}_sendControl(e,t){!function(e,t,r){let i="function"==typeof r[r.length-1]?r.pop():null,s=e._pickAdapter(n.l_.control);if(!s){(0,p.c)("transport",`[pm] buffer event=${t} (no adapter ready)`),(0,m.Lq)("switch",`buffer "${t}" (no adapter)`),e._buffer.push({event:t,args:r,cb:i});return}if((0,p.c)("transport",`[pm] send control event=${t} via=${s.constructor.id}`),"rtc"===s.constructor.id){let a=null;if(i&&(a=`c_${++e._ackSeq}`,e._pendingAcks.set(a,i),e._scheduleAckTimeout(a,{event:t,args:r})),!s.send(n.l_.control,{event:t,args:r,ackId:a})){let l=e._pickAdapter(n.l_.control);if(l&&l!==s&&l.send(n.l_.control,i?{event:t,args:r,ackId:a,cb:i}:{event:t,args:r,ackId:a}))return;(0,p.c)("transport",`[pm] rtc refused event=${t} → buffered`),e._buffer.push({event:t,args:r,cb:i})}}else s.send(n.l_.control,{event:t,args:r,cb:i})}(this,e,t)}_flushBuffer(){!function(e){if(!e._buffer.length)return;let t=e._pickAdapter(n.l_.control);if(!t)return;let r=e._buffer.splice(0);for(let{event:n,args:i,cb:s}of((0,p.c)("transport",`[pm] flush ${r.length} buffered via=${t.constructor.id}`),r))e._sendControl(n,s?[...i,s]:i)}(this)}_dispatch(e,t,r){!function(e,t,r,i){if("srvCaps"===t){let t="rtc"===i?r?.args?.[0]:r;(0,p.c)("transport",`[pm] srvCaps from host via ${i}: ${JSON.stringify(t)}`),e._srvCaps=t||{},e._adapters.get("rtc")?.setPeerCaps?.(e._srvCaps)}if("__ack"===t){let{ackId:t,args:n}=r||{},i=e._pendingAcks.get(t);if(i){e._pendingAcks.delete(t);let r=e._ackTimers.get(t);r&&(clearTimeout(r),e._ackTimers.delete(t)),i(...n||[])}return}if("device:approved"===t){e._awaitingApproval=!1;let t=e._adapters.get("rtc");e._canSignal()&&(!t||t.state===n.Of.closed)&&e._restartRtc("device-approved")}if("rtc:enabled"===t){e._rtcTestDisabled&&(e._rtcTestDisabled=!1,(0,m.Lq)("switch","rtc:enabled by host → clear flag + restart RTC"),e._restartRtc("rtc-enabled"));return}if("tunnel:updated"===t){let t="rtc"===i?r?.args?.[0]:r;if(t){let{tunnelUrl:r,localIp:n,status:i}=t;if(e._auth.tunnelUrl===window.location?.origin)return(0,m.Lq)("switch",`tunnel:updated ignored (carrier is the page origin; got url=${r||"none"})`);if((0,m.Lq)("switch",`tunnel:updated recv (status=${i} url=${r||"none"})`),"ready"===i&&r){let t=e._auth.tunnelUrl!==r;e._auth.tunnelUrl=r,n&&(e._auth.localIp=n),e._wsCallbacks.onUrlUpdate?.({tunnelUrl:r,localIp:n});let i=e._adapters.get("ws");if(i&&(!i.ready||t)){(0,m.Lq)("switch",`tunnel:updated → ${t?"url changed":"ws not ready"} → retry ws with new URL`);try{i.retryNow("tunnel-updated")}catch{}}}else"down"===i&&(e._auth.tunnelUrl="",e._wsCallbacks.onUrlUpdate?.({tunnelUrl:"",localIp:n}))}return}let s="rtc"===i&&Array.isArray(r?.args)?r.args:[r];e._bus?.dispatch(t,s)}(this,e,t,r)}_onBinary(e){e&&("mobile"===e.channel?this._bus?.dispatch("mobile-bin",[e.buffer]):"file"===e.channel&&this._bus?.dispatch("file-bin",[e.buffer]))}_scheduleAckTimeout(e){var t;let r;t=this,r=setTimeout(()=>{t._ackTimers.delete(e),(0,p.c)("transport",`[pm] ack timeout ackId=${e} event=undefined → suspect zombie RTC`);let r=t._pendingAcks.get(e),i=t._adapters.get("rtc");t._adapters.get("ws");let s=Date.now(),a=i?.lastInboundAt||0;i?.ready&&a&&s-a<n.mk?(0,m.Lq)("switch",`ack-timeout ? ignored (rtc active, lastInbound=${s-a}ms ago)`):i?.state===n.Of.open?F(t,"ack-timeout:?"):t._scheduleRtcRestart("ack-timeout")},t._ackTimeoutMs),t._ackTimers.set(e,r)}_armRestart(e,t){clearTimeout(this._rtcRestartTimer),this._rtcRestartDueAt=Date.now()+t,this._rtcRestartTimer=setTimeout(e,t)}_disarmRestart(){let e=this._rtcRestartTimer?Math.max(this._rtcRestartDueAt-Date.now(),0):-1;return clearTimeout(this._rtcRestartTimer),this._rtcRestartTimer=null,this._rtcRestartDueAt=0,e}_scheduleRtcRestart(e="?"){if((0,m.Lq)("switch",`rtcRestart REQ by=${e} attempts=${this._rtcRestartAttempts} probe=${this._probeAttempts} givenUp=${this._rtcGivenUp} pending=${!!this._rtcRestartTimer}`),this._rtcRestartTimer){let t=Math.max(this._rtcRestartDueAt-Date.now(),0);(0,m.Lq)("switch",`rtcRestart SKIP by=${e} (pending rung ${this._rtcRestartAttempts} fires in ${t}ms)`);return}if(this._rtcGivenUp){(0,m.Lq)("switch","scheduleRtcRestart skipped (hard NAT → WS-only)"),(0,p.c)("transport","[pm] rtc probe skipped (given up — hard NAT)");return}let t=function({attempts:e,probeAttempts:t,verdict:r}){let i,s,a=e>=n.QZ.maxAttempts,l=t;if(a){if(i=n.QZ.probeBackoffMs[t]??n.QZ.probeBackoffMs.at(-1),(l=t+1)>=n.QZ.classifyAfterProbes){if("hard"===(s=r?.()??"unknown"))return{giveUp:!0,verdict:s,probeAttempts:l};l=0}}else i=n.QZ.backoffMs[e]??n.QZ.backoffMs.at(-1);return{delay:i,isProbe:a,attempts:e+1,probeAttempts:l,verdict:s}}({attempts:this._rtcRestartAttempts,probeAttempts:this._probeAttempts,verdict:()=>this._adapters.get("rtc")?.natVerdict?.()??"unknown"});if(void 0!==t.verdict&&((0,m.Lq)("switch",`scheduleRtcRestart natVerdict=${t.verdict} probeAttempts=${t.probeAttempts}`),(0,p.c)("transport",`[pm] rtc nat verdict=${t.verdict} after ${t.probeAttempts} probes`)),t.giveUp){this._probeAttempts=t.probeAttempts,this._rtcGivenUp=!0,this._giveUpIp=this._netFingerprint,this._giveUpIp||E().then(e=>{this._rtcGivenUp&&!this._giveUpIp&&(this._giveUpIp=e||j,(0,m.Lq)("switch",`give-up baseline from probe: ip=${this._giveUpIp}`))}).catch(()=>{}),(0,m.Lq)("switch",`RTC give-up: hard NAT → WS-only (ip=${this._giveUpIp||"pending"})`);return}let{delay:r,isProbe:i}=t;this._probeAttempts=t.probeAttempts,this._rtcRestartAttempts=t.attempts,(0,m.Lq)("switch",`rtcRestart ARM by=${e} rung=${this._rtcRestartAttempts} delay=${r}ms probe=${i}`),(0,p.c)("transport",`[pm] schedule rtc ${i?"probe":"restart"} #${this._rtcRestartAttempts} in ${r}ms`);let s=()=>{if(this._disarmRestart(),this._awaitingApproval||!this._sig?.ready)return;let e=this._adapters.get("rtc");if(e){let t=function({state:e,connectingSince:t,connectDeadline:r,now:i,connectTimeoutMs:s}){return e!==n.Of.connecting?"restart":i<function({connectingSince:e,connectDeadline:t,connectTimeoutMs:r}){return t??(e??0)+r}({connectingSince:t,connectDeadline:r,connectTimeoutMs:s})?"wait":"teardown"}({state:e.state,connectingSince:e.connectingSince,connectDeadline:e.connectDeadline,now:Date.now(),connectTimeoutMs:n.AC});if("wait"===t){let t=Math.max(function({connectingSince:e,connectDeadline:t,connectTimeoutMs:r}){return t??(e??0)+r}({connectingSince:e.connectingSince,connectDeadline:e.connectDeadline,connectTimeoutMs:n.AC})-Date.now(),r);(0,m.Lq)("switch",`restart tick: peer still young (rung ${this._rtcRestartAttempts}) → re-arm in ${t}ms, no rung spent`),this._armRestart(s,t);return}if("teardown"===t){try{e.disconnect(`rung-${this._rtcRestartAttempts}-teardown`)}catch{}this._adapters.delete("rtc"),this._rtcSignalingHandler=null}}this._restartRtc(`rung-${this._rtcRestartAttempts}`)};this._armRestart(s,r)}_sendSignaling(e){K(this,e)}_flushSigBuffer(){H(this)}}},80186:(e,t,r)=>{r.d(t,{A:()=>i});var n=r(73365);function i({children:e,variant:t="primary",size:r="md",disabled:s=!1,loading:a=!1,onClick:l,className:o="",...c}){let d=`font-semibold rounded-brand transition-all duration-150 ease-out transform active:scale-[0.97] ${{primary:"bg-brand-500 hover:bg-brand-600 disabled:bg-surface-3 disabled:text-text-muted text-white shadow-sm",secondary:"bg-surface-2 hover:bg-surface-3 disabled:bg-surface disabled:text-text-muted text-text",danger:"bg-red-500 hover:bg-red-600 disabled:bg-surface-3 disabled:text-text-muted text-white",success:"bg-green-600 hover:bg-green-700 disabled:bg-surface-3 disabled:text-text-muted text-white"}[t]} ${{sm:"px-3 py-1.5 text-sm",md:"px-4 py-2 text-base",lg:"px-6 py-3 text-lg"}[r]} ${s||a?"cursor-not-allowed":""} ${o}`;return(0,n.jsx)("button",{onClick:l,disabled:s||a,className:d,...c,children:a?(0,n.jsxs)("span",{className:"flex items-center justify-center gap-2",children:[(0,n.jsx)("span",{className:"animate-spin rounded-full h-4 w-4 border-b-2 border-white"}),e]}):e})}},86129:(e,t,r)=>{r.d(t,{AC:()=>m,An:()=>d,BF:()=>y,El:()=>T,HE:()=>D,HJ:()=>f,Ic:()=>P,J2:()=>A,Jd:()=>R,KF:()=>c,ML:()=>v,N0:()=>C,Of:()=>L,QS:()=>g,QZ:()=>s,Rh:()=>$,Tr:()=>b,UT:()=>_,ZN:()=>l,aS:()=>x,b4:()=>p,bg:()=>k,cx:()=>a,dT:()=>i,fP:()=>h,gI:()=>w,j3:()=>M,l_:()=>n,mk:()=>u,o_:()=>I,qM:()=>S,si:()=>o});let n={control:"control",binary:"binary",file:"file",mobile:"mobile"},i=65536,s={ackTimeoutMs:5e3,maxAttempts:3,backoffMs:[500,1500,3e3],probeBackoffMs:[3e4,6e4,12e4,3e5],classifyAfterProbes:3},a={urls:["stun:stun.l.google.com:19302","stun:stun1.l.google.com:19302"],timeoutMs:2500,minIntervalMs:15e3},l=500,o=3,c=3e3,d=9e3,u=25e3,h=3,p=1e3,m=4e3,f=15e3,g=1e3,y=12e3,_=2e3,b=1e4,w={enabled:!0,pingMs:25e3},k={pending:"pending-approval",rejected:"device-rejected"},v={mismatch:"mismatch",sealUnreadable:"seal-unreadable",timeout:"proof-timeout"},A={pending:"pending",approved:"approved",rejected:"rejected",reconnect:"reconnect"},S=8,T="9remote_pending_save",x="9remote_wants_save",C="9remote:keys-changed",R="9remote_login_error",P="strict",I={debounceMs:500},$=3e4,D={chunkSize:65528,windowSize:64,dcBufferThreshold:8388608,maxUploadSize:0x3200000,maxDownloadSize:0xc800000,maxStreamMediaSize:524288e3},L={idle:"idle",connecting:"connecting",open:"open",degraded:"degraded",closed:"closed"},M={clientApp:{enabled:["ws","rtc"],parallel:!0,channels:{control:{strategy:"priority",prefer:"rtc"},binary:{strategy:"priority",prefer:"rtc"},file:{strategy:"priority",prefer:"rtc"},mobile:{strategy:"priority",prefer:"rtc"}},rtc:{enableTurn:!0,dcControl:{ordered:!0}}},remoteDesktop:{enabled:["ws","rtc"],parallel:!0,channels:{control:{strategy:"priority",prefer:"rtc"},binary:{strategy:"priority",prefer:"rtc"},file:{strategy:"priority",prefer:"rtc"},mobile:{strategy:"priority",prefer:"rtc"}},rtc:{enableTurn:!0,dcControl:{ordered:!0}}}}},86251:(e,t,r)=>{r.d(t,{O:()=>u,Y:()=>c});let n=new Uint8Array([48,42,48,5,6,3,43,101,110,3,33,0]);function i(e){let t=atob(e),r=new Uint8Array(t.length);for(let e=0;e<t.length;e++)r[e]=t.charCodeAt(e);return r}function s(e){let t="",r=new Uint8Array(e);for(let e=0;e<r.length;e++)t+=String.fromCharCode(r[e]);return btoa(t)}function a(...e){let t=new Uint8Array(e.reduce((e,t)=>e+t.length,0)),r=0;for(let n of e)t.set(n,r),r+=n.length;return t}async function l(e){let t;try{t=i(String(e))}catch{return null}if(32!==t.length)return null;try{return await crypto.subtle.importKey("spki",a(n,t),{name:"X25519"},!0,[])}catch{return null}}async function o(e,t,r,n){let i=await crypto.subtle.deriveBits({name:"X25519",public:t},e,256),s=await crypto.subtle.importKey("raw",i,"HKDF",!1,["deriveKey"]);return await crypto.subtle.deriveKey({name:"HKDF",hash:"SHA-256",salt:a(r,n),info:new TextEncoder().encode("9remote-tail-seal-v1")},s,{name:"AES-GCM",length:256},!1,["encrypt"])}async function c(e,t){if("string"!=typeof e||!e||"string"!=typeof t||!t)return null;let r=await l(t);if(!r)return null;try{let t=await crypto.subtle.generateKey({name:"X25519"},!0,["deriveBits"]),n=new Uint8Array(await crypto.subtle.exportKey("spki",t.publicKey)).slice(-32),i=new Uint8Array(await crypto.subtle.exportKey("spki",r)).slice(-32),a=await o(t.privateKey,r,n,i),l=crypto.getRandomValues(new Uint8Array(12)),c=await crypto.subtle.encrypt({name:"AES-GCM",iv:l},a,new TextEncoder().encode(e));return{epk:s(n),iv:s(l),ct:s(c)}}catch{return null}}let d="ABCDEFGHJKLMNPQRSTUVWXYZ23456789";async function u(e,t){if("u"<typeof crypto||!crypto.subtle)return null;let r=[e,t].map(e=>{let t;try{t=i(String(e||""))}catch{t=new Uint8Array(0)}let r=new Uint8Array(2);return new DataView(r.buffer).setUint16(0,t.length),a(r,t)}),n=new Uint8Array(await crypto.subtle.digest("SHA-256",a(...r)));return d[n[0]%32]+d[n[1]%32]}},90076:(e,t,r)=>{r.d(t,{O:()=>n,Sn:()=>c,TR:()=>o,_8:()=>s,cC:()=>p,dM:()=>u,fm:()=>i,jP:()=>d,lE:()=>l,qn:()=>h,w:()=>a});let n="https://9remote.cc",i="https://9remote.cc/",s=2208,a=`http://127.0.0.1:${s}`,l=a,o=`${a}/api/ui/state`,c={connect:`${n}/api/connect`,tempKeyCreate:`${n}/api/temp-key/create`,tempKeyVerify:`${n}/api/temp-key/verify`,tempKeyRemove:`${n}/api/temp-key/remove`,localSites:"/api/local-sites",turnCredentials:`${n}/api/webrtc/turn-credentials`},d=5,u=2e3,h=5e3,p=1e4},90084:(e,t,r)=>{r.d(t,{$4:()=>d,D5:()=>b,HY:()=>p,I8:()=>g,IU:()=>w,LG:()=>u,cH:()=>y,e1:()=>m,lu:()=>k,lz:()=>c,pV:()=>v,t8:()=>h});var n=r(86129);r(52159);var i=r(86251);let s="9remote_device_trust",a="9remote_pending_fp2";function l(){try{return JSON.parse(localStorage.getItem(s)||"{}")}catch{return{}}}function o(e){localStorage.setItem(s,JSON.stringify(e))}function c(e){return l()[e]||null}function d(e){if(!e)return e;let t=c(e)?.tail;return t?`${e}-${t}`:e}function u(e,t){let r=l();r[e]={...r[e]||{},...t},o(r)}async function h(e,t){return e&&t?await (0,i.O)(e,t):null}function p(){let e=sessionStorage.getItem(a);return sessionStorage.removeItem(a),e?JSON.parse(e).fp2??null:null}function m(){try{let e=sessionStorage.getItem(a);if(!e)return null;let{fp2:t,exp:r}=JSON.parse(e);if(!t||Date.now()>r)return sessionStorage.removeItem(a),null;return t}catch{return null}}let f="9remote_api_keys";function g(){try{let e=sessionStorage.getItem(n.El);if(!e)return;sessionStorage.removeItem(n.El);let t=JSON.parse(localStorage.getItem(f)||"[]");if(t.some(t=>{try{return atob(t.key)===e}catch{return!1}}))return;t.push({id:String(Date.now()),key:btoa(e),label:`Key ${t.length+1}`,createdAt:new Date().toISOString(),lastLoginDate:new Date().toISOString()}),localStorage.setItem(f,JSON.stringify(t));try{window.dispatchEvent(new Event(n.N0))}catch{}}catch{}}function y(e){if(e)try{let t=l();delete t[e],o(t)}catch{}}function _(e){let t=atob(e),r=new Uint8Array(t.length);for(let e=0;e<t.length;e++)r[e]=t.charCodeAt(e);return r}async function b(e,t,r){try{let n=await crypto.subtle.importKey("raw",_(e),{name:"Ed25519"},!1,["verify"]);return await crypto.subtle.verify("Ed25519",n,_(r),new TextEncoder().encode(t))}catch{return null}}let w=["device:keyIssued","device:tailRejected"];function k(e,t,r){let i=e._auth?.apiKey;if(!i)return!1;if("device:keyIssued"===t){e._auth.tempKey=null,e._auth.socketOptions?.auth&&(e._auth.socketOptions.auth.tempKey=null);try{sessionStorage.removeItem("tempKey")}catch{}let t=r?.tail;return!t||(u(i,{tail:t}),e._tailProofSent=e._adapters.get("rtc")?._peerEpoch??0,sessionStorage.getItem(n.aS)&&(sessionStorage.removeItem(n.aS),sessionStorage.setItem(n.El,`${i}-${t}`),g()),!0)}return"device:tailRejected"===t&&(r?.reason===n.ML.sealUnreadable&&u(i,{hostSealKey:null}),!0)}async function v(e){let t=e._auth?.apiKey;if(!t)return;let i=e._adapters.get("rtc");if(!i?.ready)return;let s=i._peerEpoch??0;if(e._tailProofSent===s)return;let{freshAuth:a}=await Promise.resolve().then(r.bind(r,63977)),l=await a({apiKey:t,tempKey:e._auth?.tempKey||null},"rtc");(l.keyTail||l.keyTailSealed)&&i.send(n.l_.control,{event:"device:tailProof",args:[{keyTail:l.keyTail,keyTailSealed:l.keyTailSealed,tempKey:e._auth?.tempKey||null}]})&&(e._tailProofSent=s)}},94858:(e,t,r)=>{r.d(t,{d:()=>s});var n=r(2074),i=r(86129);let s=(0,n.v)(e=>({bus:null,busRef:{current:null},protocolRef:{current:null},connected:!1,everConnected:!1,deliberate:!1,connectionMode:"tunnel",carrier:"ws",approvalStatus:null,admitted:!1,authKey:null,endpoint:null,retryStatus:{isRetrying:!1,attempt:0,maxAttempts:10,failed:!1},setConnection:t=>e(e=>({...e,...t})),setConnected:t=>e({connected:t}),setCarrier:t=>e({carrier:t}),setConnectionMode:t=>e({connectionMode:t}),setRetryStatus:t=>e({retryStatus:t}),setAuthKey:t=>e({authKey:t}),setAdmitted:t=>e({admitted:t}),applyApproval:t=>e(e=>{let r=e.approvalStatus;return t===i.J2.reconnect?r===i.J2.approved?{approvalStatus:null}:{}:r===i.J2.approved&&t===i.J2.pending?{}:{approvalStatus:t}}),reset:()=>e({bus:null,connected:!1,deliberate:!1,everConnected:!1,connectionMode:"tunnel",carrier:"ws",endpoint:null,approvalStatus:null,admitted:!1,retryStatus:{isRetrying:!1,attempt:0,maxAttempts:10,failed:!1}})}))},97711:(e,t,r)=>{r.d(t,{Fo:()=>u,U0:()=>o,vd:()=>d});var n=r(1521),i=r(94858);let s="9remote_auth",a="9remote_auth_state",l=["apiKey","tunnelUrl","mode","localIp"];function o(){try{localStorage.removeItem(a)}catch{}}function c(e){"u">typeof document&&(document.cookie=`${s}=${e}; path=/; max-age=86400; SameSite=Lax`)}function d({apiKey:e,tunnelUrl:t,mode:r="remote",tempKey:n=null,localIp:s=null}){if(!e){try{localStorage.removeItem(a)}catch{}return}try{sessionStorage.setItem("apiKey",e),sessionStorage.setItem("tunnelUrl",t),sessionStorage.setItem("mode",r||"remote"),n?sessionStorage.setItem("tempKey",n):sessionStorage.removeItem("tempKey"),s?sessionStorage.setItem("localIp",s):sessionStorage.removeItem("localIp")}catch{}c(e);try{sessionStorage.removeItem("9remote_manual_disconnect")}catch{}try{!function(){try{return"false"!==localStorage.getItem("9remote_remember_key_preference")}catch{return!1}}()?localStorage.removeItem(a):localStorage.setItem(a,JSON.stringify({apiKey:e,tunnelUrl:t,mode:r,localIp:s}))}catch{}i.d.getState().setAuthKey(e)}function u(){let e=(0,n.useCallback)(()=>{let e,t,r,n,i;try{e=sessionStorage.getItem("apiKey"),t=sessionStorage.getItem("tunnelUrl"),r=sessionStorage.getItem("mode"),n=sessionStorage.getItem("tempKey"),i=sessionStorage.getItem("localIp")}catch{return null}if(!e){let n=function(){try{return JSON.parse(localStorage.getItem(a)||"null")}catch{return null}}();if(!n?.apiKey)return null;try{for(let e of l)n[e]&&sessionStorage.setItem(e,n[e])}catch{}e=n.apiKey,t=n.tunnelUrl??null,r=n.mode??null,i=n.localIp??null}return c(e),{apiKey:e,tunnelUrl:t,mode:r,tempKey:n,localIp:i}},[]);return{getAuth:e,setAuth:(0,n.useCallback)(e=>d(e),[]),clearAuth:(0,n.useCallback)(()=>{try{sessionStorage.clear()}catch{}try{localStorage.removeItem(a)}catch{}"u">typeof document&&(document.cookie=`${s}=; path=/; max-age=0`)},[])}}},98988:(e,t,r)=>{r.d(t,{Nw:()=>x,eJ:()=>S,d:()=>T,rh:()=>A});var n=r(2074),i=r(29091),s=r(94858),a=r(79453),l=r(7938),o=r(11155),c=r(90084);let d="9remote_fleet_connected";function u(){try{return JSON.parse(localStorage.getItem(d)||"[]")}catch{return[]}}class h{constructor({hostOf:e,patch:t,bindBus:r,ready:n,probeTargets:i,servedBy:s=null,servedBus:a=null}){this._hostOf=e,this._patch=t,this._bindBus=r,this._ready=n,this._probeTargets=i,this._servedBy=s||(()=>!1),this._servedBus=a||(()=>null),this.buses=new Map,this._connectTimers=new Map,this.pending=new Map,this._probeTimer=null,this._probeVisible=null}busOf(e){return e&&this.buses.get(e)?.busRef?.current||null}pmOf(e){return this.buses.get(e)||null}has(e){return this.buses.has(e)}whenReady(e,t){let r=this._hostOf(e);if(!e||!r)return;if(this._servedBy(e)){let r=this._servedBus(e);r&&t(r);return}let n=this.busOf(e);if(n&&"online"===r.status)return void t(n);if(!this._canOpen(r,e))return;this.open(e,r);let i=this.pending.get(e)||[];i.push(t),this.pending.set(e,i)}persistIntent(e,t){if(e)try{let r=new Set(u());t?r.add(e):r.delete(e),localStorage.setItem(d,JSON.stringify([...r]))}catch{}}_canOpen(e,t){return!(!e||this._servedBy(t))&&!!e.full}open(e,t){if(this.has(e))return;let r=function(){try{return localStorage.getItem("9remote_deviceId")}catch{return null}}();if(!this._canOpen(t,e)||!r)return;this.persistIntent(e,!0);let n=(0,o.Cj)(t.full);n&&(0,c.LG)(e,{tail:n});let i=t=>this._patch(e,t),s=!1,d=new a.g({tunnelUrl:null,localIp:null,namespace:"",socketOptions:{auth:{apiKey:e,tempKey:null,deviceId:r}},apiKey:e,deviceId:r,tempKey:null,onConnect:t=>{clearTimeout(this._connectTimers.get(e)),this._connectTimers.delete(e),i({status:"online",lastSeenAt:Date.now(),updating:!1,approval:null});let r=this.pending.get(e);if(r)for(let n of(this.pending.delete(e),r))try{n(t)}catch{}s||(s=!0,this._bindBus(t,e)),this._ready(t,e)},onDisconnect:()=>{this.pending.delete(e),i({status:"offline",lastSeenAt:Date.now()})}},{enableWebRTC:l.eR.enableWebRTC,enableTurn:l.eR.enableTurn,apiKey:e,onTransportChange:e=>i({carrier:e||"ws"})});this.buses.set(e,d),i({status:"connecting"}),this._connectTimers.set(e,setTimeout(()=>this._onConnectTimeout(e),15e3)),d.connect()}_onConnectTimeout(e){this._connectTimers.delete(e),this.buses.has(e)&&this._hostOf(e)?.status==="connecting"&&(this._patch(e,{status:"offline"}),this._hostOf(e)?.approval!=="pending"&&this.persistIntent(e,!1))}drop(e){let t=this.buses.get(e);t&&(t.disconnect(),this.buses.delete(e)),clearTimeout(this._connectTimers.get(e)),this._connectTimers.delete(e),this.pending.delete(e)}retry(e){this.drop(e),this.open(e,this._hostOf(e))}closeAll(){for(let e of this.buses.values())e.disconnect();for(let e of(this.buses.clear(),this._connectTimers.values()))clearTimeout(e);this._connectTimers.clear(),this.pending.clear(),this.disarmProbe()}armProbe(){this._probeTimer||(this._probeTimer=setInterval(()=>{document.hidden||this.probeOnce()},6e4),this._probeVisible=()=>{"visible"===document.visibilityState&&this.probeOnce()},document.addEventListener("visibilitychange",this._probeVisible))}disarmProbe(){this._probeTimer&&(clearInterval(this._probeTimer),this._probeTimer=null,document.removeEventListener("visibilitychange",this._probeVisible),this._probeVisible=null)}probeOnce(){let e=this._probeTargets().filter(e=>!this.has(e));e.length&&fetch("/api/host-status",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({heads:e})}).then(e=>e.ok?e.json():null).then(t=>{for(let r of e){if(this.has(r))continue;let e=t?.hosts?.[r];e&&this._patch(r,{status:e.online?"online":"offline"})}}).catch(()=>{})}}var p=r(51627),m=r(31408),f=r(27520);let g="9remote_fleet_cache",y=null;function _(e){clearTimeout(y),y=setTimeout(()=>{y=null;let t={};for(let[r,n]of Object.entries(e().hosts))t[r]={label:n.label,platform:n.platform,version:n.version,sessions:n.sessions,workspaces:n.workspaces,statusMap:n.statusMap,lastSeenAt:n.lastSeenAt};try{localStorage.setItem(g,JSON.stringify(t))}catch{}},1e3)}let b=e=>({key:e,full:null,label:"",status:"offline",carrier:"ws",sessions:[],workspaces:[],statusMap:{},tasksBySession:{},platform:null,version:null,lastSeenAt:null,updateAvailable:null,canSelfUpdate:!1,updating:!1,approval:null,remoteAvailable:!1,mobileAvailable:!1,isCodespaces:!1,mobileDeviceCount:0}),w=(e,t)=>A.getState()._patchHost(e,t),k=(e,t)=>{e?.emit("getSessions",e=>{Array.isArray(e)&&w(t,{sessions:e})}),e?.emit("getWorkspaces",e=>{Array.isArray(e)&&w(t,{workspaces:e})}),e?.emit("getStatusState"),e?.emit("getSessionTasks",e=>A.getState().applySessionTasksState(t,e))},v=null,A=(0,n.v)((e,t)=>({hosts:{},currentKey:null,sync(r,n){let i=n||"",s=new Map;for(let e of r){let t=(0,o.Uo)(e.key);t&&!s.has(t)&&s.set(t,{full:e.key,label:e.label||""})}i&&!s.has(i)&&s.set(i,{full:null,label:""});let a=[...s.keys()].filter(e=>e!==i).slice(0,8),l=new Set(a);for(let e of[...v.buses.keys()])l.has(e)||v.drop(e);let c=function(){try{return JSON.parse(localStorage.getItem(g)||"{}")}catch{return{}}}(),d=new Set(u()),h=!1;try{h="1"===sessionStorage.getItem("9remote_manual_disconnect")}catch{}for(let r of(e(e=>{let t={};for(let[r,n]of s){let s=e.hosts[r]||{...b(r),...c[r]||{}};t[r]={...s,key:r,full:n.full,label:n.label||s.label,status:r===i?h?"offline":"full":l.has(r)&&("online"===s.status||"connecting"===s.status)?s.status:"offline"}}return{hosts:t,currentKey:i}}),a))d.has(r)&&v.open(r,t().hosts[r]);v.probeOnce(),v.armProbe()},_patchHost(r,n){e(e=>{let t=e.hosts[r];return t?{hosts:{...e.hosts,[r]:{...t,...n}}}:e}),_(t)},applyStatusState(r,n){let i=n||{};e(e=>{let t=e.hosts[r];return!t||(0,m.h3)(t.statusMap,i)?e:{hosts:{...e.hosts,[r]:{...t,statusMap:i}}}}),_(t)},applyStatusChange(r,{sessionId:n,state:i,tool:s,since:a,conversationId:l}={}){n&&(e(e=>{let t=e.hosts[r];if(!t)return e;let o=t.statusMap[n],c={state:i,tool:void 0!==s?s:o?.tool,since:a,...l||o?.conversationId?{conversationId:l||o?.conversationId}:{}};return(0,m.dI)(o,c)?e:{hosts:{...e.hosts,[r]:{...t,statusMap:{...t.statusMap,[n]:c}}}}}),_(t))},applyStatusCleared(r,n){n&&(e(e=>{let t=e.hosts[r],i=t?.statusMap?.[n];return i?{hosts:{...e.hosts,[r]:{...t,statusMap:{...t.statusMap,[n]:{...i,state:"idle"}}}}}:e}),_(t))},applySessionTasks(t,{sessionId:r,records:n}={}){r&&e(e=>{let i=e.hosts[t];if(!i)return e;let s={...i.tasksBySession||{}};return Array.isArray(n)&&n.length?s[r]=n:delete s[r],{hosts:{...e.hosts,[t]:{...i,tasksBySession:s}}}})},applySessionTasksState(t,r){e(e=>{let n=e.hosts[t];if(!n)return e;let i={};for(let[e,t]of Object.entries(r||{}))Array.isArray(t)&&t.length&&(i[e]=t);return{hosts:{...e.hosts,[t]:{...n,tasksBySession:i}}}})},_closeHost(e,r={}){v.drop(e),t()._patchHost(e,{status:"offline",lastSeenAt:Date.now(),approval:null,...r})},ensureHost(e){e===t().currentKey||v.has(e)||v.open(e,t().hosts[e])},connectHost(e){t().retryHost(e)},requestHostUpdate(e,r="update"){let n=t().hosts[e];if(!n||n.updating)return;let i={updating:!0,updateAvailable:null};if("full"===n.status){let n=s.d.getState(),a=n.busRef?.current;if(!a?.connected)return void(0,f.Lq)("update",`request ${r} on ACTIVE ${e} dropped: bus not connected`);t()._patchHost(e,i),n.protocolRef?.current?.setUpdating?.(!0),a.emit("restart"===r?"requestRestart":"requestUpdate")}else t()._patchHost(e,i),v.pmOf(e)?.setUpdating?.(!0),v.whenReady(e,t=>{v.pmOf(e)?.setUpdating?.(!0),(0,f.Lq)("update",`request ${r} sent on fleet bus ${e}`),t.emit("restart"===r?"requestRestart":"requestUpdate")});setTimeout(()=>{t().hosts[e]?.updating&&t()._patchHost(e,{updating:!1})},12e4)},setAutoConnect(e,t){v.persistIntent(e,t)},retryHost(e){v.retry(e)},disconnectHost(e){v.persistIntent(e,!1),t()._closeHost(e)},closeAll(){v.closeAll()}}));function S(e){return v?.busOf(e)||null}function T(e){return v?.pmOf(e)||null}function x(e,t){v?.whenReady(e,t)}v=new h({hostOf:e=>A.getState().hosts[e],patch:w,bindBus:(e,t)=>{e.on("connect",()=>{e.emit("device:clientReady"),k(e,t)}),e.on("serverInfo",e=>{let r=!!A.getState().hosts[t]?.updating;w(t,{platform:e?.platform||null,isCodespaces:!!e?.isCodespaces,version:e?.version||null,updateAvailable:!r&&(0,p.U)(e?.updateAvailable?.version,e?.version)?e.updateAvailable:null,canSelfUpdate:!!e?.canSelfUpdate,remoteAvailable:!!e?.remoteAvailable,mobileAvailable:!!e?.mobileAvailable})}),e.on("statusState",e=>A.getState().applyStatusState(t,e)),e.on("statusChange",e=>A.getState().applyStatusChange(t,e)),e.on("statusCleared",e=>A.getState().applyStatusCleared(t,e)),e.on("sessionTasks",e=>A.getState().applySessionTasks(t,e)),e.on("sessionsChanged",()=>k(e,t)),e.on("workspacesChanged",()=>k(e,t)),e.on("session-renamed",()=>k(e,t)),e.on("sessionClosed",r=>{r&&i.B.getState().closeSession(r),k(e,t)}),e.on("device:pendingApproval",()=>w(t,{approval:"pending"})),e.on("device:approved",()=>w(t,{approval:null})),e.on("device:rejected",()=>A.getState()._closeHost(t,{approval:"rejected"})),e.on("device:tailRejected",()=>A.getState()._closeHost(t))},ready:(e,t)=>{e.emit("device:clientReady"),k(e,t)},probeTargets:()=>{let e=A.getState(),t=new Set(u());return Object.values(e.hosts).filter(r=>r.key!==e.currentKey&&t.has(r.key)).map(e=>e.key)},servedBy:e=>!!e&&e===A.getState().currentKey,servedBus:()=>{let e=s.d.getState();return e.connected?e.busRef?.current||e.bus:null}})}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6419],{96419:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});let o={common:{statusIdle:"Idle",statusWorking:"Working",statusBlocked:"Needs input",statusDone:"Your turn",loading:"กำลังโหลด...",cancel:"ยกเลิก",confirm:"ยืนยัน",save:"บันทึก",delete:"ลบ",close:"ปิด",back:"กลับ",edit:"แก้ไข",rename:"เปลี่ยนชื่อ",remove:"นำออก",open:"เปิด",yes:"ใช่",no:"ไม่",ok:"ตกลง",error:"ข้อผิดพลาด",success:"สำเร็จ",failed:"ล้มเหลว",retry:"ลองใหม่",refresh:"รีเฟรช",clipboard:"Clipboard",clipboardCopy:"Copy",clipboardEmpty:"Clipboard is empty",search:"ค้นหา",create:"สร้าง",new:"ใหม่",add:"เพิ่ม",copy:"คัดลอก",copied:"คัดลอกแล้ว",download:"ดาวน์โหลด",upload:"อัปโหลด",enabled:"เปิดใช้งาน",disabled:"ปิดใช้งาน",on:"เปิด",off:"ปิด",minute:"นาที",hour:"ชม.",day:"วัน",minutesAgo:"{n} นาทีที่แล้ว",hoursAgo:"{n} ชั่วโมงที่แล้ว",daysAgo:"{n} วันที่แล้ว"},login:{tagline:"เข้าถึงเทอร์มินัลของคุณจากทุกที่",heroLine1:"Any machine.",heroLine2:"One terminal.",heroLine3:"In your pocket.",featureTerminal:"Terminal",featureDesktop:"Desktop",featureFiles:"Files",termConnected:"host connected",termTunnel:"tunnel established",termReady:"ready",accessKey:"Access Key",placeholder:"sk-xxx... หรือคีย์ใช้ครั้งเดียว (ABC123)",rememberKey:"จดจำคีย์นี้",connect:"เชื่อมต่อ",connecting:"กำลังเชื่อมต่อ...",authenticating:"กำลังตรวจสอบโทเคน...",invalidKeyTail:"Wrong access key — check the last characters and try again.",scanQr:"Scan QR to login",qrScanTitle:"Scan QR Code",qrHint:"Point the camera at the QR code shown on the machine running 9Remote.",qrDetected:"QR Code detected!",qrAuthenticating:"Authenticating...",qrPleaseWait:"Please wait...",qrLibFail:"Failed to load the QR scanner library.",qrInitFail:"Could not start the scanner.",qrCamDenied:"Camera permission denied. Allow camera access and try again.",qrNoCamera:"No camera found on this device.",qrCamBusy:"Camera is in use by another app.",qrCamError:"Could not open the camera.",savedKeys:"คีย์ที่บันทึกไว้",login:"เข้าสู่ระบบ",lastLogin:"เข้าสู่ระบบล่าสุด",namePlaceholder:"Name this key (optional)",rename:"Rename",deleteKeyTitle:"Delete key",deleteKeyConfirm:'Are you sure you want to delete "{name}"?',justNow:"เมื่อสักครู่",minutesAgo:"{n} นาทีที่แล้ว",hoursAgo:"{n} ชั่วโมงที่แล้ว",daysAgo:"{n} วันที่แล้ว",tapToScan:"แตะเพื่อสแกน",orEnterManually:"หรือป้อนคีย์ด้วยตนเอง",addKey:"Add Key",secureTitle:"Secure & Encrypted",secureDesc:"All connections are end-to-end encrypted and secure.",featAccessTitle:"Access Anywhere",featAccessDesc:"Connect from any device, anywhere.",featSecureTitle:"Secure Connection",featSecureDesc:"End-to-end encryption keeps you safe.",featFastTitle:"Fast & Reliable",featFastDesc:"Low latency and high performance.",featSessionsTitle:"Multiple Sessions",featSessionsDesc:"Manage and switch between sessions.",home:"หน้าแรก",docs:"เอกสาร"},menu:{reloadRestart:"Reload & Restart",restartHost:"Restart 9remote host",restartConfirmTitle:"Restart 9remote host?",restartConfirmMessage:"This restarts the host process (no reinstall). Terminal sessions are preserved. It takes a few seconds.",restartStarting:"Restarting host…",restartRestarting:"Restarting 9remote…",restartDone:"Restarted! Reconnecting…",restartTimeout:"Restart is taking too long",restartTimeoutHint:"Reconnect manually if it doesn't recover.",title:"เมนู",language:"ภาษา",theme:"ธีม",notifications:"การแจ้งเตือน",webgl:"GPU Render (Faster)",webglHint:"ปิดหากข้อความดูผิด",notificationsHint:"Notify when agent finishes",files:"File Explorer",downloading:"Downloading",copying:"Copying",conflictTitle:"File already exists",conflictMessage:"{name} already exists. Replace or skip?",skip:"Skip",skipAll:"Skip all",replace:"Replace",replaceAll:"Replace all",sites:"ไซต์",commandNotes:"บันทึกคำสั่ง",community:"ชุมชน",installApp:"ติดตั้งแอป",codespace:"Codespace",logout:"ออกจากระบบ",settingsGeneral:"General",settingsAppearance:"Appearance",settingsTerminalTab:"Terminal",settingsMcp:"Plugins",mcpIntro:"Extra abilities you can give your AI coding tools.",mcpTools:"Allow",mcpRestartHint:"Turning it off applies at once. Turning it on needs the AI tool restarted.",mcpUnavailable:"Update this host to use MCP.",artifactFormats:"Formats it can show",mcpClients:"Works with",settingsWorkspace:"Workspace",settingsApplication:"Application",settingsAccount:"Account",themeLight:"Light",themeDark:"Dark",reload:"โหลดแอปใหม่",remoteDesktop:"รีโมตเดสก์ท็อป",settings:"การตั้งค่า",enablePush:"เปิดการแจ้งเตือนแบบ Push",disablePush:"ปิดการแจ้งเตือนแบบ Push",pushHint:"เปิดการแจ้งเตือนเพื่อรับการแจ้งเตือนเมื่อ AI ทำงานเสร็จ",pushActiveHint:"Push notifications are on for this device. You'll be alerted when AI completes tasks.",versionMismatch:"Host {version} ล้าสมัยแล้ว",versionMismatchHint:"บางฟีเจอร์อาจไม่ทำงาน รัน:",updateNow:"Update now",updating:"Updating… reconnecting",webReloadTitle:"New web version available",webReloadHint:"Reload to get the latest interface.",reloadWeb:"Reload",updateAvailableTitle:"9Remote host update available",updateStarting:"Starting update…",updateInstalling:"Installing new version…",updateTimeout:"Update is taking too long",updateTimeoutHint:"Reload manually if it doesn't recover.",updateRestarting:"Restarting host…",updateReconnecting:"Reconnecting…",updateDone:"Updated! Reloading…",version:"เวอร์ชัน"},workspace:{loading:"กำลังโหลด...",logoutTitle:"ออกจากระบบ",logoutMessage:"คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบ?",failedCreateSession:"ไม่สามารถสร้างเซสชัน: {error}",failedRenameSession:"ไม่สามารถเปลี่ยนชื่อเซสชัน: {error}"},sessions:{headerTitle:"9remote.cc",connected:"เชื่อมต่อแล้ว",disconnected:"ตัดการเชื่อมต่อ",codespaceStopped:"Codespace หยุดทำงาน",placeholder:"ชื่อเทอร์มินัล (ไม่บังคับ)",newButton:"+ ใหม่",empty:"ไม่มีเซสชันที่ใช้งานอยู่",emptyHint:"สร้างเซสชันใหม่เพื่อเริ่มต้น",created:"สร้างเมื่อ {time}",deleteTitle:"ลบเซสชัน",deleteMessage:'คุณแน่ใจหรือไม่ว่าต้องการลบ "{name}"?',editName:"แก้ไขชื่อ",newTerminal:"เทอร์มินัลใหม่",options:"Options"},workspaces:{title:"Groups",newWorkspace:"Group",newWorkspacePrompt:"Group name",defaultName:"New Group",ungrouped:"Ungrouped",addTerminal:"Add terminal to group",moveToWorkspace:"Move to group",rename:"Rename group",delete:"Delete group",emptyWorkspace:"No terminals in this group",deleteTitle:"Delete Group",deleteMessage:'Delete group "{name}"? Terminals move to Ungrouped.'},terminal:{quotaNoData:"No quota data",quotaUsageTitle:"usage",back:"กลับ",menu:"เมนู",newTerminal:"เทอร์มินัลใหม่",remoteDesktop:"รีโมตเดสก์ท็อป",defaultName:"Term"},files:{selectWorkspace:"เลือกเวิร์กสเปซ",recentWorkspaces:"เวิร์กสเปซล่าสุด",home:"หน้าแรก",root:"ราก",drive:"ไดรฟ์ {letter}",codespaces:"Codespaces",removeRecent:"นำออกจากรายการล่าสุด",removeTitle:"นำเวิร์กสเปซออก",removeMessage:'นำ "{name}" ออกจากเวิร์กสเปซล่าสุด?',setAsWorkspace:"ตั้งเป็นเวิร์กสเปซ",openFolder:"เปิดโฟลเดอร์",newFile:"ไฟล์ใหม่",newFolder:"โฟลเดอร์ใหม่",rename:"เปลี่ยนชื่อ",delete:"ลบ",deleteFile:"ลบไฟล์",deleteFolder:"ลบโฟลเดอร์",deleteFileMessage:'ลบ "{name}"?',deleteFolderMessage:'ลบโฟลเดอร์ "{name}" และเนื้อหาทั้งหมด?',emptyFolder:"โฟลเดอร์ว่าง",git:"Git",parent:"โฟลเดอร์หลัก",workspace:"เวิร์กสเปซ",failedLoad:"โหลดไม่สำเร็จ: {error}",failedDelete:"ลบไม่สำเร็จ: {error}",failedCreate:"สร้างไม่สำเร็จ: {error}",failedRename:"เปลี่ยนชื่อไม่สำเร็จ: {error}",enterName:"ป้อนชื่อ",confirmRename:"เปลี่ยนชื่อเป็น:",setWorkspace:"ตั้งเวิร์กสเปซ",setAsWorkspaceTitle:"ตั้งเป็นเวิร์กสเปซ",switchWorkspace:"สลับเวิร์กสเปซ",searchFiles:"ค้นหาไฟล์",toggleHidden:"สลับไฟล์ที่ซ่อน",searchPlaceholder:"ค้นหาไฟล์...",searching:"กำลังค้นหา...",noFilesFound:"ไม่พบไฟล์",noGitRepo:"ไม่มี Git repository",cannotOpenBinary:"ไม่สามารถเปิดไฟล์ไบนารี",createNew:"สร้างใหม่",file:"ไฟล์",folder:"โฟลเดอร์",placeholderFile:"filename.js",placeholderFolder:"folder-name",pickFile:"Choose files",pickFolder:"Choose folder",copyPath:"คัดลอกพาธ",copyRelPath:"Copy Relative Path",copyName:"Copy Filename",delete:"ลบ",rename:"เปลี่ยนชื่อ",deleteConfirmTitle:"ลบ",deleteConfirmMessage:'ลบ "{name}"?'},editor:{save:"บันทึก",saving:"กำลังบันทึก...",saved:"บันทึกแล้ว",unsaved:"การเปลี่ยนแปลงยังไม่บันทึก",close:"ปิด",discard:"ทิ้ง",discardTitle:"ทิ้งการเปลี่ยนแปลง",discardMessage:"คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก ทิ้งหรือไม่?",unsavedTitle:"Save changes to {name}?",unsavedBody:"Your changes will be lost if you don't save them.",failedLoad:"โหลดไฟล์ไม่สำเร็จ: {error}",failedSave:"บันทึกไม่สำเร็จ: {error}",openFull:"Open in full editor",artifact:"Artifact",readOnly:"อ่านอย่างเดียว",line:"บรรทัด",column:"คอลัมน์",gitDiff:"Git Diff",typeText:"พิมพ์ข้อความและแทรก...",insert:"แทรก",statusModified:"แก้ไขแล้ว",statusAdded:"เพิ่มแล้ว",statusUntracked:"ยังไม่ติดตาม"},git:{title:"Git",branch:"Branch",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",push:"Push",pull:"Pull",fetch:"Fetch",stage:"Stage",stageAll:"Stage ทั้งหมด",unstage:"Unstage",discard:"ทิ้ง",discardChanges:"ทิ้งการเปลี่ยนแปลง",discardMessage:'ทิ้งการเปลี่ยนแปลงของ "{name}"?',noChanges:"ไม่มีการเปลี่ยนแปลง",diff:"Diff",pushing:"กำลัง Push...",pulling:"กำลัง Pull...",committing:"กำลัง Commit...",failedCommit:"Commit ไม่สำเร็จ: {error}",failedPush:"Push ไม่สำเร็จ: {error}",failedPull:"Pull ไม่สำเร็จ: {error}",status:"สถานะ",diffTab:"Diff",modified:"แก้ไขแล้ว",added:"เพิ่มแล้ว",deleted:"ลบแล้ว",untrackedTitle:"ยังไม่ติดตาม",openFile:"เปิดไฟล์",discardChangesTitle:"ทิ้งการเปลี่ยนแปลง",discardConfirmTitle:"ทิ้งการเปลี่ยนแปลง",discardConfirmDelete:'คุณแน่ใจหรือไม่ว่าต้องการลบ "{name}"? การกระทำนี้ไม่สามารถย้อนกลับได้',discardConfirmDiscard:'คุณแน่ใจหรือไม่ว่าต้องการทิ้งการเปลี่ยนแปลงใน "{name}"? การกระทำนี้ไม่สามารถย้อนกลับได้'},remote:{title:"รีโมตเดสก์ท็อป",connecting:"กำลังเชื่อมต่อ...",disconnected:"ตัดการเชื่อมต่อ",fullscreen:"เต็มหน้าจอ",exitFullscreen:"ออกจากเต็มหน้าจอ",receivingImage:"Receiving screen…",keyboard:"คีย์บอร์ด",mouse:"เมาส์",quality:"คุณภาพ",fps:"FPS",debug:"ดีบัก",help:"ช่วยเหลือ",close:"ปิด",sendKey:"ส่งคีย์",helpTitle:"ความช่วยเหลือรีโมตเดสก์ท็อป",notAvailable:"ไม่สามารถใช้รีโมตเดสก์ท็อปได้",customizeKeys:"ปรับแต่งคีย์",back:"กลับ",resetZoom:"รีเซ็ตซูม",refresh:"รีเฟรช",rectangleSelection:"เลือกแบบสี่เหลี่ยม",handMode:"โหมดมือ",toggleKeyboard:"สลับคีย์บอร์ดเนทีฟ",hideControls:"Hide controls",showControls:"Show controls",textBatchInput:"ป้อนข้อความเป็นชุด",extraKeys:"คีย์เพิ่มเติม",customizeRemoteKeys:"ปรับแต่งคีย์รีโมต",exitRemote:"ออกจากรีโมตเดสก์ท็อป",debugTitle:"สถิติดีบัก",minimize:"ย่อ",transport:"การส่งข้อมูล",latency:"ความหน่วง",tilesPerSec:"ไทล์/วินาที",bandwidth:"แบนด์วิดท์",clearStats:"ล้างสถิติ",lockTitle:"Windows ถูกล็อก",lockGrantDesc:'เปิด "ปลดล็อกพีซีระยะไกล" ใน 9remote host บนพีซีเครื่องนี้',lockDesc:"ป้อน PIN หรือรหัสผ่าน Windows สำหรับคอมพิวเตอร์เครื่องนี้",lockPlaceholder:"PIN หรือรหัสผ่าน Windows",unlock:"ปลดล็อก",unlocking:"กำลังปลดล็อก…",unlockFailed:"ปลดล็อกไม่สำเร็จ — ตรวจสอบ PIN/รหัสผ่านแล้วลองอีกครั้ง"},remoteHelp:{modePc:"PC / เมาส์",modeTrackpad:"สัมผัส \xb7 Trackpad",modeDirect:"สัมผัส \xb7 ตรง",mouseTitle:"เมาส์",keyboardTitle:"คีย์บอร์ด",gesturesTrackpadTitle:"ท่าทาง (Trackpad ✋)",gesturesDirectTitle:"ท่าทาง (ตรง)",toolbarTitle:"แถบเครื่องมือ",mouseClickKey:"คลิก / ลาก",mouseClickDesc:"คลิกซ้าย ลากเพื่อเลือก/ย้าย",mouseRightKey:"คลิกขวา",mouseRightDesc:"เมนูบริบทบนรีโมต",mouseWheelKey:"ลูกล้อ",mouseWheelDesc:"เลื่อนรีโมต (Shift + ลูกล้อ = แนวนอน)",mouseDoubleKey:"ดับเบิลคลิก",mouseDoubleDesc:"ดับเบิลคลิกบนรีโมต",keyPhysicalKey:"คีย์จริง",keyPhysicalDesc:"ส่งโดยตรง (Tab, ปุ่ม F ฯลฯ ถูกจับ)",keyModifierKey:"Ctrl / Alt / Shift / ⌘",keyModifierDesc:"ตัวขยายแบบติด — รวมกับคีย์ถัดไป",trackpadSwipeKey:"ปัด 1 นิ้ว",trackpadSwipeDesc:"เลื่อนเคอร์เซอร์เสมือน",trackpadTapKey:"แตะ 1 นิ้ว",trackpadTapDesc:"คลิกซ้ายที่เคอร์เซอร์",trackpad2TapKey:"แตะ 2 นิ้ว",trackpad2TapDesc:"คลิกขวาที่เคอร์เซอร์",trackpad2SwipeKey:"ปัด 2 นิ้ว",trackpad2SwipeDesc:"เลื่อนที่ตำแหน่งเคอร์เซอร์",trackpadPinchKey:"หนีบ 2 นิ้ว",trackpadPinchDesc:"ซูมแคนวาส",trackpadScrollLockKey:"กดค้าง + ลาก",trackpadScrollLockDesc:"กดค้างเพื่อล็อกการเลื่อน ลากได้ทุกทิศทาง",directTapKey:"แตะ 1 นิ้ว",directTapDesc:"คลิกที่ตำแหน่งแตะ",directLongKey:"กดค้าง 1 นิ้ว",directLongDesc:"คลิกขวา",directDoubleKey:"แตะ 2 ครั้ง 1 นิ้ว",directDoubleDesc:"ดับเบิลคลิก",directScrollKey:"ปัด 2 นิ้ว",directScrollDesc:"เลื่อนรีโมต",directPinchKey:"หนีบ 2 นิ้ว",directPinchDesc:"ซูมแคนวาส",directPanKey:"ลาก 1 นิ้ว (ซูม>1)",directPanDesc:"เลื่อนแคนวาส",toolbarHandDesc:"กดคลิกซ้ายค้าง (โหมดลาก) — แตะอีกครั้งเพื่อปล่อย",toolbarMouseDirectDesc:"สลับไปโหมดตรง",toolbarMouseTrackpadDesc:"สลับไป Trackpad (เคอร์เซอร์เสมือน)",toolbarKeyboardDesc:"คีย์บอร์ดเนทีฟ / ป้อนข้อความเป็นชุด",toolbarRectDesc:"โหมดเลือกแบบสี่เหลี่ยม"},remoteControls:{enterToSend:"Tab / Ctrl+Num เพื่อสลับแท็บ",typeToSend:"พิมพ์ข้อความเพื่อส่ง...",send:"ส่ง",trackpadMode:"โหมด Trackpad",directMode:"โหมดตรง",bottomRow:"แถวล่าง",extraPanel:"พาเนลเพิ่มเติม",exitConfirmMessage:"คุณแน่ใจหรือไม่ว่าต้องการออกจากเซสชันรีโมตเดสก์ท็อปปัจจุบัน?"},connection:{retrying:"กำลังเชื่อมต่อใหม่...",waitingApproval:"กำลังรอการอนุมัติ",approvalDescription:"9Remote host ต้องอนุมัติอุปกรณ์นี้ก่อนคุณจึงจะเชื่อมต่อได้",approvalHint:"ตรวจสอบเทอร์มินัลบนเครื่องของคุณ",rejectedTitle:"อุปกรณ์ถูกปฏิเสธ",rejectedDescription:"อุปกรณ์นี้ไม่ได้รับการอนุมัติจาก 9Remote host",backToLogin:"กลับไปเข้าสู่ระบบ",failed:"การเชื่อมต่อล้มเหลว",failedDescription:"ไม่สามารถเชื่อมต่อหลังจากพยายาม {n} ครั้ง",attemptOf:"ครั้งที่ {n} จาก {total}",exit:"ออก",cancel:"ยกเลิก",retry:"ลองใหม่ทันที"},notifications:{claudeCode:"Claude Code",codex:"Codex",geminiCli:"Gemini CLI",openCode:"OpenCode",needsInput:"needs input",badgeTitle:"{blocked} needs input, {done} your turn",replied:"replied",agent:"Agent"},sites:{title:"ไซต์",localSites:"ไซต์ในเครื่อง",selectSitePreview:"เลือกไซต์เพื่อดูตัวอย่าง",browserNewTab:"New tab",browserAddressPlaceholder:"localhost:3000 or /path",browserNotConnected:"Connect to your host first",portPlaceholder:"พอร์ต",loadingSites:"กำลังโหลดไซต์...",notConnected:"Not connected to the host",noSitesFound:"ไม่พบไซต์",startServerHint:"เริ่ม dev server ในเครื่องเพื่อดูที่นี่",siteNamePlaceholder:"ชื่อไซต์",saveTitle:"บันทึก",editNameTitle:"แก้ไขชื่อ",removeTitle:"นำออก",removePortTitle:"นำพอร์ตออก",removePortMessage:"นำพอร์ต {port} ออกจากรายการที่บันทึก?",popupBlocked:"Popup ถูกบล็อก! โปรดอนุญาต popup สำหรับไซต์นี้",startProxyFailed:"ไม่สามารถเริ่มเซสชัน proxy สำหรับ {name}",foundCount:"พบ {n} ไซต์{suffix}",focusOpenedTab:"โฟกัสแท็บที่เปิด",openInNewTab:"เปิดในแท็บใหม่",goBack:"ย้อนกลับ",goForward:"ไปข้างหน้า",loadingSite:"กำลังโหลด...",empty:"ไม่มีไซต์ที่ใช้งานอยู่",emptyHint:"รันเซิร์ฟเวอร์ในเครื่องเพื่อดูที่นี่",open:"เปิด",refresh:"รีเฟรช"},commandNotes:{title:"บันทึกคำสั่ง",noSavedCommands:"ไม่มีคำสั่งที่บันทึก",addFirstBelow:"เพิ่มคำสั่งแรกของคุณด้านล่าง",clickToCopy:"คลิกเพื่อคัดลอก",copiedBang:"คัดลอกแล้ว!",copy:"คัดลอก",edit:"แก้ไข",delete:"ลบ",editCommandPlaceholder:"แก้ไขคำสั่ง...",addCommandPlaceholder:"เพิ่มคำสั่ง...",update:"อัปเดต",add:"เพิ่ม",empty:"ยังไม่มีบันทึก",emptyHint:"บันทึกคำสั่งเพื่อเข้าถึงอย่างรวดเร็ว",add:"เพิ่มบันทึก",edit:"แก้ไขบันทึก",delete:"ลบบันทึก",deleteMessage:"ลบบันทึกนี้?",name:"ชื่อ",command:"คำสั่ง",save:"บันทึก",placeholderName:"เช่น เริ่ม dev server",placeholderCommand:"เช่น npm run dev"},mobileKeyboard:{pasteHere:"วางที่นี่ (Cmd+V)",enterToSend:"Tab / Ctrl+Num เพื่อสลับแท็บ",typeCommand:"พิมพ์คำสั่งและส่ง...",send:"ส่ง",toggleExtraKeys:"สลับคีย์เพิ่มเติม",toggleTextInput:"สลับช่องป้อนข้อความ",customizeTerminalKeys:"ปรับแต่งคีย์เทอร์มินัล",mainBar:"แถบหลัก",extraPanel:"พาเนลเพิ่มเติม",fileTooLarge:"ไฟล์ใหญ่เกินไป (สูงสุด 5MB)",readFileFailed:"อ่านไฟล์ไม่สำเร็จ",uploadFailed:"อัปโหลดไฟล์ไม่สำเร็จ: {error}"},terminalPane:{scrollToBottom:"เลื่อนไปด้านล่าง",changedFiles:"Changed files",pasteOrType:"วางหรือพิมพ์ที่นี่",paste:"วาง"},pwaGuide:{copyYourKey:"คัดลอกคีย์ของคุณ",copyKeyHint:"แตะคีย์ด้านล่างเพื่อคัดลอก — คุณต้องใช้เพื่อเข้าสู่ระบบหลังติดตั้ง",tapToCopyApiKey:"แตะเพื่อคัดลอก API key",copiedBang:"คัดลอกแล้ว!",copy:"คัดลอก",tapShareButton:"แตะปุ่มแชร์",tapShareHint:"แตะปุ่มแชร์ที่ด้านล่างของ iOS Safari",addToHome:"เพิ่มไปที่หน้าจอหลัก",addToHomeHint:'เลื่อนลงและแตะ "เพิ่มไปที่หน้าจอหลัก"',openAppPasteKey:"เปิดแอปและวางคีย์",openAppPasteKeyHint:"เปิดแอปที่ติดตั้งและวางคีย์เพื่อเข้าสู่ระบบ",openMenu:"เปิดเมนู",openMenuHint:"แตะปุ่มเมนู (สามจุด) ใน Android Chrome",installApp:"ติดตั้งแอป",installAppHint:'แตะ "ติดตั้งแอป" หรือ "เพิ่มไปที่หน้าจอหลัก"',lookInstallIcon:"มองหาไอคอนติดตั้ง",lookInstallIconHint:"มองหาไอคอนติดตั้งในแถบที่อยู่",clickInstallPaste:"คลิกติดตั้งและวางคีย์",installNow:"Install Now",installNowHint:"Install 9Remote as an app for quick access",installing:"Installing...",clickInstallPasteHint:"คลิกติดตั้ง เปิดแอป และวางคีย์เพื่อเข้าสู่ระบบ",alternativeHint:'ทางเลือก: เปิดเมนูเบราว์เซอร์ → "ติดตั้ง 9Remote" หรือ "สร้างทางลัด"',loadingPlatform:"กำลังตรวจจับแพลตฟอร์ม...",iosPlatform:"iOS (iPhone/iPad)",androidPlatform:"Android",macosPlatform:"macOS",windowsPlatform:"Windows",desktopPlatform:"เดสก์ท็อป",alreadyInstalled:"ติดตั้งแล้ว!",alreadyInstalledHint:"คุณกำลังใช้ 9Remote เป็นแอปที่ติดตั้งแล้ว",installationGuide:"คู่มือการติดตั้ง",installationSteps:"ขั้นตอนการติดตั้ง:"},community:{title:"ชุมชน",description:"เข้าร่วมชุมชน 9Remote"},pwa:{title:"ติดตั้งเป็นแอป",description:"ติดตั้ง 9Remote บนอุปกรณ์ของคุณเพื่อประสบการณ์ที่ดีที่สุด",iosTitle:"iOS Safari",androidTitle:"Android Chrome",desktopTitle:"เดสก์ท็อป"},codespace:{title:"Codespace",name:"ชื่อ",status:"สถานะ",running:"กำลังทำงาน",autoStart:"เริ่ม 9Remote อัตโนมัติ",autoStartHint:"เริ่ม 9Remote เมื่อ Codespace เปิด",stop:"หยุด Codespace",stopHint:"หยุดเพื่อประหยัดการใช้งาน",restartHint:"หากต้องการเริ่มใหม่ ไปที่ GitHub",unknown:"ไม่ทราบ"}}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[674],{40674:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});let o={common:{statusIdle:"Idle",statusWorking:"Working",statusBlocked:"Needs input",statusDone:"Your turn",loading:"読み込み中...",cancel:"キャンセル",confirm:"確認",save:"保存",delete:"削除",close:"閉じる",back:"戻る",edit:"編集",rename:"名前変更",remove:"削除",open:"開く",yes:"はい",no:"いいえ",ok:"OK",error:"エラー",success:"成功",failed:"失敗",retry:"再試行",refresh:"更新",clipboard:"Clipboard",clipboardCopy:"Copy",clipboardEmpty:"Clipboard is empty",search:"検索",create:"作成",new:"新規",add:"追加",copy:"コピー",copied:"コピーしました",download:"ダウンロード",upload:"アップロード",enabled:"有効",disabled:"無効",on:"オン",off:"オフ",minute:"分",hour:"時間",day:"日",minutesAgo:"{n} 分前",hoursAgo:"{n} 時間前",daysAgo:"{n} 日前"},login:{tagline:"どこからでもターミナルにアクセス",heroLine1:"Any machine.",heroLine2:"One terminal.",heroLine3:"In your pocket.",featureTerminal:"Terminal",featureDesktop:"Desktop",featureFiles:"Files",termConnected:"host connected",termTunnel:"tunnel established",termReady:"ready",accessKey:"アクセスキー",placeholder:"sk-xxx... またはワンタイムキー (ABC123)",rememberKey:"このキーを記憶する",connect:"接続",connecting:"接続中...",authenticating:"トークンで認証中...",invalidKeyTail:"Wrong access key — check the last characters and try again.",scanQr:"Scan QR to login",qrScanTitle:"Scan QR Code",qrHint:"Point the camera at the QR code shown on the machine running 9Remote.",qrDetected:"QR Code detected!",qrAuthenticating:"Authenticating...",qrPleaseWait:"Please wait...",qrLibFail:"Failed to load the QR scanner library.",qrInitFail:"Could not start the scanner.",qrCamDenied:"Camera permission denied. Allow camera access and try again.",qrNoCamera:"No camera found on this device.",qrCamBusy:"Camera is in use by another app.",qrCamError:"Could not open the camera.",savedKeys:"保存されたキー",login:"ログイン",lastLogin:"最終ログイン",namePlaceholder:"Name this key (optional)",rename:"Rename",deleteKeyTitle:"Delete key",deleteKeyConfirm:'Are you sure you want to delete "{name}"?',justNow:"たった今",minutesAgo:"{n}分前",hoursAgo:"{n}時間前",daysAgo:"{n}日前",tapToScan:"タップしてスキャン",orEnterManually:"または手動でキーを入力",addKey:"Add Key",secureTitle:"Secure & Encrypted",secureDesc:"All connections are end-to-end encrypted and secure.",featAccessTitle:"Access Anywhere",featAccessDesc:"Connect from any device, anywhere.",featSecureTitle:"Secure Connection",featSecureDesc:"End-to-end encryption keeps you safe.",featFastTitle:"Fast & Reliable",featFastDesc:"Low latency and high performance.",featSessionsTitle:"Multiple Sessions",featSessionsDesc:"Manage and switch between sessions.",home:"ホーム",docs:"ドキュメント"},menu:{reloadRestart:"Reload & Restart",restartHost:"Restart 9remote host",restartConfirmTitle:"Restart 9remote host?",restartConfirmMessage:"This restarts the host process (no reinstall). Terminal sessions are preserved. It takes a few seconds.",restartStarting:"Restarting host…",restartRestarting:"Restarting 9remote…",restartDone:"Restarted! Reconnecting…",restartTimeout:"Restart is taking too long",restartTimeoutHint:"Reconnect manually if it doesn't recover.",title:"メニュー",language:"言語",theme:"テーマ",notifications:"通知",webgl:"GPU Render (Faster)",webglHint:"テキストがおかしい場合はオフにしてください",notificationsHint:"Notify when agent finishes",files:"File Explorer",downloading:"Downloading",copying:"Copying",conflictTitle:"File already exists",conflictMessage:"{name} already exists. Replace or skip?",skip:"Skip",skipAll:"Skip all",replace:"Replace",replaceAll:"Replace all",sites:"サイト",commandNotes:"コマンドメモ",community:"コミュニティ",installApp:"アプリをインストール",codespace:"Codespace",logout:"ログアウト",settingsGeneral:"General",settingsAppearance:"Appearance",settingsTerminalTab:"Terminal",settingsMcp:"Plugins",mcpIntro:"Extra abilities you can give your AI coding tools.",mcpTools:"Allow",mcpRestartHint:"Turning it off applies at once. Turning it on needs the AI tool restarted.",mcpUnavailable:"Update this host to use MCP.",artifactFormats:"Formats it can show",mcpClients:"Works with",settingsWorkspace:"Workspace",settingsApplication:"Application",settingsAccount:"Account",themeLight:"Light",themeDark:"Dark",reload:"アプリを再読み込み",remoteDesktop:"リモートデスクトップ",settings:"設定",enablePush:"プッシュ通知を有効にする",disablePush:"プッシュ通知を無効にする",pushHint:"プッシュ通知を有効にすると、AIがタスクを完了したときに通知を受け取れます",pushActiveHint:"Push notifications are on for this device. You'll be alerted when AI completes tasks.",versionMismatch:"Host {version} は古いバージョンです",versionMismatchHint:"一部の機能が動作しない可能性があります。実行してください:",updateNow:"Update now",updating:"Updating… reconnecting",webReloadTitle:"New web version available",webReloadHint:"Reload to get the latest interface.",reloadWeb:"Reload",updateAvailableTitle:"9Remote host update available",updateStarting:"Starting update…",updateInstalling:"Installing new version…",updateTimeout:"Update is taking too long",updateTimeoutHint:"Reload manually if it doesn't recover.",updateRestarting:"Restarting host…",updateReconnecting:"Reconnecting…",updateDone:"Updated! Reloading…",version:"バージョン"},workspace:{loading:"読み込み中...",logoutTitle:"ログアウト",logoutMessage:"ログアウトしてもよろしいですか?",failedCreateSession:"セッションの作成に失敗しました: {error}",failedRenameSession:"セッションの名前変更に失敗しました: {error}"},sessions:{headerTitle:"9remote.cc",connected:"接続済み",disconnected:"切断",codespaceStopped:"Codespace 停止中",placeholder:"ターミナル名 (任意)",newButton:"+ 新規",empty:"アクティブなセッションがありません",emptyHint:"新しいセッションを作成して開始してください",created:"作成日時 {time}",deleteTitle:"セッションを削除",deleteMessage:'"{name}" を削除してもよろしいですか?',editName:"名前を編集",newTerminal:"新しいターミナル",options:"Options"},workspaces:{title:"Groups",newWorkspace:"Group",newWorkspacePrompt:"Group name",defaultName:"New Group",ungrouped:"Ungrouped",addTerminal:"Add terminal to group",moveToWorkspace:"Move to group",rename:"Rename group",delete:"Delete group",emptyWorkspace:"No terminals in this group",deleteTitle:"Delete Group",deleteMessage:'Delete group "{name}"? Terminals move to Ungrouped.'},terminal:{quotaNoData:"No quota data",quotaUsageTitle:"usage",back:"戻る",menu:"メニュー",newTerminal:"新しいターミナル",remoteDesktop:"リモートデスクトップ",defaultName:"ターム"},files:{selectWorkspace:"ワークスペースを選択",recentWorkspaces:"最近のワークスペース",home:"ホーム",root:"ルート",drive:"ドライブ {letter}",codespaces:"Codespaces",removeRecent:"最近から削除",removeTitle:"ワークスペースを削除",removeMessage:'最近のワークスペースから "{name}" を削除しますか?',setAsWorkspace:"ワークスペースに設定",openFolder:"フォルダを開く",newFile:"新規ファイル",newFolder:"新規フォルダ",rename:"名前変更",delete:"削除",deleteFile:"ファイルを削除",deleteFolder:"フォルダを削除",deleteFileMessage:'"{name}" を削除しますか?',deleteFolderMessage:'フォルダ "{name}" とそのすべての内容を削除しますか?',emptyFolder:"空のフォルダ",git:"Git",parent:"親フォルダ",workspace:"ワークスペース",failedLoad:"読み込みに失敗しました: {error}",failedDelete:"削除に失敗しました: {error}",failedCreate:"作成に失敗しました: {error}",failedRename:"名前変更に失敗しました: {error}",enterName:"名前を入力",confirmRename:"新しい名前:",setWorkspace:"ワークスペースに設定",setAsWorkspaceTitle:"ワークスペースに設定",switchWorkspace:"ワークスペースを切り替え",searchFiles:"ファイルを検索",toggleHidden:"隠しファイルを切替",searchPlaceholder:"ファイルを検索...",searching:"検索中...",noFilesFound:"ファイルが見つかりません",noGitRepo:"Git リポジトリがありません",cannotOpenBinary:"バイナリファイルは開けません",createNew:"新規作成",file:"ファイル",folder:"フォルダ",placeholderFile:"filename.js",placeholderFolder:"folder-name",pickFile:"Choose files",pickFolder:"Choose folder",copyPath:"パスをコピー",copyRelPath:"Copy Relative Path",copyName:"Copy Filename",delete:"削除",rename:"名前変更",deleteConfirmTitle:"削除",deleteConfirmMessage:'"{name}" を削除しますか?'},editor:{save:"保存",saving:"保存中...",saved:"保存済み",unsaved:"未保存の変更",close:"閉じる",discard:"破棄",discardTitle:"変更を破棄",discardMessage:"未保存の変更があります。破棄しますか?",unsavedTitle:"Save changes to {name}?",unsavedBody:"Your changes will be lost if you don't save them.",failedLoad:"ファイルの読み込みに失敗しました: {error}",failedSave:"保存に失敗しました: {error}",openFull:"Open in full editor",artifact:"Artifact",readOnly:"読み取り専用",line:"行",column:"列",gitDiff:"Git 差分",typeText:"テキストを入力して挿入...",insert:"挿入",statusModified:"変更済み",statusAdded:"追加済み",statusUntracked:"未追跡"},git:{title:"Git",branch:"ブランチ",changes:"変更",staged:"ステージ済み",unstaged:"未ステージ",untracked:"未追跡",commit:"コミット",commitAndPush:"Commit & Push",commitSuccess:"Commit successful",pushSuccess:"Push successful",stageFailed:"Failed to stage changes",commitFailed:"Commit failed",pushFailed:"Push failed",pullSuccess:"Pull successful",pullFailed:"Pull failed",stageAllConfirmTitle:"Stage All & Commit",stageAllConfirmMessage:"No changes are staged. Stage all changes and commit?",stageAndCommit:"Stage & Commit",gitActions:"Git actions",commitPlaceholder:"Commit message…",stageAllNote:"Stage all \xb7 {count}",upToDate:"Everything up-to-date",commitMessage:"コミットメッセージ",push:"プッシュ",pull:"プル",fetch:"フェッチ",stage:"ステージ",stageAll:"すべてステージ",unstage:"ステージ解除",discard:"破棄",discardChanges:"変更を破棄",discardMessage:'"{name}" の変更を破棄しますか?',noChanges:"変更なし",diff:"差分",pushing:"プッシュ中...",pulling:"プル中...",committing:"コミット中...",failedCommit:"コミットに失敗しました: {error}",failedPush:"プッシュに失敗しました: {error}",failedPull:"プルに失敗しました: {error}",status:"ステータス",diffTab:"差分",modified:"変更済み",added:"追加済み",deleted:"削除済み",untrackedTitle:"未追跡",openFile:"ファイルを開く",discardChangesTitle:"変更を破棄",discardConfirmTitle:"変更を破棄",discardConfirmDelete:'"{name}" を削除してもよろしいですか?この操作は元に戻せません。',discardConfirmDiscard:'"{name}" の変更を破棄してもよろしいですか?この操作は元に戻せません。'},remote:{title:"リモートデスクトップ",connecting:"接続中...",disconnected:"切断",fullscreen:"フルスクリーン",exitFullscreen:"フルスクリーンを終了",receivingImage:"Receiving screen…",keyboard:"キーボード",mouse:"マウス",quality:"品質",fps:"FPS",debug:"デバッグ",help:"ヘルプ",close:"閉じる",sendKey:"キーを送信",helpTitle:"リモートデスクトップ ヘルプ",notAvailable:"リモートデスクトップは利用できません",customizeKeys:"キーをカスタマイズ",back:"戻る",resetZoom:"ズームをリセット",refresh:"更新",rectangleSelection:"矩形選択",handMode:"ハンドモード",toggleKeyboard:"ネイティブキーボード切替",hideControls:"Hide controls",showControls:"Show controls",textBatchInput:"テキスト一括入力",extraKeys:"追加キー",customizeRemoteKeys:"リモートキーをカスタマイズ",exitRemote:"リモートデスクトップを終了",debugTitle:"デバッグ統計",minimize:"最小化",transport:"トランスポート",latency:"レイテンシ",tilesPerSec:"タイル/秒",bandwidth:"帯域幅",clearStats:"統計をクリア",lockTitle:"Windows がロックされています",lockGrantDesc:"このPCの9remote hostで「リモートでロック解除」をオンにしてください。",lockDesc:"このコンピューターの Windows PIN またはパスワードを入力してください",lockPlaceholder:"Windows PIN またはパスワード",unlock:"ロック解除",unlocking:"ロック解除中…",unlockFailed:"ロック解除に失敗 — PIN/パスワードを確認して再試行してください。"},remoteHelp:{modePc:"PC / マウス",modeTrackpad:"タッチ \xb7 Trackpad",modeDirect:"タッチ \xb7 ダイレクト",mouseTitle:"マウス",keyboardTitle:"キーボード",gesturesTrackpadTitle:"ジェスチャー (Trackpad ✋)",gesturesDirectTitle:"ジェスチャー (ダイレクト)",toolbarTitle:"ツールバー",mouseClickKey:"クリック / ドラッグ",mouseClickDesc:"左クリック、ドラッグで選択/移動",mouseRightKey:"右クリック",mouseRightDesc:"リモート上のコンテキストメニュー",mouseWheelKey:"ホイール",mouseWheelDesc:"リモートをスクロール (Shift + ホイール = 水平)",mouseDoubleKey:"ダブルクリック",mouseDoubleDesc:"リモート上でダブルクリック",keyPhysicalKey:"物理キー",keyPhysicalDesc:"直接送信 (Tab、Fキーなどキャプチャ)",keyModifierKey:"Ctrl / Alt / Shift / ⌘",keyModifierDesc:"粘着修飾キー — 次のキーと組み合わせます",trackpadSwipeKey:"1本指スワイプ",trackpadSwipeDesc:"仮想カーソルを移動",trackpadTapKey:"1本指タップ",trackpadTapDesc:"カーソル位置で左クリック",trackpad2TapKey:"2本指タップ",trackpad2TapDesc:"カーソル位置で右クリック",trackpad2SwipeKey:"2本指スワイプ",trackpad2SwipeDesc:"カーソル位置でスクロール",trackpadPinchKey:"2本指ピンチ",trackpadPinchDesc:"キャンバスをズーム",trackpadScrollLockKey:"長押し + ドラッグ",trackpadScrollLockDesc:"長押しでスクロール固定、任意の方向にドラッグ",directTapKey:"1本指タップ",directTapDesc:"タップ位置でクリック",directLongKey:"1本指長押し",directLongDesc:"右クリック",directDoubleKey:"1本指ダブルタップ",directDoubleDesc:"ダブルクリック",directScrollKey:"2本指スワイプ",directScrollDesc:"リモートをスクロール",directPinchKey:"2本指ピンチ",directPinchDesc:"キャンバスをズーム",directPanKey:"1本指ドラッグ (zoom>1)",directPanDesc:"キャンバスをパン",toolbarHandDesc:"左クリック保持 (ドラッグモード) — 再度タップで解除",toolbarMouseDirectDesc:"ダイレクトモードに切替",toolbarMouseTrackpadDesc:"Trackpad に切替 (仮想カーソル)",toolbarKeyboardDesc:"ネイティブキーボード / テキスト一括入力",toolbarRectDesc:"矩形選択モード"},remoteControls:{enterToSend:"Tab / Ctrl+Num でタブ切り替え",typeToSend:"送信するテキストを入力...",send:"送信",trackpadMode:"Trackpad モード",directMode:"ダイレクトモード",bottomRow:"下部の行",extraPanel:"追加パネル",exitConfirmMessage:"現在のリモートデスクトップセッションを終了してもよろしいですか?"},connection:{retrying:"再接続中...",waitingApproval:"承認待ち",approvalDescription:"接続する前に 9Remote host がこのデバイスを承認する必要があります。",approvalHint:"あなたのマシンのターミナルを確認してください。",rejectedTitle:"デバイスが拒否されました",rejectedDescription:"このデバイスは 9Remote host によって承認されませんでした。",backToLogin:"ログインに戻る",failed:"接続失敗",failedDescription:"{n} 回の試行後に接続できませんでした",attemptOf:"試行 {n} / {total}",exit:"終了",cancel:"キャンセル",retry:"今すぐ再試行"},notifications:{claudeCode:"Claude Code",codex:"Codex",geminiCli:"Gemini CLI",openCode:"OpenCode",needsInput:"needs input",badgeTitle:"{blocked} needs input, {done} your turn",replied:"replied",agent:"Agent"},sites:{title:"サイト",localSites:"ローカルサイト",selectSitePreview:"プレビューするサイトを選択",browserNewTab:"New tab",browserAddressPlaceholder:"localhost:3000 or /path",browserNotConnected:"Connect to your host first",portPlaceholder:"ポート",loadingSites:"サイトを読み込み中...",notConnected:"Not connected to the host",noSitesFound:"サイトが見つかりません",startServerHint:"ローカル開発サーバーを起動するとここに表示されます",siteNamePlaceholder:"サイト名",saveTitle:"保存",editNameTitle:"名前を編集",removeTitle:"削除",removePortTitle:"ポートを削除",removePortMessage:"保存されたリストからポート {port} を削除しますか?",popupBlocked:"ポップアップがブロックされました!このサイトのポップアップを許可してください。",startProxyFailed:"{name} のプロキシセッションを開始できませんでした",foundCount:"{n} サイト{suffix}が見つかりました",focusOpenedTab:"開いたタブにフォーカス",openInNewTab:"新しいタブで開く",goBack:"戻る",goForward:"進む",loadingSite:"読み込み中...",empty:"アクティブなサイトがありません",emptyHint:"ローカルサーバーを起動するとここに表示されます",open:"開く",refresh:"更新"},commandNotes:{title:"コマンドメモ",noSavedCommands:"保存されたコマンドはありません",addFirstBelow:"下に最初のコマンドを追加してください",clickToCopy:"クリックでコピー",copiedBang:"コピーしました!",copy:"コピー",edit:"編集",delete:"削除",editCommandPlaceholder:"コマンドを編集...",addCommandPlaceholder:"コマンドを追加...",update:"更新",add:"追加",empty:"メモはまだありません",emptyHint:"クイックアクセス用にコマンドを保存しましょう",add:"メモを追加",edit:"メモを編集",delete:"メモを削除",deleteMessage:"このメモを削除しますか?",name:"名前",command:"コマンド",save:"保存",placeholderName:"例: 開発サーバーを起動",placeholderCommand:"例: npm run dev"},mobileKeyboard:{pasteHere:"ここに貼り付け (Cmd+V)",enterToSend:"Tab / Ctrl+Num でタブ切り替え",typeCommand:"コマンドを入力して送信...",send:"送信",toggleExtraKeys:"追加キーを切替",toggleTextInput:"テキスト入力を切替",customizeTerminalKeys:"ターミナルキーをカスタマイズ",mainBar:"メインバー",extraPanel:"追加パネル",fileTooLarge:"ファイルが大きすぎます (最大 5MB)",readFileFailed:"ファイルの読み込みに失敗しました",uploadFailed:"ファイルのアップロードに失敗しました: {error}"},terminalPane:{scrollToBottom:"一番下までスクロール",changedFiles:"Changed files",pasteOrType:"ここに貼り付けまたは入力",paste:"貼り付け"},pwaGuide:{copyYourKey:"キーをコピー",copyKeyHint:"下のキーをタップしてコピーしてください — インストール後のログインに必要です",tapToCopyApiKey:"タップして API キーをコピー",copiedBang:"コピーしました!",copy:"コピー",tapShareButton:"共有ボタンをタップ",tapShareHint:"iOS Safari の下部にある共有ボタンをタップしてください",addToHome:"ホーム画面に追加",addToHomeHint:"下にスクロールして「ホーム画面に追加」をタップしてください",openAppPasteKey:"アプリを開いてキーを貼り付け",openAppPasteKeyHint:"インストールしたアプリを開き、キーを貼り付けてログインしてください",openMenu:"メニューを開く",openMenuHint:"Android Chrome でメニューボタン (3つの点) をタップしてください",installApp:"アプリをインストール",installAppHint:"「アプリをインストール」または「ホーム画面に追加」をタップしてください",lookInstallIcon:"インストールアイコンを探す",lookInstallIconHint:"アドレスバーのインストールアイコンを探してください",clickInstallPaste:"インストールしてキーを貼り付け",installNow:"Install Now",installNowHint:"Install 9Remote as an app for quick access",installing:"Installing...",clickInstallPasteHint:"インストールをクリックし、アプリを開いてキーを貼り付けてログインしてください",alternativeHint:"代替: ブラウザメニューを開く →「9Remote をインストール」または「ショートカットを作成」",loadingPlatform:"プラットフォーム検出を読み込み中...",iosPlatform:"iOS (iPhone/iPad)",androidPlatform:"Android",macosPlatform:"macOS",windowsPlatform:"Windows",desktopPlatform:"デスクトップ",alreadyInstalled:"インストール済み!",alreadyInstalledHint:"すでに 9Remote をインストール済みアプリとして使用しています",installationGuide:"インストールガイド",installationSteps:"インストール手順:"},community:{title:"コミュニティ",description:"9Remote コミュニティに参加"},pwa:{title:"アプリとしてインストール",description:"最高の体験のためにデバイスに 9Remote をインストールしましょう",iosTitle:"iOS Safari",androidTitle:"Android Chrome",desktopTitle:"デスクトップ"},codespace:{title:"Codespace",name:"名前",status:"ステータス",running:"実行中",autoStart:"9Remote を自動起動",autoStartHint:"Codespace 起動時に 9Remote を起動します",stop:"Codespace を停止",stopHint:"停止して使用量を節約",restartHint:"再起動するには GitHub にアクセスしてください",unknown:"不明"}}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6742],{46742:(e,a,o)=>{o.r(a),o.d(a,{default:()=>i});let i={common:{statusIdle:"Idle",statusWorking:"Working",statusBlocked:"Needs input",statusDone:"Your turn",loading:"Caricamento...",cancel:"Annulla",confirm:"Conferma",save:"Salva",delete:"Elimina",close:"Chiudi",back:"Indietro",edit:"Modifica",rename:"Rinomina",remove:"Rimuovi",open:"Apri",yes:"S\xec",no:"No",ok:"OK",error:"Errore",success:"Successo",failed:"Fallito",retry:"Riprova",refresh:"Aggiorna",clipboard:"Clipboard",clipboardCopy:"Copy",clipboardEmpty:"Clipboard is empty",search:"Cerca",create:"Crea",new:"Nuovo",add:"Aggiungi",copy:"Copia",copied:"Copiato",download:"Scarica",upload:"Carica",enabled:"Attivato",disabled:"Disattivato",on:"attivo",off:"disattivo",minute:"min",hour:"h",day:"g",minutesAgo:"{n} min fa",hoursAgo:"{n} ore fa",daysAgo:"{n} giorni fa"},login:{tagline:"Accedi al tuo terminale ovunque",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:"Chiave di Accesso",placeholder:"sk-xxx... o Chiave Monouso (ABC123)",rememberKey:"Ricorda questa chiave",connect:"Connetti",connecting:"Connessione...",authenticating:"Autenticazione con token...",invalidKeyTail:"Wrong access key — check the last characters and try again.",scanQr:"Scan QR to login",qrScanTitle:"Scan QR Code",qrHint:"Point the camera at the QR code shown on the machine running 9Remote.",qrDetected:"QR Code detected!",qrAuthenticating:"Authenticating...",qrPleaseWait:"Please wait...",qrLibFail:"Failed to load the QR scanner library.",qrInitFail:"Could not start the scanner.",qrCamDenied:"Camera permission denied. Allow camera access and try again.",qrNoCamera:"No camera found on this device.",qrCamBusy:"Camera is in use by another app.",qrCamError:"Could not open the camera.",savedKeys:"Chiavi Salvate",login:"Accedi",lastLogin:"Ultimo accesso",namePlaceholder:"Name this key (optional)",rename:"Rename",deleteKeyTitle:"Delete key",deleteKeyConfirm:'Are you sure you want to delete "{name}"?',justNow:"Adesso",minutesAgo:"{n}m fa",hoursAgo:"{n}h fa",daysAgo:"{n}g fa",tapToScan:"Tocca per scansionare",orEnterManually:"o inserisci la chiave manualmente",addKey:"Add Key",secureTitle:"Secure & Encrypted",secureDesc:"All connections are end-to-end encrypted and secure.",featAccessTitle:"Access Anywhere",featAccessDesc:"Connect from any device, anywhere.",featSecureTitle:"Secure Connection",featSecureDesc:"End-to-end encryption keeps you safe.",featFastTitle:"Fast & Reliable",featFastDesc:"Low latency and high performance.",featSessionsTitle:"Multiple Sessions",featSessionsDesc:"Manage and switch between sessions.",home:"Home",docs:"Documenti"},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:"Lingua",theme:"Tema",notifications:"Notifiche",webgl:"GPU Render (Faster)",webglHint:"Disattiva se il testo \xe8 errato",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:"Siti",commandNotes:"Note Comandi",community:"Comunit\xe0",installApp:"Installa App",codespace:"Codespace",logout:"Esci",settingsGeneral:"General",settingsAppearance:"Appearance",settingsTerminalTab:"Terminal",settingsMcp:"Plugins",mcpIntro:"Extra abilities you can give your AI coding tools.",mcpTools:"Allow",mcpRestartHint:"Turning it off applies at once. Turning it on needs the AI tool restarted.",mcpUnavailable:"Update this host to use MCP.",artifactFormats:"Formats it can show",mcpClients:"Works with",settingsWorkspace:"Workspace",settingsApplication:"Application",settingsAccount:"Account",themeLight:"Light",themeDark:"Dark",reload:"Ricarica app",remoteDesktop:"Desktop Remoto",settings:"Impostazioni",enablePush:"Attiva Notifiche Push",disablePush:"Disattiva Notifiche Push",pushHint:"Attiva le notifiche push per essere avvisato quando l'IA completa le attivit\xe0",pushActiveHint:"Push notifications are on for this device. You'll be alerted when AI completes tasks.",versionMismatch:"Host {version} \xe8 obsoleto",versionMismatchHint:"Alcune funzionalit\xe0 potrebbero non funzionare. Esegui:",updateNow:"Update now",updating:"Updating… reconnecting",webReloadTitle:"New web version available",webReloadHint:"Reload to get the latest interface.",reloadWeb:"Reload",updateAvailableTitle:"9Remote host update available",updateStarting:"Starting update…",updateInstalling:"Installing new version…",updateTimeout:"Update is taking too long",updateTimeoutHint:"Reload manually if it doesn't recover.",updateRestarting:"Restarting host…",updateReconnecting:"Reconnecting…",updateDone:"Updated! Reloading…",version:"Versione"},workspace:{loading:"Caricamento...",logoutTitle:"Esci",logoutMessage:"Sei sicuro di voler uscire?",failedCreateSession:"Creazione sessione fallita: {error}",failedRenameSession:"Rinomina sessione fallita: {error}"},sessions:{headerTitle:"9remote.cc",connected:"Connesso",disconnected:"Disconnesso",codespaceStopped:"Codespace fermato",placeholder:"Nome terminale (opzionale)",newButton:"+ Nuovo",empty:"Nessuna sessione attiva",emptyHint:"Crea una nuova sessione per iniziare",created:"Creato {time}",deleteTitle:"Elimina Sessione",deleteMessage:'Sei sicuro di voler eliminare "{name}"?',editName:"Modifica nome",newTerminal:"Nuovo terminale",options:"Options"},workspaces:{title:"Groups",newWorkspace:"Group",newWorkspacePrompt:"Group name",defaultName:"New Group",ungrouped:"Ungrouped",addTerminal:"Add terminal to group",moveToWorkspace:"Move to group",rename:"Rename group",delete:"Delete group",emptyWorkspace:"No terminals in this group",deleteTitle:"Delete Group",deleteMessage:'Delete group "{name}"? Terminals move to Ungrouped.'},terminal:{quotaNoData:"No quota data",quotaUsageTitle:"usage",back:"Indietro",menu:"Menu",newTerminal:"Nuovo terminale",remoteDesktop:"Desktop Remoto",defaultName:"Term"},files:{selectWorkspace:"Seleziona Workspace",recentWorkspaces:"Workspace Recenti",home:"Home",root:"Root",drive:"Unit\xe0 {letter}",codespaces:"Codespaces",removeRecent:"Rimuovi dai recenti",removeTitle:"Rimuovi Workspace",removeMessage:'Rimuovere "{name}" dai workspace recenti?',setAsWorkspace:"Imposta come Workspace",openFolder:"Apri Cartella",newFile:"Nuovo File",newFolder:"Nuova Cartella",rename:"Rinomina",delete:"Elimina",deleteFile:"Elimina File",deleteFolder:"Elimina Cartella",deleteFileMessage:'Eliminare "{name}"?',deleteFolderMessage:'Eliminare la cartella "{name}" e tutto il suo contenuto?',emptyFolder:"Cartella vuota",git:"Git",parent:"Cartella superiore",workspace:"Workspace",failedLoad:"Caricamento fallito: {error}",failedDelete:"Eliminazione fallita: {error}",failedCreate:"Creazione fallita: {error}",failedRename:"Rinomina fallita: {error}",enterName:"Inserisci nome",confirmRename:"Rinomina in:",setWorkspace:"Imposta Workspace",setAsWorkspaceTitle:"Imposta come workspace",switchWorkspace:"Cambia workspace",searchFiles:"Cerca file",toggleHidden:"Mostra/nascondi file nascosti",searchPlaceholder:"Cerca file...",searching:"Ricerca...",noFilesFound:"Nessun file trovato",noGitRepo:"Nessun repository Git",cannotOpenBinary:"Impossibile aprire file binario",createNew:"Crea Nuovo",file:"File",folder:"Cartella",placeholderFile:"nomefile.js",placeholderFolder:"nome-cartella",pickFile:"Choose files",pickFolder:"Choose folder",copyPath:"Copia percorso",copyRelPath:"Copy Relative Path",copyName:"Copy Filename",delete:"Elimina",rename:"Rinomina",deleteConfirmTitle:"Elimina",deleteConfirmMessage:'Eliminare "{name}"?'},editor:{save:"Salva",saving:"Salvataggio...",saved:"Salvato",unsaved:"Modifiche non salvate",close:"Chiudi",discard:"Scarta",discardTitle:"Scarta Modifiche",discardMessage:"Hai modifiche non salvate. Scartarle?",unsavedTitle:"Save changes to {name}?",unsavedBody:"Your changes will be lost if you don't save them.",failedLoad:"Caricamento file fallito: {error}",failedSave:"Salvataggio fallito: {error}",openFull:"Open in full editor",artifact:"Artifact",readOnly:"Sola lettura",line:"Riga",column:"Colonna",gitDiff:"Differenze Git",typeText:"Digita testo e inserisci...",insert:"Inserisci",statusModified:"Modificato",statusAdded:"Aggiunto",statusUntracked:"Non tracciato"},git:{title:"Git",branch:"Ramo",changes:"Modifiche",staged:"In stage",unstaged:"Fuori stage",untracked:"Non tracciato",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:"Messaggio di commit",push:"Push",pull:"Pull",fetch:"Fetch",stage:"In stage",stageAll:"Stage Tutto",unstage:"Fuori stage",discard:"Scarta",discardChanges:"Scarta Modifiche",discardMessage:'Scartare le modifiche a "{name}"?',noChanges:"Nessuna modifica",diff:"Differenze",pushing:"Push in corso...",pulling:"Pull in corso...",committing:"Commit in corso...",failedCommit:"Commit fallito: {error}",failedPush:"Push fallito: {error}",failedPull:"Pull fallito: {error}",status:"Stato",diffTab:"Differenze",modified:"Modificato",added:"Aggiunto",deleted:"Eliminato",untrackedTitle:"Non tracciato",openFile:"Apri file",discardChangesTitle:"Scarta modifiche",discardConfirmTitle:"Scarta Modifiche",discardConfirmDelete:'Sei sicuro di voler eliminare "{name}"? Questa azione non pu\xf2 essere annullata.',discardConfirmDiscard:'Sei sicuro di voler scartare le modifiche in "{name}"? Questa azione non pu\xf2 essere annullata.'},remote:{title:"Desktop Remoto",connecting:"Connessione...",disconnected:"Disconnesso",fullscreen:"Schermo intero",exitFullscreen:"Esci da schermo intero",receivingImage:"Receiving screen…",keyboard:"Tastiera",mouse:"Mouse",quality:"Qualit\xe0",fps:"FPS",debug:"Debug",help:"Aiuto",close:"Chiudi",sendKey:"Invia Tasto",helpTitle:"Aiuto Desktop Remoto",notAvailable:"Desktop remoto non disponibile",customizeKeys:"Personalizza tasti",back:"Indietro",resetZoom:"Reimposta zoom",refresh:"Aggiorna",rectangleSelection:"Selezione rettangolare",handMode:"Modalit\xe0 mano",toggleKeyboard:"Attiva/disattiva tastiera nativa",hideControls:"Hide controls",showControls:"Show controls",textBatchInput:"Inserimento testo batch",extraKeys:"Tasti extra",customizeRemoteKeys:"Personalizza Tasti Remoti",exitRemote:"Esci dal desktop remoto",debugTitle:"Statistiche Debug",minimize:"Riduci a icona",transport:"Trasporto",latency:"Latenza",tilesPerSec:"Tile/sec",bandwidth:"Larghezza di banda",clearStats:"Cancella Statistiche",lockTitle:"Windows \xe8 bloccato",lockGrantDesc:'Attiva "Sblocca PC da remoto" in 9remote host su questo PC.',lockDesc:"Inserisci il PIN o la password di Windows per questo computer",lockPlaceholder:"PIN o password di Windows",unlock:"Sblocca",unlocking:"Sblocco in corso…",unlockFailed:"Sblocco fallito — controlla PIN/password e riprova."},remoteHelp:{modePc:"PC / Mouse",modeTrackpad:"Tocco \xb7 Trackpad",modeDirect:"Tocco \xb7 Diretto",mouseTitle:"Mouse",keyboardTitle:"Tastiera",gesturesTrackpadTitle:"Gesti (Trackpad ✋)",gesturesDirectTitle:"Gesti (Diretto)",toolbarTitle:"Barra strumenti",mouseClickKey:"Clic / Trascina",mouseClickDesc:"Clic sinistro, trascina per selezionare/spostare",mouseRightKey:"Clic destro",mouseRightDesc:"Menu contestuale sul remoto",mouseWheelKey:"Rotella",mouseWheelDesc:"Scorri remoto (Shift + Rotella = orizzontale)",mouseDoubleKey:"Doppio clic",mouseDoubleDesc:"Doppio clic sul remoto",keyPhysicalKey:"Tasti fisici",keyPhysicalDesc:"Inviati direttamente (Tab, tasti F, ecc. catturati)",keyModifierKey:"Ctrl / Alt / Shift / ⌘",keyModifierDesc:"Modificatore persistente — combina con il tasto successivo",trackpadSwipeKey:"Scorrimento 1 dito",trackpadSwipeDesc:"Sposta il cursore virtuale",trackpadTapKey:"Tocco 1 dito",trackpadTapDesc:"Clic sinistro al cursore",trackpad2TapKey:"Tocco 2 dita",trackpad2TapDesc:"Clic destro al cursore",trackpad2SwipeKey:"Scorrimento 2 dita",trackpad2SwipeDesc:"Scorri alla posizione del cursore",trackpadPinchKey:"Pizzico 2 dita",trackpadPinchDesc:"Zoom canvas",trackpadScrollLockKey:"Tieni premuto + trascina",trackpadScrollLockDesc:"Tieni premuto per bloccare lo scroll, trascina in qualsiasi direzione",directTapKey:"Tocco 1 dito",directTapDesc:"Clic alla posizione del tocco",directLongKey:"Pressione lunga 1 dito",directLongDesc:"Clic destro",directDoubleKey:"Doppio tocco 1 dito",directDoubleDesc:"Doppio clic",directScrollKey:"Scorrimento 2 dita",directScrollDesc:"Scorri remoto",directPinchKey:"Pizzico 2 dita",directPinchDesc:"Zoom canvas",directPanKey:"Trascinamento 1 dito (zoom>1)",directPanDesc:"Sposta canvas",toolbarHandDesc:"Mantieni clic sinistro (modalit\xe0 trascina) — tocca di nuovo per rilasciare",toolbarMouseDirectDesc:"Passa alla modalit\xe0 Diretta",toolbarMouseTrackpadDesc:"Passa al Trackpad (cursore virtuale)",toolbarKeyboardDesc:"Tastiera nativa / inserimento testo batch",toolbarRectDesc:"Modalit\xe0 selezione rettangolare"},remoteControls:{enterToSend:"Tab / Ctrl+Num per cambiare scheda",typeToSend:"Digita testo da inviare...",send:"Invia",trackpadMode:"Modalit\xe0 Trackpad",directMode:"Modalit\xe0 Diretta",bottomRow:"Riga Inferiore",extraPanel:"Pannello Extra",exitConfirmMessage:"Sei sicuro di voler uscire dalla sessione corrente del desktop remoto?"},connection:{retrying:"Riconnessione...",waitingApproval:"In attesa di Approvazione",approvalDescription:"Il 9Remote host deve approvare questo dispositivo prima che tu possa connetterti.",approvalHint:"Controlla il terminale sulla tua macchina.",rejectedTitle:"Dispositivo Rifiutato",rejectedDescription:"Questo dispositivo non \xe8 stato approvato dal 9Remote host.",backToLogin:"Torna al Login",failed:"Connessione Fallita",failedDescription:"Impossibile connettersi dopo {n} tentativi",attemptOf:"Tentativo {n} di {total}",exit:"Esci",cancel:"Annulla",retry:"Riprova ora"},notifications:{claudeCode:"Claude Code",codex:"Codex",geminiCli:"Gemini CLI",openCode:"OpenCode",needsInput:"needs input",badgeTitle:"{blocked} needs input, {done} your turn",replied:"replied",agent:"Agent"},sites:{title:"Siti",localSites:"Siti Locali",selectSitePreview:"Seleziona un sito per l'anteprima",browserNewTab:"New tab",browserAddressPlaceholder:"localhost:3000 or /path",browserNotConnected:"Connect to your host first",portPlaceholder:"porta",loadingSites:"Caricamento Siti...",notConnected:"Not connected to the host",noSitesFound:"Nessun sito trovato",startServerHint:"Avvia un server di sviluppo locale per vederlo qui",siteNamePlaceholder:"Nome del sito",saveTitle:"Salva",editNameTitle:"Modifica nome",removeTitle:"Rimuovi",removePortTitle:"Rimuovi Porta",removePortMessage:"Rimuovere la porta {port} dall'elenco salvato?",popupBlocked:"Popup bloccato! Consenti i popup per questo sito.",startProxyFailed:"Avvio sessione proxy fallito per {name}",foundCount:"{n} sito{suffix} trovato",focusOpenedTab:"Metti a fuoco scheda aperta",openInNewTab:"Apri in nuova scheda",goBack:"Torna indietro",goForward:"Vai avanti",loadingSite:"Caricamento...",empty:"Nessun sito attivo",emptyHint:"Esegui un server locale per vederlo qui",open:"Apri",refresh:"Aggiorna"},commandNotes:{title:"Note Comandi",noSavedCommands:"Nessun comando salvato",addFirstBelow:"Aggiungi il tuo primo comando qui sotto",clickToCopy:"Clicca per copiare",copiedBang:"Copiato!",copy:"Copia",edit:"Modifica",delete:"Elimina",editCommandPlaceholder:"Modifica comando...",addCommandPlaceholder:"Aggiungi comando...",update:"Aggiorna",add:"Aggiungi",empty:"Ancora nessuna nota",emptyHint:"Salva comandi per accesso rapido",add:"Aggiungi Nota",edit:"Modifica Nota",delete:"Elimina Nota",deleteMessage:"Eliminare questa nota?",name:"Nome",command:"Comando",save:"Salva",placeholderName:"es. Avvia server di sviluppo",placeholderCommand:"es. npm run dev"},mobileKeyboard:{pasteHere:"Incolla qui (Cmd+V)",enterToSend:"Tab / Ctrl+Num per cambiare scheda",typeCommand:"Digita comando e invia...",send:"Invia",toggleExtraKeys:"Attiva/disattiva tasti extra",toggleTextInput:"Attiva/disattiva inserimento testo",customizeTerminalKeys:"Personalizza Tasti Terminale",mainBar:"Barra Principale",extraPanel:"Pannello Extra",fileTooLarge:"File troppo grande (max 5MB)",readFileFailed:"Lettura file fallita",uploadFailed:"Caricamento file fallito: {error}"},terminalPane:{scrollToBottom:"Scorri in fondo",changedFiles:"Changed files",pasteOrType:"Incolla o digita qui",paste:"Incolla"},pwaGuide:{copyYourKey:"Copia la Tua Chiave",copyKeyHint:"Tocca la chiave qui sotto per copiarla — ti servir\xe0 per accedere dopo l'installazione",tapToCopyApiKey:"Tocca per copiare la chiave API",copiedBang:"Copiato!",copy:"Copia",tapShareButton:"Tocca il Pulsante Condividi",tapShareHint:"Tocca il pulsante condividi in fondo a Safari",addToHome:"Aggiungi alla schermata Home",addToHomeHint:'Scorri verso il basso e tocca "Aggiungi alla schermata Home"',openAppPasteKey:"Apri App e Incolla Chiave",openAppPasteKeyHint:"Apri l'app installata e incolla la tua chiave per accedere",openMenu:"Apri Menu",openMenuHint:"Tocca il pulsante menu (tre puntini) in Chrome",installApp:"Installa App",installAppHint:'Tocca "Installa app" o "Aggiungi a schermata Home"',lookInstallIcon:"Cerca l'Icona di Installazione",lookInstallIconHint:"Cerca l'icona di installazione nella barra degli indirizzi",clickInstallPaste:"Clicca Installa e Incolla la Chiave",installNow:"Install Now",installNowHint:"Install 9Remote as an app for quick access",installing:"Installing...",clickInstallPasteHint:"Clicca installa, apri l'app e incolla la tua chiave per accedere",alternativeHint:'Alternativa: Apri menu del browser → "Installa 9Remote" o "Crea collegamento"',loadingPlatform:"Caricamento rilevamento piattaforma...",iosPlatform:"iOS (iPhone/iPad)",androidPlatform:"Android",macosPlatform:"macOS",windowsPlatform:"Windows",desktopPlatform:"Desktop",alreadyInstalled:"Gi\xe0 Installato!",alreadyInstalledHint:"Stai gi\xe0 usando 9Remote come app installata",installationGuide:"Guida all'Installazione",installationSteps:"Passaggi di Installazione:"},community:{title:"Comunit\xe0",description:"Unisciti alla comunit\xe0 9Remote"},pwa:{title:"Installa come App",description:"Installa 9Remote sul tuo dispositivo per la migliore esperienza",iosTitle:"iOS Safari",androidTitle:"Android Chrome",desktopTitle:"Desktop"},codespace:{title:"Codespace",name:"Nome",status:"Stato",running:"In esecuzione",autoStart:"Avvio Automatico 9Remote",autoStartHint:"Avvia 9Remote quando il codespace si apre",stop:"Ferma Codespace",stopHint:"Ferma per risparmiare utilizzo",restartHint:"Per riavviare, vai su GitHub",unknown:"Sconosciuto"}}}}]);
|