9remote 2.5.5 → 2.5.8
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 +3 -3
- package/dist/server.cjs +100 -99
- package/dist/ui/assets/index-CcS6AXZF.css +1 -0
- package/dist/ui/assets/index-H_1CAVCP.js +58 -0
- package/dist/ui/index.html +2 -2
- package/package.json +1 -1
- package/dist/ui/assets/index-CLABbREo.css +0 -1
- package/dist/ui/assets/index-MX08IV5-.js +0 -58
package/dist/cli.cjs
CHANGED
|
@@ -9,7 +9,7 @@ Right-click to open / quit`}function us(){let{port:e,tunnelUrl:n}=Jt,r=process.p
|
|
|
9
9
|
`}l||(t+=p)}else{var w=mo(Tr).times(o.getModuleCount()+3);t+=w+`
|
|
10
10
|
`,o.modules.forEach(function(R){t+=Tr,t+=R.map(Xc).join(""),t+=Tr+`
|
|
11
11
|
`}),t+=w}r?r(t):console.log(t)},setErrorLevel:function(e){this.error=Bs[e]||this.error}}});var jn=require("fs"),cn=require("path"),_o=require("url"),Po=k(require("os"),1);var Hn=k(require("dns"),1),Ce=k(require("path"),1),Eo=k(require("os"),1),ne="9remote",Ar=process.env.NREMOTE_REGISTRY||`https://registry.npmjs.org/${ne}/latest`,Le=`${ne}@latest`,Ye=Ce.default.join(Eo.default.homedir(),".9remote"),re={ROOT:Ye,LOGS:Ce.default.join(Ye,"logs"),STATE:Ce.default.join(Ye,"state"),CONFIG:Ce.default.join(Ye,"config"),BIN:Ce.default.join(Ye,"bin"),PIDS:Ce.default.join(Ye,"pids"),BUFFERS:Ce.default.join(Ye,"buffers"),DAEMON:Ce.default.join(Ye,"daemon")},So=new Hn.default.promises.Resolver;So.setServers(["1.1.1.1","1.0.0.1","8.8.8.8"]);var xr=Hn.default.lookup,pa=/^(\d{1,3}\.){3}\d{1,3}$|^::1$|^[0-9a-f:]+$/i;Hn.default.lookup=(e,n,r)=>{if(typeof n=="function"&&(r=n,n={}),e==="localhost"||pa.test(e))return xr(e,n,r);So.resolve4(e).then(o=>{if(!o?.length)return xr(e,n,r);n.all?r(null,o.map(t=>({address:t,family:4}))):r(null,o[0],4)}).catch(()=>xr(e,n,r))};var _=2208,To=process.execPath,Ro=(e=process.env)=>process.versions.electron?{...e,ELECTRON_RUN_AS_NODE:"1"}:{...e};var vo=5173;var Sl=[`http://localhost:${_}`,`http://127.0.0.1:${_}`,`http://localhost:${vo}`,`http://127.0.0.1:${vo}`],an={fileName:"agent.log",rotatedName:"agent.log.1",maxBytes:2*1024*1024,cleanupAfterDays:7},bo=60,I={STOPPED:0,PREPARING:1,CONNECTING:2,TUNNELING:3,VERIFYING:4,READY:5},xo={showTunnelUrlInMenu:!1};var Ao={CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN:"1"};var ko={checkIntervalMs:3e4,requestTimeoutMs:5e3},ae={server:{strategy:"exp",baseMs:1e3,maxMs:6e4},tunnelRestart:{strategy:"exp",baseMs:2e3,maxMs:3e5},tunnelSpawn:{strategy:"linear",baseMs:5e3,maxMs:6e4},tunnelRateLimit:{strategy:"exp",baseMs:6e4,maxMs:9e5},internet:{strategy:"linear",baseMs:3e3,maxMs:6e4},sse:{strategy:"linear",baseMs:2e3,maxMs:2e3},urlSync:{strategy:"linear",baseMs:5e3,maxMs:6e4}},da={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:{...da,...n.headers}})}var ma=(0,cn.dirname)((0,_o.fileURLToPath)(__importMetaUrl)),ha=[(0,cn.join)(Po.default.homedir(),".9remote",".env"),(0,cn.join)(ma,"..",".env")];function ga(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 ha)if((0,jn.existsSync)(e))try{ga((0,jn.readFileSync)(e,"utf8"))}catch{}for(let[e,n]of Object.entries(Ao))process.env[e]||(process.env[e]=n);var Ir=k(require("path"),1),Mo=k(require("fs"),1),Do=require("url");var Io=k(Oo(),1),_r=k(require("crypto"),1),{machineIdSync:ya}=Io.default;async function xt(e=null){let n=e||process.env.MACHINE_ID_SALT||"9remote-salt";try{let r=ya();return _r.default.createHash("sha256").update(r+n).digest("hex").substring(0,16)}catch(r){return console.error("Error getting machine ID:",r),_r.default.randomUUID().replace(/-/g,"").substring(0,16)}}var $o=k(require("crypto"),1),wa=process.env.API_KEY_SECRET||"9remote-api-key-secret";function va(){let e="abcdefghijklmnopqrstuvwxyz0123456789",n="";for(let r=0;r<4;r++)n+=e.charAt(Math.floor(Math.random()*e.length));return n}function Ea(e,n){return $o.default.createHmac("sha256",wa).update(e+n).digest("hex").slice(0,6)}function At(e){let n=e.slice(0,8),r=va(),o=Ea(n,r);return{key:`sk-${n}-${r}-${o}`,keyId:r}}function Kn(e){return!e||e.length<8?"sk-***":`${e.slice(0,3)}***${e.slice(-4)}`}var ce=k(require("fs"),1),un=k(require("path"),1);var kl=re.STATE,Pr=un.default.join(re.STATE,"state.json"),Or=un.default.join(re.ROOT,"keys.json"),Gn=un.default.join(re.STATE,"cmd.json"),_l=un.default.join(re.STATE,"settings.json");function Wn(){for(let e of[re.ROOT,re.STATE])ce.default.existsSync(e)||ce.default.mkdirSync(e,{recursive:!0})}function fn(e){try{Wn(),ce.default.writeFileSync(Pr,JSON.stringify(e,null,2),{mode:384})}catch(n){console.error("Error saving state:",n)}}function Co(){try{ce.default.existsSync(Pr)&&ce.default.unlinkSync(Pr)}catch{}}function Vn(){try{return Wn(),ce.default.existsSync(Or)?JSON.parse(ce.default.readFileSync(Or,"utf8")):{machineId:null,key:null,name:"Default",createdAt:null}}catch{return{machineId:null,key:null,name:"Default",createdAt:null}}}function kt(e){try{Wn(),ce.default.writeFileSync(Gn,JSON.stringify({cmd:e,ts:Date.now()}))}catch{}}function Lo(){try{if(!ce.default.existsSync(Gn))return null;let e=JSON.parse(ce.default.readFileSync(Gn,"utf8"));return ce.default.unlinkSync(Gn),e.cmd}catch{return null}}function ut(e,n,r="Default"){try{Wn();let o={machineId:e,key:n,name:r,createdAt:new Date().toISOString()};return ce.default.writeFileSync(Or,JSON.stringify(o,null,2),{mode:384}),o}catch(o){return console.error("Error saving key:",o),null}}function No(){return process.env.CODESPACES==="true"}var Sa=Ir.default.dirname((0,Do.fileURLToPath)(__importMetaUrl));async function qe(){let e=await xt();if(No()&&process.env.NREMOTE_API_KEY)return ut(e,process.env.NREMOTE_API_KEY,"Codespace");let n=Vn();if(!n.key){let{key:r}=At(e);n=ut(e,r,"Default")}return n}function Te(){return"2.5.
|
|
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 ha)if((0,jn.existsSync)(e))try{ga((0,jn.readFileSync)(e,"utf8"))}catch{}for(let[e,n]of Object.entries(Ao))process.env[e]||(process.env[e]=n);var Ir=k(require("path"),1),Mo=k(require("fs"),1),Do=require("url");var Io=k(Oo(),1),_r=k(require("crypto"),1),{machineIdSync:ya}=Io.default;async function xt(e=null){let n=e||process.env.MACHINE_ID_SALT||"9remote-salt";try{let r=ya();return _r.default.createHash("sha256").update(r+n).digest("hex").substring(0,16)}catch(r){return console.error("Error getting machine ID:",r),_r.default.randomUUID().replace(/-/g,"").substring(0,16)}}var $o=k(require("crypto"),1),wa=process.env.API_KEY_SECRET||"9remote-api-key-secret";function va(){let e="abcdefghijklmnopqrstuvwxyz0123456789",n="";for(let r=0;r<4;r++)n+=e.charAt(Math.floor(Math.random()*e.length));return n}function Ea(e,n){return $o.default.createHmac("sha256",wa).update(e+n).digest("hex").slice(0,6)}function At(e){let n=e.slice(0,8),r=va(),o=Ea(n,r);return{key:`sk-${n}-${r}-${o}`,keyId:r}}function Kn(e){return!e||e.length<8?"sk-***":`${e.slice(0,3)}***${e.slice(-4)}`}var ce=k(require("fs"),1),un=k(require("path"),1);var kl=re.STATE,Pr=un.default.join(re.STATE,"state.json"),Or=un.default.join(re.ROOT,"keys.json"),Gn=un.default.join(re.STATE,"cmd.json"),_l=un.default.join(re.STATE,"settings.json");function Wn(){for(let e of[re.ROOT,re.STATE])ce.default.existsSync(e)||ce.default.mkdirSync(e,{recursive:!0})}function fn(e){try{Wn(),ce.default.writeFileSync(Pr,JSON.stringify(e,null,2),{mode:384})}catch(n){console.error("Error saving state:",n)}}function Co(){try{ce.default.existsSync(Pr)&&ce.default.unlinkSync(Pr)}catch{}}function Vn(){try{return Wn(),ce.default.existsSync(Or)?JSON.parse(ce.default.readFileSync(Or,"utf8")):{machineId:null,key:null,name:"Default",createdAt:null}}catch{return{machineId:null,key:null,name:"Default",createdAt:null}}}function kt(e){try{Wn(),ce.default.writeFileSync(Gn,JSON.stringify({cmd:e,ts:Date.now()}))}catch{}}function Lo(){try{if(!ce.default.existsSync(Gn))return null;let e=JSON.parse(ce.default.readFileSync(Gn,"utf8"));return ce.default.unlinkSync(Gn),e.cmd}catch{return null}}function ut(e,n,r="Default"){try{Wn();let o={machineId:e,key:n,name:r,createdAt:new Date().toISOString()};return ce.default.writeFileSync(Or,JSON.stringify(o,null,2),{mode:384}),o}catch(o){return console.error("Error saving key:",o),null}}function No(){return process.env.CODESPACES==="true"}var Sa=Ir.default.dirname((0,Do.fileURLToPath)(__importMetaUrl));async function qe(){let e=await xt();if(No()&&process.env.NREMOTE_API_KEY)return ut(e,process.env.NREMOTE_API_KEY,"Codespace");let n=Vn();if(!n.key){let{key:r}=At(e);n=ut(e,r,"Default")}return n}function Te(){return"2.5.8"}var Re=k(require("fs"),1),$r=k(require("path"),1);var qn=re.LOGS,pn=$r.default.join(qn,an.fileName),Qn=$r.default.join(qn,an.rotatedName),Uo=!1,Fo=null;function Ta(){Re.default.existsSync(qn)||Re.default.mkdirSync(qn,{recursive:!0})}function Ra(){try{if(Re.default.statSync(pn).size<an.maxBytes)return;try{Re.default.rmSync(Qn,{force:!0})}catch{}Re.default.renameSync(pn,Qn)}catch{}}function ba(){try{let e=Re.default.statSync(Qn);Date.now()-e.mtimeMs>an.cleanupAfterDays*864e5&&Re.default.rmSync(Qn,{force:!0})}catch{}}function Cr(e){try{Ra(),Re.default.appendFileSync(pn,e+`
|
|
13
13
|
`)}catch{}}function Yn(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 Bo(){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 xa=/\x1b\[[0-9;]*m/g,Aa=/https?:\/\/[^\s]+/g;function ka(e){return String(e).replace(xa,"").replace(Aa,"").replace(/\s+$/g,"")}function _t(e,n,r){let o=ka(r);if(!o)return;let t=n==="info"?e:`${e}:${n}`,i=`${Bo()} [${t}] ${o}`;if(Cr(i),Fo)try{Fo(i)}catch{}}function _a(){process.on("uncaughtException",e=>_t("crash","error",`uncaughtException: ${e?.stack||e?.message||e}`)),process.on("unhandledRejection",e=>{let n=e instanceof Error?e.stack||e.message:String(e);_t("crash","error",`unhandledRejection: ${n}`)}),process.on("exit",e=>Cr(`${Bo()} [exit] code=${e} pid=${process.pid}`))}function Ho(){Uo||(Uo=!0,Ta(),ba(),Cr(`
|
|
14
14
|
=== SESSION ${new Date().toISOString()} pid=${process.pid} argv=${process.argv.slice(2).join(" ")} ===`),_a())}function jo(e=60){try{return Re.default.readFileSync(pn,"utf8").split(`
|
|
15
15
|
`).filter(Boolean).slice(-e)}catch{return[]}}var Pa=process.env.NODE_ENV==="development"||process.env.AGENT_DEBUG==="1";function j(e){return{debug:(...n)=>{Pa&&_t(e,"debug",Yn(n))},info:(...n)=>_t(e,"info",Yn(n)),warn:(...n)=>_t(e,"warn",Yn(n)),error:(...n)=>_t(e,"error",Yn(n))}}var dn=pn;var Ko=(e=0)=>n=>`\x1B[${n+e}m`,Go=(e=0)=>n=>`\x1B[${38+e};5;${n}m`,Wo=(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]}},Ul=Object.keys(M.modifier),Oa=Object.keys(M.color),Ia=Object.keys(M.bgColor),Fl=[...Oa,...Ia];function $a(){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=Ko(),M.color.ansi256=Go(),M.color.ansi16m=Wo(),M.bgColor.ansi=Ko(10),M.bgColor.ansi256=Go(10),M.bgColor.ansi16m=Wo(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 Ca=$a(),ge=Ca;var Xn=k(require("node:process"),1),Yo=k(require("node:os"),1),Lr=k(require("node:tty"),1);function ue(e,n=globalThis.Deno?globalThis.Deno.args:Xn.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:D}=Xn.default,Jn;ue("no-color")||ue("no-colors")||ue("color=false")||ue("color=never")?Jn=0:(ue("color")||ue("colors")||ue("color=true")||ue("color=always"))&&(Jn=1);function La(){if("FORCE_COLOR"in D)return D.FORCE_COLOR==="true"?1:D.FORCE_COLOR==="false"?0:D.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(D.FORCE_COLOR,10),3)}function Na(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function Ma(e,{streamIsTTY:n,sniffFlags:r=!0}={}){let o=La();o!==void 0&&(Jn=o);let t=r?Jn: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 D&&"AGENT_NAME"in D)return 1;if(e&&!n&&t===void 0)return 0;let i=t||0;if(D.TERM==="dumb")return i;if(Xn.default.platform==="win32"){let s=Yo.default.release().split(".");return Number(s[0])>=10&&Number(s[2])>=10586?Number(s[2])>=14931?3:2:1}if("CI"in D)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(s=>s in D)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(s=>s in D)||D.CI_NAME==="codeship"?1:i;if("TEAMCITY_VERSION"in D)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(D.TEAMCITY_VERSION)?1:0;if(D.COLORTERM==="truecolor"||D.TERM==="xterm-kitty"||D.TERM==="xterm-ghostty"||D.TERM==="wezterm")return 3;if("TERM_PROGRAM"in D){let s=Number.parseInt((D.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(D.TERM_PROGRAM){case"iTerm.app":return s>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(D.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(D.TERM)||"COLORTERM"in D?1:i}function Vo(e,n={}){let r=Ma(e,{streamIsTTY:e&&e.isTTY,...n});return Na(r)}var Da={stdout:Vo({isTTY:Lr.default.isatty(1)}),stderr:Vo({isTTY:Lr.default.isatty(2)})},qo=Da;function Qo(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 Jo(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:${nr}
|
|
|
71
71
|
|
|
72
72
|
[Install]
|
|
73
73
|
WantedBy=default.target
|
|
74
|
-
`}function ec(e){try{return(0,dt.execFileSync)("systemctl",["--user",...e],{stdio:"ignore"}),!0}catch{return!1}}function tc(){return(0,L.existsSync)(X.linux)||(0,L.existsSync)(X.linuxSystemd)}async function nc(){try{if(process.platform==="darwin")return qa();if(process.platform==="win32")return await Xa();if(process.platform==="linux")return tc()}catch{}return!1}async function li(){try{if(process.platform==="win32"&&Ja(),!await nc())return!1;if(process.platform==="darwin"){let e=Ya(xe(),Je());return((0,L.existsSync)(X.darwin)?(0,L.readFileSync)(X.darwin,"utf8"):"")===e?!1:((0,L.writeFileSync)(X.darwin,e),!0)}if(process.platform==="win32"){let e=Qa();return((0,L.existsSync)(X.win)?(0,L.readFileSync)(X.win,"utf8"):"")===e?!1:((0,L.writeFileSync)(X.win,e),!0)}if(process.platform==="linux"){if((0,L.existsSync)(X.linuxSystemd)){let e=za();return(0,L.readFileSync)(X.linuxSystemd,"utf8")===e?!1:((0,L.writeFileSync)(X.linuxSystemd,e),ec(["daemon-reload"]),!0)}if((0,L.existsSync)(X.linux)){let e=Za();return(0,L.readFileSync)(X.linux,"utf8")===e?!1:((0,L.writeFileSync)(X.linux,e),!0)}}}catch{}return!1}var Zl=process.env.NODE_ENV==="development";var C=process.env.NREMOTE_WORKER_URL||"https://9remote.cc",ui=3e4,fi=500,jr=300,ye={cmdMs:1e3,pendingApprovalMs:3e3,statsMs:5e3,serverReadyIntervalMs:200,serverReadyTimeoutMs:5e3,bgServerReadyTimeoutMs:15e3,bgServerReadyIntervalMs:300},Xe={intervalMs:2e3,timeoutMs:12e4,fetchTimeoutMs:5e3,dnsTimeoutMs:2e3,maxLogEntries:80,postReadyHoldMs:2e3},fe={killCloudflaredMs:500,killCloudflaredTuiMs:300,serverBootMs:2e3,trayReadyMs:1e3,postReadyHoldMs:2e3,bgSpawnFlushMs:400};var Ne={maxLogLines:200,headerWidth:44},Ct={checkIntervalMs:36e5,connectCheckDebounceMs:9e5,maxRetry:3,retryDelayMs:3e3,verifyTimeoutMs:15e3,lockTtlMs:3e5,lockFile:"update.lock"},pi=5e3,di=2,mi=3e4,oe={orange:m.rgb(230,138,110),orangeDim:m.rgb(200,120,95)};var rc=Ae.default.dirname((0,hi.fileURLToPath)(__importMetaUrl)),gi=3e3;var sr=2208,Kr=Ae.default.join(Lt.default.homedir(),".9remote","cloudflared.pid");function oc(){try{ni()}catch{}try{if((0,W.existsSync)(Kr)){let e=parseInt((0,W.readFileSync)(Kr,"utf8"));if(Number.isFinite(e))try{process.kill(e)}catch{}try{(0,W.unlinkSync)(Kr)}catch{}}}catch{}try{process.platform==="win32"?(0,yn.execSync)(`for /f "tokens=5" %a in ('netstat -aon ^| findstr :${sr}') do taskkill /F /PID %a`,{stdio:"ignore",windowsHide:!0}):(0,yn.execSync)(`lsof -ti:${sr} | xargs kill -9 2>/dev/null || true`,{stdio:"ignore"})}catch{}if(process.platform==="win32"){let e=Date.now()+1500;for(;Date.now()<e;);}}function yi(){return"2.5.
|
|
74
|
+
`}function ec(e){try{return(0,dt.execFileSync)("systemctl",["--user",...e],{stdio:"ignore"}),!0}catch{return!1}}function tc(){return(0,L.existsSync)(X.linux)||(0,L.existsSync)(X.linuxSystemd)}async function nc(){try{if(process.platform==="darwin")return qa();if(process.platform==="win32")return await Xa();if(process.platform==="linux")return tc()}catch{}return!1}async function li(){try{if(process.platform==="win32"&&Ja(),!await nc())return!1;if(process.platform==="darwin"){let e=Ya(xe(),Je());return((0,L.existsSync)(X.darwin)?(0,L.readFileSync)(X.darwin,"utf8"):"")===e?!1:((0,L.writeFileSync)(X.darwin,e),!0)}if(process.platform==="win32"){let e=Qa();return((0,L.existsSync)(X.win)?(0,L.readFileSync)(X.win,"utf8"):"")===e?!1:((0,L.writeFileSync)(X.win,e),!0)}if(process.platform==="linux"){if((0,L.existsSync)(X.linuxSystemd)){let e=za();return(0,L.readFileSync)(X.linuxSystemd,"utf8")===e?!1:((0,L.writeFileSync)(X.linuxSystemd,e),ec(["daemon-reload"]),!0)}if((0,L.existsSync)(X.linux)){let e=Za();return(0,L.readFileSync)(X.linux,"utf8")===e?!1:((0,L.writeFileSync)(X.linux,e),!0)}}}catch{}return!1}var Zl=process.env.NODE_ENV==="development";var C=process.env.NREMOTE_WORKER_URL||"https://9remote.cc",ui=3e4,fi=500,jr=300,ye={cmdMs:1e3,pendingApprovalMs:3e3,statsMs:5e3,serverReadyIntervalMs:200,serverReadyTimeoutMs:5e3,bgServerReadyTimeoutMs:15e3,bgServerReadyIntervalMs:300},Xe={intervalMs:2e3,timeoutMs:12e4,fetchTimeoutMs:5e3,dnsTimeoutMs:2e3,maxLogEntries:80,postReadyHoldMs:2e3},fe={killCloudflaredMs:500,killCloudflaredTuiMs:300,serverBootMs:2e3,trayReadyMs:1e3,postReadyHoldMs:2e3,bgSpawnFlushMs:400};var Ne={maxLogLines:200,headerWidth:44},Ct={checkIntervalMs:36e5,connectCheckDebounceMs:9e5,maxRetry:3,retryDelayMs:3e3,verifyTimeoutMs:15e3,lockTtlMs:3e5,lockFile:"update.lock"},pi=5e3,di=2,mi=3e4,oe={orange:m.rgb(230,138,110),orangeDim:m.rgb(200,120,95)};var rc=Ae.default.dirname((0,hi.fileURLToPath)(__importMetaUrl)),gi=3e3;var sr=2208,Kr=Ae.default.join(Lt.default.homedir(),".9remote","cloudflared.pid");function oc(){try{ni()}catch{}try{if((0,W.existsSync)(Kr)){let e=parseInt((0,W.readFileSync)(Kr,"utf8"));if(Number.isFinite(e))try{process.kill(e)}catch{}try{(0,W.unlinkSync)(Kr)}catch{}}}catch{}try{process.platform==="win32"?(0,yn.execSync)(`for /f "tokens=5" %a in ('netstat -aon ^| findstr :${sr}') do taskkill /F /PID %a`,{stdio:"ignore",windowsHide:!0}):(0,yn.execSync)(`lsof -ti:${sr} | xargs kill -9 2>/dev/null || true`,{stdio:"ignore"})}catch{}if(process.platform==="win32"){let e=Date.now()+1500;for(;Date.now()<e;);}}function yi(){return"2.5.8"}function wi(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 ic(){return process.env.CODESPACES==="true"||process.env.GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN?"GitHub Codespaces":(0,W.existsSync)("/.dockerenv")?"Docker":null}function ar(){oc()}async function vi(){try{let e=yi();if(!e)return null;let n=await G(Ar,{signal:AbortSignal.timeout(gi)});if(!n.ok)return null;let{version:r}=await n.json();return r&&wi(e,r)?{current:e,latest:r}:null}catch{return null}}var ir=Ae.default.join(re.STATE,Ct.lockFile);function sc(){try{if((0,W.existsSync)(ir)){let{pid:e,ts:n}=JSON.parse((0,W.readFileSync)(ir,"utf8")),r=Date.now()-n<Ct.lockTtlMs,o=!1;try{process.kill(e,0),o=!0}catch{}if(r&&o)return!1}}catch{}try{(0,W.writeFileSync)(ir,JSON.stringify({pid:process.pid,ts:Date.now()}))}catch{}return!0}async function ac(){try{let e=await G(Ar,{signal:AbortSignal.timeout(gi)});if(!e.ok)return null;let{version:n}=await e.json();return n||null}catch{return null}}function cc(){try{if(process.env.NREMOTE_REGISTRY)return`--registry ${new URL(process.env.NREMOTE_REGISTRY).origin}`}catch{}return""}function lc(){let e=Je(),n=Ae.default.sep;for(let r of[`${n}lib${n}node_modules${n}`,`${n}node_modules${n}`]){let o=e.indexOf(r);if(o>0)return`--prefix "${e.slice(0,o)}"`}return""}function uc(){let e=process.env.NREMOTE_NPM_CLI;return e&&(0,W.existsSync)(e)?process.platform==="win32"?`"${xe()}" "${e}"`:`env ELECTRON_RUN_AS_NODE=1 "${xe()}" "${e}"`:"npm"}function fc({currentVersion:e,latest:n,agentPid:r}){let o=ri(),t=cc(),i=xe(),s=si(),a=Je(),c=ir,l=`--prefer-online --no-audit --no-fund ${t} ${lc()}`.trim(),u=uc();if(process.platform==="win32"){let d=Ae.default.join(Lt.default.tmpdir(),`${ne}-restart.vbs`),h=`@echo off
|
|
75
75
|
setlocal EnableDelayedExpansion
|
|
76
76
|
set "NODE=${i}"
|
|
77
77
|
set "CLI=${a}"
|
|
@@ -202,7 +202,7 @@ QR expires in 30 minutes (one-time use)
|
|
|
202
202
|
`))):i.push(m.gray(`
|
|
203
203
|
(One-time key used \u2014 generate a new one from menu)
|
|
204
204
|
`)),i.push(oe.orange("\u2550".repeat(t)),m.white("App URL".padEnd(14))+m.gray(`${C}/login`)),xo.showTunnelUrlInMenu&&i.push(m.white("Tunnel".padEnd(14))+(o?m.cyan(o):m.gray("\u2014"))),i.push(m.white("One-Time Key".padEnd(14))+(e?oe.orange.bold(e)+m.dim(" (expires in 30m)"):m.gray("\u2014")),m.white("Key".padEnd(14))+m.dim(n),oe.orange("\u2550".repeat(t))),i.join(`
|
|
205
|
-
`)}var Ge=j("cmd");function st(e,n,r,o){let t=!1;setInterval(async()=>{if(t)return;let i=Lo();if(i){t=!0;try{if(i==="stop-tunnel")await Ks(e,n);else if(i==="restart-tunnel")await Ks(e,n),await Gs(e,n,r);else if(i==="start-tunnel"){if(await Gs(e,n,r)==="alreadyRunning"){t=!1;return}}else i==="regenerate-key"?await ol():i==="shutdown"?il(e,n):i==="update"?await Ei():i==="restart"&&gs(o?.())}catch(s){Ge.error(`cmd "${i}" failed: ${s?.message||s}`)}finally{t=!1}}},ye.cmdMs)}async function Ks(e,n){Ke(),Tn();let r=e();r&&(r.kill(),n(null),Ge.info("Tunnel stopped")),await B(I.STOPPED,{tunnelUrl:"",oneTimeKey:"",oneTimeKeyExpiresAt:null}),yr({tunnelUrl:"",running:!0})}async function Gs(e,n,r){let o=e();if(o)if(o.killed||o.exitCode!=null)n(null);else{let t=await V("/api/ui/state");return await B(I.READY,{tunnelUrl:t?.tunnelUrl||""}),"alreadyRunning"}Ke(),Ge.info("Starting...");try{await B(I.PREPARING),await In(dr),await B(I.CONNECTING);let t=await G(`${C}/api/session/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:r})});if(!t.ok)throw new Error(`Session create failed: ${t.status}`);await B(I.TUNNELING);let i=async l=>{await Et(r,l),await U({tunnelUrl:l}),jt(l),yr({tunnelUrl:l,running:!0})},s=({attempt:l,delay:u})=>{U({tunnelRetry:{attempt:l,delay:u,at:Date.now()}})},a=null;try{a=await Fe(_,i,je({onUrlUpdate:i,setTunnel:l=>n(l),onRetry:s}))}catch(l){Ge.error(`Tunnel spawn failed: ${l?.message||l} \u2014 QR RTC-only, bg retry`)}U({tunnelRetry:null});let c="";a&&(n(a.child),c=a.tunnelUrl,await B(I.VERIFYING),await rt(c)||(Ge.warn("Tunnel health check timed out \u2014 bg reconnect"),c="",n(null),a=null)),await Rr(r,c),a||Zt(_,{onUrlUpdate:i,onRestart:je({onUrlUpdate:i,setTunnel:l=>n(l),onRetry:s}),setActiveTunnel:n,onReady:async l=>{await B(I.READY,{tunnelUrl:l.tunnelUrl})}})}catch(t){Ge.error(`Failed to start: ${t.message}`),await B(I.STOPPED)}}async function ol(){let e=await xt(),{key:n}=At(e),r=Vn();ut(e,n,r?.name||"Default"),await U({permanentKey:n}),Ge.info(`Key regenerated: ${Kn(n)}`)}function il(e,n){Ke(),Ge.info("Shutting down 9Remote completely...");let r=e();n(null),wt({tunnelProcess:r}),Ge.info("9Remote stopped")}async function Ws(){Qe("agent",process.pid),Mt(Te());let e=await qe(),n=process.argv.find(a=>a.startsWith("--theme=")),r=n?n.split("=")[1]:null,o=await ie(),t=o?{getProcess:()=>null,shutdown:()=>{}}:tt(null,null);o||await new Promise(a=>setTimeout(a,fe.serverBootMs));let i=`http://localhost:${_}`;console.log(m.green(`
|
|
205
|
+
`)}var Ge=j("cmd");function st(e,n,r,o){let t=!1;setInterval(async()=>{if(t)return;let i=Lo();if(i){t=!0;try{if(i==="stop-tunnel")await Ks(e,n);else if(i==="restart-tunnel")await Ks(e,n),await Gs(e,n,r);else if(i==="start-tunnel"){if(await Gs(e,n,r)==="alreadyRunning"){t=!1;return}}else i==="regenerate-key"?await ol():i==="shutdown"?il(e,n):i==="update"?await Ei():i==="restart"&&gs(o?.())}catch(s){Ge.error(`cmd "${i}" failed: ${s?.message||s}`)}finally{t=!1}}},ye.cmdMs)}async function Ks(e,n){Ke(),Tn();let r=e();r&&(r.kill(),n(null),Ge.info("Tunnel stopped")),await B(I.STOPPED,{tunnelUrl:"",oneTimeKey:"",oneTimeKeyExpiresAt:null,qrUrl:""}),yr({tunnelUrl:"",running:!0})}async function Gs(e,n,r){let o=e();if(o)if(o.killed||o.exitCode!=null)n(null);else{let t=await V("/api/ui/state");return await B(I.READY,{tunnelUrl:t?.tunnelUrl||""}),"alreadyRunning"}Ke(),Ge.info("Starting...");try{await B(I.PREPARING),await In(dr),await B(I.CONNECTING);let t=await G(`${C}/api/session/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:r})});if(!t.ok)throw new Error(`Session create failed: ${t.status}`);await B(I.TUNNELING);let i=async l=>{await Et(r,l),await U({tunnelUrl:l}),jt(l),yr({tunnelUrl:l,running:!0})},s=({attempt:l,delay:u})=>{U({tunnelRetry:{attempt:l,delay:u,at:Date.now()}})},a=null;try{a=await Fe(_,i,je({onUrlUpdate:i,setTunnel:l=>n(l),onRetry:s}))}catch(l){Ge.error(`Tunnel spawn failed: ${l?.message||l} \u2014 QR RTC-only, bg retry`)}U({tunnelRetry:null});let c="";a&&(n(a.child),c=a.tunnelUrl,await B(I.VERIFYING),await rt(c)||(Ge.warn("Tunnel health check timed out \u2014 bg reconnect"),c="",n(null),a=null)),await Rr(r,c),a||Zt(_,{onUrlUpdate:i,onRestart:je({onUrlUpdate:i,setTunnel:l=>n(l),onRetry:s}),setActiveTunnel:n,onReady:async l=>{await B(I.READY,{tunnelUrl:l.tunnelUrl})}})}catch(t){Ge.error(`Failed to start: ${t.message}`),await B(I.STOPPED)}}async function ol(){let e=await xt(),{key:n}=At(e),r=Vn();ut(e,n,r?.name||"Default"),await U({permanentKey:n}),Ge.info(`Key regenerated: ${Kn(n)}`)}function il(e,n){Ke(),Ge.info("Shutting down 9Remote completely...");let r=e();n(null),wt({tunnelProcess:r}),Ge.info("9Remote stopped")}async function Ws(){Qe("agent",process.pid),Mt(Te());let e=await qe(),n=process.argv.find(a=>a.startsWith("--theme=")),r=n?n.split("=")[1]:null,o=await ie(),t=o?{getProcess:()=>null,shutdown:()=>{}}:tt(null,null);o||await new Promise(a=>setTimeout(a,fe.serverBootMs));let i=`http://localhost:${_}`;console.log(m.green(`
|
|
206
206
|
\u{1F310} UI ready at ${i}`));let s=null;await U({permanentKey:e.key,step:I.STOPPED,theme:r}),nt(t,null),st(()=>s,a=>{s=a},e.key,()=>t),process.argv.includes("--start")&&kt("start-tunnel"),await new Promise(()=>{})}Xt();async function Vs(){Qe("agent",process.pid),li().catch(()=>{});let e=await qe(),n=process.argv.find(l=>l.startsWith("--theme=")),r=n?n.split("=")[1]:null,o=await ie(),t=o?{getProcess:()=>null,shutdown:()=>{}}:tt(null,null);o||await new Promise(l=>setTimeout(l,fe.serverBootMs));let i=`http://localhost:${_}`,s=null;await U({permanentKey:e.key,step:I.STOPPED,theme:r});let a=()=>{let l=s;s=null,wt({serverManager:t,tunnelProcess:l,exit:!1})};nt(t,null),st(()=>s,l=>{s=l},e.key,()=>t);try{be("cloudflared")}catch{}process.argv.includes("--start")&&kt("start-tunnel"),await io({port:_,onQuit:a,onOpenUI:()=>Cn(i)})&&so({title:"9Remote is running",message:`Open ${i} or use the tray icon to manage.`}),await new Promise(()=>{})}var at=j("mode");async function sl(e){at.info("Starting server..."),await B(I.PREPARING);try{ve(),await new Promise(a=>setTimeout(a,fe.killCloudflaredMs))}catch{}try{let a=await G(`${C}/api/session/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e})});if(!a.ok)return at.error(`Session create failed: ${a.status}`),null}catch(a){return at.error(`Session create failed: ${a.message}`),null}let n=await ie(),r=n?{getProcess:()=>null,shutdown:()=>{}}:tt(null,null);n||await new Promise(a=>setTimeout(a,fe.serverBootMs)),at.info("Starting tunnel..."),await B(I.CONNECTING);let o={current:null},t="",i=async a=>{at.info(`Tunnel URL rotated: ${a}`),await Et(e,a),U({tunnelUrl:a}),jt(a)},s=null;try{s=await Fe(_,i,je({onUrlUpdate:i,setTunnel:a=>{o.current=a}}))}catch(a){at.error(`Tunnel spawn failed: ${a.message} \u2014 RTC-only, bg retry`)}return s&&(o.current=s.child,t=s.tunnelUrl,await rt(t)||(at.warn("Tunnel health check timed out \u2014 bg reconnect"),o.current=null,t="",s=null)),s||Zt(_,{onUrlUpdate:i,onRestart:je({onUrlUpdate:i,setTunnel:a=>{o.current=a}}),setActiveTunnel:a=>{o.current=a},onReady:async a=>{await B(I.READY,{tunnelUrl:a.tunnelUrl})}}),t&&await Et(e,t),fn({apiKey:e,tunnelUrl:t,serverPid:r.getProcess()?.pid,tunnelPid:o.current?.pid}),{serverManager:r,tunnelRef:o,tunnelUrl:t}}async function Ys(){Mt(Te());let e=await qe();at.info(`Using key: ${Kn(e.key)} (${e.name})`);let n=await sl(e.key);n||process.exit(1);let{serverManager:r,tunnelRef:o,tunnelUrl:t}=n;await Rr(e.key,t),nt(r,o.current),st(()=>o.current,s=>{o.current=s},e.key);let i=Date.now();setInterval(()=>{let s=Math.floor((Date.now()-i)/1e3),a=Math.floor(s/3600),c=Math.floor(s%3600/60),l=s%60;U({uptime:`${a}:${String(c).padStart(2,"0")}:${String(l).padStart(2,"0")}`})},ye.statsMs),await new Promise(()=>{})}var qs=k(require("path"),1),Qs=k(require("fs"),1);Xt();async function Js(){let e=`http://localhost:${_}`;await ie()&&(wr(_),await new Promise(c=>setTimeout(c,500)));let n=["--tray"],r=process.argv.find(c=>c.startsWith("--theme="));r&&n.push(r);let o=dn;try{Qs.default.mkdirSync(qs.default.dirname(o),{recursive:!0})}catch{}let t=null;try{t=ai(n),t&&Qe("agent",t)}catch(c){console.log(m.red(`
|
|
207
207
|
\u274C Failed to launch background: ${c.message}`)),process.exit(1)}let i=Date.now()+ye.bgServerReadyTimeoutMs,s=!1;for(;Date.now()<i;){if(await ie()){s=!0;break}await new Promise(c=>setTimeout(c,ye.bgServerReadyIntervalMs))}s||(console.log(m.red(`
|
|
208
208
|
\u274C Background server failed to start.`)),console.log(m.gray(` Check log: ${o}
|