9remote 2.0.81 → 2.0.82

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 CHANGED
@@ -9,7 +9,7 @@ Right-click to open / quit`}function qi(){let{port:e,tunnelUrl:n}=Nt,r=process.p
9
9
  `}l||(t+=p)}else{var v=to(cr).times(o.getModuleCount()+3);t+=v+`
10
10
  `,o.modules.forEach(function(T){t+=cr,t+=T.map(Ac).join(""),t+=cr+`
11
11
  `}),t+=v}r?r(t):console.log(t)},setErrorLevel:function(e){this.error=xs[e]||this.error}}});var kn=require("fs"),Vt=require("path"),mo=require("url"),ho=A(require("os"),1);var An=A(require("dns"),1),_e=A(require("path"),1),ao=A(require("os"),1),ne="9remote",pr=process.env.NREMOTE_REGISTRY||`https://registry.npmjs.org/${ne}/latest`,Pe=`${ne}@latest`,Fe=_e.default.join(ao.default.homedir(),".9remote"),re={ROOT:Fe,LOGS:_e.default.join(Fe,"logs"),STATE:_e.default.join(Fe,"state"),CONFIG:_e.default.join(Fe,"config"),BIN:_e.default.join(Fe,"bin"),PIDS:_e.default.join(Fe,"pids"),BUFFERS:_e.default.join(Fe,"buffers"),DAEMON:_e.default.join(Fe,"daemon")},co=new An.default.promises.Resolver;co.setServers(["1.1.1.1","1.0.0.1","8.8.8.8"]);var fr=An.default.lookup,Js=/^(\d{1,3}\.){3}\d{1,3}$|^::1$|^[0-9a-f:]+$/i;An.default.lookup=(e,n,r)=>{if(typeof n=="function"&&(r=n,n={}),e==="localhost"||Js.test(e))return fr(e,n,r);co.resolve4(e).then(o=>{if(!o?.length)return fr(e,n,r);n.all?r(null,o.map(t=>({address:t,family:4}))):r(null,o[0],4)}).catch(()=>fr(e,n,r))};var I=2208,so=5173;var qc=[`http://localhost:${I}`,`http://127.0.0.1:${I}`,`http://localhost:${so}`,`http://127.0.0.1:${so}`],Wt={fileName:"agent.log",rotatedName:"agent.log.1",maxBytes:2*1024*1024,cleanupAfterDays:7},lo=60,C={STOPPED:0,PREPARING:1,CONNECTING:2,TUNNELING:3,VERIFYING:4,READY:5},uo={showTunnelUrlInMenu:!1};var fo={CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN:"1"};var po={checkIntervalMs:3e4,requestTimeoutMs:5e3},le={server:{strategy:"exp",baseMs:1e3,maxMs:6e4},tunnelRestart:{strategy:"exp",baseMs:2e3,maxMs:3e5},tunnelSpawn:{strategy:"linear",baseMs:5e3,maxMs:6e4},internet:{strategy:"linear",baseMs:3e3,maxMs:6e4},sse:{strategy:"linear",baseMs:2e3,maxMs:2e3},urlSync:{strategy:"linear",baseMs:5e3,maxMs:6e4}},Qs={Accept:"application/json, text/plain, */*","Accept-Language":"en-US,en;q=0.9","Cache-Control":"no-cache",Pragma:"no-cache","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"};function G(e,n={}){return fetch(e,{...n,headers:{...Qs,...n.headers}})}var Xs=(0,Vt.dirname)((0,mo.fileURLToPath)(__importMetaUrl)),Zs=[(0,Vt.join)(ho.default.homedir(),".9remote",".env"),(0,Vt.join)(Xs,"..",".env")];function zs(e){for(let n of e.split(`
12
- `)){let r=n.trim();if(!r||r.startsWith("#"))continue;let o=r.match(/^([A-Z_][A-Z0-9_]*)\s*=\s*"?(.*?)"?$/);o&&!process.env[o[1]]&&(process.env[o[1]]=o[2])}}for(let e of Zs)if((0,kn.existsSync)(e))try{zs((0,kn.readFileSync)(e,"utf8"))}catch{}for(let[e,n]of Object.entries(fo))process.env[e]||(process.env[e]=n);var yr=A(require("path"),1),To=A(require("fs"),1),xo=require("url");var yo=A(go(),1),mr=A(require("crypto"),1),{machineIdSync:ea}=yo.default;async function vt(e=null){let n=e||process.env.MACHINE_ID_SALT||"9remote-salt";try{let r=ea();return mr.default.createHash("sha256").update(r+n).digest("hex").substring(0,16)}catch(r){return console.error("Error getting machine ID:",r),mr.default.randomUUID().replace(/-/g,"").substring(0,16)}}var wo=A(require("crypto"),1),ta=process.env.API_KEY_SECRET||"9remote-api-key-secret";function na(){let e="abcdefghijklmnopqrstuvwxyz0123456789",n="";for(let r=0;r<4;r++)n+=e.charAt(Math.floor(Math.random()*e.length));return n}function ra(e,n){return wo.default.createHmac("sha256",ta).update(e+n).digest("hex").slice(0,6)}function St(e){let n=e.slice(0,8),r=na(),o=ra(n,r);return{key:`sk-${n}-${r}-${o}`,keyId:r}}function _n(e){return!e||e.length<8?"sk-***":`${e.slice(0,3)}***${e.slice(-4)}`}var ae=A(require("fs"),1),qt=A(require("path"),1);var el=re.STATE,hr=qt.default.join(re.STATE,"state.json"),gr=qt.default.join(re.ROOT,"keys.json"),Pn=qt.default.join(re.STATE,"cmd.json"),tl=qt.default.join(re.STATE,"settings.json");function In(){for(let e of[re.ROOT,re.STATE])ae.default.existsSync(e)||ae.default.mkdirSync(e,{recursive:!0})}function On(e){try{In(),ae.default.writeFileSync(hr,JSON.stringify(e,null,2),{mode:384})}catch(n){console.error("Error saving state:",n)}}function vo(){try{ae.default.existsSync(hr)&&ae.default.unlinkSync(hr)}catch{}}function Cn(){try{return In(),ae.default.existsSync(gr)?JSON.parse(ae.default.readFileSync(gr,"utf8")):{machineId:null,key:null,name:"Default",createdAt:null}}catch{return{machineId:null,key:null,name:"Default",createdAt:null}}}function Et(e){try{In(),ae.default.writeFileSync(Pn,JSON.stringify({cmd:e,ts:Date.now()}))}catch{}}function So(){try{if(!ae.default.existsSync(Pn))return null;let e=JSON.parse(ae.default.readFileSync(Pn,"utf8"));return ae.default.unlinkSync(Pn),e.cmd}catch{return null}}function nt(e,n,r="Default"){try{In();let o={machineId:e,key:n,name:r,createdAt:new Date().toISOString()};return ae.default.writeFileSync(gr,JSON.stringify(o,null,2),{mode:384}),o}catch(o){return console.error("Error saving key:",o),null}}function Eo(){return process.env.CODESPACES==="true"}var oa=yr.default.dirname((0,xo.fileURLToPath)(__importMetaUrl));async function Ue(){let e=await vt();if(Eo()&&process.env.NREMOTE_API_KEY)return nt(e,process.env.NREMOTE_API_KEY,"Codespace");let n=Cn();if(!n.key){let{key:r}=St(e);n=nt(e,r,"Default")}return n}function Se(){return"2.0.81"}var Ee=A(require("fs"),1),vr=A(require("path"),1);var $n=re.LOGS,Qt=vr.default.join($n,Wt.fileName),Ln=vr.default.join($n,Wt.rotatedName),Ro=!1,bo=null;function ia(){Ee.default.existsSync($n)||Ee.default.mkdirSync($n,{recursive:!0})}function sa(){try{if(Ee.default.statSync(Qt).size<Wt.maxBytes)return;try{Ee.default.rmSync(Ln,{force:!0})}catch{}Ee.default.renameSync(Qt,Ln)}catch{}}function aa(){try{let e=Ee.default.statSync(Ln);Date.now()-e.mtimeMs>Wt.cleanupAfterDays*864e5&&Ee.default.rmSync(Ln,{force:!0})}catch{}}function Sr(e){try{sa(),Ee.default.appendFileSync(Qt,e+`
12
+ `)){let r=n.trim();if(!r||r.startsWith("#"))continue;let o=r.match(/^([A-Z_][A-Z0-9_]*)\s*=\s*"?(.*?)"?$/);o&&!process.env[o[1]]&&(process.env[o[1]]=o[2])}}for(let e of Zs)if((0,kn.existsSync)(e))try{zs((0,kn.readFileSync)(e,"utf8"))}catch{}for(let[e,n]of Object.entries(fo))process.env[e]||(process.env[e]=n);var yr=A(require("path"),1),To=A(require("fs"),1),xo=require("url");var yo=A(go(),1),mr=A(require("crypto"),1),{machineIdSync:ea}=yo.default;async function vt(e=null){let n=e||process.env.MACHINE_ID_SALT||"9remote-salt";try{let r=ea();return mr.default.createHash("sha256").update(r+n).digest("hex").substring(0,16)}catch(r){return console.error("Error getting machine ID:",r),mr.default.randomUUID().replace(/-/g,"").substring(0,16)}}var wo=A(require("crypto"),1),ta=process.env.API_KEY_SECRET||"9remote-api-key-secret";function na(){let e="abcdefghijklmnopqrstuvwxyz0123456789",n="";for(let r=0;r<4;r++)n+=e.charAt(Math.floor(Math.random()*e.length));return n}function ra(e,n){return wo.default.createHmac("sha256",ta).update(e+n).digest("hex").slice(0,6)}function St(e){let n=e.slice(0,8),r=na(),o=ra(n,r);return{key:`sk-${n}-${r}-${o}`,keyId:r}}function _n(e){return!e||e.length<8?"sk-***":`${e.slice(0,3)}***${e.slice(-4)}`}var ae=A(require("fs"),1),qt=A(require("path"),1);var el=re.STATE,hr=qt.default.join(re.STATE,"state.json"),gr=qt.default.join(re.ROOT,"keys.json"),Pn=qt.default.join(re.STATE,"cmd.json"),tl=qt.default.join(re.STATE,"settings.json");function In(){for(let e of[re.ROOT,re.STATE])ae.default.existsSync(e)||ae.default.mkdirSync(e,{recursive:!0})}function On(e){try{In(),ae.default.writeFileSync(hr,JSON.stringify(e,null,2),{mode:384})}catch(n){console.error("Error saving state:",n)}}function vo(){try{ae.default.existsSync(hr)&&ae.default.unlinkSync(hr)}catch{}}function Cn(){try{return In(),ae.default.existsSync(gr)?JSON.parse(ae.default.readFileSync(gr,"utf8")):{machineId:null,key:null,name:"Default",createdAt:null}}catch{return{machineId:null,key:null,name:"Default",createdAt:null}}}function Et(e){try{In(),ae.default.writeFileSync(Pn,JSON.stringify({cmd:e,ts:Date.now()}))}catch{}}function So(){try{if(!ae.default.existsSync(Pn))return null;let e=JSON.parse(ae.default.readFileSync(Pn,"utf8"));return ae.default.unlinkSync(Pn),e.cmd}catch{return null}}function nt(e,n,r="Default"){try{In();let o={machineId:e,key:n,name:r,createdAt:new Date().toISOString()};return ae.default.writeFileSync(gr,JSON.stringify(o,null,2),{mode:384}),o}catch(o){return console.error("Error saving key:",o),null}}function Eo(){return process.env.CODESPACES==="true"}var oa=yr.default.dirname((0,xo.fileURLToPath)(__importMetaUrl));async function Ue(){let e=await vt();if(Eo()&&process.env.NREMOTE_API_KEY)return nt(e,process.env.NREMOTE_API_KEY,"Codespace");let n=Cn();if(!n.key){let{key:r}=St(e);n=nt(e,r,"Default")}return n}function Se(){return"2.0.82"}var Ee=A(require("fs"),1),vr=A(require("path"),1);var $n=re.LOGS,Qt=vr.default.join($n,Wt.fileName),Ln=vr.default.join($n,Wt.rotatedName),Ro=!1,bo=null;function ia(){Ee.default.existsSync($n)||Ee.default.mkdirSync($n,{recursive:!0})}function sa(){try{if(Ee.default.statSync(Qt).size<Wt.maxBytes)return;try{Ee.default.rmSync(Ln,{force:!0})}catch{}Ee.default.renameSync(Qt,Ln)}catch{}}function aa(){try{let e=Ee.default.statSync(Ln);Date.now()-e.mtimeMs>Wt.cleanupAfterDays*864e5&&Ee.default.rmSync(Ln,{force:!0})}catch{}}function Sr(e){try{sa(),Ee.default.appendFileSync(Qt,e+`
13
13
  `)}catch{}}function wr(e){return e.map(n=>{if(n instanceof Error)return n.stack||n.message;if(typeof n=="object")try{return JSON.stringify(n)}catch{return String(n)}return String(n)}).join(" ")}function Ao(){let e=new Date,n=(r,o=2)=>String(r).padStart(o,"0");return`${n(e.getHours())}:${n(e.getMinutes())}:${n(e.getSeconds())}.${n(e.getMilliseconds(),3)}`}var ca=/\x1b\[[0-9;]*m/g,la=/https?:\/\/[^\s]+/g;function ua(e){return String(e).replace(ca,"").replace(la,"").replace(/\s+$/g,"")}function Jt(e,n,r){let o=ua(r);if(!o)return;let t=n==="info"?e:`${e}:${n}`,i=`${Ao()} [${t}] ${o}`;if(Sr(i),bo)try{bo(i)}catch{}}function fa(){process.on("uncaughtException",e=>Jt("crash","error",`uncaughtException: ${e?.stack||e?.message||e}`)),process.on("unhandledRejection",e=>{let n=e instanceof Error?e.stack||e.message:String(e);Jt("crash","error",`unhandledRejection: ${n}`)}),process.on("exit",e=>Sr(`${Ao()} [exit] code=${e} pid=${process.pid}`))}function ko(){Ro||(Ro=!0,ia(),aa(),Sr(`
14
14
  === SESSION ${new Date().toISOString()} pid=${process.pid} argv=${process.argv.slice(2).join(" ")} ===`),fa())}function _o(e=60){try{return Ee.default.readFileSync(Qt,"utf8").split(`
15
15
  `).filter(Boolean).slice(-e)}catch{return[]}}function q(e){return{info:(...n)=>Jt(e,"info",wr(n)),warn:(...n)=>Jt(e,"warn",wr(n)),error:(...n)=>Jt(e,"error",wr(n))}}var Xt=Qt;var Po=(e=0)=>n=>`\x1B[${n+e}m`,Io=(e=0)=>n=>`\x1B[${38+e};5;${n}m`,Oo=(e=0)=>(n,r,o)=>`\x1B[${38+e};2;${n};${r};${o}m`,M={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},fl=Object.keys(M.modifier),pa=Object.keys(M.color),da=Object.keys(M.bgColor),pl=[...pa,...da];function ma(){let e=new Map;for(let[n,r]of Object.entries(M)){for(let[o,t]of Object.entries(r))M[o]={open:`\x1B[${t[0]}m`,close:`\x1B[${t[1]}m`},r[o]=M[o],e.set(t[0],t[1]);Object.defineProperty(M,n,{value:r,enumerable:!1})}return Object.defineProperty(M,"codes",{value:e,enumerable:!1}),M.color.close="\x1B[39m",M.bgColor.close="\x1B[49m",M.color.ansi=Po(),M.color.ansi256=Io(),M.color.ansi16m=Oo(),M.bgColor.ansi=Po(10),M.bgColor.ansi256=Io(10),M.bgColor.ansi16m=Oo(10),Object.defineProperties(M,{rgbToAnsi256:{value(n,r,o){return n===r&&r===o?n<8?16:n>248?231:Math.round((n-8)/247*24)+232:16+36*Math.round(n/255*5)+6*Math.round(r/255*5)+Math.round(o/255*5)},enumerable:!1},hexToRgb:{value(n){let r=/[a-f\d]{6}|[a-f\d]{3}/i.exec(n.toString(16));if(!r)return[0,0,0];let[o]=r;o.length===3&&(o=[...o].map(i=>i+i).join(""));let t=Number.parseInt(o,16);return[t>>16&255,t>>8&255,t&255]},enumerable:!1},hexToAnsi256:{value:n=>M.rgbToAnsi256(...M.hexToRgb(n)),enumerable:!1},ansi256ToAnsi:{value(n){if(n<8)return 30+n;if(n<16)return 90+(n-8);let r,o,t;if(n>=232)r=((n-232)*10+8)/255,o=r,t=r;else{n-=16;let a=n%36;r=Math.floor(n/36)/5,o=Math.floor(a/6)/5,t=a%6/5}let i=Math.max(r,o,t)*2;if(i===0)return 30;let s=30+(Math.round(t)<<2|Math.round(o)<<1|Math.round(r));return i===2&&(s+=60),s},enumerable:!1},rgbToAnsi:{value:(n,r,o)=>M.ansi256ToAnsi(M.rgbToAnsi256(n,r,o)),enumerable:!1},hexToAnsi:{value:n=>M.ansi256ToAnsi(M.hexToAnsi256(n)),enumerable:!1}}),M}var ha=ma(),he=ha;var Nn=A(require("node:process"),1),$o=A(require("node:os"),1),Er=A(require("node:tty"),1);function ue(e,n=globalThis.Deno?globalThis.Deno.args:Nn.default.argv){let r=e.startsWith("-")?"":e.length===1?"-":"--",o=n.indexOf(r+e),t=n.indexOf("--");return o!==-1&&(t===-1||o<t)}var{env:N}=Nn.default,Mn;ue("no-color")||ue("no-colors")||ue("color=false")||ue("color=never")?Mn=0:(ue("color")||ue("colors")||ue("color=true")||ue("color=always"))&&(Mn=1);function ga(){if("FORCE_COLOR"in N)return N.FORCE_COLOR==="true"?1:N.FORCE_COLOR==="false"?0:N.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(N.FORCE_COLOR,10),3)}function ya(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function wa(e,{streamIsTTY:n,sniffFlags:r=!0}={}){let o=ga();o!==void 0&&(Mn=o);let t=r?Mn:o;if(t===0)return 0;if(r){if(ue("color=16m")||ue("color=full")||ue("color=truecolor"))return 3;if(ue("color=256"))return 2}if("TF_BUILD"in N&&"AGENT_NAME"in N)return 1;if(e&&!n&&t===void 0)return 0;let i=t||0;if(N.TERM==="dumb")return i;if(Nn.default.platform==="win32"){let s=$o.default.release().split(".");return Number(s[0])>=10&&Number(s[2])>=10586?Number(s[2])>=14931?3:2:1}if("CI"in N)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(s=>s in N)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(s=>s in N)||N.CI_NAME==="codeship"?1:i;if("TEAMCITY_VERSION"in N)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(N.TEAMCITY_VERSION)?1:0;if(N.COLORTERM==="truecolor"||N.TERM==="xterm-kitty"||N.TERM==="xterm-ghostty"||N.TERM==="wezterm")return 3;if("TERM_PROGRAM"in N){let s=Number.parseInt((N.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(N.TERM_PROGRAM){case"iTerm.app":return s>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(N.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(N.TERM)||"COLORTERM"in N?1:i}function Co(e,n={}){let r=wa(e,{streamIsTTY:e&&e.isTTY,...n});return ya(r)}var va={stdout:Co({isTTY:Er.default.isatty(1)}),stderr:Co({isTTY:Er.default.isatty(2)})},Lo=va;function Mo(e,n,r){let o=e.indexOf(n);if(o===-1)return e;let t=n.length,i=0,s="";do s+=e.slice(i,o)+n+r,i=o+t,o=e.indexOf(n,i);while(o!==-1);return s+=e.slice(i),s}function No(e,n,r,o){let t=0,i="";do{let s=e[o-1]==="\r";i+=e.slice(t,s?o-1:o)+n+(s?`\r
@@ -71,7 +71,7 @@ StandardError=append:${Hn}
71
71
 
72
72
  [Install]
73
73
  WantedBy=default.target
74
- `}function Na(e){try{return(0,it.execFileSync)("systemctl",["--user",...e],{stdio:"ignore"}),!0}catch{return!1}}function Da(){return(0,$.existsSync)(J.linux)||(0,$.existsSync)(J.linuxSystemd)}async function Fa(){try{if(process.platform==="darwin")return Ia();if(process.platform==="win32")return await $a();if(process.platform==="linux")return Da()}catch{}return!1}async function Jo(){try{if(process.platform==="win32"&&Ca(),!await Fa())return!1;if(process.platform==="darwin"){let e=Pa(je(),st());return((0,$.existsSync)(J.darwin)?(0,$.readFileSync)(J.darwin,"utf8"):"")===e?!1:((0,$.writeFileSync)(J.darwin,e),!0)}if(process.platform==="win32"){let e=Oa();return((0,$.existsSync)(J.win)?(0,$.readFileSync)(J.win,"utf8"):"")===e?!1:((0,$.writeFileSync)(J.win,e),!0)}if(process.platform==="linux"){if((0,$.existsSync)(J.linuxSystemd)){let e=Ma();return(0,$.readFileSync)(J.linuxSystemd,"utf8")===e?!1:((0,$.writeFileSync)(J.linuxSystemd,e),Na(["daemon-reload"]),!0)}if((0,$.existsSync)(J.linux)){let e=La();return(0,$.readFileSync)(J.linux,"utf8")===e?!1:((0,$.writeFileSync)(J.linux,e),!0)}}}catch{}return!1}var D="https://9remote.cc",Qo=3e4,Xo=500,Pr=300,ge={cmdMs:1e3,pendingApprovalMs:3e3,statsMs:5e3,serverReadyIntervalMs:200,serverReadyTimeoutMs:5e3,bgServerReadyTimeoutMs:15e3,bgServerReadyIntervalMs:300},Ke={intervalMs:2e3,timeoutMs:18e4,fetchTimeoutMs:5e3,dnsTimeoutMs:2e3,maxLogEntries:80,postReadyHoldMs:2e3},oe={killCloudflaredMs:500,killCloudflaredTuiMs:300,serverBootMs:2e3,trayReadyMs:1e3,postReadyHoldMs:2e3,bgSpawnFlushMs:400},Ie={maxLogLines:200,headerWidth:44},bt={checkIntervalMs:36e5,connectCheckDebounceMs:9e5,maxRetry:3,retryDelayMs:3e3,verifyTimeoutMs:15e3,lockTtlMs:3e5,lockFile:"update.lock"},Zo=5e3,zo=2,ei=3e4,fe={orange:m.rgb(230,138,110),orangeDim:m.rgb(200,120,95)};var Ua=Oe.default.dirname((0,ti.fileURLToPath)(__importMetaUrl)),ni=3e3;var Wn=2208,Ir=Oe.default.join(At.default.homedir(),".9remote","cloudflared.pid");function Ba(){try{Ko()}catch{}try{if((0,Q.existsSync)(Ir)){let e=parseInt((0,Q.readFileSync)(Ir,"utf8"));if(Number.isFinite(e))try{process.kill(e)}catch{}try{(0,Q.unlinkSync)(Ir)}catch{}}}catch{}try{process.platform==="win32"?(0,tn.execSync)(`for /f "tokens=5" %a in ('netstat -aon ^| findstr :${Wn}') do taskkill /F /PID %a`,{stdio:"ignore",windowsHide:!0}):(0,tn.execSync)(`lsof -ti:${Wn} | xargs kill -9 2>/dev/null || true`,{stdio:"ignore"})}catch{}if(process.platform==="win32"){let e=Date.now()+1500;for(;Date.now()<e;);}}function ri(){return"2.0.81"}function oi(e,n){let r=e.split(".").map(Number),o=n.split(".").map(Number);for(let t=0;t<3;t++){if(o[t]>r[t])return!0;if(o[t]<r[t])return!1}return!1}function Ha(){return process.env.CODESPACES==="true"||process.env.GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN?"GitHub Codespaces":(0,Q.existsSync)("/.dockerenv")?"Docker":null}function Vn(){Ba()}async function ii(){try{let e=ri();if(!e)return null;let n=await G(pr,{signal:AbortSignal.timeout(ni)});if(!n.ok)return null;let{version:r}=await n.json();return r&&oi(e,r)?{current:e,latest:r}:null}catch{return null}}var Gn=Oe.default.join(re.STATE,bt.lockFile);function ja(){try{if((0,Q.existsSync)(Gn)){let{pid:e,ts:n}=JSON.parse((0,Q.readFileSync)(Gn,"utf8")),r=Date.now()-n<bt.lockTtlMs,o=!1;try{process.kill(e,0),o=!0}catch{}if(r&&o)return!1}}catch{}try{(0,Q.writeFileSync)(Gn,JSON.stringify({pid:process.pid,ts:Date.now()}))}catch{}return!0}async function Ka(){try{let e=await G(pr,{signal:AbortSignal.timeout(ni)});if(!e.ok)return null;let{version:n}=await e.json();return n||null}catch{return null}}function Ga(){try{if(process.env.NREMOTE_REGISTRY)return`--registry ${new URL(process.env.NREMOTE_REGISTRY).origin}`}catch{}return""}function Wa({currentVersion:e,latest:n,agentPid:r}){let o=Go(),t=Ga(),i=je(),s=st(),a=Gn,c=`--prefer-online --no-audit --no-fund ${t}`.trim();if(process.platform==="win32"){let f=Oe.default.join(At.default.tmpdir(),`${ne}-restart.vbs`),p=`@echo off
74
+ `}function Na(e){try{return(0,it.execFileSync)("systemctl",["--user",...e],{stdio:"ignore"}),!0}catch{return!1}}function Da(){return(0,$.existsSync)(J.linux)||(0,$.existsSync)(J.linuxSystemd)}async function Fa(){try{if(process.platform==="darwin")return Ia();if(process.platform==="win32")return await $a();if(process.platform==="linux")return Da()}catch{}return!1}async function Jo(){try{if(process.platform==="win32"&&Ca(),!await Fa())return!1;if(process.platform==="darwin"){let e=Pa(je(),st());return((0,$.existsSync)(J.darwin)?(0,$.readFileSync)(J.darwin,"utf8"):"")===e?!1:((0,$.writeFileSync)(J.darwin,e),!0)}if(process.platform==="win32"){let e=Oa();return((0,$.existsSync)(J.win)?(0,$.readFileSync)(J.win,"utf8"):"")===e?!1:((0,$.writeFileSync)(J.win,e),!0)}if(process.platform==="linux"){if((0,$.existsSync)(J.linuxSystemd)){let e=Ma();return(0,$.readFileSync)(J.linuxSystemd,"utf8")===e?!1:((0,$.writeFileSync)(J.linuxSystemd,e),Na(["daemon-reload"]),!0)}if((0,$.existsSync)(J.linux)){let e=La();return(0,$.readFileSync)(J.linux,"utf8")===e?!1:((0,$.writeFileSync)(J.linux,e),!0)}}}catch{}return!1}var D="https://9remote.cc",Qo=3e4,Xo=500,Pr=300,ge={cmdMs:1e3,pendingApprovalMs:3e3,statsMs:5e3,serverReadyIntervalMs:200,serverReadyTimeoutMs:5e3,bgServerReadyTimeoutMs:15e3,bgServerReadyIntervalMs:300},Ke={intervalMs:2e3,timeoutMs:18e4,fetchTimeoutMs:5e3,dnsTimeoutMs:2e3,maxLogEntries:80,postReadyHoldMs:2e3},oe={killCloudflaredMs:500,killCloudflaredTuiMs:300,serverBootMs:2e3,trayReadyMs:1e3,postReadyHoldMs:2e3,bgSpawnFlushMs:400},Ie={maxLogLines:200,headerWidth:44},bt={checkIntervalMs:36e5,connectCheckDebounceMs:9e5,maxRetry:3,retryDelayMs:3e3,verifyTimeoutMs:15e3,lockTtlMs:3e5,lockFile:"update.lock"},Zo=5e3,zo=2,ei=3e4,fe={orange:m.rgb(230,138,110),orangeDim:m.rgb(200,120,95)};var Ua=Oe.default.dirname((0,ti.fileURLToPath)(__importMetaUrl)),ni=3e3;var Wn=2208,Ir=Oe.default.join(At.default.homedir(),".9remote","cloudflared.pid");function Ba(){try{Ko()}catch{}try{if((0,Q.existsSync)(Ir)){let e=parseInt((0,Q.readFileSync)(Ir,"utf8"));if(Number.isFinite(e))try{process.kill(e)}catch{}try{(0,Q.unlinkSync)(Ir)}catch{}}}catch{}try{process.platform==="win32"?(0,tn.execSync)(`for /f "tokens=5" %a in ('netstat -aon ^| findstr :${Wn}') do taskkill /F /PID %a`,{stdio:"ignore",windowsHide:!0}):(0,tn.execSync)(`lsof -ti:${Wn} | xargs kill -9 2>/dev/null || true`,{stdio:"ignore"})}catch{}if(process.platform==="win32"){let e=Date.now()+1500;for(;Date.now()<e;);}}function ri(){return"2.0.82"}function oi(e,n){let r=e.split(".").map(Number),o=n.split(".").map(Number);for(let t=0;t<3;t++){if(o[t]>r[t])return!0;if(o[t]<r[t])return!1}return!1}function Ha(){return process.env.CODESPACES==="true"||process.env.GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN?"GitHub Codespaces":(0,Q.existsSync)("/.dockerenv")?"Docker":null}function Vn(){Ba()}async function ii(){try{let e=ri();if(!e)return null;let n=await G(pr,{signal:AbortSignal.timeout(ni)});if(!n.ok)return null;let{version:r}=await n.json();return r&&oi(e,r)?{current:e,latest:r}:null}catch{return null}}var Gn=Oe.default.join(re.STATE,bt.lockFile);function ja(){try{if((0,Q.existsSync)(Gn)){let{pid:e,ts:n}=JSON.parse((0,Q.readFileSync)(Gn,"utf8")),r=Date.now()-n<bt.lockTtlMs,o=!1;try{process.kill(e,0),o=!0}catch{}if(r&&o)return!1}}catch{}try{(0,Q.writeFileSync)(Gn,JSON.stringify({pid:process.pid,ts:Date.now()}))}catch{}return!0}async function Ka(){try{let e=await G(pr,{signal:AbortSignal.timeout(ni)});if(!e.ok)return null;let{version:n}=await e.json();return n||null}catch{return null}}function Ga(){try{if(process.env.NREMOTE_REGISTRY)return`--registry ${new URL(process.env.NREMOTE_REGISTRY).origin}`}catch{}return""}function Wa({currentVersion:e,latest:n,agentPid:r}){let o=Go(),t=Ga(),i=je(),s=st(),a=Gn,c=`--prefer-online --no-audit --no-fund ${t}`.trim();if(process.platform==="win32"){let f=Oe.default.join(At.default.tmpdir(),`${ne}-restart.vbs`),p=`@echo off
75
75
  setlocal EnableDelayedExpansion
76
76
  set "NODE=${i}"
77
77
  set "CLI=${s}"
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  const __importMetaUrl = require('url').pathToFileURL(__filename).href;
3
- var T=Object.create;var L=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,j=Object.prototype.hasOwnProperty;var H=(e,s,t,o)=>{if(s&&typeof s=="object"||typeof s=="function")for(let r of z(s))!j.call(e,r)&&r!==t&&L(e,r,{get:()=>s[r],enumerable:!(o=q(s,r))||o.enumerable});return e};var w=(e,s,t)=>(t=e!=null?T(F(e)):{},H(s||!e||!e.__esModule?L(t,"default",{value:e,enumerable:!0}):t,e));var N=w(require("net"),1),c=w(require("fs"),1),d=w(require("path"),1),x=w(require("os"),1),$=w(require("node-pty"),1);var _={win32:[{id:"cmd",label:"Command Prompt",path:"cmd.exe",args:[]},{id:"powershell",label:"PowerShell",path:"powershell.exe",args:["-NoLogo"]},{id:"pwsh",label:"PowerShell Core",path:"pwsh.exe",args:["-NoLogo"]}],unix:[{id:"bash",label:"Bash",path:"/bin/bash",args:["-l"]},{id:"zsh",label:"Zsh",path:"/bin/zsh",args:["-l"]},{id:"sh",label:"Sh",path:"/bin/sh",args:["-l"]}]};function k(e){if(process.platform==="win32"){let o=e?_.win32.find(n=>n.id===e):null;if(o)return o;let r=process.env.COMSPEC;return r?{id:"cmd",label:"Command Prompt",path:r,args:[]}:_.win32[0]}let s=process.env.SHELL||"/bin/bash",t=s.split("/").pop();return{id:t,label:t,path:s,args:["-l"]}}var I=d.default.join(x.default.homedir(),".9remote"),b=process.platform==="win32"?"\\\\.\\pipe\\9remote-pty":d.default.join(I,"pty-daemon.sock"),v=d.default.join(I,"pids","ptyDaemon.pid"),f=new Map,D=new Set,M=2*1024*1024,Z=256*1024,B=5*1024*1024;function A(e,s){if(!e?.length||s<=0)return"";let t=s,o=[];for(let r=e.length-1;r>=0&&t>0;r--){let n=e[r];n.length<=t?(o.push(n),t-=n.length):(o.push(n.slice(n.length-t)),t=0)}return o.reverse(),o.join("")}var U=["1049","1047","1000","1002","1003","1006","1015","1005"],J=/\x1b\[\?([0-9;]+)([hl])/g;function V(e,s){typeof s!="string"&&(s=String(s));for(let t of s.matchAll(J)){let o=t[2]==="h";for(let r of t[1].split(";"))e[o?"add":"delete"](`?${r}`)}}function W(e){let s=U.filter(t=>e.has(`?${t}`));return s.length?`\x1B[?${s.join(";")}h`:""}var P=d.default.join(I,"logs"),E=d.default.join(P,"daemon.log");try{c.default.existsSync(P)||c.default.mkdirSync(P,{recursive:!0})}catch{}function K(){try{if(c.default.existsSync(E)&&c.default.statSync(E).size>B){let t=c.default.readFileSync(E,"utf8").slice(-1024*1024);c.default.writeFileSync(E,t)}}catch{}}function m(e,s=null){K();let o=`[${new Date().toISOString()}] ERROR: ${e}`;s&&(o+=` - ${s.message||s}`),o+=`
4
- `;try{c.default.appendFileSync(E,o)}catch{}console.error(o.trim())}function X(){return process.env.CODESPACES==="true"?process.env.CODESPACE_VSCODE_FOLDER||"/workspaces":process.env.HOME||process.env.USERPROFILE||x.default.homedir()}function Y(e){let s={...process.env,TERM:"xterm-256color",COLORTERM:"truecolor",LANG:process.env.LANG||"en_US.UTF-8"};delete s.PORT;let t=e.includes("zsh"),o=e.includes("bash"),r=null;if(t){r=c.default.mkdtempSync(d.default.join(x.default.tmpdir(),"9remote-zsh-"));let n=d.default.join(r,".zshrc"),i=s.HOME?d.default.join(s.HOME,".zshrc"):null,l='precmd() { print -Pn "\\e]7;file://%m${PWD}\\e\\\\" }\n';i&&c.default.existsSync(i)&&(l+=`[ -f "${i}" ] && source "${i}"
5
- `),c.default.writeFileSync(n,l),s.ZDOTDIR=r}else if(o){let n=s.PROMPT_COMMAND||"";s.PROMPT_COMMAND=`printf "\\e]7;file://%s\\a" "\${HOSTNAME}\${PWD}"${n?`; ${n}`:""}`}return{env:s,zdotDir:r}}function R(e){let s=JSON.stringify(e)+`
6
- `;for(let t of D)try{t.write(s)}catch{}}function u(e,s){try{e.write(JSON.stringify(s)+`
7
- `)}catch{}}function Q(e,s,t=80,o=24,r=null,n=null){if(f.has(e))return{success:!1,error:"Session already exists"};let i=k(r);(!n||!c.default.existsSync(n))&&(n=X());try{let{env:l,zdotDir:O}=Y(i.path);l.NINE_REMOTE_SESSION_ID=e;let S=$.default.spawn(i.path,i.args,{name:"xterm-256color",cols:t,rows:o,cwd:n,env:l,useConpty:process.platform==="win32"});if(i.id==="powershell"||i.id==="pwsh"){let h=`function prompt { $p = $PWD.Path -replace '\\\\','/'; "$([char]27)]7;file://$([System.Net.Dns]::GetHostName())$p$([char]27)\\PS $($PWD.Path)> " }\r
8
- `;setTimeout(()=>{try{S.write(h)}catch{}},500)}let a={pty:S,buffer:[],modes:new Set,name:s,createdAt:Date.now(),cwd:n,shellId:i.id,shellLabel:i.label,zdotDir:O};return S.onData(h=>{a.buffer.push(h),V(a.modes,h);let y=h.match(/\x1b\]7;file:\/\/[^/]*([^\x07\x1b]*)/);if(y){let p;try{p=decodeURIComponent(y[1])}catch{p=y[1]}p&&p!==a.cwd&&(a.cwd=p,R({type:"cwdChange",sessionId:e,cwd:p}))}a.buffer.reduce((p,g)=>p+g.length,0)>M&&(a.buffer=[A(a.buffer,M)]),R({type:"output",sessionId:e,data:Buffer.from(h).toString("base64")})}),S.onExit(()=>{f.delete(e),a.zdotDir&&c.default.rm(a.zdotDir,{recursive:!0,force:!0},()=>{}),R({type:"sessionClosed",sessionId:e})}),f.set(e,a),{success:!0,sessionId:e,cwd:n,shellId:i.id,shellLabel:i.label}}catch(l){return m("Failed to create session",l),{success:!1,error:l.message}}}function ee(e,s){let{type:t,sessionId:o,...r}=s;switch(t){case"ping":u(e,{type:"pong",version:"25",requestId:r.requestId});break;case"listSessions":let n=Array.from(f.entries()).map(([p,g])=>({id:p,name:g.name,createdAt:g.createdAt,shellId:g.shellId,shellLabel:g.shellLabel,cwd:g.cwd}));u(e,{type:"sessionList",sessions:n,requestId:r.requestId});break;case"createSession":let i=Q(o||`session-${Date.now()}`,r.name,r.cols,r.rows,r.shellId,r.cwd);u(e,{type:"createResult",...i,requestId:r.requestId});break;case"joinSession":let l=f.get(o);if(!l){u(e,{type:"joinResult",success:!1,error:"Session not found",requestId:r.requestId});return}let O=W(l.modes);O&&u(e,{type:"output",sessionId:o,data:Buffer.from(O).toString("base64")});let S=A(l.buffer,Z);S&&u(e,{type:"output",sessionId:o,data:Buffer.from(S).toString("base64")}),u(e,{type:"joinResult",success:!0,name:l.name,cwd:l.cwd,shellId:l.shellId,shellLabel:l.shellLabel,requestId:r.requestId});break;case"input":let a=f.get(o);a?.pty&&a.pty.write(r.data);break;case"resize":let h=f.get(o);if(h?.pty)try{h.pty.resize(r.cols,r.rows)}catch{}break;case"deleteSession":let y=f.get(o);y?(y.pty&&y.pty.kill(),f.delete(o),R({type:"sessionClosed",sessionId:o}),u(e,{type:"deleteResult",success:!0,requestId:r.requestId})):u(e,{type:"deleteResult",success:!1,error:"Session not found",requestId:r.requestId});break;case"getCwd":let C=f.get(o);u(e,{type:"cwdResult",cwd:C?.cwd||null,requestId:r.requestId});break;default:m(`Unknown message type: ${t}`)}}function te(){if(!c.default.existsSync(I))try{c.default.mkdirSync(I,{recursive:!0})}catch(t){m("Failed to create socket directory",t),process.exit(1)}if(process.platform!=="win32"&&c.default.existsSync(b))try{c.default.unlinkSync(b)}catch(t){m("Failed to remove stale socket",t),process.exit(1)}let e=N.default.createServer(t=>{D.add(t);let o="";t.on("data",r=>{o+=r.toString();let n=o.split(`
9
- `);o=n.pop()||"";for(let i of n)if(i.trim())try{let l=JSON.parse(i);ee(t,l)}catch{m("Invalid message",i)}}),t.on("close",()=>{D.delete(t)}),t.on("error",r=>{m("Client error",r),D.delete(t)})});e.on("error",t=>{m("Server error",t),t.code==="EADDRINUSE"&&m("Socket already in use, exiting"),process.exit(1)}),e.listen(b,()=>{if(process.platform!=="win32")try{c.default.chmodSync(b,384)}catch{}});try{c.default.mkdirSync(d.default.dirname(v),{recursive:!0}),c.default.writeFileSync(v,String(process.pid),{mode:384})}catch{}let s=()=>{for(let[,t]of f)if(t.pty)try{t.pty.kill()}catch{}try{e.close()}catch{}if(process.platform!=="win32"&&c.default.existsSync(b))try{c.default.unlinkSync(b)}catch{}try{c.default.unlinkSync(v)}catch{}process.exit(0)};process.on("SIGTERM",s),process.on("SIGINT",s)}te();
3
+ var q=Object.create;var L=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var G=(e,s,t,r)=>{if(s&&typeof s=="object"||typeof s=="function")for(let n of F(s))!H.call(e,n)&&n!==t&&L(e,n,{get:()=>s[n],enumerable:!(r=z(s,n))||r.enumerable});return e};var b=(e,s,t)=>(t=e!=null?q(j(e)):{},G(s||!e||!e.__esModule?L(t,"default",{value:e,enumerable:!0}):t,e));var N=b(require("net"),1),c=b(require("fs"),1),h=b(require("path"),1),x=b(require("os"),1),$=b(require("node-pty"),1);var _={win32:[{id:"cmd",label:"Command Prompt",path:"cmd.exe",args:[]},{id:"powershell",label:"PowerShell",path:"powershell.exe",args:["-NoLogo"]},{id:"pwsh",label:"PowerShell Core",path:"pwsh.exe",args:["-NoLogo"]}],unix:[{id:"bash",label:"Bash",path:"/bin/bash",args:["-l"]},{id:"zsh",label:"Zsh",path:"/bin/zsh",args:["-l"]},{id:"sh",label:"Sh",path:"/bin/sh",args:["-l"]}]};function k(e){if(process.platform==="win32"){let r=e?_.win32.find(o=>o.id===e):null;if(r)return r;let n=process.env.COMSPEC;return n?{id:"cmd",label:"Command Prompt",path:n,args:[]}:_.win32[0]}let s=process.env.SHELL||"/bin/bash",t=s.split("/").pop();return{id:t,label:t,path:s,args:["-l"]}}var E=h.default.join(x.default.homedir(),".9remote"),y=process.platform==="win32"?"\\\\.\\pipe\\9remote-pty":h.default.join(E,"pty-daemon.sock"),P=h.default.join(E,"pids","ptyDaemon.pid"),f=new Map,D=new Set,M=2*1024*1024,B=256*1024,U=5*1024*1024;function A(e,s){if(!e?.length||s<=0)return"";let t=s,r=[];for(let n=e.length-1;n>=0&&t>0;n--){let o=e[n];o.length<=t?(r.push(o),t-=o.length):(r.push(o.slice(o.length-t)),t=0)}return r.reverse(),r.join("")}var J=["1049","1047","1000","1002","1003","1006","1015","1005"],V=/\x1b\[\?([0-9;]+)([hl])/g;function W(e,s){typeof s!="string"&&(s=String(s));for(let t of s.matchAll(V)){let r=t[2]==="h";for(let n of t[1].split(";"))e[r?"add":"delete"](`?${n}`)}}function K(e){let s=J.filter(t=>e.has(`?${t}`));return s.length?`\x1B[?${s.join(";")}h`:""}var C=h.default.join(E,"logs"),w=h.default.join(C,"daemon.log");try{c.default.existsSync(C)||c.default.mkdirSync(C,{recursive:!0})}catch{}function X(){try{if(c.default.existsSync(w)&&c.default.statSync(w).size>U){let t=c.default.readFileSync(w,"utf8").slice(-1024*1024);c.default.writeFileSync(w,t)}}catch{}}function S(e,s=null){X();let r=`[${new Date().toISOString()}] ERROR: ${e}`;s&&(r+=` - ${s.message||s}`),r+=`
4
+ `;try{c.default.appendFileSync(w,r)}catch{}console.error(r.trim())}function Y(){return process.env.CODESPACES==="true"?process.env.CODESPACE_VSCODE_FOLDER||"/workspaces":process.env.HOME||process.env.USERPROFILE||x.default.homedir()}function Q(e){let s={...process.env,TERM:"xterm-256color",COLORTERM:"truecolor",LANG:process.env.LANG||"en_US.UTF-8"};delete s.PORT;let t=e.includes("zsh"),r=e.includes("bash"),n=null;if(t){n=c.default.mkdtempSync(h.default.join(x.default.tmpdir(),"9remote-zsh-"));let o=h.default.join(n,".zshrc"),l=s.HOME?h.default.join(s.HOME,".zshrc"):null,a='precmd() { print -Pn "\\e]7;file://%m${PWD}\\e\\\\" }\n';l&&c.default.existsSync(l)&&(a+=`[ -f "${l}" ] && source "${l}"
5
+ `),c.default.writeFileSync(o,a),s.ZDOTDIR=n}else if(r){let o=s.PROMPT_COMMAND||"";s.PROMPT_COMMAND=`printf "\\e]7;file://%s\\a" "\${HOSTNAME}\${PWD}"${o?`; ${o}`:""}`}return{env:s,zdotDir:n}}function R(e){let s=JSON.stringify(e)+`
6
+ `;for(let t of D)try{t.write(s)}catch{}}function d(e,s){try{e.write(JSON.stringify(s)+`
7
+ `)}catch{}}function ee(e,s,t=80,r=24,n=null,o=null){if(f.has(e))return{success:!1,error:"Session already exists"};let l=k(n);(!o||!c.default.existsSync(o))&&(o=Y());try{let{env:a,zdotDir:I}=Q(l.path);a.NINE_REMOTE_SESSION_ID=e;let m=$.default.spawn(l.path,l.args,{name:"xterm-256color",cols:t,rows:r,cwd:o,env:a,useConpty:process.platform==="win32"});if(l.id==="powershell"||l.id==="pwsh"){let p=`function prompt { $p = $PWD.Path -replace '\\\\','/'; "$([char]27)]7;file://$([System.Net.Dns]::GetHostName())$p$([char]27)\\PS $($PWD.Path)> " }\r
8
+ `;setTimeout(()=>{try{m.write(p)}catch{}},500)}let i={pty:m,buffer:[],modes:new Set,name:s,createdAt:Date.now(),cwd:o,shellId:l.id,shellLabel:l.label,zdotDir:I,pending:null,flushScheduled:!1},O=()=>{i.flushScheduled=!1;let p=i.pending;p&&(i.pending=null,R({type:"output",sessionId:e,enc:"b64",data:Buffer.from(p).toString("base64")}))};return m.onData(p=>{i.buffer.push(p),W(i.modes,p);let g=p.match(/\x1b\]7;file:\/\/[^/]*([^\x07\x1b]*)/);if(g){let u;try{u=decodeURIComponent(g[1])}catch{u=g[1]}u&&u!==i.cwd&&(i.cwd=u,R({type:"cwdChange",sessionId:e,cwd:u}))}i.buffer.reduce((u,T)=>u+T.length,0)>M&&(i.buffer=[A(i.buffer,M)]),i.pending=i.pending===null?p:i.pending+p,i.flushScheduled||(i.flushScheduled=!0,setImmediate(O))}),m.onExit(()=>{f.delete(e),i.zdotDir&&c.default.rm(i.zdotDir,{recursive:!0,force:!0},()=>{}),R({type:"sessionClosed",sessionId:e})}),f.set(e,i),{success:!0,sessionId:e,cwd:o,shellId:l.id,shellLabel:l.label}}catch(a){return S("Failed to create session",a),{success:!1,error:a.message}}}function te(e,s){let{type:t,sessionId:r,...n}=s;switch(t){case"ping":d(e,{type:"pong",version:"28",requestId:n.requestId});break;case"listSessions":let o=Array.from(f.entries()).map(([v,u])=>({id:v,name:u.name,createdAt:u.createdAt,shellId:u.shellId,shellLabel:u.shellLabel,cwd:u.cwd}));d(e,{type:"sessionList",sessions:o,requestId:n.requestId});break;case"createSession":let l=ee(r||`session-${Date.now()}`,n.name,n.cols,n.rows,n.shellId,n.cwd);d(e,{type:"createResult",...l,requestId:n.requestId});break;case"joinSession":let a=f.get(r);if(!a){d(e,{type:"joinResult",success:!1,error:"Session not found",requestId:n.requestId});return}let I=K(a.modes);I&&d(e,{type:"output",sessionId:r,enc:"b64",data:Buffer.from(I).toString("base64")});let m=A(a.buffer,B);m&&d(e,{type:"output",sessionId:r,enc:"b64",data:Buffer.from(m).toString("base64")}),d(e,{type:"joinResult",success:!0,name:a.name,cwd:a.cwd,shellId:a.shellId,shellLabel:a.shellLabel,requestId:n.requestId});break;case"input":let i=f.get(r);i?.pty&&i.pty.write(n.data);break;case"resize":let O=f.get(r);if(O?.pty)try{O.pty.resize(n.cols,n.rows)}catch{}break;case"deleteSession":let p=f.get(r);p?(p.pty&&p.pty.kill(),f.delete(r),R({type:"sessionClosed",sessionId:r}),d(e,{type:"deleteResult",success:!0,requestId:n.requestId})):d(e,{type:"deleteResult",success:!1,error:"Session not found",requestId:n.requestId});break;case"getCwd":let g=f.get(r);d(e,{type:"cwdResult",cwd:g?.cwd||null,requestId:n.requestId});break;default:S(`Unknown message type: ${t}`)}}function se(){if(!c.default.existsSync(E))try{c.default.mkdirSync(E,{recursive:!0})}catch(t){S("Failed to create socket directory",t),process.exit(1)}if(process.platform!=="win32"&&c.default.existsSync(y))try{c.default.unlinkSync(y)}catch(t){S("Failed to remove stale socket",t),process.exit(1)}let e=N.default.createServer(t=>{D.add(t);let r="";t.on("data",n=>{r+=n.toString();let o=r.split(`
9
+ `);r=o.pop()||"";for(let l of o)if(l.trim())try{let a=JSON.parse(l);te(t,a)}catch{S("Invalid message",l)}}),t.on("close",()=>{D.delete(t)}),t.on("error",n=>{S("Client error",n),D.delete(t)})});e.on("error",t=>{S("Server error",t),t.code==="EADDRINUSE"&&S("Socket already in use, exiting"),process.exit(1)}),e.listen(y,()=>{if(process.platform!=="win32")try{c.default.chmodSync(y,384)}catch{}});try{c.default.mkdirSync(h.default.dirname(P),{recursive:!0}),c.default.writeFileSync(P,String(process.pid),{mode:384})}catch{}let s=()=>{for(let[,t]of f)if(t.pty)try{t.pty.kill()}catch{}try{e.close()}catch{}if(process.platform!=="win32"&&c.default.existsSync(y))try{c.default.unlinkSync(y)}catch{}try{c.default.unlinkSync(P)}catch{}process.exit(0)};process.on("SIGTERM",s),process.on("SIGINT",s)}se();
package/dist/server.cjs CHANGED
@@ -110,10 +110,10 @@ WantedBy=default.target
110
110
  `:`
111
111
  `)+t,i=n+1,n=r.indexOf(`
112
112
  `,i)}while(n!==-1);return s+=r.slice(i),s}var{stdout:bv,stderr:wv}=yv,Tp=Symbol("GENERATOR"),Ni=Symbol("STYLER"),so=Symbol("IS_EMPTY"),Sv=["ansi","ansi","ansi256","ansi16m"],Di=Object.create(null),LO=(r,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let t=bv?bv.level:0;r.level=e.level===void 0?t:e.level};var BO=r=>{let e=(...t)=>t.join(" ");return LO(e,r),Object.setPrototypeOf(e,oo.prototype),e};function oo(r){return BO(r)}Object.setPrototypeOf(oo.prototype,Function.prototype);for(let[r,e]of Object.entries(Sr))Di[r]={get(){let t=Ga(this,kp(e.open,e.close,this[Ni]),this[so]);return Object.defineProperty(this,r,{value:t}),t}};Di.visible={get(){let r=Ga(this,this[Ni],!0);return Object.defineProperty(this,"visible",{value:r}),r}};var Cp=(r,e,t,...n)=>r==="rgb"?e==="ansi16m"?Sr[t].ansi16m(...n):e==="ansi256"?Sr[t].ansi256(Sr.rgbToAnsi256(...n)):Sr[t].ansi(Sr.rgbToAnsi(...n)):r==="hex"?Cp("rgb",e,t,...Sr.hexToRgb(...n)):Sr[t][r](...n),jO=["rgb","hex","ansi256"];for(let r of jO){Di[r]={get(){let{level:t}=this;return function(...n){let i=kp(Cp(r,Sv[t],"color",...n),Sr.color.close,this[Ni]);return Ga(this,i,this[so])}}};let e="bg"+r[0].toUpperCase()+r.slice(1);Di[e]={get(){let{level:t}=this;return function(...n){let i=kp(Cp(r,Sv[t],"bgColor",...n),Sr.bgColor.close,this[Ni]);return Ga(this,i,this[so])}}}}var FO=Object.defineProperties(()=>{},{...Di,level:{enumerable:!0,get(){return this[Tp].level},set(r){this[Tp].level=r}}}),kp=(r,e,t)=>{let n,i;return t===void 0?(n=r,i=e):(n=t.openAll+r,i=e+t.closeAll),{open:r,close:e,openAll:n,closeAll:i,parent:t}},Ga=(r,e,t)=>{let n=(...i)=>HO(n,i.length===1?""+i[0]:i.join(" "));return Object.setPrototypeOf(n,FO),n[Tp]=r,n[Ni]=e,n[so]=t,n},HO=(r,e)=>{if(r.level<=0||!e)return r[so]?"":e;let t=r[Ni];if(t===void 0)return e;let{openAll:n,closeAll:i}=t;if(e.includes("\x1B"))for(;t!==void 0;)e=xv(e,t.close,t.open),t=t.parent;let s=e.indexOf(`
113
- `);return s!==-1&&(e=_v(e,i,n,s)),n+e+i};Object.defineProperties(oo.prototype,Di);var qO=oo(),x4=oo({level:wv?wv.level:0});var ao=qO;Lt();bt();ji();var jb=K(Bb(),1),{Server:Fb,Namespace:h8,Socket:m8}=jb.default;var IA=require("fs"),NA=require("path");bt();dl();var ct={control:"control",binary:"binary"},lt={idle:"idle",connecting:"connecting",open:"open",degraded:"degraded",closed:"closed"},$b={clientApp:{enabled:["ws","rtc"],channels:{control:{strategy:"priority",prefer:"rtc"},binary:{strategy:"priority",prefer:"rtc"}}},remoteDesktop:{enabled:["ws","rtc"],channels:{control:{strategy:"priority",prefer:"ws"},binary:{strategy:"priority",prefer:"rtc"}}}};var ys=class{static id="base";static capabilities={control:!1,binary:!1,signaling:"none"};static priority={control:0,binary:0};constructor(){this._listeners=new Map,this._state=lt.idle}get state(){return this._state}get ready(){return this._state===lt.open}supports(e){return!!this.constructor.capabilities[e]}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 n=this._listeners.get(e);if(n)for(let i of n)i(...t)}_setState(e){this._state!==e&&(this._state=e,this._emit("stateChange",e))}connect(e){throw new Error("Not implemented: connect")}disconnect(){throw new Error("Not implemented: disconnect")}send(e,t){throw new Error("Not implemented: send")}};var hl=class extends ys{static id="ws";static capabilities={control:!0,binary:!0,signaling:"ws"};static priority={control:100,binary:10};constructor(){super(),this._socket=null}get socket(){return this._socket}connect(e){this._socket=e.socket,this._setState(e.socket.connected?lt.open:lt.connecting),e.socket.on("connect",()=>this._setState(lt.open)),e.socket.on("disconnect",()=>this._setState(lt.closed)),e.socket.onAny?.((t,n)=>this._emit("message",{event:t,data:n,source:"ws"}))}disconnect(){this._socket=null,this._setState(lt.closed)}send(e,t){if(!this._socket?.connected)return!1;let n=this._socket._rawEmit||this._socket.emit.bind(this._socket);if(e===ct.control){let{event:i,args:s=[]}=t;return n(i,...s),!0}if(e===ct.binary){let i=this._socket.conn?.transport;return i&&i.writable===!1?!1:(n("tiles-bin-v2",t),!0)}return!1}};var Jb=K(require("node-datachannel"),1);function B2(r,e){return e&&typeof e=="object"&&e.type==="Buffer"&&Array.isArray(e.data)?{__b:Buffer.from(e.data).toString("base64")}:e}function j2(r,e){return e&&typeof e=="object"&&typeof e.__b=="string"?Buffer.from(e.__b,"base64"):e}function Wb(r){return JSON.stringify(r,B2)}function Gb(r){return JSON.parse(typeof r=="string"?r:Buffer.from(r).toString("utf8"),j2)}pt();var Kb=K(require("node:dns/promises"),1),F2=3e4,H2=/\s([0-9a-f-]{8,}\.local)\s/i,Vb=new Map;async function q2(r){let e=Vb.get(r);if(e&&Date.now()-e.ts<F2)return e.ip;try{let{address:t}=await Kb.default.lookup(r);return Vb.set(r,{ip:t,ts:Date.now()}),t}catch{return null}}async function Yb(r){let e=r.match(H2);if(!e)return r;let t=await q2(e[1]);return t?r.replace(e[1],t):null}var{PeerConnection:U2}=Jb.default,$2=[{hostname:"stun.l.google.com",port:19302,type:"Stun"},{hostname:"stun1.l.google.com",port:19302,type:"Stun"},{hostname:"stun2.l.google.com",port:19302,type:"Stun"},{hostname:"stun3.l.google.com",port:19302,type:"Stun"},{hostname:"stun4.l.google.com",port:19302,type:"Stun"},{hostname:"global.stun.twilio.com",port:3478,type:"Stun"},{hostname:"stun.cloudflare.com",port:3478,type:"Stun"}];async function W2(r,e){try{let t=await fetch(r,{headers:{"X-API-Key":e}});if(!t.ok)throw new Error(`HTTP ${t.status}`);let{iceServers:n}=await t.json(),i=[];for(let s of n)for(let o of s.urls)if(o.startsWith("stun:")){let a=o.replace("stun:","").split(":")[0],c=parseInt(o.split(":")[2]||"3478");i.push({hostname:a,port:c,type:"Stun"})}else if(o.startsWith("turn:")||o.startsWith("turns:")){let a=o.startsWith("turns:"),l=o.replace(/^turns?:/,"").split("?")[0],u=l.split(":")[0],f=parseInt(l.split(":")[1]||(a?"5349":"3478")),h=o.includes("transport=tcp")?"Tcp":"Udp";i.push({hostname:u,port:f,type:a?"Tls":"Turn",relayType:h,username:s.username,password:s.credential})}return i}catch(t){return console.error("[WebRtcProtocol] TURN fetch failed:",t.message),null}}var gl=class extends ys{static id="rtc";static capabilities={control:!0,binary:!0,signaling:"external"};static priority={control:50,binary:100};constructor(){super(),this._pc=null,this._dcControl=null,this._dcBinary=null,this._iceServers=$2,this._refreshTimer=null,this._remoteSet=!1,this._pendingCandidates=[],this._signaling=null,this._iceGraceTimer=null}async connect(e){this._ctx=e,this._setState(lt.connecting);let t=e.profile?.rtc||{};t.enableTurn&&e.auth?.apiKey&&t.turnApiUrl&&await this._refreshTurn(t),this._signaling=e.signaling,this._signaling?.on?.(n=>this._handleSignal(n,t))}disconnect(){clearTimeout(this._refreshTimer),this._signaling?.off?.(),this._signaling=null,this._cleanupPeer(),this._setState(lt.closed)}send(e,t){if(e===ct.control){if(!this._dcControl)return!1;try{return this._dcControl.sendMessage(Wb({event:t.event,args:t.args||[],ackId:t.ackId||null})),!0}catch(n){return console.error("[WebRtcProtocol] send control:",n.message),!1}}if(e===ct.binary){if(!this._dcBinary)return!1;try{let n=Array.isArray(t)?t[0]:t,i=$.webrtc.dcBufferThreshold;return this._dcBinary.bufferedAmount()>i?!1:this._dcBinary.sendMessageBinary(n)}catch(n){return console.error("[WebRtcProtocol] send binary:",n.message),!1}}return!1}_handleSignal(e,t){if(e.type==="offer")this._processOffer(e.sdp,t);else if(e.type==="ice"){if(!this._remoteSet||!this._pc){this._pendingCandidates.push({candidate:e.candidate,mid:e.mid||"0"});return}this._addRemoteCandidate(e.candidate,e.mid||"0")}}async _addRemoteCandidate(e,t){try{let n=await Yb(e);if(!n||!this._pc)return;this._pc.addRemoteCandidate(n,t)}catch(n){console.error("[WebRtcProtocol] addRemoteCandidate:",n.message)}}_createPeer(e){try{this._pc?.close()}catch{}this._pc=null,this._dcControl=null,this._dcBinary=null,this._remoteSet=!1,this._pendingCandidates=[],this._iceGraceTimer&&(clearTimeout(this._iceGraceTimer),this._iceGraceTimer=null);let t=this._ctx?.auth?.socketId||"anon",n=new U2(`peer-${t}`,{iceServers:this._iceServers});this._pcState="new",n.onStateChange(i=>{if(this._pcState=i,i==="failed"||i==="closed")this._iceGraceTimer&&(clearTimeout(this._iceGraceTimer),this._iceGraceTimer=null),this._setState(lt.closed);else if(i==="disconnected"){if(this._iceGraceTimer)return;this._iceGraceTimer=setTimeout(()=>{this._iceGraceTimer=null,this._pcState!=="connected"&&this._setState(lt.closed)},$.webrtc.iceDisconnectGraceMs)}else i==="connected"&&this._iceGraceTimer&&(clearTimeout(this._iceGraceTimer),this._iceGraceTimer=null)}),n.onDataChannel(i=>{let s=i.getLabel?.()||"",o=()=>{s==="control"?this._dcControl=i:s==="binary"&&(this._dcBinary=i),this._dcControl&&this._dcBinary&&this._setState(lt.open)};i.onOpen(o),i.onClosed(()=>{s==="control"&&(this._dcControl=null),s==="binary"&&(this._dcBinary=null),!this._dcControl&&!this._dcBinary&&this._setState(lt.closed)}),i.onError(a=>console.error(`[WebRtcProtocol] DC[${s}] error:`,a)),i.onMessage(a=>{if(s!=="control")return;let c;try{c=Gb(a)}catch(l){console.error("[WebRtcProtocol] control parse:",l.message);return}try{this._emit("message",{event:c.event,data:c,source:"rtc"})}catch(l){console.error(`[WebRtcProtocol] handler error event=${c.event}:`,l.message)}})}),this._pc=n}_processOffer(e,t){return this._createPeer(t),new Promise((n,i)=>{this._pc.onLocalDescription((o,a)=>{a==="answer"&&(this._signaling?.send?.({type:"answer",sdp:o}),n())}),this._pc.onLocalCandidate((o,a)=>{o&&this._signaling?.send?.({type:"ice",candidate:o,mid:a})});try{this._pc.setRemoteDescription(e,"offer"),this._remoteSet=!0;for(let{candidate:o,mid:a}of this._pendingCandidates)this._addRemoteCandidate(o,a);this._pendingCandidates=[],this._pc.setLocalDescription()}catch(o){this._signaling?.send?.({type:"error",message:o.message}),i(o)}let s=t?.answerTimeout||1e4;setTimeout(()=>i(new Error("Answer timeout")),s)})}_cleanupPeer(){this._iceGraceTimer&&(clearTimeout(this._iceGraceTimer),this._iceGraceTimer=null);try{this._pc?.close()}catch{}this._pc=null,this._dcControl=null,this._dcBinary=null}async _refreshTurn(e){let t=await W2(e.turnApiUrl,this._ctx.auth.apiKey);t?.length&&(this._iceServers=t,$.logging?.webrtc&&console.log(`[WebRtcProtocol] TURN credentials loaded (${t.length} servers)`)),clearTimeout(this._refreshTimer),this._refreshTimer=setTimeout(()=>this._refreshTurn(e),e.turnRefreshInterval)}};var Xb=new Map;function Jd(r){if(!r?.id)throw new Error("Adapter missing static id");Xb.set(r.id,r)}function Zb(r){return Xb.get(r)}mh();Jd(hl);Jd(gl);var Rl=class{constructor(e,t){let n=t.enableWebRTC?"remoteDesktop":"clientApp",i={...$b[n]};t.enableWebRTC||(i.enabled=["ws"]),i.rtc={enableTurn:!!(t.apiKey&&t.turnApiUrl),turnApiUrl:t.turnApiUrl||null,turnRefreshInterval:t.turnRefreshInterval,dcMaxMessageSize:t.dcMaxMessageSize,answerTimeout:t.answerTimeout},this._profile=i,this._auth={apiKey:t.apiKey||null,socketId:e.id},this._socket=e,this._wsChunkSize=t.wsChunkSize,this._dcChunkSize=t.dcChunkSize,this._dcMaxTilesPerFrame=t.dcMaxTilesPerFrame,this._maxControlBuffer=t.maxControlBuffer,this._adapters=new Map,this._listeners=new Map,this._buffer=[],this._rtcSignalingHandler=null,this._sigListeners=null,this._chunkOffset=0,this._wsPendingSince=new Map}get type(){return this._pickAdapter(ct.binary)?.constructor.id==="rtc"?"dc":"ws"}async init(){for(let e of this._profile.enabled){let t=Zb(e);if(!t)continue;let n=new t;n.on("stateChange",s=>this._onAdapterStateChange(e,s)),n.on("message",({event:s,data:o,source:a})=>this._dispatch(s,o,a)),this._adapters.set(e,n);let i=this._buildCtx(e);await n.connect(i)}}setupSignaling(e){this._installSignalingListeners()}emit(e,...t){this._sendControl(e,t)}sendTiles(e,t){let{tiles:n,timestamp:i}=e;if(!n?.length)return[];let s=this._pickAdapter(ct.binary),o=i??Date.now();return s?.constructor.id==="rtc"&&t?this._emitTilesRtc(s,n,o,t):this._emitTilesChunked(n,o)}close(){for(let e of this._adapters.values())try{e.disconnect()}catch{}this._adapters.clear(),this._buffer=[]}attachAsBus(e){if(e._rawEmit)return;let t=e.emit.bind(e);e._rawEmit=t;let n=new Set(["error","disconnect","disconnecting","connect","newListener","removeListener"]);e.emit=(i,...s)=>n.has(i)?t(i,...s):(this._sendControl(i,s),!0)}_emitTilesChunked(e,t){let n=this._adapters.get("ws");if(!n?.ready)return[];let i=this._wsChunkSize,s=this._wsPendingSince,o=t??Date.now(),a=[...e].sort((l,u)=>{let f=s.get(l.tileIndex)??1/0,h=s.get(u.tileIndex)??1/0;return f!==h?f-h:l.tileIndex-u.tileIndex}),c=[];for(let l=0;l<a.length;l+=i){let u=a.slice(l,l+i);if(n.send(ct.binary,Ts(u,t))===!1){for(let f=l;f<a.length;f++){let h=a[f].tileIndex;s.has(h)||s.set(h,o)}break}for(let f of u)s.delete(f.tileIndex);c.push(...u)}return c}_emitTilesRtc(e,t,n,i){let s=this._profile.rtc?.dcMaxMessageSize??65536,o=t.length,a=o>this._dcChunkSize?this._chunkOffset%o:0,c=h=>{let g=[];for(let x=0;x<h;x++)g.push(t[(a+x)%o]);return g},l=Math.min(this._dcChunkSize,o);for(;l>1&&i(c(l),n).length>s;)l=Math.floor(l/2);o>l&&(this._chunkOffset=(a+l)%o);let u=this._adapters.get("ws"),f=[];for(let h=0;h<o;h+=l){let g=[];for(let S=0;S<l&&h+S<o;S++)g.push(t[(a+h+S)%o]);let x=i(g,n);if(x.length>s){g.length===1&&u?.ready&&u.send(ct.binary,x)!==!1&&f.push(...g);continue}if(e.send(ct.binary,x)===!1)return f;f.push(...g)}return f}_buildCtx(e){let t={auth:this._auth,profile:this._profile};return e==="ws"&&(t.socket=this._socket),e==="rtc"&&(t.signaling={send:n=>this._sendSignaling(n),on:n=>{this._rtcSignalingHandler=n,this._installSignalingListeners()},off:()=>{this._rtcSignalingHandler=null,this._removeSignalingListeners()}}),t}_onAdapterStateChange(e,t){t===lt.open&&this._flushBuffer()}_pickAdapter(e){let t=this._profile.channels[e];if(!t)return null;let n=[...this._adapters.values()].filter(i=>i.supports(e)&&i.ready);if(t.prefer){let i=n.find(s=>s.constructor.id===t.prefer);if(i)return i}return n.sort((i,s)=>(s.constructor.priority[e]??0)-(i.constructor.priority[e]??0)),n[0]||null}hasReadyAdapter(){return!!(this._pickAdapter(ct.control)||this._pickAdapter(ct.binary))}_sendControl(e,t,n){let i=this._pickAdapter(ct.control);if(!i){this._buffer.push({event:e,args:t,ackId:n}),this._buffer.length>this._maxControlBuffer&&this._buffer.shift();return}i.constructor.id==="rtc"?i.send(ct.control,{event:e,args:t,ackId:n}):i.send(ct.control,{event:e,args:t})}_flushBuffer(){if(!(!this._buffer.length||!this._pickAdapter(ct.control)))for(;this._buffer.length;){let{event:t,args:n,ackId:i}=this._buffer.shift();this._sendControl(t,n,i)}}_dispatch(e,t,n){if(n==="rtc"){let s=Array.isArray(t?.args)?[...t.args]:[],o=t?.ackId;o&&s.push((...l)=>this._sendAck(o,l));let a=this._listeners.get(e);if(a)for(let l of a)l(...s);let c=this._socket.listeners?.(e)||[];for(let l of c)l(...s);return}let i=this._listeners.get(e);if(i)for(let s of i)s(t)}_sendAck(e,t){let n=this._adapters.get("rtc");n?.ready&&n.send(ct.control,{event:"__ack",args:t,ackId:e})}_sendSignaling(e){let t=this._adapters.get("ws");if(t?.ready){t.send(ct.control,{event:this._sigEvent(e.type),args:[this._sigData(e)]});return}console.warn("[ProtocolManager] signaling unavailable (ws down)")}_sigEvent(e){return e==="offer"?"webrtc:offer":e==="answer"?"webrtc:answer":e==="ice"?"webrtc:ice-candidate":"webrtc:error"}_sigData(e){return e.type==="offer"||e.type==="answer"?{sdp:e.sdp}:e.type==="ice"?{candidate:e.candidate,mid:e.mid}:e}_installSignalingListeners(){if(!this._rtcSignalingHandler||this._sigListeners)return;let e=({sdp:n})=>this._rtcSignalingHandler?.({type:"offer",sdp:n}),t=({candidate:n,mid:i})=>this._rtcSignalingHandler?.({type:"ice",candidate:n,mid:i});this._sigListeners={onOffer:e,onIce:t},this._socket.on("webrtc:offer",e),this._socket.on("webrtc:ice-candidate",t)}_removeSignalingListeners(){this._sigListeners&&(this._socket.off("webrtc:offer",this._sigListeners.onOffer),this._socket.off("webrtc:ice-candidate",this._sigListeners.onIce),this._sigListeners=null)}};hi();pt();var GT=require("path"),zT=require("url");var Nl=K(require("net"),1),ce=K(require("fs"),1),he=K(require("path"),1),Jw=K(require("os"),1),Xw=require("child_process"),Zw=require("url");var vh={win32:[{id:"cmd",label:"Command Prompt",path:"cmd.exe",args:[]},{id:"powershell",label:"PowerShell",path:"powershell.exe",args:["-NoLogo"]},{id:"pwsh",label:"PowerShell Core",path:"pwsh.exe",args:["-NoLogo"]}],unix:[{id:"bash",label:"Bash",path:"/bin/bash",args:["-l"]},{id:"zsh",label:"Zsh",path:"/bin/zsh",args:["-l"]},{id:"sh",label:"Sh",path:"/bin/sh",args:["-l"]}]};function Vw(){return process.platform==="win32"?vh.win32:[]}function yh(r){if(process.platform==="win32"){let n=r?vh.win32.find(s=>s.id===r):null;if(n)return n;let i=process.env.COMSPEC;return i?{id:"cmd",label:"Command Prompt",path:i,args:[]}:vh.win32[0]}let e=process.env.SHELL||"/bin/bash",t=e.split("/").pop();return{id:t,label:t,path:e,args:["-l"]}}var _h=he.default.dirname((0,Zw.fileURLToPath)(__importMetaUrl)),xn=he.default.join(Jw.default.homedir(),".9remote"),Jo=process.platform==="win32"?"\\\\.\\pipe\\9remote-pty":he.default.join(xn,"pty-daemon.sock"),Kw=he.default.join(_h,"ptyDaemon.js"),Yw=he.default.join(_h,"ptyDaemon.cjs"),Ol=he.default.join(xn,"daemon");function Qw(r,e){if(ce.default.existsSync(r)){ce.default.mkdirSync(e,{recursive:!0});for(let t of ce.default.readdirSync(r,{withFileTypes:!0})){let n=he.default.join(r,t.name),i=he.default.join(e,t.name);t.isDirectory()?Qw(n,i):t.isFile()&&ce.default.copyFileSync(n,i)}}}function yB(r,e){let t=r;for(let n=0;n<6;n++){let i=he.default.join(t,"node_modules",e);if(ce.default.existsSync(i))return i;let s=he.default.dirname(t);if(s===t)break;t=s}return null}var xB=r=>yB(r,"node-pty");function _B(r){try{if(!ce.default.existsSync(Ol))return;let e=he.default.join(xn,"pids","ptyDaemon.pid"),t=!1;try{let n=parseInt(ce.default.readFileSync(e,"utf8").trim(),10);if(Number.isFinite(n)&&n>0)try{process.kill(n,0),t=!0}catch{}}catch{}if(t)return;for(let n of ce.default.readdirSync(Ol))if(n!==`v${r}`)try{ce.default.rmSync(he.default.join(Ol,n),{recursive:!0,force:!0})}catch{}}catch{}}function bB(r){_B("25");let e=he.default.join(Ol,`v${"25"}`),t=r.endsWith(".js"),n=t?he.default.join(e,"features","terminal"):e,i=he.default.join(n,he.default.basename(r)),s=he.default.join(n,"node_modules","node-pty");if(ce.default.existsSync(i)&&ce.default.existsSync(s))return{script:i,cwd:n};try{if(ce.default.mkdirSync(n,{recursive:!0}),ce.default.copyFileSync(r,i),t){let a=he.default.dirname(r);ce.default.copyFileSync(he.default.join(a,"constants.js"),he.default.join(n,"constants.js"));let c=he.default.join(e,"lib");ce.default.mkdirSync(c,{recursive:!0}),ce.default.copyFileSync(he.default.resolve(a,"..","..","lib","constants.js"),he.default.join(c,"constants.js"))}let o=xB(he.default.dirname(r));return o?(Qw(o,s),{script:i,cwd:n}):null}catch{return null}}var Wr=null,ks=!1,$n=!1,xh="",wB=0,As=new Map,Ml=new Map;function SB(){return++wB}function Zo(r,e){Ml.has(r)||Ml.set(r,[]),Ml.get(r).push(e)}function Xo(r,e){let t=Ml.get(r);if(t)for(let n of t)try{n(e)}catch(i){console.error(`[DaemonClient] Error in ${r} handler:`,i)}}function bh(r){if(!Wr||!ks)return!1;try{return Wr.write(JSON.stringify(r)+`
114
- `),!0}catch(e){return console.error("[DaemonClient] Send error:",e),!1}}function Qo(r,e=5e3){return new Promise((t,n)=>{let i=SB();r.requestId=i;let s=setTimeout(()=>{As.delete(i),n(new Error("Request timeout"))},e);As.set(i,{resolve:t,reject:n,timer:s}),bh(r)||(clearTimeout(s),As.delete(i),n(new Error("Not connected to daemon")))})}function EB(r){let{type:e,requestId:t,...n}=r;if(t&&As.has(t)){let{resolve:i,timer:s}=As.get(t);clearTimeout(s),As.delete(t),i({type:e,...n});return}switch(e){case"output":Xo("output",{sessionId:n.sessionId,data:Buffer.from(n.data,"base64")});break;case"sessionClosed":Xo("sessionClosed",n.sessionId);break;case"cwdChange":Xo("cwdChange",{sessionId:n.sessionId,cwd:n.cwd});break;case"pong":break;default:console.log("[DaemonClient] Unknown message:",e)}}function Il(){return new Promise(r=>{let e=Nl.default.connect(Jo),t=setTimeout(()=>{e.destroy(),r(!1)},1e3);e.on("connect",()=>{clearTimeout(t),e.destroy(),r(!0)}),e.on("error",()=>{if(clearTimeout(t),process.platform!=="win32"&&ce.default.existsSync(Jo))try{ce.default.unlinkSync(Jo)}catch{}r(!1)})})}function TB(){ce.default.existsSync(xn)||ce.default.mkdirSync(xn,{recursive:!0});let r=ce.default.existsSync(Kw)?Kw:ce.default.existsSync(Yw)?Yw:null;if(!r)return console.error("[DaemonClient] \u274C Daemon script not found"),null;let e=bB(r);return e||{script:r,cwd:_h}}async function CB(){if(!ce.default.existsSync(xn))try{ce.default.mkdirSync(xn,{recursive:!0})}catch(a){return console.error("[DaemonClient] Failed to create socket directory:",a.message),!1}let r=TB();if(!r)return!1;let{script:e,cwd:t}=r,n=he.default.join(xn,"logs");try{ce.default.mkdirSync(n,{recursive:!0})}catch{}let i=he.default.join(n,"daemon.log"),s;try{s=ce.default.openSync(i,"w")}catch(a){console.error("[DaemonClient] Failed to open log file:",a.message),s="ignore"}if((0,Xw.spawn)("node",[e],{detached:!0,stdio:["ignore",s,s],cwd:t}).unref(),typeof s=="number")try{ce.default.closeSync(s)}catch{}for(let a=0;a<20;a++)if(await new Promise(c=>setTimeout(c,100)),await Il())return!0;console.error("[DaemonClient] \u274C Failed to start daemon");try{let a=ce.default.readFileSync(i,"utf8");a.trim()&&(console.error("[DaemonClient] Daemon log:"),console.error(a))}catch{}return!1}function kB(){return new Promise(r=>{let e=Nl.default.connect(Jo),t="",n=s=>{try{e.destroy()}catch{}r(s)},i=setTimeout(()=>n(null),2e3);e.on("connect",()=>e.write(JSON.stringify({type:"ping",requestId:-1})+`
113
+ `);return s!==-1&&(e=_v(e,i,n,s)),n+e+i};Object.defineProperties(oo.prototype,Di);var qO=oo(),x4=oo({level:wv?wv.level:0});var ao=qO;Lt();bt();ji();var jb=K(Bb(),1),{Server:Fb,Namespace:h8,Socket:m8}=jb.default;var IA=require("fs"),NA=require("path");bt();dl();var ct={control:"control",binary:"binary"},lt={idle:"idle",connecting:"connecting",open:"open",degraded:"degraded",closed:"closed"},$b={clientApp:{enabled:["ws","rtc"],channels:{control:{strategy:"priority",prefer:"rtc"},binary:{strategy:"priority",prefer:"rtc"}}},remoteDesktop:{enabled:["ws","rtc"],channels:{control:{strategy:"priority",prefer:"ws"},binary:{strategy:"priority",prefer:"rtc"}}}};var ys=class{static id="base";static capabilities={control:!1,binary:!1,signaling:"none"};static priority={control:0,binary:0};constructor(){this._listeners=new Map,this._state=lt.idle}get state(){return this._state}get ready(){return this._state===lt.open}supports(e){return!!this.constructor.capabilities[e]}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 n=this._listeners.get(e);if(n)for(let i of n)i(...t)}_setState(e){this._state!==e&&(this._state=e,this._emit("stateChange",e))}connect(e){throw new Error("Not implemented: connect")}disconnect(){throw new Error("Not implemented: disconnect")}send(e,t){throw new Error("Not implemented: send")}};var hl=class extends ys{static id="ws";static capabilities={control:!0,binary:!0,signaling:"ws"};static priority={control:100,binary:10};constructor(){super(),this._socket=null}get socket(){return this._socket}connect(e){this._socket=e.socket,this._setState(e.socket.connected?lt.open:lt.connecting),e.socket.on("connect",()=>this._setState(lt.open)),e.socket.on("disconnect",()=>this._setState(lt.closed)),e.socket.onAny?.((t,n)=>this._emit("message",{event:t,data:n,source:"ws"}))}disconnect(){this._socket=null,this._setState(lt.closed)}send(e,t){if(!this._socket?.connected)return!1;let n=this._socket._rawEmit||this._socket.emit.bind(this._socket);if(e===ct.control){let{event:i,args:s=[]}=t;return n(i,...s),!0}if(e===ct.binary){let i=this._socket.conn?.transport;return i&&i.writable===!1?!1:(n("tiles-bin-v2",t),!0)}return!1}};var Jb=K(require("node-datachannel"),1);function B2(r,e){return e&&typeof e=="object"&&e.type==="Buffer"&&Array.isArray(e.data)?{__b:Buffer.from(e.data).toString("base64")}:e}function j2(r,e){return e&&typeof e=="object"&&typeof e.__b=="string"?Buffer.from(e.__b,"base64"):e}function Wb(r){return JSON.stringify(r,B2)}function Gb(r){return JSON.parse(typeof r=="string"?r:Buffer.from(r).toString("utf8"),j2)}pt();var Kb=K(require("node:dns/promises"),1),F2=3e4,H2=/\s([0-9a-f-]{8,}\.local)\s/i,Vb=new Map;async function q2(r){let e=Vb.get(r);if(e&&Date.now()-e.ts<F2)return e.ip;try{let{address:t}=await Kb.default.lookup(r);return Vb.set(r,{ip:t,ts:Date.now()}),t}catch{return null}}async function Yb(r){let e=r.match(H2);if(!e)return r;let t=await q2(e[1]);return t?r.replace(e[1],t):null}var{PeerConnection:U2}=Jb.default,$2=[{hostname:"stun.l.google.com",port:19302,type:"Stun"},{hostname:"stun1.l.google.com",port:19302,type:"Stun"},{hostname:"stun2.l.google.com",port:19302,type:"Stun"},{hostname:"stun3.l.google.com",port:19302,type:"Stun"},{hostname:"stun4.l.google.com",port:19302,type:"Stun"},{hostname:"global.stun.twilio.com",port:3478,type:"Stun"},{hostname:"stun.cloudflare.com",port:3478,type:"Stun"}];async function W2(r,e){try{let t=await fetch(r,{headers:{"X-API-Key":e}});if(!t.ok)throw new Error(`HTTP ${t.status}`);let{iceServers:n}=await t.json(),i=[];for(let s of n)for(let o of s.urls)if(o.startsWith("stun:")){let a=o.replace("stun:","").split(":")[0],c=parseInt(o.split(":")[2]||"3478");i.push({hostname:a,port:c,type:"Stun"})}else if(o.startsWith("turn:")||o.startsWith("turns:")){let a=o.startsWith("turns:"),l=o.replace(/^turns?:/,"").split("?")[0],u=l.split(":")[0],f=parseInt(l.split(":")[1]||(a?"5349":"3478")),h=o.includes("transport=tcp")?"Tcp":"Udp";i.push({hostname:u,port:f,type:a?"Tls":"Turn",relayType:h,username:s.username,password:s.credential})}return i}catch(t){return console.error("[WebRtcProtocol] TURN fetch failed:",t.message),null}}var gl=class extends ys{static id="rtc";static capabilities={control:!0,binary:!0,signaling:"external"};static priority={control:50,binary:100};constructor(){super(),this._pc=null,this._dcControl=null,this._dcBinary=null,this._iceServers=$2,this._refreshTimer=null,this._remoteSet=!1,this._pendingCandidates=[],this._signaling=null,this._iceGraceTimer=null}async connect(e){this._ctx=e,this._setState(lt.connecting);let t=e.profile?.rtc||{};t.enableTurn&&e.auth?.apiKey&&t.turnApiUrl&&await this._refreshTurn(t),this._signaling=e.signaling,this._signaling?.on?.(n=>this._handleSignal(n,t))}disconnect(){clearTimeout(this._refreshTimer),this._signaling?.off?.(),this._signaling=null,this._cleanupPeer(),this._setState(lt.closed)}send(e,t){if(e===ct.control){if(!this._dcControl)return!1;try{return this._dcControl.sendMessage(Wb({event:t.event,args:t.args||[],ackId:t.ackId||null})),!0}catch(n){return console.error("[WebRtcProtocol] send control:",n.message),!1}}if(e===ct.binary){if(!this._dcBinary)return!1;try{let n=Array.isArray(t)?t[0]:t,i=$.webrtc.dcBufferThreshold;return this._dcBinary.bufferedAmount()>i?!1:this._dcBinary.sendMessageBinary(n)}catch(n){return console.error("[WebRtcProtocol] send binary:",n.message),!1}}return!1}_handleSignal(e,t){if(e.type==="offer")this._processOffer(e.sdp,t);else if(e.type==="ice"){if(!this._remoteSet||!this._pc){this._pendingCandidates.push({candidate:e.candidate,mid:e.mid||"0"});return}this._addRemoteCandidate(e.candidate,e.mid||"0")}}async _addRemoteCandidate(e,t){try{let n=await Yb(e);if(!n||!this._pc)return;this._pc.addRemoteCandidate(n,t)}catch(n){console.error("[WebRtcProtocol] addRemoteCandidate:",n.message)}}_createPeer(e){try{this._pc?.close()}catch{}this._pc=null,this._dcControl=null,this._dcBinary=null,this._remoteSet=!1,this._pendingCandidates=[],this._iceGraceTimer&&(clearTimeout(this._iceGraceTimer),this._iceGraceTimer=null);let t=this._ctx?.auth?.socketId||"anon",n=new U2(`peer-${t}`,{iceServers:this._iceServers});this._pcState="new",n.onStateChange(i=>{if(this._pcState=i,i==="failed"||i==="closed")this._iceGraceTimer&&(clearTimeout(this._iceGraceTimer),this._iceGraceTimer=null),this._setState(lt.closed);else if(i==="disconnected"){if(this._iceGraceTimer)return;this._iceGraceTimer=setTimeout(()=>{this._iceGraceTimer=null,this._pcState!=="connected"&&this._setState(lt.closed)},$.webrtc.iceDisconnectGraceMs)}else i==="connected"&&this._iceGraceTimer&&(clearTimeout(this._iceGraceTimer),this._iceGraceTimer=null)}),n.onDataChannel(i=>{let s=i.getLabel?.()||"",o=()=>{s==="control"?this._dcControl=i:s==="binary"&&(this._dcBinary=i),this._dcControl&&this._dcBinary&&this._setState(lt.open)};i.onOpen(o),i.onClosed(()=>{s==="control"&&(this._dcControl=null),s==="binary"&&(this._dcBinary=null),!this._dcControl&&!this._dcBinary&&this._setState(lt.closed)}),i.onError(a=>console.error(`[WebRtcProtocol] DC[${s}] error:`,a)),i.onMessage(a=>{if(s!=="control")return;let c;try{c=Gb(a)}catch(l){console.error("[WebRtcProtocol] control parse:",l.message);return}try{this._emit("message",{event:c.event,data:c,source:"rtc"})}catch(l){console.error(`[WebRtcProtocol] handler error event=${c.event}:`,l.message)}})}),this._pc=n}_processOffer(e,t){return this._createPeer(t),new Promise((n,i)=>{this._pc.onLocalDescription((o,a)=>{a==="answer"&&(this._signaling?.send?.({type:"answer",sdp:o}),n())}),this._pc.onLocalCandidate((o,a)=>{o&&this._signaling?.send?.({type:"ice",candidate:o,mid:a})});try{this._pc.setRemoteDescription(e,"offer"),this._remoteSet=!0;for(let{candidate:o,mid:a}of this._pendingCandidates)this._addRemoteCandidate(o,a);this._pendingCandidates=[],this._pc.setLocalDescription()}catch(o){this._signaling?.send?.({type:"error",message:o.message}),i(o)}let s=t?.answerTimeout||1e4;setTimeout(()=>i(new Error("Answer timeout")),s)})}_cleanupPeer(){this._iceGraceTimer&&(clearTimeout(this._iceGraceTimer),this._iceGraceTimer=null);try{this._pc?.close()}catch{}this._pc=null,this._dcControl=null,this._dcBinary=null}async _refreshTurn(e){let t=await W2(e.turnApiUrl,this._ctx.auth.apiKey);t?.length&&(this._iceServers=t,$.logging?.webrtc&&console.log(`[WebRtcProtocol] TURN credentials loaded (${t.length} servers)`)),clearTimeout(this._refreshTimer),this._refreshTimer=setTimeout(()=>this._refreshTurn(e),e.turnRefreshInterval)}};var Xb=new Map;function Jd(r){if(!r?.id)throw new Error("Adapter missing static id");Xb.set(r.id,r)}function Zb(r){return Xb.get(r)}mh();Jd(hl);Jd(gl);var Rl=class{constructor(e,t){let n=t.enableWebRTC?"remoteDesktop":"clientApp",i={...$b[n]};t.enableWebRTC||(i.enabled=["ws"]),i.rtc={enableTurn:!!(t.apiKey&&t.turnApiUrl),turnApiUrl:t.turnApiUrl||null,turnRefreshInterval:t.turnRefreshInterval,dcMaxMessageSize:t.dcMaxMessageSize,answerTimeout:t.answerTimeout},this._profile=i,this._auth={apiKey:t.apiKey||null,socketId:e.id},this._socket=e,this._wsChunkSize=t.wsChunkSize,this._dcChunkSize=t.dcChunkSize,this._dcMaxTilesPerFrame=t.dcMaxTilesPerFrame,this._maxControlBuffer=t.maxControlBuffer,this._adapters=new Map,this._listeners=new Map,this._buffer=[],this._rtcSignalingHandler=null,this._sigListeners=null,this._chunkOffset=0,this._wsPendingSince=new Map}get type(){return this._pickAdapter(ct.binary)?.constructor.id==="rtc"?"dc":"ws"}async init(){for(let e of this._profile.enabled){let t=Zb(e);if(!t)continue;let n=new t;n.on("stateChange",s=>this._onAdapterStateChange(e,s)),n.on("message",({event:s,data:o,source:a})=>this._dispatch(s,o,a)),this._adapters.set(e,n);let i=this._buildCtx(e);await n.connect(i)}}setupSignaling(e){this._installSignalingListeners()}emit(e,...t){this._sendControl(e,t)}sendTiles(e,t){let{tiles:n,timestamp:i}=e;if(!n?.length)return[];let s=this._pickAdapter(ct.binary),o=i??Date.now();return s?.constructor.id==="rtc"&&t?this._emitTilesRtc(s,n,o,t):this._emitTilesChunked(n,o)}close(){for(let e of this._adapters.values())try{e.disconnect()}catch{}this._adapters.clear(),this._buffer=[]}attachAsBus(e){if(e._rawEmit)return;let t=e.emit.bind(e);e._rawEmit=t;let n=new Set(["error","disconnect","disconnecting","connect","newListener","removeListener"]);e.emit=(i,...s)=>n.has(i)?t(i,...s):(this._sendControl(i,s),!0)}_emitTilesChunked(e,t){let n=this._adapters.get("ws");if(!n?.ready)return[];let i=this._wsChunkSize,s=this._wsPendingSince,o=t??Date.now(),a=[...e].sort((l,u)=>{let f=s.get(l.tileIndex)??1/0,h=s.get(u.tileIndex)??1/0;return f!==h?f-h:l.tileIndex-u.tileIndex}),c=[];for(let l=0;l<a.length;l+=i){let u=a.slice(l,l+i);if(n.send(ct.binary,Ts(u,t))===!1){for(let f=l;f<a.length;f++){let h=a[f].tileIndex;s.has(h)||s.set(h,o)}break}for(let f of u)s.delete(f.tileIndex);c.push(...u)}return c}_emitTilesRtc(e,t,n,i){let s=this._profile.rtc?.dcMaxMessageSize??65536,o=t.length,a=o>this._dcChunkSize?this._chunkOffset%o:0,c=h=>{let g=[];for(let x=0;x<h;x++)g.push(t[(a+x)%o]);return g},l=Math.min(this._dcChunkSize,o);for(;l>1&&i(c(l),n).length>s;)l=Math.floor(l/2);o>l&&(this._chunkOffset=(a+l)%o);let u=this._adapters.get("ws"),f=[];for(let h=0;h<o;h+=l){let g=[];for(let S=0;S<l&&h+S<o;S++)g.push(t[(a+h+S)%o]);let x=i(g,n);if(x.length>s){g.length===1&&u?.ready&&u.send(ct.binary,x)!==!1&&f.push(...g);continue}if(e.send(ct.binary,x)===!1)return f;f.push(...g)}return f}_buildCtx(e){let t={auth:this._auth,profile:this._profile};return e==="ws"&&(t.socket=this._socket),e==="rtc"&&(t.signaling={send:n=>this._sendSignaling(n),on:n=>{this._rtcSignalingHandler=n,this._installSignalingListeners()},off:()=>{this._rtcSignalingHandler=null,this._removeSignalingListeners()}}),t}_onAdapterStateChange(e,t){t===lt.open&&this._flushBuffer()}_pickAdapter(e){let t=this._profile.channels[e];if(!t)return null;let n=[...this._adapters.values()].filter(i=>i.supports(e)&&i.ready);if(t.prefer){let i=n.find(s=>s.constructor.id===t.prefer);if(i)return i}return n.sort((i,s)=>(s.constructor.priority[e]??0)-(i.constructor.priority[e]??0)),n[0]||null}hasReadyAdapter(){return!!(this._pickAdapter(ct.control)||this._pickAdapter(ct.binary))}_sendControl(e,t,n){let i=this._pickAdapter(ct.control);if(!i){this._buffer.push({event:e,args:t,ackId:n}),this._buffer.length>this._maxControlBuffer&&this._buffer.shift();return}i.constructor.id==="rtc"?i.send(ct.control,{event:e,args:t,ackId:n}):i.send(ct.control,{event:e,args:t})}_flushBuffer(){if(!(!this._buffer.length||!this._pickAdapter(ct.control)))for(;this._buffer.length;){let{event:t,args:n,ackId:i}=this._buffer.shift();this._sendControl(t,n,i)}}_dispatch(e,t,n){if(n==="rtc"){let s=Array.isArray(t?.args)?[...t.args]:[],o=t?.ackId;o&&s.push((...l)=>this._sendAck(o,l));let a=this._listeners.get(e);if(a)for(let l of a)l(...s);let c=this._socket.listeners?.(e)||[];for(let l of c)l(...s);return}let i=this._listeners.get(e);if(i)for(let s of i)s(t)}_sendAck(e,t){let n=this._adapters.get("rtc");n?.ready&&n.send(ct.control,{event:"__ack",args:t,ackId:e})}_sendSignaling(e){let t=this._adapters.get("ws");if(t?.ready){t.send(ct.control,{event:this._sigEvent(e.type),args:[this._sigData(e)]});return}console.warn("[ProtocolManager] signaling unavailable (ws down)")}_sigEvent(e){return e==="offer"?"webrtc:offer":e==="answer"?"webrtc:answer":e==="ice"?"webrtc:ice-candidate":"webrtc:error"}_sigData(e){return e.type==="offer"||e.type==="answer"?{sdp:e.sdp}:e.type==="ice"?{candidate:e.candidate,mid:e.mid}:e}_installSignalingListeners(){if(!this._rtcSignalingHandler||this._sigListeners)return;let e=({sdp:n})=>this._rtcSignalingHandler?.({type:"offer",sdp:n}),t=({candidate:n,mid:i})=>this._rtcSignalingHandler?.({type:"ice",candidate:n,mid:i});this._sigListeners={onOffer:e,onIce:t},this._socket.on("webrtc:offer",e),this._socket.on("webrtc:ice-candidate",t)}_removeSignalingListeners(){this._sigListeners&&(this._socket.off("webrtc:offer",this._sigListeners.onOffer),this._socket.off("webrtc:ice-candidate",this._sigListeners.onIce),this._sigListeners=null)}};hi();pt();var GT=require("path"),zT=require("url");var Nl=K(require("net"),1),ce=K(require("fs"),1),he=K(require("path"),1),Jw=K(require("os"),1),Xw=require("child_process"),Zw=require("url");var vh={win32:[{id:"cmd",label:"Command Prompt",path:"cmd.exe",args:[]},{id:"powershell",label:"PowerShell",path:"powershell.exe",args:["-NoLogo"]},{id:"pwsh",label:"PowerShell Core",path:"pwsh.exe",args:["-NoLogo"]}],unix:[{id:"bash",label:"Bash",path:"/bin/bash",args:["-l"]},{id:"zsh",label:"Zsh",path:"/bin/zsh",args:["-l"]},{id:"sh",label:"Sh",path:"/bin/sh",args:["-l"]}]};function Vw(){return process.platform==="win32"?vh.win32:[]}function yh(r){if(process.platform==="win32"){let n=r?vh.win32.find(s=>s.id===r):null;if(n)return n;let i=process.env.COMSPEC;return i?{id:"cmd",label:"Command Prompt",path:i,args:[]}:vh.win32[0]}let e=process.env.SHELL||"/bin/bash",t=e.split("/").pop();return{id:t,label:t,path:e,args:["-l"]}}var _h=he.default.dirname((0,Zw.fileURLToPath)(__importMetaUrl)),xn=he.default.join(Jw.default.homedir(),".9remote"),Jo=process.platform==="win32"?"\\\\.\\pipe\\9remote-pty":he.default.join(xn,"pty-daemon.sock"),Kw=he.default.join(_h,"ptyDaemon.js"),Yw=he.default.join(_h,"ptyDaemon.cjs"),Ol=he.default.join(xn,"daemon");function Qw(r,e){if(ce.default.existsSync(r)){ce.default.mkdirSync(e,{recursive:!0});for(let t of ce.default.readdirSync(r,{withFileTypes:!0})){let n=he.default.join(r,t.name),i=he.default.join(e,t.name);t.isDirectory()?Qw(n,i):t.isFile()&&ce.default.copyFileSync(n,i)}}}function yB(r,e){let t=r;for(let n=0;n<6;n++){let i=he.default.join(t,"node_modules",e);if(ce.default.existsSync(i))return i;let s=he.default.dirname(t);if(s===t)break;t=s}return null}var xB=r=>yB(r,"node-pty");function _B(r){try{if(!ce.default.existsSync(Ol))return;let e=he.default.join(xn,"pids","ptyDaemon.pid"),t=!1;try{let n=parseInt(ce.default.readFileSync(e,"utf8").trim(),10);if(Number.isFinite(n)&&n>0)try{process.kill(n,0),t=!0}catch{}}catch{}if(t)return;for(let n of ce.default.readdirSync(Ol))if(n!==`v${r}`)try{ce.default.rmSync(he.default.join(Ol,n),{recursive:!0,force:!0})}catch{}}catch{}}function bB(r){_B("28");let e=he.default.join(Ol,`v${"28"}`),t=r.endsWith(".js"),n=t?he.default.join(e,"features","terminal"):e,i=he.default.join(n,he.default.basename(r)),s=he.default.join(n,"node_modules","node-pty");if(ce.default.existsSync(i)&&ce.default.existsSync(s))return{script:i,cwd:n};try{if(ce.default.mkdirSync(n,{recursive:!0}),ce.default.copyFileSync(r,i),t){let a=he.default.dirname(r);ce.default.copyFileSync(he.default.join(a,"constants.js"),he.default.join(n,"constants.js"));let c=he.default.join(e,"lib");ce.default.mkdirSync(c,{recursive:!0}),ce.default.copyFileSync(he.default.resolve(a,"..","..","lib","constants.js"),he.default.join(c,"constants.js"))}let o=xB(he.default.dirname(r));return o?(Qw(o,s),{script:i,cwd:n}):null}catch{return null}}var Wr=null,ks=!1,$n=!1,xh="",wB=0,As=new Map,Ml=new Map;function SB(){return++wB}function Zo(r,e){Ml.has(r)||Ml.set(r,[]),Ml.get(r).push(e)}function Xo(r,e){let t=Ml.get(r);if(t)for(let n of t)try{n(e)}catch(i){console.error(`[DaemonClient] Error in ${r} handler:`,i)}}function bh(r){if(!Wr||!ks)return!1;try{return Wr.write(JSON.stringify(r)+`
114
+ `),!0}catch(e){return console.error("[DaemonClient] Send error:",e),!1}}function Qo(r,e=5e3){return new Promise((t,n)=>{let i=SB();r.requestId=i;let s=setTimeout(()=>{As.delete(i),n(new Error("Request timeout"))},e);As.set(i,{resolve:t,reject:n,timer:s}),bh(r)||(clearTimeout(s),As.delete(i),n(new Error("Not connected to daemon")))})}function EB(r){let{type:e,requestId:t,...n}=r;if(t&&As.has(t)){let{resolve:i,timer:s}=As.get(t);clearTimeout(s),As.delete(t),i({type:e,...n});return}switch(e){case"output":Xo("output",{sessionId:n.sessionId,enc:n.enc,data:n.enc==="b64"?n.data:Buffer.from(n.data,"base64")});break;case"sessionClosed":Xo("sessionClosed",n.sessionId);break;case"cwdChange":Xo("cwdChange",{sessionId:n.sessionId,cwd:n.cwd});break;case"pong":break;default:console.log("[DaemonClient] Unknown message:",e)}}function Il(){return new Promise(r=>{let e=Nl.default.connect(Jo),t=setTimeout(()=>{e.destroy(),r(!1)},1e3);e.on("connect",()=>{clearTimeout(t),e.destroy(),r(!0)}),e.on("error",()=>{if(clearTimeout(t),process.platform!=="win32"&&ce.default.existsSync(Jo))try{ce.default.unlinkSync(Jo)}catch{}r(!1)})})}function TB(){ce.default.existsSync(xn)||ce.default.mkdirSync(xn,{recursive:!0});let r=ce.default.existsSync(Kw)?Kw:ce.default.existsSync(Yw)?Yw:null;if(!r)return console.error("[DaemonClient] \u274C Daemon script not found"),null;let e=bB(r);return e||{script:r,cwd:_h}}async function CB(){if(!ce.default.existsSync(xn))try{ce.default.mkdirSync(xn,{recursive:!0})}catch(a){return console.error("[DaemonClient] Failed to create socket directory:",a.message),!1}let r=TB();if(!r)return!1;let{script:e,cwd:t}=r,n=he.default.join(xn,"logs");try{ce.default.mkdirSync(n,{recursive:!0})}catch{}let i=he.default.join(n,"daemon.log"),s;try{s=ce.default.openSync(i,"w")}catch(a){console.error("[DaemonClient] Failed to open log file:",a.message),s="ignore"}if((0,Xw.spawn)("node",[e],{detached:!0,stdio:["ignore",s,s],cwd:t}).unref(),typeof s=="number")try{ce.default.closeSync(s)}catch{}for(let a=0;a<20;a++)if(await new Promise(c=>setTimeout(c,100)),await Il())return!0;console.error("[DaemonClient] \u274C Failed to start daemon");try{let a=ce.default.readFileSync(i,"utf8");a.trim()&&(console.error("[DaemonClient] Daemon log:"),console.error(a))}catch{}return!1}function kB(){return new Promise(r=>{let e=Nl.default.connect(Jo),t="",n=s=>{try{e.destroy()}catch{}r(s)},i=setTimeout(()=>n(null),2e3);e.on("connect",()=>e.write(JSON.stringify({type:"ping",requestId:-1})+`
115
115
  `)),e.on("data",s=>{t+=s.toString();let o=t.indexOf(`
116
- `);if(o!==-1){clearTimeout(i);try{let a=JSON.parse(t.slice(0,o));n(a.version||"unknown")}catch{n(null)}}}),e.on("error",()=>{clearTimeout(i),n(null)})})}async function AB(){try{let r=he.default.join(xn,"pids","ptyDaemon.pid"),e=parseInt(ce.default.readFileSync(r,"utf8").trim(),10);Number.isFinite(e)&&e>0&&process.kill(e,"SIGTERM")}catch{}for(let r=0;r<20;r++){if(!await Il())return;await new Promise(e=>setTimeout(e,100))}}async function eS(){if(!(ks||$n)){$n=!0;try{if(await Il()){let r=await kB();r!=="25"&&(console.log(`[DaemonClient] Daemon v${r} != v${"25"}, restarting`),await AB())}return!await Il()&&!await CB()?(console.error("[DaemonClient] \u274C Failed to start daemon"),$n=!1,!1):new Promise(r=>{let e=setTimeout(()=>{console.error("[DaemonClient] \u274C Connection timeout after 5s"),Wr&&Wr.destroy(),$n=!1,r(!1)},5e3);Wr=Nl.default.connect(Jo),Wr.on("connect",()=>{clearTimeout(e),ks=!0,$n=!1,Xo("connected"),r(!0)}),Wr.on("data",t=>{xh+=t.toString();let n=xh.split(`
116
+ `);if(o!==-1){clearTimeout(i);try{let a=JSON.parse(t.slice(0,o));n(a.version||"unknown")}catch{n(null)}}}),e.on("error",()=>{clearTimeout(i),n(null)})})}async function AB(){try{let r=he.default.join(xn,"pids","ptyDaemon.pid"),e=parseInt(ce.default.readFileSync(r,"utf8").trim(),10);Number.isFinite(e)&&e>0&&process.kill(e,"SIGTERM")}catch{}for(let r=0;r<20;r++){if(!await Il())return;await new Promise(e=>setTimeout(e,100))}}async function eS(){if(!(ks||$n)){$n=!0;try{if(await Il()){let r=await kB();r!=="28"&&(console.log(`[DaemonClient] Daemon v${r} != v${"28"}, restarting`),await AB())}return!await Il()&&!await CB()?(console.error("[DaemonClient] \u274C Failed to start daemon"),$n=!1,!1):new Promise(r=>{let e=setTimeout(()=>{console.error("[DaemonClient] \u274C Connection timeout after 5s"),Wr&&Wr.destroy(),$n=!1,r(!1)},5e3);Wr=Nl.default.connect(Jo),Wr.on("connect",()=>{clearTimeout(e),ks=!0,$n=!1,Xo("connected"),r(!0)}),Wr.on("data",t=>{xh+=t.toString();let n=xh.split(`
117
117
  `);xh=n.pop()||"";for(let i of n)if(i.trim())try{EB(JSON.parse(i))}catch{console.error("[DaemonClient] Invalid message:",i)}}),Wr.on("close",()=>{ks=!1,Wr=null,Xo("disconnected"),setTimeout(()=>{!ks&&!$n&&eS()},2e3)}),Wr.on("error",t=>{clearTimeout(e),console.error("[DaemonClient] \u274C Connection error:",t.message),console.error("[DaemonClient] Error code:",t.code),$n=!1,r(!1)})})}catch(r){return console.error("[DaemonClient] \u274C Connect error:",r),$n=!1,!1}}}async function tS(){return eS()}function Ut(){return ks}async function Dl(){return(await Qo({type:"listSessions"})).sessions||[]}async function Ll(r,e=80,t=24,n=null,i=`session-${Date.now()}`,s=null){return await Qo({type:"createSession",sessionId:i,name:r,cols:e,rows:t,shellId:n,cwd:s})}async function rS(r){try{return(await Qo({type:"getCwd",sessionId:r})).cwd||null}catch{return null}}async function wh(r){return await Qo({type:"joinSession",sessionId:r})}function Bl(r,e){return bh({type:"input",sessionId:r,data:e})}function nS(r,e,t){return bh({type:"resize",sessionId:r,cols:e,rows:t})}async function mi(r){return await Qo({type:"deleteSession",sessionId:r})}hi();ji();var sS=require("child_process");pt();var RB={darwin:()=>({cmd:"caffeinate",args:["-u","-t",String($.displayWake.macDurationSec)]}),linux:()=>({cmd:"xset",args:["dpms","force","on"]}),win32:()=>({cmd:"powershell.exe",args:["-NonInteractive","-NoProfile","-WindowStyle","Hidden","-Command",`Add-Type -Name K -Namespace W -MemberDefinition '[System.Runtime.InteropServices.DllImport("kernel32")]public static extern uint SetThreadExecutionState(uint e);'; [void][W.K]::SetThreadExecutionState(0x80000003)`]})},iS=0;function oS(){let r=$.displayWake;if(!r?.enabled)return;let e=Date.now();if(e-iS<r.throttleMs)return;iS=e;let t=RB[process.platform];if(t)try{let{cmd:n,args:i}=t(),s=(0,sS.spawn)(n,i,{detached:!0,stdio:"ignore",windowsHide:!0});s.on("error",()=>{}),s.unref()}catch{}}pt();var kS=On("remote"),_n=null;function DB(){return process.env.CODESPACES==="true"||process.env.GITPOD_WORKSPACE_ID||process.platform==="linux"&&!process.env.DISPLAY}async function PS(){if(_n!==null)return _n;if(DB())return _n=!1,kS.info("\u2705 Remote desktop not available (headless environment)"),_n;try{let r=await import("@hurdlegroup/robotjs");(r.default||r).getScreenSize(),_n=!0}catch{_n=!1,kS.info("\u2705 Remote desktop not available (no display or robotjs not installed)")}return _n}function $l(){return _n===!0}function IS(){return Gr}var vi=null,Ph=null,Ih=null,NS=null,DS=null,LS=null,BS=null,Gr=null,AS=null,RS=null,OS=null,MS=null;async function LB(){if(vi&&Ph&&Ih)return!0;try{let r=await import("@hurdlegroup/robotjs");vi=r.default||r;let{TileManager:e}=await Promise.resolve().then(()=>(vS(),gS)),{ResourceManager:t}=await Promise.resolve().then(()=>(xS(),yS)),{ScreenUpdateHelper:n}=await Promise.resolve().then(()=>(bS(),_S)),{MouseHandler:i}=await Promise.resolve().then(()=>(SS(),wS)),{KeyboardHandler:s}=await Promise.resolve().then(()=>(CS(),TS)),{ScreenHandler:o}=await Promise.resolve().then(()=>(mh(),Gw));return Ph=e,Ih=t,NS=n,DS=i,LS=s,BS=o,vi.setMouseDelay(2),vi.setKeyboardDelay(2),!0}catch(r){return console.error("\u274C Failed to load remote modules:",r.message),!1}}async function jS(r,e){if(!_n){r.emit("remote:unavailable");return}if(!await LB()){r.emit("remote:unavailable");return}Gr||(Gr=new Ih,AS=new NS(Gr),RS=new DS(vi,Gr),OS=new LS(vi,Gr),MS=new BS(Gr,AS),Gr.startResourceMonitoring());let n=r.data.protocol;if(!n){r.emit("remote:unavailable");return}let i=r.handshake.auth?.apiKey,s=new Ph(vi);Gr.addClient(r.id,{tileManager:s,protocol:n,screenInterval:null,authenticated:!0,apiKey:i}),r.data.remoteAttached=!0;let o=a=>(...c)=>(oS(),a(...c));RS.setupMouseHandlers(r,o),OS.setupKeyboardHandlers(r,o),MS.setupScreenHandlers(r,o,n),r.on("disconnect",()=>{let a=n._adapters?.get("rtc"),c=!1,l=null,u=null,f=()=>{c||(c=!0,l&&(clearTimeout(l),l=null),a&&u&&a.off("stateChange",u),Gr.removeClient(r.id),n.close(),Cs(n))};if(!a?.ready)return f();u=h=>{h===lt.closed&&f()},a.on("stateChange",u),l=setTimeout(f,$.resourceManagement.disconnectGraceMs)}),r.emit("remote:ready")}yn();var Wn=K(require("fs"),1),Nh=K(require("path"),1),Wl=0,ta=null,BB=6e4,jB={name:"9Remote",postCreateCommand:"npm install -g 9remote@latest",postAttachCommand:"9remote start",forwardPorts:[2208],portsAttributes:{2208:{label:"9Remote Server",onAutoForward:"notify"}}};function zr(){return process.env.CODESPACES==="true"}function FS(){return zr()?{isCodespaces:!0,codespaceName:process.env.CODESPACE_NAME||"unknown",workspacePath:process.env.CODESPACE_VSCODE_FOLDER||process.cwd()}:null}function HS(){Wl++,zr()&&Wl===1&&FB()}function qS(){Wl--,zr()&&Wl===0&&HB()}function FB(){ta||(ta=setInterval(()=>{process.memoryUsage()},BB))}function HB(){ta&&(console.log("\u23F8\uFE0F Stopping Codespaces heartbeat"),clearInterval(ta),ta=null)}function US(r){return Nh.default.join(r,".devcontainer","devcontainer.json")}function $S(r){try{let e=US(r);if(!Wn.default.existsSync(e))return{enabled:!1,exists:!1};let t=JSON.parse(Wn.default.readFileSync(e,"utf8"));return{enabled:t.postAttachCommand==="9remote start"||t.postAttachCommand==="9remote",exists:!0}}catch{return{enabled:!1,exists:!1,error:"Failed to read config"}}}function WS(r,e){try{let t=Nh.default.join(r,".devcontainer"),n=US(r);Wn.default.existsSync(t)||Wn.default.mkdirSync(t,{recursive:!0});let i={...jB};if(Wn.default.existsSync(n))try{i={...JSON.parse(Wn.default.readFileSync(n,"utf8"))}}catch{}return e?(i.postAttachCommand="9remote start",i.postCreateCommand||(i.postCreateCommand="npm install -g 9remote@latest")):delete i.postAttachCommand,Wn.default.writeFileSync(n,JSON.stringify(i,null,2)),{success:!0,enabled:e}}catch(t){return{success:!1,error:t.message}}}var Gl=K(require("os"),1),Oe=K(require("fs"),1),Gn=K(require("path"),1);bt();var Os=ie.BUFFERS,zl=Gn.default.join(ie.STATE,"sessions.json"),Vl=Gn.default.join(ie.STATE,"terminalGroups.json"),ra="/tmp/9remote-uploads";Oe.default.existsSync(ra)||Oe.default.mkdirSync(ra,{recursive:!0});function Dh(){return process.platform==="win32"?process.env.COMSPEC||"powershell.exe":process.env.SHELL||"/bin/zsh"}function Kl(r){return r?"/workspaces":Gl.default.homedir()}function Lh(){let r=Gl.default.homedir(),e=Gl.default.userInfo().username,t=Dh(),n={...process.env};if(delete n.PORT,Object.assign(n,{HOME:r,USER:e,LOGNAME:e,SHELL:t,TERM:"xterm-256color",COLORTERM:"truecolor",LANG:"en_US.UTF-8",LC_ALL:"en_US.UTF-8",LC_CTYPE:"en_US.UTF-8",PWD:r,OLDPWD:r,TMPDIR:n.TMPDIR||(process.platform==="win32"?n.TEMP||n.TMP:"/tmp"),__CF_USER_TEXT_ENCODING:n.__CF_USER_TEXT_ENCODING,XPC_FLAGS:n.XPC_FLAGS,XPC_SERVICE_NAME:n.XPC_SERVICE_NAME,SSH_AUTH_SOCK:n.SSH_AUTH_SOCK,TERM_PROGRAM:"9Remote",TERM_PROGRAM_VERSION:"1.0.0",ITERM_SESSION_ID:`9remote-${Date.now()}`,SHLVL:"1"}),t.includes("bash")){let i=n.PROMPT_COMMAND||"";n.PROMPT_COMMAND=`printf "\\e]7;file://%s\\a" "\${HOSTNAME}\${PWD}"${i?`; ${i}`:""}`}return n}function GS(){Oe.default.existsSync(Os)||Oe.default.mkdirSync(Os,{recursive:!0})}function Bh(r,e,t){if(t==="buffer"){GS();try{Oe.default.writeFileSync(Gn.default.join(Os,`${r}.buf`),e.join(""),"utf8")}catch(n){console.log(`\u26A0\uFE0F Failed to save buffer for ${r}:`,n.message)}}}function zS(r,e){if(e!=="buffer")return null;let t=Gn.default.join(Os,`${r}.buf`);try{if(Oe.default.existsSync(t))return Oe.default.readFileSync(t,"utf8")}catch(n){console.log(`\u26A0\uFE0F Failed to load buffer for ${r}:`,n.message)}return null}function Yl(r){let e=Gn.default.join(Os,`${r}.buf`);try{Oe.default.existsSync(e)&&Oe.default.unlinkSync(e)}catch{}}function VS(){GS();try{return Oe.default.readdirSync(Os).filter(r=>r.endsWith(".buf")).map(r=>r.replace(".buf",""))}catch{return[]}}function jh(){try{if(Oe.default.existsSync(zl))return JSON.parse(Oe.default.readFileSync(zl,"utf8"))}catch(r){console.log("\u26A0\uFE0F Failed to load session metadata:",r.message)}return{}}function Mr(r){try{let e={};for(let[n,i]of r)e[n]={name:i.name,createdAt:i.createdAt,shellId:i.shellId,cwd:i.cwd};let t=Gn.default.dirname(zl);Oe.default.existsSync(t)||Oe.default.mkdirSync(t,{recursive:!0}),Oe.default.writeFileSync(zl,JSON.stringify(e,null,2),"utf8")}catch(e){console.log("\u26A0\uFE0F Failed to save session metadata:",e.message)}}function KS(){try{if(Oe.default.existsSync(Vl)){let r=JSON.parse(Oe.default.readFileSync(Vl,"utf8"));return{groups:r.groups||[],sessionGroups:r.sessionGroups||{},sessionOrder:r.sessionOrder||[]}}}catch(r){console.log("\u26A0\uFE0F Failed to load groups:",r.message)}return{groups:[],sessionGroups:{},sessionOrder:[]}}function YS(r,e,t=[]){try{let n=Gn.default.dirname(Vl);Oe.default.existsSync(n)||Oe.default.mkdirSync(n,{recursive:!0});let i={groups:Array.from(r.values()),sessionGroups:e,sessionOrder:t};Oe.default.writeFileSync(Vl,JSON.stringify(i,null,2),"utf8")}catch(n){console.log("\u26A0\uFE0F Failed to save groups:",n.message)}}var Fh=K(require("node-pty"),1);hi();var JS=2*1024*1024,qB=256*1024,bn="daemon";function ZS(r,e){if(!r?.length||e<=0)return"";let t=e,n=[];for(let i=r.length-1;i>=0&&t>0;i--){let s=r[i];s.length<=t?(n.push(s),t-=s.length):(n.push(s.slice(s.length-t)),t=0)}return n.reverse(),n.join("")}function XS(r,e,t,n,i){let s=null;r.onData(o=>{t.buffer.push(o),t.buffer.reduce((c,l)=>c+l.length,0)>JS&&(t.buffer=[ZS(t.buffer,JS)]),yt(n,"output",{sessionId:e,data:Buffer.from(o,"utf-8")}),bn==="buffer"&&(s&&clearTimeout(s),s=setTimeout(()=>Bh(e,t.buffer,bn),2e3))}),r.onExit(({exitCode:o})=>{console.log(`PTY exited: sessionId=${e}, code=${o}`),bn==="buffer"&&t.buffer.length>0&&Bh(e,t.buffer,bn),i.delete(e),Yl(e),yt(n,"sessionClosed",e)})}function QS(r,e,t,n,i,s=[]){let o=()=>YS(n,i,s);r.on("getSessions",async a=>{let c=[],l=bn==="daemon"&&Ut();for(let[f,h]of t){let g=h.cwd;if(l&&h.daemon){let x=await rS(f);x&&(g=x,h.cwd!==x&&(h.cwd=x))}c.push({id:f,name:h.name,createdAt:h.createdAt,restored:h.restored||!1,shellId:h.shellId,shellLabel:h.shellLabel,groupId:i[f]||null,cwd:g})}let u=new Map(s.map((f,h)=>[f,h]));c.sort((f,h)=>(u.has(f.id)?u.get(f.id):1/0)-(u.has(h.id)?u.get(h.id):1/0)),a(c)}),r.on("getShells",a=>{a({platform:process.platform,shells:Vw()})}),r.on("getGroups",a=>{a(Array.from(n.values()))}),r.on("createGroup",({name:a},c)=>{let l=`group-${Date.now()}`,u={id:l,name:a||"Group",createdAt:Date.now()};n.set(l,u),o(),yt(e,"groupsChanged"),c({success:!0,group:u})}),r.on("renameGroup",({groupId:a,name:c},l)=>{let u=n.get(a);if(!u)return l({success:!1,error:"Group not found"});u.name=c,o(),yt(e,"groupsChanged"),l({success:!0})}),r.on("deleteGroup",async({groupId:a},c)=>{if(!n.delete(a))return c({success:!1,error:"Group not found"});let l=Object.keys(i).filter(u=>i[u]===a);for(let u of l){let f=t.get(u);if(f){if(f.daemon&&Ut())try{await mi(u)}catch{}else f.pty&&(f.pty.kill(),Yl(u));t.delete(u),yt(e,"sessionClosed",u)}delete i[u]}o(),yt(e,"groupsChanged"),c({success:!0})}),r.on("moveSession",({sessionId:a,groupId:c},l)=>{c&&n.has(c)?i[a]=c:delete i[a],o(),yt(e,"groupsChanged"),l({success:!0})}),r.on("reorderSession",({orderedIds:a},c)=>{if(!Array.isArray(a))return c?.({success:!1,error:"orderedIds required"});let l=new Set(a),u=s.filter(h=>!l.has(h)),f=[...t.keys()].filter(h=>!l.has(h)&&!u.includes(h));s.length=0,s.push(...u,...f,...a),o(),yt(e,"groupsChanged"),c?.({success:!0})}),r.on("createSession",async({name:a,shellId:c,groupId:l},u)=>{let f=`session-${Date.now()}`,h=yh(c),g=Lh();g.NINE_REMOTE_SESSION_ID=f;let x=Kl(zr());try{let S=a||`${h.label} ${t.size+1}`;if(bn==="daemon"&&Ut()){let M=await Ll(S,80,24,c,f,x);M.success?(t.set(M.sessionId,{daemon:!0,name:S,createdAt:Date.now(),cwd:M.cwd,shellId:M.shellId,shellLabel:M.shellLabel}),l&&n.has(l)&&(i[M.sessionId]=l,o()),Mr(t),u({success:!0,sessionId:M.sessionId,shellLabel:M.shellLabel})):u({success:!1,error:M.error});return}let k=Fh.default.spawn(h.path,h.args,{name:"xterm-256color",cols:80,rows:24,cwd:x,env:g,useConpty:!1}),R={pty:k,name:S,createdAt:Date.now(),buffer:[],cwd:x,shellId:h.id,shellLabel:h.label};XS(k,f,R,e,t),t.set(f,R),l&&n.has(l)&&(i[f]=l,o()),u({success:!0,sessionId:f,shellLabel:h.label})}catch(S){console.error("Failed to create session:",S),u({success:!1,error:S.message})}}),r.on("joinSession",async(a,c)=>{let l=t.get(a);if(!l&&bn==="daemon"&&Ut()){let u=`${yh().label} ${t.size+1}`,f=Kl(zr()),h=await Ll(u,80,24,void 0,a,f);if(!h.success)return c({success:!1,error:h.error});l={daemon:!0,name:u,createdAt:Date.now(),cwd:h.cwd,shellId:h.shellId,shellLabel:h.shellLabel},t.set(a,l),Mr(t);let g=await wh(a);return c({success:g.success,name:l.name,cwd:g.cwd||l.cwd,recreated:!0,error:g.error})}if(!l)return c({success:!1,error:"Session not found"});if(l.daemon&&Ut()){try{if(l.needsRespawn){let f=await Ll(l.name,80,24,l.shellId,a,l.cwd);if(!f.success)return c({success:!1,error:f.error});delete l.needsRespawn,l.cwd=f.cwd,l.shellLabel=f.shellLabel,Mr(t)}let u=await wh(a);u.cwd&&u.cwd!==l.cwd&&(l.cwd=u.cwd,Mr(t)),c({success:u.success,name:l.name,cwd:u.cwd||l.cwd,error:u.error})}catch(u){c({success:!1,error:u.message})}return}if(l.needsRestore&&bn==="buffer")try{let u=Dh(),f=process.platform==="win32"?[]:["-l"],h=Kl(zr()),g=Fh.default.spawn(u,f,{name:"xterm-256color",cols:80,rows:24,cwd:h,env:Lh(),useConpty:!1});l.pty=g,l.needsRestore=!1,l.cwd=h;let x=zS(a,bn);x&&(l.buffer=[x]),XS(g,a,l,e,t),console.log(`\u2705 Restored PTY session: ${a}`)}catch(u){return console.error("Failed to restore session:",u),c({success:!1,error:"Failed to restore session"})}l.buffer?.length>0&&r.emit("output",{sessionId:a,data:Buffer.from(ZS(l.buffer,qB),"utf-8")}),c({success:!0,name:l.name,cwd:l.cwd})}),r.on("deleteSession",async(a,c)=>{let l=t.get(a);if(!l)return c({success:!1,error:"Session not found"});if(l.daemon&&Ut()){try{await mi(a),t.delete(a),i[a]&&(delete i[a],o()),Mr(t),c({success:!0})}catch(u){c({success:!1,error:u.message})}return}l.pty&&l.pty.kill(),t.delete(a),i[a]&&(delete i[a],o()),Yl(a),yt(e,"sessionClosed",a),Mr(t),c({success:!0})}),r.on("renameSession",async({sessionId:a,name:c},l)=>{let u=t.get(a);if(!u)return l({success:!1,error:"Session not found"});u.name=c,yt(e,"session-renamed",{sessionId:a,name:c}),Mr(t),l({success:!0})})}var eE=require("child_process");function Ms(r,e,t){return new Promise((n,i)=>{let s=(0,eE.spawn)(r,e,{stdio:["pipe","ignore","pipe"]}),o="";s.stderr&&s.stderr.on("data",a=>{o+=a.toString()}),s.on("error",i),s.on("close",a=>a===0?n():i(new Error(o.trim()||`${r} exited ${a}`))),t!=null&&s.stdin.write(t),s.stdin.end()})}var UB=r=>typeof r=="string"&&r.startsWith("image/"),$B={darwin:{image:r=>Ms("osascript",["-e",`set the clipboard to (read (POSIX file ${JSON.stringify(r)}) as \xABclass PNGf\xBB)`]),file:r=>Ms("osascript",["-e",`set the clipboard to POSIX file ${JSON.stringify(r)}`])},linux:{image:r=>Ms("xclip",["-selection","clipboard","-t","image/png","-i",r]),file:r=>Ms("xclip",["-selection","clipboard","-t","text/uri-list","-i"],`file://${r}
118
118
  `)},win32:{image:r=>Ms("powershell.exe",["-NonInteractive","-NoProfile","-STA","-Command",`Add-Type -AssemblyName System.Windows.Forms,System.Drawing; [System.Windows.Forms.Clipboard]::SetImage([System.Drawing.Image]::FromFile(${JSON.stringify(r)}))`]),file:r=>Ms("powershell.exe",["-NonInteractive","-NoProfile","-STA","-Command",`Set-Clipboard -Path ${JSON.stringify(r)}`])}};async function tE(r,e){let t=$B[process.platform];if(!t)throw new Error(`clipboard unsupported on ${process.platform}`);return UB(e)?t.image(r):t.file(r)}var Hh=K(require("fs"),1),qh=K(require("path"),1);var WB="";function rE(r,e){r.on("input",({sessionId:t,data:n})=>{if(!t)return;let i=e.get(t);if(i){if(i.daemon&&Ut())return Bl(t,n);i.pty&&i.pty.write(Buffer.isBuffer(n)?n.toString("utf-8"):n)}}),r.on("resize",({sessionId:t,cols:n,rows:i})=>{if(!t)return;let s=e.get(t);if(s){if(s.daemon&&Ut())return nS(t,n,i);if(s.pty)try{s.pty.resize(n,i)}catch(o){console.log(`Resize failed for ${t}: ${o.message}`)}}}),r.on("upload-file",({sessionId:t,filename:n,size:i,content:s})=>{if(!t)return;let o=e.get(t);if(o)try{let a=n.replace(/[^a-zA-Z0-9._-]/g,"_"),c=qh.default.join(ra,`${Date.now()}_${a}`);Hh.default.writeFileSync(c,Buffer.from(s,"base64")),console.log(`\u{1F4CE} File uploaded: ${c} (${i} bytes)`),o.daemon&&Ut()?Bl(t,c):o.pty&&o.pty.write(c)}catch(a){console.error("File upload error:",a),r.emit("output",{sessionId:t,data:Buffer.from(`\r
119
119
  Error uploading file: ${a.message}\r
@@ -160,7 +160,7 @@ function post(type) {
160
160
  export default function (${e}) {
161
161
  ${e}.on(${JSON.stringify(t)}, async () => post("stop"));
162
162
  }
163
- `}function O3(){let r=Te.amp(),e=Me.default.dirname(r);return se.default.existsSync(e)||se.default.mkdirSync(e,{recursive:!0}),se.default.writeFileSync(r,qT("amp","amp","agent.end"),"utf8"),{success:!0}}function M3(){let r=Te.pi(),e=Me.default.dirname(r);return se.default.existsSync(e)||se.default.mkdirSync(e,{recursive:!0}),se.default.writeFileSync(r,qT("pi","pi","agent_end"),"utf8"),{success:!0}}function NT(r,e){try{return se.default.existsSync(r)&&se.default.readFileSync(r,"utf8").includes(e)}catch{return!1}}function P3(r){switch(r){case"claude":{let e=xr(Te.claude());return!!(e.hooks?.Stop||e.hooks?.Notification)}case"codex":return NT(Te.codex(),"# 9Remote notification");case"gemini":{let e=xr(Te.gemini());return!!(e.hooks?.AfterAgent||e.hooks?.Notification)}case"opencode":case"amp":case"pi":return se.default.existsSync(Te[r]());case"kiro":case"antigravity":case"cursor":case"grok":case"copilot":case"codebuddy":case"factory":case"qoder":case"rovodev":case"hermes":return NT(Te[r](),`&tool=${r}`);default:return!1}}function I3(r){let e=(process.env.PATH||"").split(Me.default.delimiter).filter(Boolean),t=process.platform==="win32"?(process.env.PATHEXT||".EXE;.CMD;.BAT").split(";"):[""];return e.some(n=>t.some(i=>{try{return se.default.existsSync(Me.default.join(n,r+i))}catch{return!1}}))}function N3(r){let e=t3[r];if(e&&I3(e))return!0;let t=r3[r]?.();return t?(Array.isArray(t)?t:[t]).some(n=>se.default.existsSync(n)):!1}var D3={claude:i3,codex:c3,gemini:l3,opencode:p3,grok:d3,cursor:w3,antigravity:E3,kiro:T3,copilot:y3,codebuddy:x3,factory:_3,qoder:b3,rovodev:k3,hermes:R3,amp:O3,pi:M3};var L3=Mv;function B3(r){return D3[r]?.()||{success:!1,error:"Unknown tool"}}function UT(){let r={};for(let e of L3)if(!(!N3(e)||P3(e)))try{r[e]=B3(e).success}catch{r[e]=!1}return r}function $T(){let r=Te.claude(),e=xr(r);if(!e.hooks?.Stop&&!e.hooks?.Notification)return;let t=e.env||{};Object.keys(uo).some(i=>t[i]!==uo[i])&&(jT(e),Jr(r,e))}hi();var fz=(0,GT.dirname)((0,zT.fileURLToPath)(__importMetaUrl)),dz=ao.rgb(230,138,110),Am="daemon",j3="2.0.81",Xr=new Map,VT=new Map,KT={},YT=[];async function WT(){let r=await Dl(),e=new Map(r.map(n=>[n.id,n])),t=jh();for(let n of r)if(!t[n.id])try{await mi(n.id)}catch{}Xr.clear();for(let[n,i]of Object.entries(t)){let s=e.get(n);Xr.set(n,{daemon:!0,name:i.name,createdAt:i.createdAt,shellId:i.shellId,cwd:s?.cwd||i.cwd,needsRespawn:!s})}Mr(Xr)}async function JT(){let r=KS();for(let n of r.groups)VT.set(n.id,n);Object.assign(KT,r.sessionGroups),YT.push(...r.sessionOrder);try{$T()}catch{}try{UT()}catch{}if(Am==="daemon")if(!await tS())console.error("\u274C Failed to connect to PTY daemon, falling back to buffer mode");else{await WT(),Zo("connected",()=>{WT().catch(()=>{})});return}console.log("\u{1F4E6} Buffer persistence mode - scrollback enabled");let e=VS(),t=jh();for(let n of e){let i=t[n]||{};Xr.set(n,{pty:null,name:i.name||`Terminal ${Xr.size+1}`,createdAt:i.createdAt||Date.now(),buffer:[],needsRestore:!0}),console.log(`\u{1F504} Found saved session: ${n}`)}e.length>0&&console.log(`\u2705 Found ${e.length} saved session(s)`)}function Gs(r,e){Am==="daemon"&&(Zo("output",({sessionId:i,data:s})=>yt(r,"output",{sessionId:i,data:s})),Zo("cwdChange",({sessionId:i,cwd:s})=>{let o=Xr.get(i);o&&s&&o.cwd!==s&&(o.cwd=s,Mr(Xr)),yt(r,"cwdChange",{sessionId:i,cwd:s})}),Zo("sessionClosed",i=>{Xr.delete(i),Su(i),yt(r,"sessionClosed",i),yt(r,"notificationCleared",i)}));let t=()=>({version:j3,remoteAvailable:Es(),daemonMode:Am==="daemon"&&Ut(),platform:process.platform,updateAvailable:ww(),canSelfUpdate:!0,...FS()}),n=()=>{let i=t();for(let s of r.sockets.sockets.values())s.data?.approved&&s.emit("serverInfo",i)};Tw(n),Gs._buildServerInfo=t,Gs._emitServerInfo=n}function XT(){Gs._emitServerInfo?.()}var ZT=null;function QT(r){ZT=r}async function eC(r,e,t){HS(),ZT?.(),r.emit("serverInfo",Gs._buildServerInfo?.()),QS(r,e,Xr,VT,KT,YT),rE(r,Xr),RT(r),$l()&&await jS(r,t).catch(n=>{console.error("\u274C Failed to setup remote handlers:",n.message)}),r.on("disconnect",()=>{ST(r.id),qS()})}var re=K(require("fs"),1),br=K(require("path"),1),Qr=K(require("os"),1),Zs=require("child_process"),cA=K(Qk(),1);var kg=["node_modules",".git","dist","build",".next","coverage","__pycache__",".cache",".vscode",".idea",".turbo",".vercel",".output","out",".nuxt",".svelte-kit","target","vendor",".gradle",".pytest_cache",".mypy_cache",".tox",".venv","venv","env",".DS_Store",".parcel-cache",".rollup.cache"],Gu=[".png",".jpg",".jpeg",".gif",".webp",".ico",".svg",".bmp",".pdf",".zip",".tar",".gz",".rar",".7z",".exe",".dll",".so",".dylib",".mp3",".mp4",".wav",".avi",".mov",".webm",".woff",".woff2",".ttf",".eot",".otf",".sqlite",".db"];var eA=[".ssh",".aws",".gnupg",".kube",".docker",".cargo",".npmrc",".netrc",".pypirc",".config/gh",".config/gcloud"],tA=["/etc/shadow","/etc/sudoers","/etc/ssh","/root","/private/etc/sudoers"];var rA=K(require("fs"),1),ka=K(require("path"),1),nA=K(require("os"),1);var iA=nA.default.homedir();function e$(r){if(!r)return null;let e=r.startsWith("~")?r.replace(/^~/,iA):r;try{return rA.default.realpathSync(e)}catch{return ka.default.resolve(e)}}function Tn(r){let e=e$(r);if(!e)return!1;for(let t of tA)if(e===t||e.startsWith(t+ka.default.sep))return!0;for(let t of eA){let n=ka.default.join(iA,t);if(e===n||e.startsWith(n+ka.default.sep))return!0}return!1}function zu(r){return kg.includes(r)}function Qs(r){return Gu.includes(br.default.extname(r).toLowerCase())}function r$(r,e){return r.isDirectory()?"folder":Qs(e)?"binary":"file"}function Aa(r){return r<1024?`${r}B`:r<1024*1024?`${(r/1024).toFixed(1)}KB`:`${(r/(1024*1024)).toFixed(1)}MB`}function lA(r,e,t,n=50){if(!(t.length>=n))try{for(let i of re.default.readdirSync(r)){if(t.length>=n)return;if(i.startsWith(".")||zu(i))continue;let s=br.default.join(r,i);try{let o=re.default.statSync(s);o.isDirectory()?lA(s,e,t,n):i.toLowerCase().includes(e.toLowerCase())&&t.push({name:i,path:s,type:Qs(i)?"binary":"file",size:o.size,sizeFormatted:Aa(o.size)})}catch{}}}catch{}}function aA(r){if(!r)return null;let e=r.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"::ANY::").replace(/\*/g,"[^/]*").replace(/::ANY::/g,".*").replace(/\?/g,".");return new RegExp(`^${e}$`)}function uA(r,e,t,n,i,s){if(s.length>=200)return;let o;try{o=re.default.readdirSync(r,{withFileTypes:!0})}catch{return}for(let a of o){if(s.length>=200)return;if(zu(a.name))continue;let c=br.default.join(r,a.name),l=br.default.relative(e,c);if(a.isDirectory()){uA(c,e,t,n,i,s);continue}if(a.isFile()&&!Qs(a.name)&&!(i&&i.test(l))&&!(n&&!n.test(l)))try{if(re.default.statSync(c).size>512e3)continue;let h=re.default.readFileSync(c,"utf-8").split(`
163
+ `}function O3(){let r=Te.amp(),e=Me.default.dirname(r);return se.default.existsSync(e)||se.default.mkdirSync(e,{recursive:!0}),se.default.writeFileSync(r,qT("amp","amp","agent.end"),"utf8"),{success:!0}}function M3(){let r=Te.pi(),e=Me.default.dirname(r);return se.default.existsSync(e)||se.default.mkdirSync(e,{recursive:!0}),se.default.writeFileSync(r,qT("pi","pi","agent_end"),"utf8"),{success:!0}}function NT(r,e){try{return se.default.existsSync(r)&&se.default.readFileSync(r,"utf8").includes(e)}catch{return!1}}function P3(r){switch(r){case"claude":{let e=xr(Te.claude());return!!(e.hooks?.Stop||e.hooks?.Notification)}case"codex":return NT(Te.codex(),"# 9Remote notification");case"gemini":{let e=xr(Te.gemini());return!!(e.hooks?.AfterAgent||e.hooks?.Notification)}case"opencode":case"amp":case"pi":return se.default.existsSync(Te[r]());case"kiro":case"antigravity":case"cursor":case"grok":case"copilot":case"codebuddy":case"factory":case"qoder":case"rovodev":case"hermes":return NT(Te[r](),`&tool=${r}`);default:return!1}}function I3(r){let e=(process.env.PATH||"").split(Me.default.delimiter).filter(Boolean),t=process.platform==="win32"?(process.env.PATHEXT||".EXE;.CMD;.BAT").split(";"):[""];return e.some(n=>t.some(i=>{try{return se.default.existsSync(Me.default.join(n,r+i))}catch{return!1}}))}function N3(r){let e=t3[r];if(e&&I3(e))return!0;let t=r3[r]?.();return t?(Array.isArray(t)?t:[t]).some(n=>se.default.existsSync(n)):!1}var D3={claude:i3,codex:c3,gemini:l3,opencode:p3,grok:d3,cursor:w3,antigravity:E3,kiro:T3,copilot:y3,codebuddy:x3,factory:_3,qoder:b3,rovodev:k3,hermes:R3,amp:O3,pi:M3};var L3=Mv;function B3(r){return D3[r]?.()||{success:!1,error:"Unknown tool"}}function UT(){let r={};for(let e of L3)if(!(!N3(e)||P3(e)))try{r[e]=B3(e).success}catch{r[e]=!1}return r}function $T(){let r=Te.claude(),e=xr(r);if(!e.hooks?.Stop&&!e.hooks?.Notification)return;let t=e.env||{};Object.keys(uo).some(i=>t[i]!==uo[i])&&(jT(e),Jr(r,e))}hi();var fz=(0,GT.dirname)((0,zT.fileURLToPath)(__importMetaUrl)),dz=ao.rgb(230,138,110),Am="daemon",j3="2.0.82",Xr=new Map,VT=new Map,KT={},YT=[];async function WT(){let r=await Dl(),e=new Map(r.map(n=>[n.id,n])),t=jh();for(let n of r)if(!t[n.id])try{await mi(n.id)}catch{}Xr.clear();for(let[n,i]of Object.entries(t)){let s=e.get(n);Xr.set(n,{daemon:!0,name:i.name,createdAt:i.createdAt,shellId:i.shellId,cwd:s?.cwd||i.cwd,needsRespawn:!s})}Mr(Xr)}async function JT(){let r=KS();for(let n of r.groups)VT.set(n.id,n);Object.assign(KT,r.sessionGroups),YT.push(...r.sessionOrder);try{$T()}catch{}try{UT()}catch{}if(Am==="daemon")if(!await tS())console.error("\u274C Failed to connect to PTY daemon, falling back to buffer mode");else{await WT(),Zo("connected",()=>{WT().catch(()=>{})});return}console.log("\u{1F4E6} Buffer persistence mode - scrollback enabled");let e=VS(),t=jh();for(let n of e){let i=t[n]||{};Xr.set(n,{pty:null,name:i.name||`Terminal ${Xr.size+1}`,createdAt:i.createdAt||Date.now(),buffer:[],needsRestore:!0}),console.log(`\u{1F504} Found saved session: ${n}`)}e.length>0&&console.log(`\u2705 Found ${e.length} saved session(s)`)}function Gs(r,e){Am==="daemon"&&(Zo("output",({sessionId:i,enc:s,data:o})=>yt(r,"output",{sessionId:i,enc:s,data:o})),Zo("cwdChange",({sessionId:i,cwd:s})=>{let o=Xr.get(i);o&&s&&o.cwd!==s&&(o.cwd=s,Mr(Xr)),yt(r,"cwdChange",{sessionId:i,cwd:s})}),Zo("sessionClosed",i=>{Xr.delete(i),Su(i),yt(r,"sessionClosed",i),yt(r,"notificationCleared",i)}));let t=()=>({version:j3,remoteAvailable:Es(),daemonMode:Am==="daemon"&&Ut(),platform:process.platform,updateAvailable:ww(),canSelfUpdate:!0,...FS()}),n=()=>{let i=t();for(let s of r.sockets.sockets.values())s.data?.approved&&s.emit("serverInfo",i)};Tw(n),Gs._buildServerInfo=t,Gs._emitServerInfo=n}function XT(){Gs._emitServerInfo?.()}var ZT=null;function QT(r){ZT=r}async function eC(r,e,t){HS(),ZT?.(),r.emit("serverInfo",Gs._buildServerInfo?.()),QS(r,e,Xr,VT,KT,YT),rE(r,Xr),RT(r),$l()&&await jS(r,t).catch(n=>{console.error("\u274C Failed to setup remote handlers:",n.message)}),r.on("disconnect",()=>{ST(r.id),qS()})}var re=K(require("fs"),1),br=K(require("path"),1),Qr=K(require("os"),1),Zs=require("child_process"),cA=K(Qk(),1);var kg=["node_modules",".git","dist","build",".next","coverage","__pycache__",".cache",".vscode",".idea",".turbo",".vercel",".output","out",".nuxt",".svelte-kit","target","vendor",".gradle",".pytest_cache",".mypy_cache",".tox",".venv","venv","env",".DS_Store",".parcel-cache",".rollup.cache"],Gu=[".png",".jpg",".jpeg",".gif",".webp",".ico",".svg",".bmp",".pdf",".zip",".tar",".gz",".rar",".7z",".exe",".dll",".so",".dylib",".mp3",".mp4",".wav",".avi",".mov",".webm",".woff",".woff2",".ttf",".eot",".otf",".sqlite",".db"];var eA=[".ssh",".aws",".gnupg",".kube",".docker",".cargo",".npmrc",".netrc",".pypirc",".config/gh",".config/gcloud"],tA=["/etc/shadow","/etc/sudoers","/etc/ssh","/root","/private/etc/sudoers"];var rA=K(require("fs"),1),ka=K(require("path"),1),nA=K(require("os"),1);var iA=nA.default.homedir();function e$(r){if(!r)return null;let e=r.startsWith("~")?r.replace(/^~/,iA):r;try{return rA.default.realpathSync(e)}catch{return ka.default.resolve(e)}}function Tn(r){let e=e$(r);if(!e)return!1;for(let t of tA)if(e===t||e.startsWith(t+ka.default.sep))return!0;for(let t of eA){let n=ka.default.join(iA,t);if(e===n||e.startsWith(n+ka.default.sep))return!0}return!1}function zu(r){return kg.includes(r)}function Qs(r){return Gu.includes(br.default.extname(r).toLowerCase())}function r$(r,e){return r.isDirectory()?"folder":Qs(e)?"binary":"file"}function Aa(r){return r<1024?`${r}B`:r<1024*1024?`${(r/1024).toFixed(1)}KB`:`${(r/(1024*1024)).toFixed(1)}MB`}function lA(r,e,t,n=50){if(!(t.length>=n))try{for(let i of re.default.readdirSync(r)){if(t.length>=n)return;if(i.startsWith(".")||zu(i))continue;let s=br.default.join(r,i);try{let o=re.default.statSync(s);o.isDirectory()?lA(s,e,t,n):i.toLowerCase().includes(e.toLowerCase())&&t.push({name:i,path:s,type:Qs(i)?"binary":"file",size:o.size,sizeFormatted:Aa(o.size)})}catch{}}}catch{}}function aA(r){if(!r)return null;let e=r.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"::ANY::").replace(/\*/g,"[^/]*").replace(/::ANY::/g,".*").replace(/\?/g,".");return new RegExp(`^${e}$`)}function uA(r,e,t,n,i,s){if(s.length>=200)return;let o;try{o=re.default.readdirSync(r,{withFileTypes:!0})}catch{return}for(let a of o){if(s.length>=200)return;if(zu(a.name))continue;let c=br.default.join(r,a.name),l=br.default.relative(e,c);if(a.isDirectory()){uA(c,e,t,n,i,s);continue}if(a.isFile()&&!Qs(a.name)&&!(i&&i.test(l))&&!(n&&!n.test(l)))try{if(re.default.statSync(c).size>512e3)continue;let h=re.default.readFileSync(c,"utf-8").split(`
164
164
  `),g=[];for(let x=0;x<h.length&&g.length<10;x++){let S=h[x],k=t(S);for(let R of k){if(g.length>=10)break;g.push({line:x+1,column:R.column+1,lineText:S,matchLength:R.length})}}g.length&&s.push({path:c,matches:g})}catch{}}}function pA(r,e,t){let n;try{n=re.default.readdirSync(r,{withFileTypes:!0})}catch{return[]}let i=[];for(let s of n){if(!t&&s.name.startsWith(".")&&s.name!==".env"&&s.name!==".env.example"||zu(s.name))continue;let o=br.default.join(r,s.name);if(s.isDirectory()){let a={name:s.name,path:o,type:"folder"};e>0&&(a.children=pA(o,e-1,t)),i.push(a)}else s.isFile()&&i.push({name:s.name,path:o,type:Qs(s.name)?"binary":"file"})}return i.sort((s,o)=>s.type==="folder"&&o.type!=="folder"?-1:s.type!=="folder"&&o.type==="folder"?1:s.name.localeCompare(o.name)),i}function n$(){if(process.platform!=="win32")return[];try{return(0,Zs.execSync)("wmic logicaldisk get name",{encoding:"utf-8",stdio:["pipe","pipe","pipe"],windowsHide:!0}).split(/\r?\n/).map(e=>e.trim()).filter(e=>/^[A-Z]:$/.test(e)).map(e=>({letter:e[0],path:e+"\\"}))}catch{return"CDEFGHIJ".split("").map(r=>`${r}:\\`).filter(r=>re.default.existsSync(r)).map(r=>({letter:r[0],path:r}))}}function fA(r){r.on("getSystemInfo",t=>{let n=process.platform;t({success:!0,platform:n,isWindows:n==="win32",drives:n==="win32"?n$():[],homedir:Qr.default.homedir()})}),r.on("getFiles",({dirPath:t,showHidden:n},i)=>{try{let s=t||Qr.default.homedir(),o=s.startsWith("~")?s.replace("~",Qr.default.homedir()):s;if(Tn(o))return i({success:!1,error:"Access denied"});if(!re.default.existsSync(o))return i({success:!1,error:"Directory not found"});let a=[];for(let c of re.default.readdirSync(o))if(!(!n&&c.startsWith(".")&&c!==".env"&&c!==".env.example")&&!zu(c))try{let l=br.default.join(o,c),u=re.default.statSync(l);a.push({name:c,path:l,type:r$(u,c),size:u.isFile()?u.size:null,sizeFormatted:u.isFile()?Aa(u.size):null,modified:u.mtime.getTime()})}catch{}a.sort((c,l)=>c.type==="folder"&&l.type!=="folder"?-1:c.type!=="folder"&&l.type==="folder"?1:c.name.localeCompare(l.name)),i({success:!0,files:a,currentPath:o,parentPath:br.default.dirname(o)})}catch(s){i({success:!1,error:s.message})}}),r.on("searchFiles",({workspace:t,query:n},i)=>{try{if(!n||n.length<2)return i({success:!0,files:[]});let s=(t||Qr.default.homedir()).replace(/^~/,Qr.default.homedir());if(!re.default.existsSync(s))return i({success:!1,error:"Workspace not found"});let o=[];lA(s,n,o,50),o.sort((a,c)=>{let l=a.name.toLowerCase()===n.toLowerCase(),u=c.name.toLowerCase()===n.toLowerCase();return l&&!u?-1:!l&&u?1:a.path.length-c.path.length}),i({success:!0,files:o})}catch(s){i({success:!1,error:s.message})}}),r.on("readFile",({filePath:t},n)=>{try{if(Tn(t))return n({success:!1,error:"Access denied"});if(!re.default.existsSync(t))return n({success:!1,error:"File not found"});let i=re.default.statSync(t);if(i.size>512e3)return n({success:!1,error:`File too large (${Aa(i.size)}). Max ${Aa(512e3)}`});if(Qs(t))return n({success:!1,error:"Cannot open binary file"});n({success:!0,content:re.default.readFileSync(t,"utf-8")})}catch(i){n({success:!1,error:i.message})}}),r.on("readImage",({filePath:t},n)=>{try{if(Tn(t))return n({success:!1,error:"Access denied"});if(!re.default.existsSync(t))return n({success:!1,error:"File not found"});let i=re.default.statSync(t),s=10*1024*1024;if(i.size>s)return n({success:!1,error:`Image too large (${Aa(i.size)})`});let o=br.default.extname(t).toLowerCase().slice(1),c={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",ico:"image/x-icon",bmp:"image/bmp"}[o]||"application/octet-stream",l=re.default.readFileSync(t),u=`data:${c};base64,${l.toString("base64")}`;n({success:!0,dataUrl:u,size:i.size,mime:c})}catch(i){n({success:!1,error:i.message})}}),r.on("writeFile",({filePath:t,content:n},i)=>{try{if(Tn(t))return i({success:!1,error:"Access denied"});re.default.writeFileSync(t,n,"utf-8"),i({success:!0})}catch(s){i({success:!1,error:s.message})}}),r.on("createItem",({itemPath:t,type:n},i)=>{try{if(Tn(t))return i({success:!1,error:"Access denied"});if(re.default.existsSync(t))return i({success:!1,error:"Item already exists"});n==="folder"?re.default.mkdirSync(t,{recursive:!0}):re.default.writeFileSync(t,"","utf-8"),i({success:!0})}catch(s){i({success:!1,error:s.message})}}),r.on("deleteItem",({itemPath:t},n)=>{try{if(Tn(t))return n({success:!1,error:"Access denied"});if(!re.default.existsSync(t))return n({success:!1,error:"Item not found"});re.default.statSync(t).isDirectory()?re.default.rmSync(t,{recursive:!0}):re.default.unlinkSync(t),n({success:!0})}catch(i){n({success:!1,error:i.message})}}),r.on("renameItem",({oldPath:t,newPath:n},i)=>{try{if(Tn(t)||Tn(n))return i({success:!1,error:"Access denied"});if(!re.default.existsSync(t))return i({success:!1,error:"Item not found"});if(re.default.existsSync(n))return i({success:!1,error:"Target already exists"});re.default.renameSync(t,n),i({success:!0})}catch(s){i({success:!1,error:s.message})}}),r.on("searchInFiles",({workspace:t,query:n,caseSensitive:i,regex:s,includeGlob:o,excludeGlob:a},c)=>{try{if(!n)return c({success:!0,results:[]});let l=(t||Qr.default.homedir()).replace(/^~/,Qr.default.homedir());if(!re.default.existsSync(l))return c({success:!1,error:"Workspace not found"});let u;if(s){let x;try{x=new RegExp(n,i?"g":"gi")}catch(S){return c({success:!1,error:`Invalid regex: ${S.message}`})}u=S=>{let k=[],R;for(x.lastIndex=0;(R=x.exec(S))!==null;)k.push({column:R.index,length:R[0].length}),R.index===x.lastIndex&&x.lastIndex++;return k}}else{let x=i?n:n.toLowerCase();u=S=>{let k=i?S:S.toLowerCase(),R=[],M=0;for(;(M=k.indexOf(x,M))!==-1;)R.push({column:M,length:x.length}),M+=x.length||1;return R}}let f=aA(o),h=aA(a),g=[];uA(l,l,u,f,h,g),c({success:!0,results:g})}catch(l){c({success:!1,error:l.message})}}),r.on("replaceInFiles",({workspace:t,query:n,replacement:i,caseSensitive:s,regex:o,files:a},c)=>{try{if(!n||!Array.isArray(a)||!a.length)return c({success:!0,replacedCount:0,fileCount:0});let l;if(o){let h;try{h=new RegExp(n,s?"g":"gi")}catch(g){return c({success:!1,error:`Invalid regex: ${g.message}`})}l=g=>{let x=0;return{next:g.replace(h,k=>(x++,i)),count:x}}}else l=h=>{let g=0,x=s?"g":"gi",S=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),k=new RegExp(S,x);return{next:h.replace(k,()=>(g++,i)),count:g}};let u=0,f=0;for(let h of a)try{if(!re.default.existsSync(h)||Qs(h))continue;let g=re.default.statSync(h);if(!g.isFile()||g.size>512e3)continue;let x=re.default.readFileSync(h,"utf-8"),{next:S,count:k}=l(x);k>0&&(re.default.writeFileSync(h,S,"utf-8"),u+=k,f++)}catch{}c({success:!0,replacedCount:u,fileCount:f})}catch(l){c({success:!1,error:l.message})}});let e=new Map;r.on("watchDir",({dirPath:t},n)=>{try{if(!t||!re.default.existsSync(t))return n({success:!1,error:"Directory not found"});let i=e.get(t);if(i)return i.count++,n({success:!0});let s=cA.default.watch(t,{depth:0,ignoreInitial:!0,persistent:!0,ignored:a=>kg.includes(br.default.basename(a))}),o=a=>c=>r.emit("fileChange",{type:a,path:c});s.on("add",o("add")).on("change",o("change")).on("unlink",o("unlink")).on("addDir",o("addDir")).on("unlinkDir",o("unlinkDir")),e.set(t,{w:s,count:1}),n({success:!0})}catch(i){n({success:!1,error:i.message})}}),r.on("unwatchDir",({dirPath:t},n)=>{try{let i=e.get(t);i&&--i.count<=0&&(i.w.close(),e.delete(t)),n({success:!0})}catch(i){n({success:!1,error:i.message})}}),r.once("disconnect",()=>{for(let{w:t}of e.values())try{t.close()}catch{}e.clear()}),r.on("revealInOS",({filePath:t},n)=>{try{if(!t)return n({success:!1,error:"No path"});let i=process.platform,s,o;i==="darwin"?(s="open",o=["-R",t]):i==="win32"?(s="explorer",o=[`/select,${t}`]):(s="xdg-open",o=[br.default.dirname(t)]);let a=(0,Zs.spawn)(s,o,{detached:!0,stdio:"ignore",windowsHide:!0});a.on("error",c=>n({success:!1,error:c.message})),a.unref(),n({success:!0})}catch(i){n({success:!1,error:i.message})}}),r.on("openInTerminal",({dirPath:t},n)=>{try{if(!t||!re.default.existsSync(t))return n({success:!1,error:"Directory not found"});let i=process.platform,s,o,a={detached:!0,stdio:"ignore",windowsHide:!0};i==="darwin"?(s="open",o=["-a","Terminal",t]):i==="win32"?(s="cmd",o=["/C","start","cmd","/K",`cd /d "${t}"`],a.shell=!1):(s="gnome-terminal",o=[`--working-directory=${t}`]);let c=(0,Zs.spawn)(s,o,a);c.on("error",()=>{if(i==="linux"){let l=(0,Zs.spawn)("xterm",["-e",`cd "${t}" && bash`],a);l.on("error",u=>n({success:!1,error:u.message})),l.unref()}else n({success:!1,error:"Failed to open terminal"})}),c.unref(),n({success:!0})}catch(i){n({success:!1,error:i.message})}}),r.on("getFileTree",({dirPath:t,depth:n,showHidden:i},s)=>{try{let o=(t||Qr.default.homedir()).replace(/^~/,Qr.default.homedir());if(!re.default.existsSync(o))return s({success:!1,error:"Directory not found"});let c=pA(o,typeof n=="number"?n:3,!!i);s({success:!0,tree:{name:br.default.basename(o)||o,path:o,type:"folder",children:c}})}catch(o){s({success:!1,error:o.message})}})}var Gt=K(require("fs"),1),ki=K(require("path"),1),wr=require("child_process");function Ci(r,e){return new Promise(t=>{let n=(0,wr.spawn)("git",r,{cwd:e,windowsHide:!0}),i="",s="";n.stdout.on("data",o=>{i+=o.toString()}),n.stderr.on("data",o=>{s+=o.toString()}),n.on("error",o=>t({code:-1,stdout:i,stderr:o.message})),n.on("close",o=>t({code:o,stdout:i,stderr:s}))})}function dA(r){return Gu.includes(ki.default.extname(r).toLowerCase())}function hA(r){r.on("gitStatus",({repoPath:e},t)=>{try{let n=(0,wr.execSync)("git status --porcelain",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"],windowsHide:!0}),i={};try{(0,wr.execSync)("git diff HEAD --numstat",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"],windowsHide:!0}).trim().split(`
165
165
  `).filter(Boolean).forEach(a=>{let c=a.split(" ");c.length>=3&&(i[c[2]]={added:c[0]==="-"?0:parseInt(c[0],10)||0,deleted:c[1]==="-"?0:parseInt(c[1],10)||0})})}catch{}let s=[];for(let o of n.trim().split(`
166
166
  `).filter(Boolean)){let a=o.match(/^([MADRCU?! ]{1,2})\s+(.+)$/);if(!a)continue;let c=a[1],l=a[2];if(!l)continue;let u;c.includes("?")?u="?":c.includes("A")?u="A":c.includes("D")?u="D":c.includes("M")?u="M":c.includes("R")?u="R":u=c.trim()[0]||"?";let f=i[l]||{added:0,deleted:0};if(u==="?")try{let h=ki.default.join(e,l);if(Gt.default.existsSync(h)&&!dA(l)){let g=Gt.default.readFileSync(h,"utf-8");f.added=g.split(`
@@ -291,8 +291,8 @@ self.addEventListener('fetch', (event) => {
291
291
  </body>
292
292
  </html>
293
293
  `);return}e._proxyTargetPort=n,e.url=i+(s||""),r.web(e,t,{target:`http://localhost:${n}`,changeOrigin:!0},o=>{t.writeHead(502),t.end(`Bad Gateway: ${o.message}`)})}var kR=K(require("http"),1),AR=K(require("https"),1),RR=require("child_process"),OR=require("util"),q$=(0,OR.promisify)(RR.exec);async function U$(){let r=process.platform,e=new Set([80,443]);try{let t;if(r==="win32")t="netstat -ano | findstr LISTENING";else{let s="/dev/null";t=`lsof -iTCP -sTCP:LISTEN -P -n 2>${s} || netstat -tlnp 2>${s}`}let{stdout:n}=await q$(t),i=n.split(`
294
- `);for(let s of i){let o=s.match(/[:\*\]](\d{2,5})(?:\s|$)/g);if(o)for(let a of o){let c=parseInt(a.replace(/[:\*\]\s]/g,""),10);c>0&&c<=65535&&(c===80||c===443||c>=1024)&&e.add(c)}}return Array.from(e)}catch(t){return console.error("Failed to get listening ports:",t.message),[80,443,3e3,3001,4200,5e3,5173,8e3,8080,9e3]}}function $$(r,e=2e3){return new Promise(t=>{let n=kR.default.request({host:"localhost",port:r,method:"GET",path:"/",timeout:e},i=>{i.on("data",()=>{}),i.on("end",()=>{}),t({active:!0,protocol:"http",status:i.statusCode})});n.on("error",i=>{t({active:!1,error:i.message})}),n.on("timeout",()=>{n.destroy(),t({active:!1,error:"timeout"})}),n.end()})}function W$(r,e=2e3){return new Promise(t=>{let n=AR.default.request({host:"localhost",port:r,method:"GET",path:"/",timeout:e,rejectUnauthorized:!1},i=>{i.on("data",()=>{}),i.on("end",()=>{}),t({active:!0,protocol:"https",status:i.statusCode})});n.on("error",i=>{t({active:!1,error:i.message})}),n.on("timeout",()=>{n.destroy(),t({active:!1,error:"timeout"})}),n.end()})}async function G$(r){let[e,t]=await Promise.all([$$(r),W$(r)]);return t.active?{port:r,...t}:e.active?{port:r,...e}:{port:r,active:!1}}async function MR(){let r=await U$();return(await Promise.all(r.map(t=>G$(t)))).filter(t=>t.active).map(t=>({port:t.port,protocol:t.protocol,url:`${t.protocol}://localhost:${t.port}`,name:`localhost:${t.port}`,status:t.status})).sort((t,n)=>t.port-n.port)}var PR=K(require("crypto"),1),z$=process.env.API_KEY_SECRET||"9remote-api-key-secret";function V$(){let r="abcdefghijklmnopqrstuvwxyz0123456789",e="";for(let t=0;t<4;t++)e+=r.charAt(Math.floor(Math.random()*r.length));return e}function IR(r,e){return PR.default.createHmac("sha256",z$).update(r+e).digest("hex").slice(0,6)}function NR(r){let e=r.slice(0,8),t=V$(),n=IR(e,t);return{key:`sk-${e}-${t}-${n}`,keyId:t}}function K$(r){if(!r||!r.startsWith("sk-"))return null;let e=r.split("-");if(e.length===4){let[,t,n,i]=e,s=IR(t,n);return i!==s?null:{machineId:t,keyId:n}}return null}function rp(r){return K$(r)!==null}async function DR(r,e){let t=r.headers.authorization;if(!t||!t.startsWith("Bearer ")){e.setHeader("Content-Type","application/json"),e.writeHead(401),e.end(JSON.stringify({error:"Unauthorized: Missing API key"}));return}let n=t.slice(7);if(!rp(n)){e.setHeader("Content-Type","application/json"),e.writeHead(401),e.end(JSON.stringify({error:"Unauthorized: Invalid API key"}));return}let i=await MR();e.setHeader("Content-Type","application/json"),e.writeHead(200),e.end(JSON.stringify(i))}dl();var jR=require("url");var np=K(require("path"),1),FR=K(require("os"),1);bt();var LR=K(require("path"),1),BR=K(require("os"),1);var HV=LR.default.join(BR.default.homedir(),".9remote","pids");nh();var Fa={checkIntervalMs:36e5,connectCheckDebounceMs:9e5,maxRetry:3,retryDelayMs:3e3,verifyTimeoutMs:15e3,lockTtlMs:3e5,lockFile:"update.lock"};var $V={orange:ao.rgb(230,138,110),orangeDim:ao.rgb(200,120,95)};var XV=np.default.dirname((0,jR.fileURLToPath)(__importMetaUrl));var ZV=np.default.join(FR.default.homedir(),".9remote","cloudflared.pid");function HR(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let i=0;i<3;i++){if(n[i]>t[i])return!0;if(n[i]<t[i])return!1}return!1}var QV=np.default.join(ie.STATE,Fa.lockFile);yn();Lt();bt();xs();var UR=K(qR(),1),Yg=K(require("crypto"),1),{machineIdSync:Y$}=UR.default;async function $R(r=null){let e=r||process.env.MACHINE_ID_SALT||"9remote-salt";try{let t=Y$();return Yg.default.createHash("sha256").update(t+e).digest("hex").substring(0,16)}catch(t){return console.error("Error getting machine ID:",t),Yg.default.randomUUID().replace(/-/g,"").substring(0,16)}}yn();async function WR(r,e){let t=_w(),n=t.workerUrl||"https://9remote.cc";if(!t.permanentKey){le(e,400,"No permanent key set");return}try{let s=await(await po(`${n}/api/temp-key/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:t.permanentKey,expiryMinutes:30})})).json(),o=`${n}/login?k=${s.tempKey}`;vn({oneTimeKey:s.tempKey,oneTimeKeyExpiresAt:s.expiresAt,qrUrl:o}),X(e,{oneTimeKey:s.tempKey,expiresAt:s.expiresAt,qrUrl:o})}catch(i){le(e,500,i.message)}}async function GR(r,e){try{let t=await $R(),{key:n}=NR(t),i=ew();tw(t,n,i?.name||"Default"),vn({permanentKey:n}),X(e,{ok:!0,permanentKey:n})}catch(t){le(e,500,t.message)}}Lt();async function zR(r,e){let t=await Dt(r,e);if(!t)return;let n=DA(t.socketId);X(e,{ok:n})}async function VR(r,e){let t=await Dt(r,e);if(!t)return;let n=BA(t.socketId);X(e,{ok:n})}function KR(r,e){X(e,{pending:CA()})}function YR(r,e){X(e,{devices:SA()})}function JR(r,e){X(e,{rejected:OA()})}async function XR(r,e){let t=await Dt(r,e);if(!t)return;let n=LA(t.deviceId);X(e,{ok:n})}async function ZR(r,e){let t=await Dt(r,e);t&&(Xu(t.deviceId),ro(t.deviceId),X(e))}async function QR(r,e){let t=await Dt(r,e);t&&(Xu(t.deviceId),bA(t.deviceId),X(e))}async function eO(r,e){let t=await Dt(r,e);if(!t)return;let n=Xu(t.deviceId);X(e,{disconnected:n})}function tO(r,e){X(e,{enabled:Ju()})}async function rO(r,e){let t=await Dt(r,e);if(!t)return;let n=wA(t.deviceId,t.label);X(e,{ok:n})}async function nO(r,e){let t=await Dt(r,e);if(!t)return;let n=PA(!!t.enabled);X(e,{enabled:n})}Lt();hi();var iO={},J$=1e4;function sO(r,e){if(e)return{type:e.type||"stop",sessionId:e.sessionId||"",tool:e.tool||"claude"};let t=JSON.parse(r||"{}");return{type:t.type||"stop",sessionId:t.sessionId||"",tool:t.tool||"claude"}}async function oO(r,e){let t="";await new Promise(n=>{r.on("data",i=>t+=i),r.on("end",n)});try{cO(sO(t,null)),X(e,{success:!0})}catch{le(e,400,"Invalid JSON")}}function aO(r,e,{query:t}){cO(sO(null,t)),X(e,{success:!0})}function cO({type:r,sessionId:e,tool:t}){let n=Date.now(),i=Ma();if(!i||!e)return;let s={type:r,sessionId:e,tool:t,timestamp:n};kT(e,s),yt(i,"chatNotification",s);let o=`${e}:${r}`;n-(iO[o]||0)<J$||(iO[o]=n,TT(s))}Lt();Tl();xs();pt();yn();function lO(){return{mode:lh(),active:ch(),presets:Object.keys($.sleepInhibit?.presets||{})}}function uO(r,e){X(e,lO())}async function pO(r,e){let t=await Dt(r,e);if(!t)return;let n=Yo(t.mode);Qb({sleepInhibitMode:n});let i=lO();Et("sleepInhibit",i),X(e,i)}Lt();async function fO(r,e){try{let t=await Dl();X(e,{sessions:t})}catch(t){le(e,500,t.message)}}async function dO(r,e){let t=await Dt(r,e);if(t){if(!t.sessionId)return le(e,400,"sessionId required");try{await mi(t.sessionId),X(e)}catch(n){le(e,500,n.message)}}}var An=K(require("os"),1);pt();Lt();function X$(){let r=IS();if(!r?.activeClients)return{total:0,streaming:0};let e=0;for(let t of r.activeClients.values())t.isStreaming&&e++;return{total:r.activeClients.size,streaming:e}}function Z$(){let r=process.memoryUsage(),e=An.default.cpus();return{agent:{pid:process.pid,version:"2.0.81",nodeVersion:process.version,platform:`${process.platform}/${process.arch}`,uptimeSec:Math.round(process.uptime()),memory:{heapUsedMB:Math.round(r.heapUsed/1048576*10)/10,heapTotalMB:Math.round(r.heapTotal/1048576*10)/10,rssMB:Math.round(r.rss/1048576*10)/10,externalMB:Math.round(r.external/1048576*10)/10}},os:{hostname:An.default.hostname(),platform:An.default.platform(),arch:An.default.arch(),uptimeSec:Math.round(An.default.uptime()),loadAvg:An.default.loadavg(),cpuModel:e?.[0]?.model||"unknown",cpuCount:e.length,totalMemMB:Math.round(An.default.totalmem()/1048576),freeMemMB:Math.round(An.default.freemem()/1048576)},remote:{available:$l(),...X$(),memoryWarningThresholdMB:$.resourceManagement.memoryWarningThreshold},timestamp:Date.now()}}function hO(r,e){try{X(e,Z$())}catch(t){le(e,500,"stats error",t.message)}}Tl();xs();pt();Dv();var Kn=On("server"),Yn=(0,yO.fileURLToPath)(new URL(".",__importMetaUrl)),xO=process.env.NODE_ENV==="development",Q$=5173,Jg=(0,Ii.existsSync)((0,rr.join)(Yn,"ui","dist"))?(0,rr.join)(Yn,"ui","dist"):(0,rr.join)(Yn,"ui"),e4={".html":"text/html",".js":"application/javascript",".css":"text/css",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon",".woff2":"font/woff2",".woff":"font/woff"};function t4(r,e,t){let n=(0,ip.request)({hostname:"localhost",port:Q$,path:r.url,method:r.method,headers:r.headers},i=>{e.writeHead(i.statusCode,i.headers),i.pipe(e)});n.on("error",()=>t?t():void(e.writeHead(502),e.end("Vite dev server not ready"))),r.pipe(n)}function mO(r,e){if(!(0,Ii.existsSync)(e))return!1;let t=e4[(0,rr.extname)(e)]||"application/octet-stream";return r.setHeader("Content-Type",t),r.writeHead(200),r.end((0,Ii.readFileSync)(e)),!0}async function Xg(r){try{let e=await po(Op);if(!e.ok)return;let{version:t}=await e.json();t&&HR(r,t)&&(Sw({version:t}),Et("updateAvailable",{version:t}),XT())}catch{}}var gO=0;function r4(r){let e=Date.now();e-gO<Fa.connectCheckDebounceMs||(gO=e,Xg(r))}function n4(r,e){if(process.env.CODESPACES!=="true"){le(e,400,"Not running on Codespaces");return}let t=process.env.CODESPACE_NAME;if(!t){le(e,400,"Codespace name not found");return}let n=Ma();n&&n.emit("codespace:stopping"),X(e,{success:!0,message:"Stopping codespace..."}),setTimeout(()=>(0,Pi.execFile)("gh",["codespace","stop","-c",t],{windowsHide:!0}),500)}var _O;async function vO(r,e,{pathname:t}){let n=r.headers.authorization;if(!n||!n.startsWith("Bearer ")||!rp(n.slice(7))){le(e,401,"Unauthorized");return}let{parseJsonBody:i}=await Promise.resolve().then(()=>(Lt(),Li)),s=await i(r,e);if(s){if(!s.port){le(e,400,"Port required");return}t.endsWith("start")?SR(s.port):ER(s.port),X(e,{success:!0})}}function i4(r,e,{pathname:t,search:n}){let i=t.match(/^\/proxy\/(\d+)(\/.*)?$/);i?CR(_O,r,e,i[1],i[2]||"/",n):le(e,404,"Not found")}var s4=[{path:"/api/health",method:"GET",public:!0,handler:(r,e)=>X(e,{status:"ok",timestamp:Date.now()})},{path:"/api/version",method:"GET",public:!0,handler:(r,e)=>{X(e,{version:"2.0.81"})}},{path:"/api/notify",method:"POST",public:!0,handler:oO},{path:"/api/notify",method:"GET",public:!0,handler:aO},{path:"/proxy/*",method:"*",public:!0,handler:i4},{path:"/api/ui/events",method:"GET",handler:Ow},{path:"/api/local-token",method:"GET",handler:Cw},{path:"/api/ui/state",method:"GET",handler:Mw},{path:"/api/ui/state",method:"POST",handler:Pw},{path:"/api/ui/stop",method:"POST",handler:Iw},{path:"/api/ui/start",method:"POST",handler:Nw},{path:"/api/ui/stop-tunnel",method:"POST",handler:Dw},{path:"/api/ui/shutdown",method:"POST",handler:Lw},{path:"/api/update",method:"POST",handler:Bw},{path:"/api/system/stats",method:"GET",handler:hO},{path:"/api/key/one-time",method:"POST",handler:WR},{path:"/api/key/regenerate",method:"POST",handler:GR},{path:"/api/device/approve",method:"POST",handler:zR},{path:"/api/device/reject",method:"POST",handler:VR},{path:"/api/device/pending",method:"GET",handler:KR},{path:"/api/device/approved",method:"GET",handler:YR},{path:"/api/device/rejected",method:"GET",handler:JR},{path:"/api/device/approve-rejected",method:"POST",handler:XR},{path:"/api/device/clear-rejected",method:"POST",handler:ZR},{path:"/api/device/remove",method:"POST",handler:QR},{path:"/api/device/label",method:"POST",handler:rO},{path:"/api/device/disconnect",method:"POST",handler:eO},{path:"/api/device/auto-approve",method:"GET",handler:tO},{path:"/api/device/auto-approve",method:"POST",handler:nO},{path:"/api/connections",method:"GET",handler:jw},{path:"/api/logs",method:"GET",handler:Fw},{path:"/api/permissions",method:"GET",handler:qw},{path:"/api/permissions/request",method:"POST",handler:Ww},{path:"/api/desktop/toggle",method:"POST",handler:Hw},{path:"/api/autostart",method:"GET",handler:Uw},{path:"/api/autostart",method:"POST",handler:$w},{path:"/api/sleep-inhibit",method:"GET",handler:uO},{path:"/api/sleep-inhibit",method:"POST",handler:pO},{path:"/api/sessions",method:"GET",handler:fO},{path:"/api/sessions/delete",method:"POST",handler:dO},{path:"/api/local-sites",method:"*",public:!0,handler:DR},{path:"/api/codespace/stop",method:"POST",handler:n4},{path:"/api/proxy/start",method:"POST",public:!0,handler:vO},{path:"/api/proxy/end",method:"POST",public:!0,handler:vO}];var o4=parseInt(process.env.PORT||"2208",10),qa=null;function a4(r){if(process.platform!=="win32")try{let e=(0,Pi.execSync)(`pgrep -f "vite --config ${r}"`,{encoding:"utf8"}).trim();for(let t of e.split(`
295
- `).filter(Boolean))if((0,Pi.execSync)(`ps -o ppid= -p ${t}`,{encoding:"utf8"}).trim()==="1")try{process.kill(Number(t))}catch{}}catch{}}function c4(){if(!xO)return;let r=(0,rr.join)(Yn,"vite.config.js");if(!(0,Ii.existsSync)(r))return;a4(r);let e=(0,Ii.existsSync)((0,rr.join)(Yn,"node_modules",".bin","vite"))?(0,rr.join)(Yn,"node_modules",".bin","vite"):(0,rr.join)(Yn,"..","node_modules",".bin","vite");qa=(0,Pi.spawn)("node",[e,"--config",r],{cwd:Yn,stdio:"ignore",detached:!1}),qa.on("error",()=>{}),qa.unref()}async function bO(){let r=eh(),e=r.sleepInhibitMode;e||(r.sleepInhibit===!1?e="never":e=$.sleepInhibit?.defaultMode||"never"),Yo(e),await JT(),_O=TR(),c4();let n=Ap(s4,{fallback:(a,c,{pathname:l})=>{if(l.startsWith("/api/")||l.startsWith("/socket.io")){le(c,404,"Not found");return}let u=!!a.headers["cf-connecting-ip"],f=a.socket.remoteAddress==="127.0.0.1"||a.socket.remoteAddress==="::1";if(u||!f){le(c,403,"Forbidden");return}let h=()=>{let g=l==="/"||l===""?(0,rr.join)(Jg,"index.html"):(0,rr.join)(Jg,l);mO(c,g)||mO(c,(0,rr.join)(Jg,"index.html"))};if(xO){t4(a,c,h);return}h()}}),i=(0,ip.createServer)(async(a,c)=>{FA(c),!HA(a,c)&&await n(a,c)});Yd(),yw(),xw(),Al(),process.platform==="darwin"&&setInterval(Al,Av),await jA(i),i.listen(o4,a=>{if(a)throw a;let c="2.0.81";Xg(c),setInterval(()=>Xg(c),Fa.checkIntervalMs),QT(()=>r4(c))});let s=!1,o=async a=>{if(s)return;s=!0,ah(),Kn.info(`\u{1F6D1} Received ${a}, shutting down gracefully...`);let c=setTimeout(()=>{Kn.error("\u26A0\uFE0F Forced exit"),process.exit(1)},5e3);try{if(i.close(()=>Kn.info("\u2713 HTTP server closed")),qa)try{qa.kill()}catch{}let l=Ma();l&&(l.emit("server:shutdown"),l.close(()=>Kn.info("\u2713 Socket.IO closed"))),await new Promise(u=>setTimeout(u,500)),clearTimeout(c),Kn.info("\u2705 Server stopped cleanly"),process.exit(0)}catch(l){Kn.error(`\u274C Error during shutdown: ${l?.message||l}`),clearTimeout(c),process.exit(1)}};return process.on("SIGINT",()=>o("SIGINT")),process.on("SIGTERM",()=>o("SIGTERM")),process.platform==="win32"&&process.on("SIGBREAK",()=>o("SIGBREAK")),process.on("uncaughtException",a=>{Kn.error(`\u26A0\uFE0F uncaughtException: ${a?.stack||a}`)}),process.on("unhandledRejection",a=>{Kn.error(`\u26A0\uFE0F unhandledRejection: ${a?.stack||a}`)}),i}bO();0&&(module.exports={startServer});
294
+ `);for(let s of i){let o=s.match(/[:\*\]](\d{2,5})(?:\s|$)/g);if(o)for(let a of o){let c=parseInt(a.replace(/[:\*\]\s]/g,""),10);c>0&&c<=65535&&(c===80||c===443||c>=1024)&&e.add(c)}}return Array.from(e)}catch(t){return console.error("Failed to get listening ports:",t.message),[80,443,3e3,3001,4200,5e3,5173,8e3,8080,9e3]}}function $$(r,e=2e3){return new Promise(t=>{let n=kR.default.request({host:"localhost",port:r,method:"GET",path:"/",timeout:e},i=>{i.on("data",()=>{}),i.on("end",()=>{}),t({active:!0,protocol:"http",status:i.statusCode})});n.on("error",i=>{t({active:!1,error:i.message})}),n.on("timeout",()=>{n.destroy(),t({active:!1,error:"timeout"})}),n.end()})}function W$(r,e=2e3){return new Promise(t=>{let n=AR.default.request({host:"localhost",port:r,method:"GET",path:"/",timeout:e,rejectUnauthorized:!1},i=>{i.on("data",()=>{}),i.on("end",()=>{}),t({active:!0,protocol:"https",status:i.statusCode})});n.on("error",i=>{t({active:!1,error:i.message})}),n.on("timeout",()=>{n.destroy(),t({active:!1,error:"timeout"})}),n.end()})}async function G$(r){let[e,t]=await Promise.all([$$(r),W$(r)]);return t.active?{port:r,...t}:e.active?{port:r,...e}:{port:r,active:!1}}async function MR(){let r=await U$();return(await Promise.all(r.map(t=>G$(t)))).filter(t=>t.active).map(t=>({port:t.port,protocol:t.protocol,url:`${t.protocol}://localhost:${t.port}`,name:`localhost:${t.port}`,status:t.status})).sort((t,n)=>t.port-n.port)}var PR=K(require("crypto"),1),z$=process.env.API_KEY_SECRET||"9remote-api-key-secret";function V$(){let r="abcdefghijklmnopqrstuvwxyz0123456789",e="";for(let t=0;t<4;t++)e+=r.charAt(Math.floor(Math.random()*r.length));return e}function IR(r,e){return PR.default.createHmac("sha256",z$).update(r+e).digest("hex").slice(0,6)}function NR(r){let e=r.slice(0,8),t=V$(),n=IR(e,t);return{key:`sk-${e}-${t}-${n}`,keyId:t}}function K$(r){if(!r||!r.startsWith("sk-"))return null;let e=r.split("-");if(e.length===4){let[,t,n,i]=e,s=IR(t,n);return i!==s?null:{machineId:t,keyId:n}}return null}function rp(r){return K$(r)!==null}async function DR(r,e){let t=r.headers.authorization;if(!t||!t.startsWith("Bearer ")){e.setHeader("Content-Type","application/json"),e.writeHead(401),e.end(JSON.stringify({error:"Unauthorized: Missing API key"}));return}let n=t.slice(7);if(!rp(n)){e.setHeader("Content-Type","application/json"),e.writeHead(401),e.end(JSON.stringify({error:"Unauthorized: Invalid API key"}));return}let i=await MR();e.setHeader("Content-Type","application/json"),e.writeHead(200),e.end(JSON.stringify(i))}dl();var jR=require("url");var np=K(require("path"),1),FR=K(require("os"),1);bt();var LR=K(require("path"),1),BR=K(require("os"),1);var HV=LR.default.join(BR.default.homedir(),".9remote","pids");nh();var Fa={checkIntervalMs:36e5,connectCheckDebounceMs:9e5,maxRetry:3,retryDelayMs:3e3,verifyTimeoutMs:15e3,lockTtlMs:3e5,lockFile:"update.lock"};var $V={orange:ao.rgb(230,138,110),orangeDim:ao.rgb(200,120,95)};var XV=np.default.dirname((0,jR.fileURLToPath)(__importMetaUrl));var ZV=np.default.join(FR.default.homedir(),".9remote","cloudflared.pid");function HR(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let i=0;i<3;i++){if(n[i]>t[i])return!0;if(n[i]<t[i])return!1}return!1}var QV=np.default.join(ie.STATE,Fa.lockFile);yn();Lt();bt();xs();var UR=K(qR(),1),Yg=K(require("crypto"),1),{machineIdSync:Y$}=UR.default;async function $R(r=null){let e=r||process.env.MACHINE_ID_SALT||"9remote-salt";try{let t=Y$();return Yg.default.createHash("sha256").update(t+e).digest("hex").substring(0,16)}catch(t){return console.error("Error getting machine ID:",t),Yg.default.randomUUID().replace(/-/g,"").substring(0,16)}}yn();async function WR(r,e){let t=_w(),n=t.workerUrl||"https://9remote.cc";if(!t.permanentKey){le(e,400,"No permanent key set");return}try{let s=await(await po(`${n}/api/temp-key/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:t.permanentKey,expiryMinutes:30})})).json(),o=`${n}/login?k=${s.tempKey}`;vn({oneTimeKey:s.tempKey,oneTimeKeyExpiresAt:s.expiresAt,qrUrl:o}),X(e,{oneTimeKey:s.tempKey,expiresAt:s.expiresAt,qrUrl:o})}catch(i){le(e,500,i.message)}}async function GR(r,e){try{let t=await $R(),{key:n}=NR(t),i=ew();tw(t,n,i?.name||"Default"),vn({permanentKey:n}),X(e,{ok:!0,permanentKey:n})}catch(t){le(e,500,t.message)}}Lt();async function zR(r,e){let t=await Dt(r,e);if(!t)return;let n=DA(t.socketId);X(e,{ok:n})}async function VR(r,e){let t=await Dt(r,e);if(!t)return;let n=BA(t.socketId);X(e,{ok:n})}function KR(r,e){X(e,{pending:CA()})}function YR(r,e){X(e,{devices:SA()})}function JR(r,e){X(e,{rejected:OA()})}async function XR(r,e){let t=await Dt(r,e);if(!t)return;let n=LA(t.deviceId);X(e,{ok:n})}async function ZR(r,e){let t=await Dt(r,e);t&&(Xu(t.deviceId),ro(t.deviceId),X(e))}async function QR(r,e){let t=await Dt(r,e);t&&(Xu(t.deviceId),bA(t.deviceId),X(e))}async function eO(r,e){let t=await Dt(r,e);if(!t)return;let n=Xu(t.deviceId);X(e,{disconnected:n})}function tO(r,e){X(e,{enabled:Ju()})}async function rO(r,e){let t=await Dt(r,e);if(!t)return;let n=wA(t.deviceId,t.label);X(e,{ok:n})}async function nO(r,e){let t=await Dt(r,e);if(!t)return;let n=PA(!!t.enabled);X(e,{enabled:n})}Lt();hi();var iO={},J$=1e4;function sO(r,e){if(e)return{type:e.type||"stop",sessionId:e.sessionId||"",tool:e.tool||"claude"};let t=JSON.parse(r||"{}");return{type:t.type||"stop",sessionId:t.sessionId||"",tool:t.tool||"claude"}}async function oO(r,e){let t="";await new Promise(n=>{r.on("data",i=>t+=i),r.on("end",n)});try{cO(sO(t,null)),X(e,{success:!0})}catch{le(e,400,"Invalid JSON")}}function aO(r,e,{query:t}){cO(sO(null,t)),X(e,{success:!0})}function cO({type:r,sessionId:e,tool:t}){let n=Date.now(),i=Ma();if(!i||!e)return;let s={type:r,sessionId:e,tool:t,timestamp:n};kT(e,s),yt(i,"chatNotification",s);let o=`${e}:${r}`;n-(iO[o]||0)<J$||(iO[o]=n,TT(s))}Lt();Tl();xs();pt();yn();function lO(){return{mode:lh(),active:ch(),presets:Object.keys($.sleepInhibit?.presets||{})}}function uO(r,e){X(e,lO())}async function pO(r,e){let t=await Dt(r,e);if(!t)return;let n=Yo(t.mode);Qb({sleepInhibitMode:n});let i=lO();Et("sleepInhibit",i),X(e,i)}Lt();async function fO(r,e){try{let t=await Dl();X(e,{sessions:t})}catch(t){le(e,500,t.message)}}async function dO(r,e){let t=await Dt(r,e);if(t){if(!t.sessionId)return le(e,400,"sessionId required");try{await mi(t.sessionId),X(e)}catch(n){le(e,500,n.message)}}}var An=K(require("os"),1);pt();Lt();function X$(){let r=IS();if(!r?.activeClients)return{total:0,streaming:0};let e=0;for(let t of r.activeClients.values())t.isStreaming&&e++;return{total:r.activeClients.size,streaming:e}}function Z$(){let r=process.memoryUsage(),e=An.default.cpus();return{agent:{pid:process.pid,version:"2.0.82",nodeVersion:process.version,platform:`${process.platform}/${process.arch}`,uptimeSec:Math.round(process.uptime()),memory:{heapUsedMB:Math.round(r.heapUsed/1048576*10)/10,heapTotalMB:Math.round(r.heapTotal/1048576*10)/10,rssMB:Math.round(r.rss/1048576*10)/10,externalMB:Math.round(r.external/1048576*10)/10}},os:{hostname:An.default.hostname(),platform:An.default.platform(),arch:An.default.arch(),uptimeSec:Math.round(An.default.uptime()),loadAvg:An.default.loadavg(),cpuModel:e?.[0]?.model||"unknown",cpuCount:e.length,totalMemMB:Math.round(An.default.totalmem()/1048576),freeMemMB:Math.round(An.default.freemem()/1048576)},remote:{available:$l(),...X$(),memoryWarningThresholdMB:$.resourceManagement.memoryWarningThreshold},timestamp:Date.now()}}function hO(r,e){try{X(e,Z$())}catch(t){le(e,500,"stats error",t.message)}}Tl();xs();pt();Dv();var Kn=On("server"),Yn=(0,yO.fileURLToPath)(new URL(".",__importMetaUrl)),xO=process.env.NODE_ENV==="development",Q$=5173,Jg=(0,Ii.existsSync)((0,rr.join)(Yn,"ui","dist"))?(0,rr.join)(Yn,"ui","dist"):(0,rr.join)(Yn,"ui"),e4={".html":"text/html",".js":"application/javascript",".css":"text/css",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon",".woff2":"font/woff2",".woff":"font/woff"};function t4(r,e,t){let n=(0,ip.request)({hostname:"localhost",port:Q$,path:r.url,method:r.method,headers:r.headers},i=>{e.writeHead(i.statusCode,i.headers),i.pipe(e)});n.on("error",()=>t?t():void(e.writeHead(502),e.end("Vite dev server not ready"))),r.pipe(n)}function mO(r,e){if(!(0,Ii.existsSync)(e))return!1;let t=e4[(0,rr.extname)(e)]||"application/octet-stream";return r.setHeader("Content-Type",t),r.writeHead(200),r.end((0,Ii.readFileSync)(e)),!0}async function Xg(r){try{let e=await po(Op);if(!e.ok)return;let{version:t}=await e.json();t&&HR(r,t)&&(Sw({version:t}),Et("updateAvailable",{version:t}),XT())}catch{}}var gO=0;function r4(r){let e=Date.now();e-gO<Fa.connectCheckDebounceMs||(gO=e,Xg(r))}function n4(r,e){if(process.env.CODESPACES!=="true"){le(e,400,"Not running on Codespaces");return}let t=process.env.CODESPACE_NAME;if(!t){le(e,400,"Codespace name not found");return}let n=Ma();n&&n.emit("codespace:stopping"),X(e,{success:!0,message:"Stopping codespace..."}),setTimeout(()=>(0,Pi.execFile)("gh",["codespace","stop","-c",t],{windowsHide:!0}),500)}var _O;async function vO(r,e,{pathname:t}){let n=r.headers.authorization;if(!n||!n.startsWith("Bearer ")||!rp(n.slice(7))){le(e,401,"Unauthorized");return}let{parseJsonBody:i}=await Promise.resolve().then(()=>(Lt(),Li)),s=await i(r,e);if(s){if(!s.port){le(e,400,"Port required");return}t.endsWith("start")?SR(s.port):ER(s.port),X(e,{success:!0})}}function i4(r,e,{pathname:t,search:n}){let i=t.match(/^\/proxy\/(\d+)(\/.*)?$/);i?CR(_O,r,e,i[1],i[2]||"/",n):le(e,404,"Not found")}var s4=[{path:"/api/health",method:"GET",public:!0,handler:(r,e)=>X(e,{status:"ok",timestamp:Date.now()})},{path:"/api/version",method:"GET",public:!0,handler:(r,e)=>{X(e,{version:"2.0.82"})}},{path:"/api/notify",method:"POST",public:!0,handler:oO},{path:"/api/notify",method:"GET",public:!0,handler:aO},{path:"/proxy/*",method:"*",public:!0,handler:i4},{path:"/api/ui/events",method:"GET",handler:Ow},{path:"/api/local-token",method:"GET",handler:Cw},{path:"/api/ui/state",method:"GET",handler:Mw},{path:"/api/ui/state",method:"POST",handler:Pw},{path:"/api/ui/stop",method:"POST",handler:Iw},{path:"/api/ui/start",method:"POST",handler:Nw},{path:"/api/ui/stop-tunnel",method:"POST",handler:Dw},{path:"/api/ui/shutdown",method:"POST",handler:Lw},{path:"/api/update",method:"POST",handler:Bw},{path:"/api/system/stats",method:"GET",handler:hO},{path:"/api/key/one-time",method:"POST",handler:WR},{path:"/api/key/regenerate",method:"POST",handler:GR},{path:"/api/device/approve",method:"POST",handler:zR},{path:"/api/device/reject",method:"POST",handler:VR},{path:"/api/device/pending",method:"GET",handler:KR},{path:"/api/device/approved",method:"GET",handler:YR},{path:"/api/device/rejected",method:"GET",handler:JR},{path:"/api/device/approve-rejected",method:"POST",handler:XR},{path:"/api/device/clear-rejected",method:"POST",handler:ZR},{path:"/api/device/remove",method:"POST",handler:QR},{path:"/api/device/label",method:"POST",handler:rO},{path:"/api/device/disconnect",method:"POST",handler:eO},{path:"/api/device/auto-approve",method:"GET",handler:tO},{path:"/api/device/auto-approve",method:"POST",handler:nO},{path:"/api/connections",method:"GET",handler:jw},{path:"/api/logs",method:"GET",handler:Fw},{path:"/api/permissions",method:"GET",handler:qw},{path:"/api/permissions/request",method:"POST",handler:Ww},{path:"/api/desktop/toggle",method:"POST",handler:Hw},{path:"/api/autostart",method:"GET",handler:Uw},{path:"/api/autostart",method:"POST",handler:$w},{path:"/api/sleep-inhibit",method:"GET",handler:uO},{path:"/api/sleep-inhibit",method:"POST",handler:pO},{path:"/api/sessions",method:"GET",handler:fO},{path:"/api/sessions/delete",method:"POST",handler:dO},{path:"/api/local-sites",method:"*",public:!0,handler:DR},{path:"/api/codespace/stop",method:"POST",handler:n4},{path:"/api/proxy/start",method:"POST",public:!0,handler:vO},{path:"/api/proxy/end",method:"POST",public:!0,handler:vO}];var o4=parseInt(process.env.PORT||"2208",10),qa=null;function a4(r){if(process.platform!=="win32")try{let e=(0,Pi.execSync)(`pgrep -f "vite --config ${r}"`,{encoding:"utf8"}).trim();for(let t of e.split(`
295
+ `).filter(Boolean))if((0,Pi.execSync)(`ps -o ppid= -p ${t}`,{encoding:"utf8"}).trim()==="1")try{process.kill(Number(t))}catch{}}catch{}}function c4(){if(!xO)return;let r=(0,rr.join)(Yn,"vite.config.js");if(!(0,Ii.existsSync)(r))return;a4(r);let e=(0,Ii.existsSync)((0,rr.join)(Yn,"node_modules",".bin","vite"))?(0,rr.join)(Yn,"node_modules",".bin","vite"):(0,rr.join)(Yn,"..","node_modules",".bin","vite");qa=(0,Pi.spawn)("node",[e,"--config",r],{cwd:Yn,stdio:"ignore",detached:!1}),qa.on("error",()=>{}),qa.unref()}async function bO(){let r=eh(),e=r.sleepInhibitMode;e||(r.sleepInhibit===!1?e="never":e=$.sleepInhibit?.defaultMode||"never"),Yo(e),await JT(),_O=TR(),c4();let n=Ap(s4,{fallback:(a,c,{pathname:l})=>{if(l.startsWith("/api/")||l.startsWith("/socket.io")){le(c,404,"Not found");return}let u=!!a.headers["cf-connecting-ip"],f=a.socket.remoteAddress==="127.0.0.1"||a.socket.remoteAddress==="::1";if(u||!f){le(c,403,"Forbidden");return}let h=()=>{let g=l==="/"||l===""?(0,rr.join)(Jg,"index.html"):(0,rr.join)(Jg,l);mO(c,g)||mO(c,(0,rr.join)(Jg,"index.html"))};if(xO){t4(a,c,h);return}h()}}),i=(0,ip.createServer)(async(a,c)=>{FA(c),!HA(a,c)&&await n(a,c)});Yd(),yw(),xw(),Al(),process.platform==="darwin"&&setInterval(Al,Av),await jA(i),i.listen(o4,a=>{if(a)throw a;let c="2.0.82";Xg(c),setInterval(()=>Xg(c),Fa.checkIntervalMs),QT(()=>r4(c))});let s=!1,o=async a=>{if(s)return;s=!0,ah(),Kn.info(`\u{1F6D1} Received ${a}, shutting down gracefully...`);let c=setTimeout(()=>{Kn.error("\u26A0\uFE0F Forced exit"),process.exit(1)},5e3);try{if(i.close(()=>Kn.info("\u2713 HTTP server closed")),qa)try{qa.kill()}catch{}let l=Ma();l&&(l.emit("server:shutdown"),l.close(()=>Kn.info("\u2713 Socket.IO closed"))),await new Promise(u=>setTimeout(u,500)),clearTimeout(c),Kn.info("\u2705 Server stopped cleanly"),process.exit(0)}catch(l){Kn.error(`\u274C Error during shutdown: ${l?.message||l}`),clearTimeout(c),process.exit(1)}};return process.on("SIGINT",()=>o("SIGINT")),process.on("SIGTERM",()=>o("SIGTERM")),process.platform==="win32"&&process.on("SIGBREAK",()=>o("SIGBREAK")),process.on("uncaughtException",a=>{Kn.error(`\u26A0\uFE0F uncaughtException: ${a?.stack||a}`)}),process.on("unhandledRejection",a=>{Kn.error(`\u26A0\uFE0F unhandledRejection: ${a?.stack||a}`)}),i}bO();0&&(module.exports={startServer});
296
296
  /*! Bundled license information:
297
297
 
298
298
  negotiator/index.js: