9remote 0.1.30 → 0.1.32

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,7 +61,7 @@ ${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(){try{let r=vo.default.resolve(gR,"../../package.json");return JSON.parse((0,Nt.readFileSync)(r,"utf-8")).version}catch{return null}}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.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
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...
@@ -88,7 +88,7 @@ else
88
88
  ${Pe} ${b} --skip-update
89
89
  fi
90
90
  `;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.30"}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(`
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(`
92
92
  ${e}`)),c_.default.generate(r,{small:!0,type:"terminal",margin:0},t=>{let n=t.trim().split(`
93
93
  `);console.log(n.join(`
94
94
  `))})}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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9remote",
3
- "version": "0.1.30",
3
+ "version": "0.1.32",
4
4
  "type": "module",
5
5
  "description": "Remote terminal access from anywhere",
6
6
  "main": "index.js",
@@ -12,11 +12,17 @@ const UPDATE_CHECK_TIMEOUT = 3000;
12
12
  const SAFETY_TIMEOUT = 8000;
13
13
 
14
14
  /**
15
- * Get current version from package.json
15
+ * Get current version
16
16
  */
17
17
  function getCurrentVersion() {
18
+ // When bundled, version is injected at build time
19
+ if (typeof __CLI_VERSION__ !== "undefined") {
20
+ return __CLI_VERSION__;
21
+ }
22
+
23
+ // Dev mode: read from package.json
18
24
  try {
19
- const packagePath = path.resolve(__dirname, "../../package.json");
25
+ const packagePath = path.resolve(__dirname, "../package.json");
20
26
  const packageJson = JSON.parse(readFileSync(packagePath, "utf-8"));
21
27
  return packageJson.version;
22
28
  } catch {