9remote 0.1.32 → 0.1.34

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
@@ -61,34 +61,54 @@ ${N6.default.cursorShow}`)}releaseCursor(){this.extraLinesUnderPrompt>0&&Af(this
61
61
  `:`
62
62
  `)+t,i=n+1,n=r.indexOf(`
63
63
  `,i)}while(n!==-1);return o+=r.slice(i),o}var{stdout:by,stderr:my}=hy,Xd=Symbol("GENERATOR"),ei=Symbol("STYLER"),lo=Symbol("IS_EMPTY"),yy=["ansi","ansi","ansi256","ansi16m"],ri=Object.create(null),nR=(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=by?by.level:0;r.level=e.level===void 0?t:e.level};var iR=r=>{let e=(...t)=>t.join(" ");return nR(e,r),Object.setPrototypeOf(e,fo.prototype),e};function fo(r){return iR(r)}Object.setPrototypeOf(fo.prototype,Function.prototype);for(let[r,e]of Object.entries(Ze))ri[r]={get(){let t=Qs(this,ex(e.open,e.close,this[ei]),this[lo]);return Object.defineProperty(this,r,{value:t}),t}};ri.visible={get(){let r=Qs(this,this[ei],!0);return Object.defineProperty(this,"visible",{value:r}),r}};var Zd=(r,e,t,...n)=>r==="rgb"?e==="ansi16m"?Ze[t].ansi16m(...n):e==="ansi256"?Ze[t].ansi256(Ze.rgbToAnsi256(...n)):Ze[t].ansi(Ze.rgbToAnsi(...n)):r==="hex"?Zd("rgb",e,t,...Ze.hexToRgb(...n)):Ze[t][r](...n),oR=["rgb","hex","ansi256"];for(let r of oR){ri[r]={get(){let{level:t}=this;return function(...n){let i=ex(Zd(r,yy[t],"color",...n),Ze.color.close,this[ei]);return Qs(this,i,this[lo])}}};let e="bg"+r[0].toUpperCase()+r.slice(1);ri[e]={get(){let{level:t}=this;return function(...n){let i=ex(Zd(r,yy[t],"bgColor",...n),Ze.bgColor.close,this[ei]);return Qs(this,i,this[lo])}}}}var aR=Object.defineProperties(()=>{},{...ri,level:{enumerable:!0,get(){return this[Xd].level},set(r){this[Xd].level=r}}}),ex=(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}},Qs=(r,e,t)=>{let n=(...i)=>uR(n,i.length===1?""+i[0]:i.join(" "));return Object.setPrototypeOf(n,aR),n[Xd]=r,n[ei]=e,n[lo]=t,n},uR=(r,e)=>{if(r.level<=0||!e)return r[lo]?"":e;let t=r[ei];if(t===void 0)return e;let{openAll:n,closeAll:i}=t;if(e.includes("\x1B"))for(;t!==void 0;)e=py(e,t.close,t.open),t=t.parent;let o=e.indexOf(`
64
- `);return o!==-1&&(e=vy(e,i,n,o)),n+e+i};Object.defineProperties(fo.prototype,ri);var sR=fo(),v$=fo({level:my?my.level:0});var A=sR;var c_=O(Vy(),1),oi=require("child_process"),Wt=O(require("path"),1),l_=require("url"),sc=O(require("fs"),1),f_=O(require("dns/promises"),1);var Ky=O($y(),1),ux=O(require("crypto"),1),{machineIdSync:bR}=Ky.default;async function ec(r=null){let e=r||process.env.MACHINE_ID_SALT||"9remote-salt";try{let t=bR();return ux.default.createHash("sha256").update(t+e).digest("hex").substring(0,16)}catch(t){return console.error("Error getting machine ID:",t),ux.default.randomUUID().replace(/-/g,"").substring(0,16)}}var Gy=O(require("crypto"),1),mR=process.env.API_KEY_SECRET||"9remote-api-key-secret";function yR(){let r="abcdefghijklmnopqrstuvwxyz0123456789",e="";for(let t=0;t<6;t++)e+=r.charAt(Math.floor(Math.random()*r.length));return e}function _R(r,e){return Gy.default.createHmac("sha256",mR).update(r+e).digest("hex").slice(0,8)}function ho(r){let e=yR(),t=_R(r,e);return{key:`sk-${r}-${e}-${t}`,keyId:e}}var Cr=O(require("fs"),1),tc=O(require("path"),1),Hy=O(require("os"),1),rc=tc.default.join(Hy.default.homedir(),".9remote"),sx=tc.default.join(rc,"state.json"),cx=tc.default.join(rc,"keys.json");function lx(){Cr.default.existsSync(rc)||Cr.default.mkdirSync(rc,{recursive:!0})}function Yy(r){try{lx(),Cr.default.writeFileSync(sx,JSON.stringify(r,null,2))}catch(e){console.error("Error saving state:",e)}}function zy(){try{Cr.default.existsSync(sx)&&Cr.default.unlinkSync(sx)}catch{}}function nc(){try{return lx(),Cr.default.existsSync(cx)?JSON.parse(Cr.default.readFileSync(cx,"utf8")):{machineId:null,key:null,name:"Default",createdAt:null}}catch{return{machineId:null,key:null,name:"Default",createdAt:null}}}function po(r,e,t="Default"){try{lx();let n={machineId:r,key:e,name:t,createdAt:new Date().toISOString()};return Cr.default.writeFileSync(cx,JSON.stringify(n,null,2)),n}catch(n){return console.error("Error saving key:",n),null}}async function fx(r,e){try{let t=await fetch(`${e}/api/temp-key/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:r,expiryMinutes:30})});if(!t.ok){let n=await t.json();throw new Error(n.error||"Failed to create temp key")}return await t.json()}catch(t){return console.error("Error creating temp key:",t),null}}var Nt=require("fs"),Qy=require("url"),Jy=require("child_process"),vo=O(require("path"),1),dx=O(require("os"),1),gR=vo.default.dirname((0,Qy.fileURLToPath)(__importMetaUrl)),Pe="9remote",DR=`https://registry.npmjs.org/${Pe}/latest`,wR=3e3,ER=8e3;function SR(){return"0.1.32"}function OR(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}function FR(){return process.env.CODESPACES==="true"||process.env.GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN?"GitHub Codespaces":(0,Nt.existsSync)("/.dockerenv")?"Docker":null}async function Xy(r=!1){if(r)return!1;let e=SR();if(!e)return!1;let t=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],n=0,i=null,o=u=>{process.stdout.isTTY&&(process.stdout.write(`\r${t[0]} ${u}`),i=setInterval(()=>{process.stdout.write(`\r${t[n++%t.length]} ${u}`)},80))},a=()=>{i&&(clearInterval(i),i=null),process.stdout.isTTY&&process.stdout.write("\r\x1B[K")};return new Promise(u=>{let s=!1,c=x=>{s||(s=!0,a(),u(x))},l=setTimeout(()=>c(!1),ER);o("Checking for updates..."),fetch(DR,{signal:AbortSignal.timeout(wR)}).then(x=>x.json()).then(x=>{if(s)return;clearTimeout(l);let h=x.version;if(!h||!OR(e,h)){c(!1);return}a(),console.log(A.green(`\u2705 New version available: ${e} \u2192 ${h}`));let p=FR();if(p){console.log(A.yellow(` \u26A0\uFE0F ${p} detected - manual update required`)),console.log(A.gray(` Run: npm install -g ${Pe}@latest
64
+ `);return o!==-1&&(e=vy(e,i,n,o)),n+e+i};Object.defineProperties(fo.prototype,ri);var sR=fo(),v$=fo({level:my?my.level:0});var A=sR;var c_=O(Vy(),1),oi=require("child_process"),Wt=O(require("path"),1),l_=require("url"),sc=O(require("fs"),1),f_=O(require("dns/promises"),1);var Ky=O($y(),1),ux=O(require("crypto"),1),{machineIdSync:bR}=Ky.default;async function ec(r=null){let e=r||process.env.MACHINE_ID_SALT||"9remote-salt";try{let t=bR();return ux.default.createHash("sha256").update(t+e).digest("hex").substring(0,16)}catch(t){return console.error("Error getting machine ID:",t),ux.default.randomUUID().replace(/-/g,"").substring(0,16)}}var Gy=O(require("crypto"),1),mR=process.env.API_KEY_SECRET||"9remote-api-key-secret";function yR(){let r="abcdefghijklmnopqrstuvwxyz0123456789",e="";for(let t=0;t<6;t++)e+=r.charAt(Math.floor(Math.random()*r.length));return e}function _R(r,e){return Gy.default.createHmac("sha256",mR).update(r+e).digest("hex").slice(0,8)}function ho(r){let e=yR(),t=_R(r,e);return{key:`sk-${r}-${e}-${t}`,keyId:e}}var Cr=O(require("fs"),1),tc=O(require("path"),1),Hy=O(require("os"),1),rc=tc.default.join(Hy.default.homedir(),".9remote"),sx=tc.default.join(rc,"state.json"),cx=tc.default.join(rc,"keys.json");function lx(){Cr.default.existsSync(rc)||Cr.default.mkdirSync(rc,{recursive:!0})}function Yy(r){try{lx(),Cr.default.writeFileSync(sx,JSON.stringify(r,null,2))}catch(e){console.error("Error saving state:",e)}}function zy(){try{Cr.default.existsSync(sx)&&Cr.default.unlinkSync(sx)}catch{}}function nc(){try{return lx(),Cr.default.existsSync(cx)?JSON.parse(Cr.default.readFileSync(cx,"utf8")):{machineId:null,key:null,name:"Default",createdAt:null}}catch{return{machineId:null,key:null,name:"Default",createdAt:null}}}function po(r,e,t="Default"){try{lx();let n={machineId:r,key:e,name:t,createdAt:new Date().toISOString()};return Cr.default.writeFileSync(cx,JSON.stringify(n,null,2)),n}catch(n){return console.error("Error saving key:",n),null}}async function fx(r,e){try{let t=await fetch(`${e}/api/temp-key/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:r,expiryMinutes:30})});if(!t.ok){let n=await t.json();throw new Error(n.error||"Failed to create temp key")}return await t.json()}catch(t){return console.error("Error creating temp key:",t),null}}var Nt=require("fs"),Qy=require("url"),Jy=require("child_process"),vo=O(require("path"),1),dx=O(require("os"),1),gR=vo.default.dirname((0,Qy.fileURLToPath)(__importMetaUrl)),Pe="9remote",DR=`https://registry.npmjs.org/${Pe}/latest`,wR=3e3,ER=8e3;function SR(){return"0.1.34"}function OR(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}function FR(){return process.env.CODESPACES==="true"||process.env.GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN?"GitHub Codespaces":(0,Nt.existsSync)("/.dockerenv")?"Docker":null}async function Xy(r=!1){if(r)return!1;let e=SR();if(!e)return!1;let t=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],n=0,i=null,o=u=>{process.stdout.isTTY&&(process.stdout.write(`\r${t[0]} ${u}`),i=setInterval(()=>{process.stdout.write(`\r${t[n++%t.length]} ${u}`)},80))},a=()=>{i&&(clearInterval(i),i=null),process.stdout.isTTY&&process.stdout.write("\r\x1B[K")};return new Promise(u=>{let s=!1,c=x=>{s||(s=!0,a(),u(x))},l=setTimeout(()=>c(!1),ER);o("Checking for updates..."),fetch(DR,{signal:AbortSignal.timeout(wR)}).then(x=>x.json()).then(x=>{if(s)return;clearTimeout(l);let h=x.version;if(!h||!OR(e,h)){c(!1);return}a(),console.log(A.green(`\u2705 New version available: ${e} \u2192 ${h}`));let p=FR();if(p){console.log(A.yellow(` \u26A0\uFE0F ${p} detected - manual update required`)),console.log(A.gray(` Run: npm install -g ${Pe}@latest
65
65
  `)),c(!1);return}console.log(A.yellow(`\u{1F504} Auto-updating...
66
66
  `));let b=process.argv.slice(2).filter(q=>q!=="--skip-update").join(" "),m=process.platform,y,_;if(m==="win32"){let q=`@echo off
67
67
  echo \u{1F4E5} Downloading update...
68
+ echo \u23F3 Waiting for process to exit...
68
69
  timeout /t 2 /nobreak >nul
70
+
71
+ echo \u{1F504} Installing new version...
72
+ call npm cache clean --force >nul 2>&1
69
73
  call npm install -g ${Pe}@latest --prefer-online
74
+
70
75
  if %ERRORLEVEL% EQU 0 (
71
- echo \u2705 Update completed
76
+ echo \u2705 Update completed successfully
77
+ echo \u{1F680} Restarting with new version...
72
78
  ${Pe} ${b} --skip-update
73
79
  ) else (
74
- echo \u274C Update failed - run manually: npm install -g ${Pe}
80
+ echo \u274C Update failed
81
+ echo \u{1F4A1} Try manually: npm install -g ${Pe}
82
+ echo \u{1F504} Starting with current version...
75
83
  ${Pe} ${b} --skip-update
76
84
  )
77
85
  `;y=vo.default.join(dx.default.tmpdir(),`${Pe}-update.bat`),(0,Nt.writeFileSync)(y,q),_=["cmd.exe",["/c",y]]}else{let q=`#!/bin/bash
78
86
  echo "\u{1F4E5} Downloading update..."
87
+ echo "\u23F3 Waiting for process to exit..."
79
88
  sleep 1
89
+
80
90
  pkill -f "${Pe}" 2>/dev/null || true
81
91
  sleep 1
92
+
93
+ echo "\u{1F504} Installing new version..."
94
+ npm cache clean --force 2>/dev/null
95
+
96
+ # Try to install with full output for debugging
82
97
  npm install -g ${Pe}@latest --prefer-online 2>&1
83
- if [ $? -eq 0 ]; then
84
- echo "\u2705 Update completed"
98
+ EXIT_CODE=$?
99
+
100
+ if [ $EXIT_CODE -eq 0 ]; then
101
+ echo "\u2705 Update completed successfully"
102
+ echo "\u{1F680} Restarting with new version..."
85
103
  ${Pe} ${b} --skip-update
86
104
  else
87
- echo "\u274C Update failed - run manually: npm install -g ${Pe}"
105
+ echo "\u274C Update failed (exit code: $EXIT_CODE)"
106
+ echo "\u{1F4A1} Update manually: npm install -g ${Pe}@latest"
107
+ echo "\u{1F504} Starting with current version..."
88
108
  ${Pe} ${b} --skip-update
89
109
  fi
90
110
  `;y=vo.default.join(dx.default.tmpdir(),`${Pe}-update.sh`),(0,Nt.writeFileSync)(y,q,{mode:493}),_=["sh",[y]]}(0,Jy.spawn)(_[0],_[1],{detached:!0,stdio:"inherit"}).unref(),process.exit(0)}).catch(()=>{clearTimeout(l),c(!1)})})}var pe=O(require("fs"),1),_o=O(require("path"),1),t_=O(require("https"),1),Ut=O(require("os"),1),uc=require("child_process"),yo=null,ic=null,ac=null,bo=_o.default.join(Ut.default.homedir(),".9remote","bin"),Zy="cloudflared",hx=Ut.default.platform()==="win32",CR=hx?`${Zy}.exe`:Zy,ti=_o.default.join(bo,CR),oc=_o.default.join(Ut.default.homedir(),".9remote","cloudflared.pid"),mo=!1,xx=5,e_=6e4,ni=[],ii=null,AR="https://github.com/cloudflare/cloudflared/releases/latest/download",qR={darwin:{x64:"cloudflared-darwin-amd64.tgz",arm64:"cloudflared-darwin-amd64.tgz"},win32:{x64:"cloudflared-windows-amd64.exe"},linux:{x64:"cloudflared-linux-amd64",arm64:"cloudflared-linux-arm64"}};function PR(){let r=Ut.default.platform(),e=Ut.default.arch(),t=qR[r];if(!t)throw new Error(`Unsupported platform: ${r}`);let n=t[e];if(!n)throw new Error(`Unsupported architecture: ${e} for platform ${r}`);return`${AR}/${n}`}async function n_(r,e){return new Promise((t,n)=>{let i=pe.default.createWriteStream(e);t_.default.get(r,o=>{if([301,302].includes(o.statusCode)){i.close(),pe.default.unlinkSync(e),n_(o.headers.location,e).then(t).catch(n);return}if(o.statusCode!==200){i.close(),pe.default.unlinkSync(e),n(new Error(`Download failed with status ${o.statusCode}`));return}o.pipe(i),i.on("finish",()=>{i.close(()=>t(e))}),i.on("error",a=>{i.close(),pe.default.unlinkSync(e),n(a)})}).on("error",o=>{i.close(),pe.default.existsSync(e)&&pe.default.unlinkSync(e),n(o)})})}async function px(){if(pe.default.existsSync(bo)||pe.default.mkdirSync(bo,{recursive:!0}),pe.default.existsSync(ti))return hx||pe.default.chmodSync(ti,"755"),ti;console.log("\u{1F4E5} Downloading tunnel binary...");let r=PR(),e=r.endsWith(".tgz"),t=e?_o.default.join(bo,"cloudflared.tgz"):ti;try{return await n_(r,t),e&&(console.log("\u2705 Extracting..."),(0,uc.execSync)(`tar -xzf "${t}" -C "${bo}"`,{stdio:"pipe"}),pe.default.unlinkSync(t)),hx||pe.default.chmodSync(ti,"755"),console.log("\u2705 cloudflared ready"),ti}catch(n){throw console.error("\u274C Failed to download cloudflared:",n.message),n}}var TR=["INF Starting tunnel","INF Version","GOOS:","Settings:","Autoupdate frequency","Generated Connector","Initial protocol","ICMP proxy","Created ICMP","Starting metrics server","curve preferences","Updated to new configuration"];async function i_(r,e=null){let t=await px();e&&(ii=e),ac=r;let n=(0,uc.spawn)(t,["tunnel","run","--token",r],{detached:!1,stdio:["ignore","pipe","pipe"]});mo=!1,console.log(`\u2705 Cloudflared spawned with PID: ${n.pid}`);let i=0,o=a=>{let u=a.toString().trim();if(!TR.some(s=>u.includes(s))&&!mo&&u.includes("Registered tunnel connection")){i++,i<=4&&(process.stdout.write(`\r \u2714 Connection ${i}/4 established`),i===4&&process.stdout.write(`
91
- `));return}};return n.stdout.on("data",o),n.stderr.on("data",o),n.on("error",a=>{console.error("\u274C cloudflared error:",a)}),n.on("exit",(a,u)=>{if(console.log(`\u26A0\uFE0F Cloudflared process exited (code: ${a}, signal: ${u}, intentional: ${mo})`),mo)console.log("\u2139\uFE0F Cloudflared exit ignored (intentional shutdown)");else if(console.log("\u26A0\uFE0F Cloudflared unexpected exit detected - will restart"),ii){let s=Date.now();ni.push(s),ni=ni.filter(c=>c>s-e_),ni.length<=xx?(console.log(`\u{1F504} Restarting tunnel... (attempt ${ni.length}/${xx})`),setTimeout(()=>{console.log("\u{1F504} Executing tunnel restart..."),ii(r)},2e3)):console.log(`\u274C Too many tunnel restarts (${xx} in ${e_/1e3}s). Giving up.`)}else console.log("\u26A0\uFE0F No restart callback registered")}),pe.default.writeFileSync(oc,n.pid.toString()),BR(),n}function vx(){try{if(pe.default.existsSync(oc)){mo=!0;let r=parseInt(pe.default.readFileSync(oc,"utf8"));process.kill(r),pe.default.unlinkSync(oc),console.log("\u2705 Cloudflared killed")}}catch{}}function o_(){ni=[],ii=null,ac=null,jR()}function r_(){let r=Ut.default.networkInterfaces(),e=[];for(let[t,n]of Object.entries(r))if(n)for(let i of n)!i.internal&&i.family==="IPv4"&&e.push(`${t}:${i.address}`);return e.sort().join("|")}function BR(){yo||(ic=r_(),yo=setInterval(()=>{let r=r_();r!==ic&&(console.log("\u{1F504} Network change detected - restarting tunnel..."),ic=r,vx(),ii&&ac&&setTimeout(()=>{console.log("\u{1F504} Restarting tunnel after network change..."),ii(ac)},2e3))},5e3))}function jR(){yo&&(clearInterval(yo),yo=null),ic=null}var MR=process.argv.includes("--skip-update"),yx=Wt.default.dirname((0,l_.fileURLToPath)(__importMetaUrl)),RR=Wt.default.resolve(yx,".."),IR=Wt.default.join(yx,"server.cjs"),a_=Wt.default.join(RR,"server/index.js"),ft="https://remote.9router.com",mx=2208,bx=10,u_=6e4,G=A.rgb(230,138,110),kR=A.rgb(200,120,95);function LR(){return"0.1.32"}function d_(){let r=LR(),e=Math.min(44,process.stdout.columns||44);console.log(""),console.log(G("\u2554"+"\u2550".repeat(e-2)+"\u2557")),console.log(G("\u2551")+" ".repeat(e-2)+G("\u2551"));let t=`\u{1F680} 9Remote v${r}`,n=Math.floor((e-2-t.length)/2);console.log(G("\u2551")+" ".repeat(n)+G.bold(t)+" ".repeat(e-2-n-t.length)+G("\u2551"));let i="Remote terminal access from anywhere",o=Math.floor((e-2-i.length)/2);console.log(G("\u2551")+" ".repeat(o)+A.gray(i)+" ".repeat(e-2-o-i.length)+G("\u2551")),console.log(G("\u2551")+" ".repeat(e-2)+G("\u2551")),console.log(G("\u255A"+"\u2550".repeat(e-2)+"\u255D")),console.log("")}function x_(r,e="\u{1F4F1} Scan QR to connect:"){console.log(G(`
111
+ `));return}};return n.stdout.on("data",o),n.stderr.on("data",o),n.on("error",a=>{console.error("\u274C cloudflared error:",a)}),n.on("exit",(a,u)=>{if(console.log(`\u26A0\uFE0F Cloudflared process exited (code: ${a}, signal: ${u}, intentional: ${mo})`),mo)console.log("\u2139\uFE0F Cloudflared exit ignored (intentional shutdown)");else if(console.log("\u26A0\uFE0F Cloudflared unexpected exit detected - will restart"),ii){let s=Date.now();ni.push(s),ni=ni.filter(c=>c>s-e_),ni.length<=xx?(console.log(`\u{1F504} Restarting tunnel... (attempt ${ni.length}/${xx})`),setTimeout(()=>{console.log("\u{1F504} Executing tunnel restart..."),ii(r)},2e3)):console.log(`\u274C Too many tunnel restarts (${xx} in ${e_/1e3}s). Giving up.`)}else console.log("\u26A0\uFE0F No restart callback registered")}),pe.default.writeFileSync(oc,n.pid.toString()),BR(),n}function vx(){try{if(pe.default.existsSync(oc)){mo=!0;let r=parseInt(pe.default.readFileSync(oc,"utf8"));process.kill(r),pe.default.unlinkSync(oc),console.log("\u2705 Cloudflared killed")}}catch{}}function o_(){ni=[],ii=null,ac=null,jR()}function r_(){let r=Ut.default.networkInterfaces(),e=[];for(let[t,n]of Object.entries(r))if(n)for(let i of n)!i.internal&&i.family==="IPv4"&&e.push(`${t}:${i.address}`);return e.sort().join("|")}function BR(){yo||(ic=r_(),yo=setInterval(()=>{let r=r_();r!==ic&&(console.log("\u{1F504} Network change detected - restarting tunnel..."),ic=r,vx(),ii&&ac&&setTimeout(()=>{console.log("\u{1F504} Restarting tunnel after network change..."),ii(ac)},2e3))},5e3))}function jR(){yo&&(clearInterval(yo),yo=null),ic=null}var MR=process.argv.includes("--skip-update"),yx=Wt.default.dirname((0,l_.fileURLToPath)(__importMetaUrl)),RR=Wt.default.resolve(yx,".."),IR=Wt.default.join(yx,"server.cjs"),a_=Wt.default.join(RR,"server/index.js"),ft="https://9remote.cc",mx=2208,bx=10,u_=6e4,G=A.rgb(230,138,110),kR=A.rgb(200,120,95);function LR(){return"0.1.34"}function d_(){let r=LR(),e=Math.min(44,process.stdout.columns||44);console.log(""),console.log(G("\u2554"+"\u2550".repeat(e-2)+"\u2557")),console.log(G("\u2551")+" ".repeat(e-2)+G("\u2551"));let t=`\u{1F680} 9Remote v${r}`,n=Math.floor((e-2-t.length)/2);console.log(G("\u2551")+" ".repeat(n)+G.bold(t)+" ".repeat(e-2-n-t.length)+G("\u2551"));let i="Remote terminal access from anywhere",o=Math.floor((e-2-i.length)/2);console.log(G("\u2551")+" ".repeat(o)+A.gray(i)+" ".repeat(e-2-o-i.length)+G("\u2551")),console.log(G("\u2551")+" ".repeat(e-2)+G("\u2551")),console.log(G("\u255A"+"\u2550".repeat(e-2)+"\u255D")),console.log("")}function x_(r,e="\u{1F4F1} Scan QR to connect:"){console.log(G(`
92
112
  ${e}`)),c_.default.generate(r,{small:!0,type:"terminal",margin:0},t=>{let n=t.trim().split(`
93
113
  `);console.log(n.join(`
94
114
  `))})}async function h_(r,e){let t=await fx(r,ft);if(!t){console.log(A.red("\u274C Failed to create temp key"));return}let n=`${ft}/login?k=${t.tempKey}`,i=Math.min(44,process.stdout.columns||55);x_(n),console.log(A.gray(`
package/index.js CHANGED
@@ -24,7 +24,7 @@ const PROJECT_ROOT = path.resolve(__dirname, "..");
24
24
  // When running from cli/index.js (dev), use server/index.js
25
25
  const STANDALONE_SERVER = path.join(__dirname, "server.cjs");
26
26
  const DEV_SERVER = path.join(PROJECT_ROOT, "server/index.js");
27
- const WORKER_URL = "https://remote.9router.com";
27
+ const WORKER_URL = "https://9remote.cc";
28
28
  const SERVER_PORT = 2208;
29
29
  const MAX_RESTART_ATTEMPTS = 10;
30
30
  const RESTART_WINDOW_MS = 60000; // 1 minute
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9remote",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "type": "module",
5
5
  "description": "Remote terminal access from anywhere",
6
6
  "main": "index.js",
@@ -172,13 +172,21 @@ export async function checkAndUpdate(skipUpdate = false) {
172
172
  if (platform === "win32") {
173
173
  const script = `@echo off
174
174
  echo 📥 Downloading update...
175
+ echo ⏳ Waiting for process to exit...
175
176
  timeout /t 2 /nobreak >nul
177
+
178
+ echo 🔄 Installing new version...
179
+ call npm cache clean --force >nul 2>&1
176
180
  call npm install -g ${PACKAGE_NAME}@latest --prefer-online
181
+
177
182
  if %ERRORLEVEL% EQU 0 (
178
- echo ✅ Update completed
183
+ echo ✅ Update completed successfully
184
+ echo 🚀 Restarting with new version...
179
185
  ${PACKAGE_NAME} ${argsStr} --skip-update
180
186
  ) else (
181
- echo ❌ Update failed - run manually: npm install -g ${PACKAGE_NAME}
187
+ echo ❌ Update failed
188
+ echo 💡 Try manually: npm install -g ${PACKAGE_NAME}
189
+ echo 🔄 Starting with current version...
182
190
  ${PACKAGE_NAME} ${argsStr} --skip-update
183
191
  )
184
192
  `;
@@ -188,15 +196,27 @@ if %ERRORLEVEL% EQU 0 (
188
196
  } else {
189
197
  const script = `#!/bin/bash
190
198
  echo "📥 Downloading update..."
199
+ echo "⏳ Waiting for process to exit..."
191
200
  sleep 1
201
+
192
202
  pkill -f "${PACKAGE_NAME}" 2>/dev/null || true
193
203
  sleep 1
204
+
205
+ echo "🔄 Installing new version..."
206
+ npm cache clean --force 2>/dev/null
207
+
208
+ # Try to install with full output for debugging
194
209
  npm install -g ${PACKAGE_NAME}@latest --prefer-online 2>&1
195
- if [ $? -eq 0 ]; then
196
- echo "✅ Update completed"
210
+ EXIT_CODE=$?
211
+
212
+ if [ $EXIT_CODE -eq 0 ]; then
213
+ echo "✅ Update completed successfully"
214
+ echo "🚀 Restarting with new version..."
197
215
  ${PACKAGE_NAME} ${argsStr} --skip-update
198
216
  else
199
- echo "❌ Update failed - run manually: npm install -g ${PACKAGE_NAME}"
217
+ echo "❌ Update failed (exit code: $EXIT_CODE)"
218
+ echo "💡 Update manually: npm install -g ${PACKAGE_NAME}@latest"
219
+ echo "🔄 Starting with current version..."
200
220
  ${PACKAGE_NAME} ${argsStr} --skip-update
201
221
  fi
202
222
  `;