9remote 2.0.25 → 2.0.26
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
|
@@ -15,7 +15,7 @@ Right-click to open / quit`}function li(){let{port:e,tunnelUrl:r}=zt,n=process.p
|
|
|
15
15
|
`:`
|
|
16
16
|
`)+n,t=o+1,o=e.indexOf(`
|
|
17
17
|
`,t)}while(o!==-1);return i+=e.slice(t),i}var{stdout:so,stderr:ao}=ro,Xn=Symbol("GENERATOR"),lt=Symbol("STYLER"),Nt=Symbol("IS_EMPTY"),co=["ansi","ansi","ansi256","ansi16m"],ut=Object.create(null),Ds=(e,r={})=>{if(r.level&&!(Number.isInteger(r.level)&&r.level>=0&&r.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let n=so?so.level:0;e.level=r.level===void 0?n:r.level};var Us=e=>{let r=(...n)=>n.join(" ");return Ds(r,e),Object.setPrototypeOf(r,Dt.prototype),r};function Dt(e){return Us(e)}Object.setPrototypeOf(Dt.prototype,Function.prototype);for(let[e,r]of Object.entries(le))ut[e]={get(){let n=yn(this,Zn(r.open,r.close,this[lt]),this[Nt]);return Object.defineProperty(this,e,{value:n}),n}};ut.visible={get(){let e=yn(this,this[lt],!0);return Object.defineProperty(this,"visible",{value:e}),e}};var qn=(e,r,n,...o)=>e==="rgb"?r==="ansi16m"?le[n].ansi16m(...o):r==="ansi256"?le[n].ansi256(le.rgbToAnsi256(...o)):le[n].ansi(le.rgbToAnsi(...o)):e==="hex"?qn("rgb",r,n,...le.hexToRgb(...o)):le[n][e](...o),Bs=["rgb","hex","ansi256"];for(let e of Bs){ut[e]={get(){let{level:n}=this;return function(...o){let t=Zn(qn(e,co[n],"color",...o),le.color.close,this[lt]);return yn(this,t,this[Nt])}}};let r="bg"+e[0].toUpperCase()+e.slice(1);ut[r]={get(){let{level:n}=this;return function(...o){let t=Zn(qn(e,co[n],"bgColor",...o),le.bgColor.close,this[lt]);return yn(this,t,this[Nt])}}}}var Fs=Object.defineProperties(()=>{},{...ut,level:{enumerable:!0,get(){return this[Xn].level},set(e){this[Xn].level=e}}}),Zn=(e,r,n)=>{let o,t;return n===void 0?(o=e,t=r):(o=n.openAll+e,t=r+n.closeAll),{open:e,close:r,openAll:o,closeAll:t,parent:n}},yn=(e,r,n)=>{let o=(...t)=>Hs(o,t.length===1?""+t[0]:t.join(" "));return Object.setPrototypeOf(o,Fs),o[Xn]=e,o[lt]=r,o[Nt]=n,o},Hs=(e,r)=>{if(e.level<=0||!r)return e[Nt]?"":r;let n=e[lt];if(n===void 0)return r;let{openAll:o,closeAll:t}=n;if(r.includes("\x1B"))for(;n!==void 0;)r=oo(r,n.close,n.open),n=n.parent;let i=r.indexOf(`
|
|
18
|
-
`);return i!==-1&&(r=io(r,t,o,i)),o+r+t};Object.defineProperties(Dt.prototype,ut);var Ks=Dt(),wc=Dt({level:ao?ao.level:0});var m=Ks;var Ce=require("fs"),ho=require("url"),vn=require("child_process"),Sn=A(require("path"),1),go=A(require("os"),1);var ft=A(require("fs"),1),er=A(require("path"),1),lo=A(require("os"),1),uo=require("child_process"),zn=er.default.join(lo.default.homedir(),".9remote","pids");function js(){try{ft.default.existsSync(zn)||ft.default.mkdirSync(zn,{recursive:!0})}catch{}}function tr(e){return er.default.join(zn,`${e}.pid`)}function Ie(e,r){if(r)try{js(),ft.default.writeFileSync(tr(e),String(r))}catch{}}function wn(e){try{let r=ft.default.readFileSync(tr(e),"utf8").trim(),n=parseInt(r,10);return Number.isFinite(n)&&n>0?n:null}catch{return null}}function Pe(e){try{ft.default.unlinkSync(tr(e))}catch{}}function fo(e){if(!e)return!1;try{return process.kill(e,0),!0}catch{return!1}}function Gs(e){let r=wn(e);if(Pe(e),!r)return!1;try{process.platform==="win32"?(0,uo.execSync)(`taskkill /F /T /PID ${r}`,{stdio:"ignore",windowsHide:!0}):process.kill(r,"SIGKILL")}catch{}return!0}var Ws=["cloudflared","agent"];function po(){for(let e of Ws)Gs(e)}var Ys=Sn.default.dirname((0,ho.fileURLToPath)(__importMetaUrl)),Vs="9remote",Qs=`https://registry.npmjs.org/${Vs}/latest`,Js=3e3;var mo=2208,nr=Sn.default.join(go.default.homedir(),".9remote","cloudflared.pid");function Xs(){try{po()}catch{}try{if((0,Ce.existsSync)(nr)){let e=parseInt((0,Ce.readFileSync)(nr,"utf8"));if(Number.isFinite(e))try{process.kill(e)}catch{}try{(0,Ce.unlinkSync)(nr)}catch{}}}catch{}try{process.platform==="win32"?(0,vn.execSync)(`for /f "tokens=5" %a in ('netstat -aon ^| findstr :${mo}') do taskkill /F /PID %a`,{stdio:"ignore",windowsHide:!0}):(0,vn.execSync)(`lsof -ti:${mo} | xargs kill -9 2>/dev/null || true`,{stdio:"ignore"})}catch{}if(process.platform==="win32"){let e=Date.now()+1500;for(;Date.now()<e;);}}function qs(){return"2.0.
|
|
18
|
+
`);return i!==-1&&(r=io(r,t,o,i)),o+r+t};Object.defineProperties(Dt.prototype,ut);var Ks=Dt(),wc=Dt({level:ao?ao.level:0});var m=Ks;var Ce=require("fs"),ho=require("url"),vn=require("child_process"),Sn=A(require("path"),1),go=A(require("os"),1);var ft=A(require("fs"),1),er=A(require("path"),1),lo=A(require("os"),1),uo=require("child_process"),zn=er.default.join(lo.default.homedir(),".9remote","pids");function js(){try{ft.default.existsSync(zn)||ft.default.mkdirSync(zn,{recursive:!0})}catch{}}function tr(e){return er.default.join(zn,`${e}.pid`)}function Ie(e,r){if(r)try{js(),ft.default.writeFileSync(tr(e),String(r))}catch{}}function wn(e){try{let r=ft.default.readFileSync(tr(e),"utf8").trim(),n=parseInt(r,10);return Number.isFinite(n)&&n>0?n:null}catch{return null}}function Pe(e){try{ft.default.unlinkSync(tr(e))}catch{}}function fo(e){if(!e)return!1;try{return process.kill(e,0),!0}catch{return!1}}function Gs(e){let r=wn(e);if(Pe(e),!r)return!1;try{process.platform==="win32"?(0,uo.execSync)(`taskkill /F /T /PID ${r}`,{stdio:"ignore",windowsHide:!0}):process.kill(r,"SIGKILL")}catch{}return!0}var Ws=["cloudflared","agent"];function po(){for(let e of Ws)Gs(e)}var Ys=Sn.default.dirname((0,ho.fileURLToPath)(__importMetaUrl)),Vs="9remote",Qs=`https://registry.npmjs.org/${Vs}/latest`,Js=3e3;var mo=2208,nr=Sn.default.join(go.default.homedir(),".9remote","cloudflared.pid");function Xs(){try{po()}catch{}try{if((0,Ce.existsSync)(nr)){let e=parseInt((0,Ce.readFileSync)(nr,"utf8"));if(Number.isFinite(e))try{process.kill(e)}catch{}try{(0,Ce.unlinkSync)(nr)}catch{}}}catch{}try{process.platform==="win32"?(0,vn.execSync)(`for /f "tokens=5" %a in ('netstat -aon ^| findstr :${mo}') do taskkill /F /PID %a`,{stdio:"ignore",windowsHide:!0}):(0,vn.execSync)(`lsof -ti:${mo} | xargs kill -9 2>/dev/null || true`,{stdio:"ignore"})}catch{}if(process.platform==="win32"){let e=Date.now()+1500;for(;Date.now()<e;);}}function qs(){return"2.0.26"}function Zs(e,r){let n=e.split(".").map(Number),o=r.split(".").map(Number);for(let t=0;t<3;t++){if(o[t]>n[t])return!0;if(o[t]<n[t])return!1}return!1}function Tn(){Xs()}async function yo(){try{let e=qs();if(!e)return null;let r=await Y(Qs,{signal:AbortSignal.timeout(Js)});if(!r.ok)return null;let{version:n}=await r.json();return n&&Zs(e,n)?{current:e,latest:n}:null}catch{return null}}var te=A(require("fs"),1),Ut=A(require("path"),1);var Ac=he.STATE,rr=Ut.default.join(he.STATE,"state.json"),or=Ut.default.join(he.ROOT,"keys.json"),En=Ut.default.join(he.STATE,"cmd.json"),_c=Ut.default.join(he.STATE,"settings.json");function Rn(){for(let e of[he.ROOT,he.STATE])te.default.existsSync(e)||te.default.mkdirSync(e,{recursive:!0})}function xn(e){try{Rn(),te.default.writeFileSync(rr,JSON.stringify(e,null,2),{mode:384})}catch(r){console.error("Error saving state:",r)}}function wo(){try{te.default.existsSync(rr)&&te.default.unlinkSync(rr)}catch{}}function bn(){try{return Rn(),te.default.existsSync(or)?JSON.parse(te.default.readFileSync(or,"utf8")):{machineId:null,key:null,name:"Default",createdAt:null}}catch{return{machineId:null,key:null,name:"Default",createdAt:null}}}function pt(e){try{Rn(),te.default.writeFileSync(En,JSON.stringify({cmd:e,ts:Date.now()}))}catch{}}function vo(){try{if(!te.default.existsSync(En))return null;let e=JSON.parse(te.default.readFileSync(En,"utf8"));return te.default.unlinkSync(En),e.cmd}catch{return null}}function Xe(e,r,n="Default"){try{Rn();let o={machineId:e,key:r,name:n,createdAt:new Date().toISOString()};return te.default.writeFileSync(or,JSON.stringify(o,null,2),{mode:384}),o}catch(o){return console.error("Error saving key:",o),null}}var Lo=A(require("os"),1);var On=A(require("readline"),1),Eo=A(require("http"),1);var ir=require("child_process"),zs={screenRecording:"x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture",accessibility:"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility"};function An(e){let r=zs[e];r&&process.platform==="darwin"&&(0,ir.exec)(`open "${r}"`,()=>{})}function ue({strategy:e,baseMs:r,maxMs:n},o){let t=Math.max(1,o),i=e==="exp"?r*Math.pow(2,t-1):r*t;return Math.min(i,n)}async function So({config:e,task:r,label:n="task",log:o=()=>{},ctx:t={}}){let i=0;for(;!t.cancelled;){i++;try{if(await r(i))return!0}catch(a){o(`\u274C ${n} attempt ${i} error: ${a?.message||a}`)}if(t.cancelled)return!1;let s=ue(e,i);o(`\u{1F504} ${n} retry in ${s}ms (attempt ${i})`),await new Promise(a=>setTimeout(a,s))}return!1}var T={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",orange:"\x1B[38;2;230;138;110m",green:"\x1B[32m",red:"\x1B[31m",yellow:"\x1B[33m",cyan:"\x1B[36m",white:"\x1B[37m"},Ro=()=>Math.min(44,process.stdout.columns||44);function ar(e,r=null){let o=Ro()-2,t=(a="")=>{let c=a.replace(/\x1b\[[0-9;]*m/g,""),l=Math.max(0,o-c.length);return T.orange+"\u2551"+T.reset+a+" ".repeat(l)+T.orange+"\u2551"+T.reset},i=(a,c=l=>l)=>{let l=a.replace(/\x1b\[[0-9;]*m/g,""),u=Math.floor((o-l.length)/2),f=o-l.length-u;return T.orange+"\u2551"+T.reset+" ".repeat(u)+c(a)+" ".repeat(f)+T.orange+"\u2551"+T.reset},s=["",T.orange+"\u2554"+"\u2550".repeat(o)+"\u2557"+T.reset,t(),i(`\u{1F680} 9Remote v${e}`,a=>T.bold+T.orange+a+T.reset),i("Remote terminal access from anywhere",a=>T.dim+a+T.reset),t()];return r&&(s.push(i(`\u2B06 New version v${r} available!`,a=>T.yellow+T.bold+a+T.reset)),s.push(i("Run: npm i -g 9remote@latest",a=>T.dim+a+T.reset)),s.push(t())),s.push(T.orange+"\u255A"+"\u2550".repeat(o)+"\u255D"+T.reset),s.push(""),s.join(`
|
|
19
19
|
`)}function mt(e,r=null){console.log(ar(e,r))}var To=["\u28FE","\u28FD","\u28FB","\u28BF","\u287F","\u28DF","\u28EF","\u28F7"],sr=[{label:"Preparing",desc:"Checking dependencies"},{label:"Connecting",desc:"Creating session"},{label:"Starting tunnel",desc:"Spawning tunnel"},{label:"Verifying tunnel",desc:"Health check"},{label:"Ready",desc:"Tunnel is live"}],ea=process.platform==="win32",ta=ea?120:80;process.on("exit",()=>process.stdout.write("\x1B[?25h"));var xo=(e,r)=>{process.stdout.write("\x1B[?25h"),process.listenerCount(e)<=1&&process.exit(r)};process.on("SIGINT",()=>xo("SIGINT",130));process.on("SIGTERM",()=>xo("SIGTERM",143));var Re=0,qe=null,_n=0,ye=-1,Bt=null,dt=null,kn=!1;function bo(){let e=[],r=ye===sr.length-1;return sr.forEach((n,o)=>{let t=o===ye&&Bt?Bt:n.desc;if(o<ye||r&&o===ye)e.push(` ${T.green}\u2713${T.reset} ${T.dim}${n.label}${T.reset}`),dt&&o===dt.afterIdx&&e.push(` ${T.green}\u2713${T.reset} ${T.cyan}${dt.text}${T.reset}`);else if(o===ye){let i=To[_n%To.length];e.push(` ${T.orange}${i}${T.reset} ${T.bold}${n.label}${T.reset} ${T.dim}${t}${T.reset}`)}else e.push(` ${T.dim}\u25CB ${n.label}${T.reset}`)}),e}function Ao(){let e=bo();Re>0&&process.stdout.write(`\x1B[${Re}A\x1B[0J`),process.stdout.write(e.join(`
|
|
20
20
|
`)+`
|
|
21
21
|
`),Re=e.length}function _o(){if(Re===0||ye<0)return;let e=bo();if(e.length!==Re){Ao();return}let r=ye+(dt&&dt.afterIdx<ye?1:0),n=Re-r;process.stdout.write(`\x1B[${n}A\r\x1B[2K${e[r]}\x1B[${n}B\r`)}function na(){kn||(process.stdout.write("\x1B[?25l"),kn=!0)}function ko(){kn&&(process.stdout.write("\x1B[?25h"),kn=!1)}function Oo(e,r=!1,n=null){qe&&(clearInterval(qe),qe=null),ye=e,Bt=n,_n=0,r||(Re=0),Ao(),e<sr.length-1?(na(),qe=setInterval(()=>{_n++,_o()},ta)):ko()}function ht(e){Bt=e,Re>0&&_o()}function Io(){qe&&(clearInterval(qe),qe=null),ko(),Re=0,ye=-1,Bt=null,dt=null,_n=0}function we(e,r,n=0,o="",t=null,i=null){return new Promise(s=>{let a=n,c=!0,l=!0,u=process.platform==="win32",f=()=>{if(!c)return;process.stdout.write(l?"\x1B[2J\x1B[H":"\x1B[H"),l=!1;let v=typeof o=="function"?o():o;if(v)for(let E of v.split(`
|
|
@@ -53,7 +53,7 @@ QR expires in 30 minutes (one-time use)
|
|
|
53
53
|
`))):i.push(m.gray(`
|
|
54
54
|
(One-time key used \u2014 generate a new one from menu)
|
|
55
55
|
`)),i.push(ie.orange("\u2550".repeat(t)),m.white("App URL".padEnd(14))+m.gray(`${N}/login`)),Kr.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?ie.orange.bold(e)+m.dim(" (expires in 30m)"):m.gray("\u2014")),m.white("Key".padEnd(14))+m.dim(r),ie.orange("\u2550".repeat(t))),i.join(`
|
|
56
|
-
`)}var it=V("cmd");function Ge(e,r,n){let o=!1;setInterval(async()=>{if(o)return;let t=vo();if(t){o=!0;try{if(t==="stop-tunnel")await Gi(e,r);else if(t==="restart-tunnel")await Gi(e,r),await Wi(e,r,n);else if(t==="start-tunnel"){if(await Wi(e,r,n)==="alreadyRunning"){o=!1;return}}else t==="regenerate-key"?await Ha():t==="shutdown"&&Ka(e,r)}finally{o=!1}}},fe.cmdMs)}async function Gi(e,r){jt();let n=e();n&&(n.kill(),r(null),it.info("\u{1F6D1} Tunnel stopped")),await K(C.STOPPED,{tunnelUrl:"",oneTimeKey:"",oneTimeKeyExpiresAt:null}),Nn({tunnelUrl:"",running:!0})}async function Wi(e,r,n){let o=e();if(o)if(o.killed||o.exitCode!=null)r(null);else{let t=await j("/api/ui/state");return await K(C.READY,{tunnelUrl:t?.tunnelUrl||""}),"alreadyRunning"}it.info("\u{1F680} Starting tunnel...");try{await K(C.PREPARING),await qt(In),await K(C.CONNECTING);let t=await Y(`${N}/api/session/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:n})});if(!t.ok)throw new Error(`Session create failed: ${t.status}`);await K(C.TUNNELING);let i=async c=>{await Ae(n,c),await U({tunnelUrl:c}),wt(c)},s=await rt(I,i,xt({onUrlUpdate:i,setTunnel:c=>r(c)}));r(s.child),await K(C.VERIFYING),await He(s.tunnelUrl)||it.warn("\u26A0\uFE0F Tunnel health check timed out, proceeding anyway..."),await Ae(n,s.tunnelUrl),Nn({tunnelUrl:s.tunnelUrl,running:!0}),await new Promise(c=>setTimeout(c,z.postReadyHoldMs)),await jn(n,s.tunnelUrl)}catch(t){it.error(`\u274C Failed to start tunnel: ${t.message}`),await K(C.STOPPED)}}async function Ha(){let e=await Et(),{key:r}=Rt(e),n=bn();Xe(e,r,n?.name||"Default"),await U({permanentKey:r}),it.info(`\u2705 Key regenerated: ${Bn(r)}`)}function Ka(e,r){it.info("\u{1F6D1} Shutting down 9Remote completely...");let n=e();r(null),nt({tunnelProcess:n}),it.info("\u2705 9Remote stopped")}var Mr=A(require("path"),1),Vi=A(require("fs"),1),Qi=require("url");function Yi(){return process.env.CODESPACES==="true"}var ja=Mr.default.dirname((0,Qi.fileURLToPath)(__importMetaUrl));async function We(){let e=await Et();if(Yi()&&process.env.NREMOTE_API_KEY)return Xe(e,process.env.NREMOTE_API_KEY,"Codespace");let r=bn();if(!r.key){let{key:n}=Rt(e);r=Xe(e,n,"Default")}return r}function Ye(){return"2.0.
|
|
56
|
+
`)}var it=V("cmd");function Ge(e,r,n){let o=!1;setInterval(async()=>{if(o)return;let t=vo();if(t){o=!0;try{if(t==="stop-tunnel")await Gi(e,r);else if(t==="restart-tunnel")await Gi(e,r),await Wi(e,r,n);else if(t==="start-tunnel"){if(await Wi(e,r,n)==="alreadyRunning"){o=!1;return}}else t==="regenerate-key"?await Ha():t==="shutdown"&&Ka(e,r)}finally{o=!1}}},fe.cmdMs)}async function Gi(e,r){jt();let n=e();n&&(n.kill(),r(null),it.info("\u{1F6D1} Tunnel stopped")),await K(C.STOPPED,{tunnelUrl:"",oneTimeKey:"",oneTimeKeyExpiresAt:null}),Nn({tunnelUrl:"",running:!0})}async function Wi(e,r,n){let o=e();if(o)if(o.killed||o.exitCode!=null)r(null);else{let t=await j("/api/ui/state");return await K(C.READY,{tunnelUrl:t?.tunnelUrl||""}),"alreadyRunning"}it.info("\u{1F680} Starting tunnel...");try{await K(C.PREPARING),await qt(In),await K(C.CONNECTING);let t=await Y(`${N}/api/session/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:n})});if(!t.ok)throw new Error(`Session create failed: ${t.status}`);await K(C.TUNNELING);let i=async c=>{await Ae(n,c),await U({tunnelUrl:c}),wt(c)},s=await rt(I,i,xt({onUrlUpdate:i,setTunnel:c=>r(c)}));r(s.child),await K(C.VERIFYING),await He(s.tunnelUrl)||it.warn("\u26A0\uFE0F Tunnel health check timed out, proceeding anyway..."),await Ae(n,s.tunnelUrl),Nn({tunnelUrl:s.tunnelUrl,running:!0}),await new Promise(c=>setTimeout(c,z.postReadyHoldMs)),await jn(n,s.tunnelUrl)}catch(t){it.error(`\u274C Failed to start tunnel: ${t.message}`),await K(C.STOPPED)}}async function Ha(){let e=await Et(),{key:r}=Rt(e),n=bn();Xe(e,r,n?.name||"Default"),await U({permanentKey:r}),it.info(`\u2705 Key regenerated: ${Bn(r)}`)}function Ka(e,r){it.info("\u{1F6D1} Shutting down 9Remote completely...");let n=e();r(null),nt({tunnelProcess:n}),it.info("\u2705 9Remote stopped")}var Mr=A(require("path"),1),Vi=A(require("fs"),1),Qi=require("url");function Yi(){return process.env.CODESPACES==="true"}var ja=Mr.default.dirname((0,Qi.fileURLToPath)(__importMetaUrl));async function We(){let e=await Et();if(Yi()&&process.env.NREMOTE_API_KEY)return Xe(e,process.env.NREMOTE_API_KEY,"Codespace");let r=bn();if(!r.key){let{key:n}=Rt(e);r=Xe(e,n,"Default")}return r}function Ye(){return"2.0.26"}async function Ji(){Ie("agent",process.pid),mt(Ye());let e=await We(),r=process.argv.find(a=>a.startsWith("--theme=")),n=r?r.split("=")[1]:null,o=await Z(),t=o?{getProcess:()=>null,shutdown:()=>{}}:Be(null,null);o||await new Promise(a=>setTimeout(a,z.serverBootMs));let i=`http://localhost:${I}`;console.log(m.green(`
|
|
57
57
|
\u{1F310} UI ready at ${i}`));let s=null;await U({permanentKey:e.key,step:C.STOPPED,theme:n}),Fe(t,null),Ge(()=>s,a=>{s=a},e.key),process.argv.includes("--start")&&pt("start-tunnel"),await new Promise(()=>{})}Tt();async function Xi(){Ie("agent",process.pid);let e=await We(),r=process.argv.find(l=>l.startsWith("--theme=")),n=r?r.split("=")[1]:null,o=await Z(),t=o?{getProcess:()=>null,shutdown:()=>{}}:Be(null,null);o||await new Promise(l=>setTimeout(l,z.serverBootMs));let i=`http://localhost:${I}`,s=null;await U({permanentKey:e.key,step:C.STOPPED,theme:n});let a=()=>{let l=s;s=null,nt({serverManager:t,tunnelProcess:l,exit:!1})};Fe(t,null),Ge(()=>s,l=>{s=l},e.key);try{Pe("cloudflared")}catch{}process.argv.includes("--start")&&pt("start-tunnel"),await Tr({port:I,onQuit:a,onOpenUI:()=>en(i)})&&Er({title:"9Remote is running",message:`Open ${i} or use the tray icon to manage.`}),await new Promise(()=>{})}var Ve=V("mode");async function Ga(e){Ve.info("\u{1F680} Starting server..."),await K(C.PREPARING);try{tt(),await new Promise(s=>setTimeout(s,z.killCloudflaredMs))}catch{}try{let s=await Y(`${N}/api/session/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e})});if(!s.ok)return Ve.error(`\u274C Session create failed: ${s.status}`),null}catch(s){return Ve.error(`\u274C Session create failed: ${s.message}`),null}let r=await Z(),n=r?{getProcess:()=>null,shutdown:()=>{}}:Be(null,null);r||await new Promise(s=>setTimeout(s,z.serverBootMs)),Ve.info("\u2705 Starting tunnel..."),await K(C.CONNECTING);let o={current:null},t,i=async s=>{Ve.info(`\u{1F504} Tunnel URL rotated: ${s}`),await Ae(e,s),U({tunnelUrl:s}),wt(s)};try{let s=await rt(I,i,xt({onUrlUpdate:i,setTunnel:a=>{o.current=a}}));o.current=s.child,t=s.tunnelUrl}catch(s){return Ve.error(`\u274C Failed to start tunnel: ${s.message}`),n.shutdown(),null}return await He(t)||Ve.warn("\u26A0\uFE0F Tunnel health check timed out, proceeding anyway..."),await Ae(e,t),xn({apiKey:e,tunnelUrl:t,serverPid:n.getProcess()?.pid,tunnelPid:o.current?.pid}),{serverManager:n,tunnelRef:o,tunnelUrl:t}}async function qi(){mt(Ye());let e=await We();Ve.info(`Using key: ${Bn(e.key)} (${e.name})`);let r=await Ga(e.key);r||process.exit(1);let{serverManager:n,tunnelRef:o,tunnelUrl:t}=r;await jn(e.key,t),Fe(n,o.current),Ge(()=>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")}`})},fe.statsMs),await new Promise(()=>{})}var Zi=require("child_process"),$r=A(require("path"),1),zi=A(require("fs"),1),es=require("url");Tt();var df=$r.default.dirname((0,es.fileURLToPath)(__importMetaUrl));async function ts(){let e=`http://localhost:${I}`;await Z()&&(Un(I),await new Promise(l=>setTimeout(l,500)));let n=[process.argv[1],"--tray"],o=process.argv.find(l=>l.startsWith("--theme="));o&&n.push(o);let t=$t;try{zi.default.mkdirSync($r.default.dirname(t),{recursive:!0})}catch{}let i=null;try{let l=(0,Zi.spawn)(process.execPath,n,{detached:!0,windowsHide:!0,stdio:"ignore",env:{...process.env}});l.unref(),i=l.pid,l.pid&&Ie("agent",l.pid)}catch(l){console.log(m.red(`
|
|
58
58
|
\u274C Failed to launch background: ${l.message}`)),process.exit(1)}let s=Date.now()+fe.bgServerReadyTimeoutMs,a=!1;for(;Date.now()<s;){if(await Z()){a=!0;break}await new Promise(l=>setTimeout(l,fe.bgServerReadyIntervalMs))}a||(console.log(m.red(`
|
|
59
59
|
\u274C Background server failed to start.`)),console.log(m.gray(` Check log: ${t}
|
package/dist/server.cjs
CHANGED
|
@@ -129,7 +129,7 @@ export const ${TT} = async () => ({
|
|
|
129
129
|
else if (event.type === "permission.asked") post("notification");
|
|
130
130
|
},
|
|
131
131
|
});
|
|
132
|
-
`}function o3(){let r=yn.opencode(),e=Ht.default.dirname(r);return dt.default.existsSync(e)||dt.default.mkdirSync(e,{recursive:!0}),dt.default.writeFileSync(r,s3(),"utf8"),{success:!0}}function a3(r){switch(r){case"claude":{let e=Zo(yn.claude());return!!(e.hooks?.Stop||e.hooks?.Notification)}case"codex":{let e=yn.codex();return dt.default.existsSync(e)&&dt.default.readFileSync(e,"utf8").includes("# 9Remote notification")}case"gemini":{let e=Zo(yn.gemini());return!!(e.hooks?.AfterAgent||e.hooks?.Notification)}case"opencode":return dt.default.existsSync(yn.opencode());default:return!1}}function c3(r){let e=QF[r]?.();return e?(Array.isArray(e)?e:[e]).some(n=>dt.default.existsSync(n)):!1}var l3={claude:ZF,codex:n3,gemini:i3,opencode:o3};var u3=Cv;function p3(r){return l3[r]?.()||{success:!1,error:"Unknown tool"}}function AT(){let r={};for(let e of u3)if(!(!c3(e)||a3(e)))try{r[e]=p3(e).success}catch{r[e]=!1}return r}function RT(){let r=yn.claude(),e=Zo(r);if(!e.hooks?.Stop&&!e.hooks?.Notification)return;let t=e.env||{};Object.keys(Zs).some(i=>t[i]!==Zs[i])&&(CT(e),fu(r,e))}var gz=(0,OT.dirname)((0,PT.fileURLToPath)(__importMetaUrl)),vz=xv.rgb(230,138,110),fm="daemon",f3="2.0.
|
|
132
|
+
`}function o3(){let r=yn.opencode(),e=Ht.default.dirname(r);return dt.default.existsSync(e)||dt.default.mkdirSync(e,{recursive:!0}),dt.default.writeFileSync(r,s3(),"utf8"),{success:!0}}function a3(r){switch(r){case"claude":{let e=Zo(yn.claude());return!!(e.hooks?.Stop||e.hooks?.Notification)}case"codex":{let e=yn.codex();return dt.default.existsSync(e)&&dt.default.readFileSync(e,"utf8").includes("# 9Remote notification")}case"gemini":{let e=Zo(yn.gemini());return!!(e.hooks?.AfterAgent||e.hooks?.Notification)}case"opencode":return dt.default.existsSync(yn.opencode());default:return!1}}function c3(r){let e=QF[r]?.();return e?(Array.isArray(e)?e:[e]).some(n=>dt.default.existsSync(n)):!1}var l3={claude:ZF,codex:n3,gemini:i3,opencode:o3};var u3=Cv;function p3(r){return l3[r]?.()||{success:!1,error:"Unknown tool"}}function AT(){let r={};for(let e of u3)if(!(!c3(e)||a3(e)))try{r[e]=p3(e).success}catch{r[e]=!1}return r}function RT(){let r=yn.claude(),e=Zo(r);if(!e.hooks?.Stop&&!e.hooks?.Notification)return;let t=e.env||{};Object.keys(Zs).some(i=>t[i]!==Zs[i])&&(CT(e),fu(r,e))}var gz=(0,OT.dirname)((0,PT.fileURLToPath)(__importMetaUrl)),vz=xv.rgb(230,138,110),fm="daemon",f3="2.0.26",Gn=new Map,MT=new Map,IT={};async function kT(){let r=await hl(),e=new Map(r.map(n=>[n.id,n])),t=Ch();for(let n of r)if(!t[n.id])try{await ui(n.id)}catch{}Gn.clear();for(let[n,i]of Object.entries(t)){let s=e.get(n);Gn.set(n,{daemon:!0,name:i.name,createdAt:i.createdAt,shellId:i.shellId,cwd:s?.cwd||i.cwd,needsRespawn:!s})}vn(Gn)}async function NT(){let r=qS();for(let n of r.groups)MT.set(n.id,n);Object.assign(IT,r.sessionGroups);try{RT()}catch{}try{AT()}catch{}if(fm==="daemon")if(!await sw())console.error("\u274C Failed to connect to PTY daemon, falling back to buffer mode");else{await kT(),fl("connected",()=>{kT().catch(()=>{})});return}console.log("\u{1F4E6} Buffer persistence mode - scrollback enabled");let e=$S(),t=Ch();for(let n of e){let i=t[n]||{};Gn.set(n,{pty:null,name:i.name||`Terminal ${Gn.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 LT(r,e){fm==="daemon"&&(fl("output",({sessionId:n,data:i})=>wt(r,"output",{sessionId:n,data:i})),fl("sessionClosed",n=>{Gn.delete(n),pu(n),wt(r,"sessionClosed",n),wt(r,"notificationCleared",n)}));let t=()=>({version:f3,remoteAvailable:xs(),daemonMode:fm==="daemon"&&Cr(),platform:process.platform,...IS()});$w(()=>{let n=t();for(let i of r.sockets.sockets.values())i.data?.approved&&i.emit("serverInfo",n)}),r.on("connection",n=>{NS(),n.emit("serverInfo",t()),zS(n,r,Gn,MT,IT),YS(n,Gn),wT(n),TS()&&MS(n,e).catch(i=>{console.error("\u274C Failed to setup remote handlers:",i.message)}),n.on("disconnect",i=>{mT(n.id),LS()})})}var se=X(require("fs"),1),yr=X(require("path"),1),Vr=X(require("os"),1),qs=require("child_process"),fR=X(nR(),1);var bg=["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"],Lu=[".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 iR=[".ssh",".aws",".gnupg",".kube",".docker",".cargo",".npmrc",".netrc",".pypirc",".config/gh",".config/gcloud"],sR=["/etc/shadow","/etc/sudoers","/etc/ssh","/root","/private/etc/sudoers"];var oR=X(require("fs"),1),ma=X(require("path"),1),aR=X(require("os"),1);var cR=aR.default.homedir();function dU(r){if(!r)return null;let e=r.startsWith("~")?r.replace(/^~/,cR):r;try{return oR.default.realpathSync(e)}catch{return ma.default.resolve(e)}}function Sn(r){let e=dU(r);if(!e)return!1;for(let t of sR)if(e===t||e.startsWith(t+ma.default.sep))return!0;for(let t of iR){let n=ma.default.join(cR,t);if(e===n||e.startsWith(n+ma.default.sep))return!0}return!1}function Du(r){return bg.includes(r)}function Us(r){return Lu.includes(yr.default.extname(r).toLowerCase())}function mU(r,e){return r.isDirectory()?"folder":Us(e)?"binary":"file"}function ga(r){return r<1024?`${r}B`:r<1024*1024?`${(r/1024).toFixed(1)}KB`:`${(r/(1024*1024)).toFixed(1)}MB`}function dR(r,e,t,n=50){if(!(t.length>=n))try{for(let i of se.default.readdirSync(r)){if(t.length>=n)return;if(i.startsWith(".")||Du(i))continue;let s=yr.default.join(r,i);try{let o=se.default.statSync(s);o.isDirectory()?dR(s,e,t,n):i.toLowerCase().includes(e.toLowerCase())&&t.push({name:i,path:s,type:Us(i)?"binary":"file",size:o.size,sizeFormatted:ga(o.size)})}catch{}}}catch{}}function pR(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 hR(r,e,t,n,i,s){if(s.length>=200)return;let o;try{o=se.default.readdirSync(r,{withFileTypes:!0})}catch{return}for(let a of o){if(s.length>=200)return;if(Du(a.name))continue;let c=yr.default.join(r,a.name),u=yr.default.relative(e,c);if(a.isDirectory()){hR(c,e,t,n,i,s);continue}if(a.isFile()&&!Us(a.name)&&!(i&&i.test(u))&&!(n&&!n.test(u)))try{if(se.default.statSync(c).size>512e3)continue;let m=se.default.readFileSync(c,"utf-8").split(`
|
|
133
133
|
`),y=[];for(let _=0;_<m.length&&y.length<10;_++){let S=m[_],A=t(S);for(let P of A){if(y.length>=10)break;y.push({line:_+1,column:P.column+1,lineText:S,matchLength:P.length})}}y.length&&s.push({path:c,matches:y})}catch{}}}function mR(r,e,t){let n;try{n=se.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"||Du(s.name))continue;let o=yr.default.join(r,s.name);if(s.isDirectory()){let a={name:s.name,path:o,type:"folder"};e>0&&(a.children=mR(o,e-1,t)),i.push(a)}else s.isFile()&&i.push({name:s.name,path:o,type:Us(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 gU(){if(process.platform!=="win32")return[];try{return(0,qs.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=>se.default.existsSync(r)).map(r=>({letter:r[0],path:r}))}}function gR(r){r.on("getSystemInfo",t=>{let n=process.platform;t({success:!0,platform:n,isWindows:n==="win32",drives:n==="win32"?gU():[],homedir:Vr.default.homedir()})}),r.on("getFiles",({dirPath:t,showHidden:n},i)=>{try{let s=t||Vr.default.homedir(),o=s.startsWith("~")?s.replace("~",Vr.default.homedir()):s;if(Sn(o))return i({success:!1,error:"Access denied"});if(!se.default.existsSync(o))return i({success:!1,error:"Directory not found"});let a=[];for(let c of se.default.readdirSync(o))if(!(!n&&c.startsWith(".")&&c!==".env"&&c!==".env.example")&&!Du(c))try{let u=yr.default.join(o,c),p=se.default.statSync(u);a.push({name:c,path:u,type:mU(p,c),size:p.isFile()?p.size:null,sizeFormatted:p.isFile()?ga(p.size):null,modified:p.mtime.getTime()})}catch{}a.sort((c,u)=>c.type==="folder"&&u.type!=="folder"?-1:c.type!=="folder"&&u.type==="folder"?1:c.name.localeCompare(u.name)),i({success:!0,files:a,currentPath:o,parentPath:yr.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||Vr.default.homedir()).replace(/^~/,Vr.default.homedir());if(!se.default.existsSync(s))return i({success:!1,error:"Workspace not found"});let o=[];dR(s,n,o,50),o.sort((a,c)=>{let u=a.name.toLowerCase()===n.toLowerCase(),p=c.name.toLowerCase()===n.toLowerCase();return u&&!p?-1:!u&&p?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(Sn(t))return n({success:!1,error:"Access denied"});if(!se.default.existsSync(t))return n({success:!1,error:"File not found"});let i=se.default.statSync(t);if(i.size>512e3)return n({success:!1,error:`File too large (${ga(i.size)}). Max ${ga(512e3)}`});if(Us(t))return n({success:!1,error:"Cannot open binary file"});n({success:!0,content:se.default.readFileSync(t,"utf-8")})}catch(i){n({success:!1,error:i.message})}}),r.on("readImage",({filePath:t},n)=>{try{if(Sn(t))return n({success:!1,error:"Access denied"});if(!se.default.existsSync(t))return n({success:!1,error:"File not found"});let i=se.default.statSync(t),s=10*1024*1024;if(i.size>s)return n({success:!1,error:`Image too large (${ga(i.size)})`});let o=yr.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",u=se.default.readFileSync(t),p=`data:${c};base64,${u.toString("base64")}`;n({success:!0,dataUrl:p,size:i.size,mime:c})}catch(i){n({success:!1,error:i.message})}}),r.on("writeFile",({filePath:t,content:n},i)=>{try{if(Sn(t))return i({success:!1,error:"Access denied"});se.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(Sn(t))return i({success:!1,error:"Access denied"});if(se.default.existsSync(t))return i({success:!1,error:"Item already exists"});n==="folder"?se.default.mkdirSync(t,{recursive:!0}):se.default.writeFileSync(t,"","utf-8"),i({success:!0})}catch(s){i({success:!1,error:s.message})}}),r.on("deleteItem",({itemPath:t},n)=>{try{if(Sn(t))return n({success:!1,error:"Access denied"});if(!se.default.existsSync(t))return n({success:!1,error:"Item not found"});se.default.statSync(t).isDirectory()?se.default.rmSync(t,{recursive:!0}):se.default.unlinkSync(t),n({success:!0})}catch(i){n({success:!1,error:i.message})}}),r.on("renameItem",({oldPath:t,newPath:n},i)=>{try{if(Sn(t)||Sn(n))return i({success:!1,error:"Access denied"});if(!se.default.existsSync(t))return i({success:!1,error:"Item not found"});if(se.default.existsSync(n))return i({success:!1,error:"Target already exists"});se.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 u=(t||Vr.default.homedir()).replace(/^~/,Vr.default.homedir());if(!se.default.existsSync(u))return c({success:!1,error:"Workspace not found"});let p;if(s){let _;try{_=new RegExp(n,i?"g":"gi")}catch(S){return c({success:!1,error:`Invalid regex: ${S.message}`})}p=S=>{let A=[],P;for(_.lastIndex=0;(P=_.exec(S))!==null;)A.push({column:P.index,length:P[0].length}),P.index===_.lastIndex&&_.lastIndex++;return A}}else{let _=i?n:n.toLowerCase();p=S=>{let A=i?S:S.toLowerCase(),P=[],L=0;for(;(L=A.indexOf(_,L))!==-1;)P.push({column:L,length:_.length}),L+=_.length||1;return P}}let f=pR(o),m=pR(a),y=[];hR(u,u,p,f,m,y),c({success:!0,results:y})}catch(u){c({success:!1,error:u.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 u;if(o){let m;try{m=new RegExp(n,s?"g":"gi")}catch(y){return c({success:!1,error:`Invalid regex: ${y.message}`})}u=y=>{let _=0;return{next:y.replace(m,A=>(_++,i)),count:_}}}else u=m=>{let y=0,_=s?"g":"gi",S=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),A=new RegExp(S,_);return{next:m.replace(A,()=>(y++,i)),count:y}};let p=0,f=0;for(let m of a)try{if(!se.default.existsSync(m)||Us(m))continue;let y=se.default.statSync(m);if(!y.isFile()||y.size>512e3)continue;let _=se.default.readFileSync(m,"utf-8"),{next:S,count:A}=u(_);A>0&&(se.default.writeFileSync(m,S,"utf-8"),p+=A,f++)}catch{}c({success:!0,replacedCount:p,fileCount:f})}catch(u){c({success:!1,error:u.message})}});let e=new Map;r.on("watchDir",({dirPath:t},n)=>{try{if(!t||!se.default.existsSync(t))return n({success:!1,error:"Directory not found"});if(e.has(t))return n({success:!0});let i=fR.default.watch(t,{depth:0,ignoreInitial:!0,persistent:!0,ignored:o=>bg.includes(yr.default.basename(o))}),s=o=>a=>r.emit("fileChange",{type:o,path:a});i.on("add",s("add")).on("change",s("change")).on("unlink",s("unlink")).on("addDir",s("addDir")).on("unlinkDir",s("unlinkDir")),e.set(t,i),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.close(),e.delete(t)),n({success:!0})}catch(i){n({success:!1,error:i.message})}}),r.once("disconnect",()=>{for(let 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=[yr.default.dirname(t)]);let a=(0,qs.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||!se.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,qs.spawn)(s,o,a);c.on("error",()=>{if(i==="linux"){let u=(0,qs.spawn)("xterm",["-e",`cd "${t}" && bash`],a);u.on("error",p=>n({success:!1,error:p.message})),u.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||Vr.default.homedir()).replace(/^~/,Vr.default.homedir());if(!se.default.existsSync(o))return s({success:!1,error:"Directory not found"});let c=mR(o,typeof n=="number"?n:3,!!i);s({success:!0,tree:{name:yr.default.basename(o)||o,path:o,type:"folder",children:c}})}catch(o){s({success:!1,error:o.message})}})}var Ut=X(require("fs"),1),wi=X(require("path"),1),Mr=require("child_process");function bi(r,e){return new Promise(t=>{let n=(0,Mr.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 vR(r){return Lu.includes(wi.default.extname(r).toLowerCase())}function xR(r){r.on("gitStatus",({repoPath:e},t)=>{try{let n=(0,Mr.execSync)("git status --porcelain",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"],windowsHide:!0}),i={};try{(0,Mr.execSync)("git diff HEAD --numstat",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"],windowsHide:!0}).trim().split(`
|
|
134
134
|
`).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(`
|
|
135
135
|
`).filter(Boolean)){let a=o.match(/^([MADRCU?! ]{1,2})\s+(.+)$/);if(!a)continue;let c=a[1],u=a[2];if(!u)continue;let p;c.includes("?")?p="?":c.includes("A")?p="A":c.includes("D")?p="D":c.includes("M")?p="M":c.includes("R")?p="R":p=c.trim()[0]||"?";let f=i[u]||{added:0,deleted:0};if(p==="?")try{let m=wi.default.join(e,u);if(Ut.default.existsSync(m)&&!vR(u)){let y=Ut.default.readFileSync(m,"utf-8");f.added=y.split(`
|
|
@@ -259,7 +259,7 @@ self.addEventListener('fetch', (event) => {
|
|
|
259
259
|
</body>
|
|
260
260
|
</html>
|
|
261
261
|
`);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 Mk=X(require("http"),1),Ik=X(require("https"),1),Nk=require("child_process"),Lk=require("util"),e4=(0,Lk.promisify)(Nk.exec);async function t4(){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 e4(t),i=n.split(`
|
|
262
|
-
`);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 r4(r,e=2e3){return new Promise(t=>{let n=Mk.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 n4(r,e=2e3){return new Promise(t=>{let n=Ik.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 i4(r){let[e,t]=await Promise.all([r4(r),n4(r)]);return t.active?{port:r,...t}:e.active?{port:r,...e}:{port:r,active:!1}}async function Dk(){let r=await t4();return(await Promise.all(r.map(t=>i4(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 Bk=X(require("crypto"),1),s4=process.env.API_KEY_SECRET||"9remote-api-key-secret";function o4(){let r="abcdefghijklmnopqrstuvwxyz0123456789",e="";for(let t=0;t<4;t++)e+=r.charAt(Math.floor(Math.random()*r.length));return e}function jk(r,e){return Bk.default.createHmac("sha256",s4).update(r+e).digest("hex").slice(0,6)}function Fk(r){let e=r.slice(0,8),t=o4(),n=jk(e,t);return{key:`sk-${e}-${t}-${n}`,keyId:t}}function a4(r){if(!r||!r.startsWith("sk-"))return null;let e=r.split("-");if(e.length===4){let[,t,n,i]=e,s=jk(t,n);return i!==s?null:{machineId:t,keyId:n}}return null}function Gu(r){return a4(r)!==null}async function Hk(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(!Gu(n)){e.setHeader("Content-Type","application/json"),e.writeHead(401),e.end(JSON.stringify({error:"Unauthorized: Invalid API key"}));return}let i=await Dk();e.setHeader("Content-Type","application/json"),e.writeHead(200),e.end(JSON.stringify(i))}el();var Uk=require("url");var qg=X(require("path"),1),Wk=X(require("os"),1);gt();var $k=X(require("path"),1),qk=X(require("os"),1);var JK=$k.default.join(qk.default.homedir(),".9remote","pids");var nV=qg.default.dirname((0,Uk.fileURLToPath)(__importMetaUrl)),c4="9remote",iV=`https://registry.npmjs.org/${c4}/latest`;var sV=qg.default.join(Wk.default.homedir(),".9remote","cloudflared.pid");function Gk(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}fi();Gt();gt();Mo();var Kk=X(zk(),1),Wg=X(require("crypto"),1),{machineIdSync:l4}=Kk.default;async function Vk(r=null){let e=r||process.env.MACHINE_ID_SALT||"9remote-salt";try{let t=l4();return Wg.default.createHash("sha256").update(t+e).digest("hex").substring(0,16)}catch(t){return console.error("Error getting machine ID:",t),Wg.default.randomUUID().replace(/-/g,"").substring(0,16)}}fi();async function Yk(r,e){let t=jw(),n=t.workerUrl||"https://9remote.cc";if(!t.permanentKey){he(e,400,"No permanent key set");return}try{let s=await(await eo(`${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}`;Hn({oneTimeKey:s.tempKey,oneTimeKeyExpiresAt:s.expiresAt,qrUrl:o}),ee(e,{oneTimeKey:s.tempKey,expiresAt:s.expiresAt,qrUrl:o})}catch(i){he(e,500,i.message)}}async function Xk(r,e){try{let t=await Vk(),{key:n}=Fk(t),i=xw();yw(t,n,i?.name||"Default"),Hn({permanentKey:n}),ee(e,{ok:!0,permanentKey:n})}catch(t){he(e,500,t.message)}}Gt();async function Jk(r,e){let t=await It(r,e);if(!t)return;let n=HR(t.socketId);ee(e,{ok:n})}async function Qk(r,e){let t=await It(r,e);if(!t)return;let n=qR(t.socketId);ee(e,{ok:n})}function Zk(r,e){ee(e,{pending:OR()})}function eO(r,e){ee(e,{devices:AR()})}function tO(r,e){ee(e,{rejected:NR()})}async function rO(r,e){let t=await It(r,e);if(!t)return;let n=$R(t.deviceId);ee(e,{ok:n})}async function nO(r,e){let t=await It(r,e);t&&(Hu(t.deviceId),zs(t.deviceId),ee(e))}async function iO(r,e){let t=await It(r,e);t&&(Hu(t.deviceId),TR(t.deviceId),ee(e))}async function sO(r,e){let t=await It(r,e);if(!t)return;let n=Hu(t.deviceId);ee(e,{disconnected:n})}function oO(r,e){ee(e,{enabled:Fu()})}async function aO(r,e){let t=await It(r,e);if(!t)return;let n=CR(t.deviceId,t.label);ee(e,{ok:n})}async function cO(r,e){let t=await It(r,e);if(!t)return;let n=DR(!!t.enabled);ee(e,{enabled:n})}Gt();var lO={},u4=1e4;function uO(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 pO(r,e){let t="";await new Promise(n=>{r.on("data",i=>t+=i),r.on("end",n)});try{dO(uO(t,null)),ee(e,{success:!0})}catch{he(e,400,"Invalid JSON")}}function fO(r,e,{query:t}){dO(uO(null,t)),ee(e,{success:!0})}function dO({type:r,sessionId:e,tool:t}){let n=Date.now(),i=ya();if(!i||!e)return;let s={type:r,sessionId:e,tool:t,timestamp:n};if(_T(e,s),wt(i,"chatNotification",s),!yT())return;let o=`${t}:${r}`;n-(lO[o]||0)<u4||(lO[o]=n,i.timeout(5e3).emit("chatNotificationAck",s,(a,c)=>{!a&&c&&c.length>0||vT(s)}))}Gt();Cl();Mo();bt();fi();function hO(){return{mode:ph(),active:uh(),presets:Object.keys(Z.sleepInhibit?.presets||{})}}function mO(r,e){ee(e,hO())}async function gO(r,e){let t=await It(r,e);if(!t)return;let n=Ho(t.mode);vw({sleepInhibitMode:n});let i=hO();St("sleepInhibit",i),ee(e,i)}Gt();async function vO(r,e){try{let t=await hl();ee(e,{sessions:t})}catch(t){he(e,500,t.message)}}async function xO(r,e){let t=await It(r,e);if(t){if(!t.sessionId)return he(e,400,"sessionId required");try{await ui(t.sessionId),ee(e)}catch(n){he(e,500,n.message)}}}Cl();Mo();bt();Ov();var zn=An("server"),Kn=(0,bO.fileURLToPath)(new URL(".",__importMetaUrl)),wO=process.env.NODE_ENV==="development",p4=5173,f4="https://registry.npmjs.org/9remote/latest",Gg=(0,Ci.existsSync)((0,tr.join)(Kn,"ui","dist"))?(0,tr.join)(Kn,"ui","dist"):(0,tr.join)(Kn,"ui"),d4={".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 h4(r,e,t){let n=(0,zu.request)({hostname:"localhost",port:p4,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 yO(r,e){if(!(0,Ci.existsSync)(e))return!1;let t=d4[(0,tr.extname)(e)]||"application/octet-stream";return r.setHeader("Content-Type",t),r.writeHead(200),r.end((0,Ci.readFileSync)(e)),!0}async function m4(r){try{let e=await eo(f4);if(!e.ok)return;let{version:t}=await e.json();t&&Gk(r,t)&&St("updateAvailable",{version:t})}catch{}}function g4(r,e){if(process.env.CODESPACES!=="true"){he(e,400,"Not running on Codespaces");return}let t=process.env.CODESPACE_NAME;if(!t){he(e,400,"Codespace name not found");return}let n=ya();n&&n.emit("codespace:stopping"),ee(e,{success:!0,message:"Stopping codespace..."}),setTimeout(()=>(0,Ku.execFile)("gh",["codespace","stop","-c",t],{windowsHide:!0}),500)}var SO;async function _O(r,e,{pathname:t}){let n=r.headers.authorization;if(!n||!n.startsWith("Bearer ")||!Gu(n.slice(7))){he(e,401,"Unauthorized");return}let{parseJsonBody:i}=await Promise.resolve().then(()=>(Gt(),ki)),s=await i(r,e);if(s){if(!s.port){he(e,400,"Port required");return}t.endsWith("start")?Rk(s.port):kk(s.port),ee(e,{success:!0})}}function v4(r,e,{pathname:t,search:n}){let i=t.match(/^\/proxy\/(\d+)(\/.*)?$/);i?Pk(SO,r,e,i[1],i[2]||"/",n):he(e,404,"Not found")}var x4=[{path:"/api/health",method:"GET",public:!0,handler:(r,e)=>ee(e,{status:"ok",timestamp:Date.now()})},{path:"/api/version",method:"GET",public:!0,handler:(r,e)=>{ee(e,{version:"2.0.25"})}},{path:"/api/notify",method:"POST",public:!0,handler:pO},{path:"/api/notify",method:"GET",public:!0,handler:fO},{path:"/proxy/*",method:"*",public:!0,handler:v4},{path:"/api/ui/events",method:"GET",handler:zw},{path:"/api/local-token",method:"GET",handler:qw},{path:"/api/ui/state",method:"GET",handler:Kw},{path:"/api/ui/state",method:"POST",handler:Vw},{path:"/api/ui/stop",method:"POST",handler:Yw},{path:"/api/ui/start",method:"POST",handler:Xw},{path:"/api/ui/shutdown",method:"POST",handler:Jw},{path:"/api/key/one-time",method:"POST",handler:Yk},{path:"/api/key/regenerate",method:"POST",handler:Xk},{path:"/api/device/approve",method:"POST",handler:Jk},{path:"/api/device/reject",method:"POST",handler:Qk},{path:"/api/device/pending",method:"GET",handler:Zk},{path:"/api/device/approved",method:"GET",handler:eO},{path:"/api/device/rejected",method:"GET",handler:tO},{path:"/api/device/approve-rejected",method:"POST",handler:rO},{path:"/api/device/clear-rejected",method:"POST",handler:nO},{path:"/api/device/remove",method:"POST",handler:iO},{path:"/api/device/label",method:"POST",handler:aO},{path:"/api/device/disconnect",method:"POST",handler:sO},{path:"/api/device/auto-approve",method:"GET",handler:oO},{path:"/api/device/auto-approve",method:"POST",handler:cO},{path:"/api/connections",method:"GET",handler:Qw},{path:"/api/logs",method:"GET",handler:Zw},{path:"/api/permissions",method:"GET",handler:tS},{path:"/api/permissions/request",method:"POST",handler:iS},{path:"/api/desktop/toggle",method:"POST",handler:eS},{path:"/api/autostart",method:"GET",handler:rS},{path:"/api/autostart",method:"POST",handler:nS},{path:"/api/sleep-inhibit",method:"GET",handler:mO},{path:"/api/sleep-inhibit",method:"POST",handler:gO},{path:"/api/sessions",method:"GET",handler:vO},{path:"/api/sessions/delete",method:"POST",handler:xO},{path:"/api/local-sites",method:"*",public:!0,handler:Hk},{path:"/api/codespace/stop",method:"POST",handler:g4},{path:"/api/proxy/start",method:"POST",public:!0,handler:_O},{path:"/api/proxy/end",method:"POST",public:!0,handler:_O}];var y4=parseInt(process.env.PORT||"2208",10),Ra=null;function _4(){if(!wO)return;let r=(0,tr.join)(Kn,"vite.config.js");if(!(0,Ci.existsSync)(r))return;let e=(0,Ci.existsSync)((0,tr.join)(Kn,"node_modules",".bin","vite"))?(0,tr.join)(Kn,"node_modules",".bin","vite"):(0,tr.join)(Kn,"..","node_modules",".bin","vite");Ra=(0,Ku.spawn)("node",[e,"--config",r],{cwd:Kn,stdio:"ignore",detached:!1}),Ra.on("error",()=>{}),Ra.unref()}async function EO(){let r=rh(),e=r.sleepInhibitMode;e||(r.sleepInhibit===!1?e="never":e=Z.sleepInhibit?.defaultMode||"never"),Ho(e),await NT(),SO=Ok(),_4();let n=vp(x4,{fallback:(a,c,{pathname:u})=>{if(u.startsWith("/api/")||u.startsWith("/socket.io")){he(c,404,"Not found");return}let p=!!a.headers["cf-connecting-ip"],f=a.socket.remoteAddress==="127.0.0.1"||a.socket.remoteAddress==="::1";if(p||!f){he(c,403,"Forbidden");return}let m=()=>{let y=u==="/"||u===""?(0,tr.join)(Gg,"index.html"):(0,tr.join)(Gg,u);yO(c,y)||yO(c,(0,tr.join)(Gg,"index.html"))};if(wO){h4(a,c,m);return}m()}}),i=(0,zu.createServer)(async(a,c)=>{WR(c),!GR(a,c)&&await n(a,c)});Bd(),Dw(),Bw(),Rl(),process.platform==="darwin"&&setInterval(Rl,Sv),await UR(i),i.listen(y4,a=>{if(a)throw a;m4("2.0.25")});let s=!1,o=async a=>{if(s)return;s=!0,lh(),zn.info(`\u{1F6D1} Received ${a}, shutting down gracefully...`);let c=setTimeout(()=>{zn.error("\u26A0\uFE0F Forced exit"),process.exit(1)},5e3);try{if(i.close(()=>zn.info("\u2713 HTTP server closed")),Ra)try{Ra.kill()}catch{}let u=ya();u&&(u.emit("server:shutdown"),u.close(()=>zn.info("\u2713 Socket.IO closed"))),await new Promise(p=>setTimeout(p,500)),clearTimeout(c),zn.info("\u2705 Server stopped cleanly"),process.exit(0)}catch(u){zn.error(`\u274C Error during shutdown: ${u?.message||u}`),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=>{zn.error(`\u26A0\uFE0F uncaughtException: ${a?.stack||a}`)}),process.on("unhandledRejection",a=>{zn.error(`\u26A0\uFE0F unhandledRejection: ${a?.stack||a}`)}),i}EO();0&&(module.exports={startServer});
|
|
262
|
+
`);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 r4(r,e=2e3){return new Promise(t=>{let n=Mk.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 n4(r,e=2e3){return new Promise(t=>{let n=Ik.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 i4(r){let[e,t]=await Promise.all([r4(r),n4(r)]);return t.active?{port:r,...t}:e.active?{port:r,...e}:{port:r,active:!1}}async function Dk(){let r=await t4();return(await Promise.all(r.map(t=>i4(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 Bk=X(require("crypto"),1),s4=process.env.API_KEY_SECRET||"9remote-api-key-secret";function o4(){let r="abcdefghijklmnopqrstuvwxyz0123456789",e="";for(let t=0;t<4;t++)e+=r.charAt(Math.floor(Math.random()*r.length));return e}function jk(r,e){return Bk.default.createHmac("sha256",s4).update(r+e).digest("hex").slice(0,6)}function Fk(r){let e=r.slice(0,8),t=o4(),n=jk(e,t);return{key:`sk-${e}-${t}-${n}`,keyId:t}}function a4(r){if(!r||!r.startsWith("sk-"))return null;let e=r.split("-");if(e.length===4){let[,t,n,i]=e,s=jk(t,n);return i!==s?null:{machineId:t,keyId:n}}return null}function Gu(r){return a4(r)!==null}async function Hk(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(!Gu(n)){e.setHeader("Content-Type","application/json"),e.writeHead(401),e.end(JSON.stringify({error:"Unauthorized: Invalid API key"}));return}let i=await Dk();e.setHeader("Content-Type","application/json"),e.writeHead(200),e.end(JSON.stringify(i))}el();var Uk=require("url");var qg=X(require("path"),1),Wk=X(require("os"),1);gt();var $k=X(require("path"),1),qk=X(require("os"),1);var JK=$k.default.join(qk.default.homedir(),".9remote","pids");var nV=qg.default.dirname((0,Uk.fileURLToPath)(__importMetaUrl)),c4="9remote",iV=`https://registry.npmjs.org/${c4}/latest`;var sV=qg.default.join(Wk.default.homedir(),".9remote","cloudflared.pid");function Gk(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}fi();Gt();gt();Mo();var Kk=X(zk(),1),Wg=X(require("crypto"),1),{machineIdSync:l4}=Kk.default;async function Vk(r=null){let e=r||process.env.MACHINE_ID_SALT||"9remote-salt";try{let t=l4();return Wg.default.createHash("sha256").update(t+e).digest("hex").substring(0,16)}catch(t){return console.error("Error getting machine ID:",t),Wg.default.randomUUID().replace(/-/g,"").substring(0,16)}}fi();async function Yk(r,e){let t=jw(),n=t.workerUrl||"https://9remote.cc";if(!t.permanentKey){he(e,400,"No permanent key set");return}try{let s=await(await eo(`${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}`;Hn({oneTimeKey:s.tempKey,oneTimeKeyExpiresAt:s.expiresAt,qrUrl:o}),ee(e,{oneTimeKey:s.tempKey,expiresAt:s.expiresAt,qrUrl:o})}catch(i){he(e,500,i.message)}}async function Xk(r,e){try{let t=await Vk(),{key:n}=Fk(t),i=xw();yw(t,n,i?.name||"Default"),Hn({permanentKey:n}),ee(e,{ok:!0,permanentKey:n})}catch(t){he(e,500,t.message)}}Gt();async function Jk(r,e){let t=await It(r,e);if(!t)return;let n=HR(t.socketId);ee(e,{ok:n})}async function Qk(r,e){let t=await It(r,e);if(!t)return;let n=qR(t.socketId);ee(e,{ok:n})}function Zk(r,e){ee(e,{pending:OR()})}function eO(r,e){ee(e,{devices:AR()})}function tO(r,e){ee(e,{rejected:NR()})}async function rO(r,e){let t=await It(r,e);if(!t)return;let n=$R(t.deviceId);ee(e,{ok:n})}async function nO(r,e){let t=await It(r,e);t&&(Hu(t.deviceId),zs(t.deviceId),ee(e))}async function iO(r,e){let t=await It(r,e);t&&(Hu(t.deviceId),TR(t.deviceId),ee(e))}async function sO(r,e){let t=await It(r,e);if(!t)return;let n=Hu(t.deviceId);ee(e,{disconnected:n})}function oO(r,e){ee(e,{enabled:Fu()})}async function aO(r,e){let t=await It(r,e);if(!t)return;let n=CR(t.deviceId,t.label);ee(e,{ok:n})}async function cO(r,e){let t=await It(r,e);if(!t)return;let n=DR(!!t.enabled);ee(e,{enabled:n})}Gt();var lO={},u4=1e4;function uO(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 pO(r,e){let t="";await new Promise(n=>{r.on("data",i=>t+=i),r.on("end",n)});try{dO(uO(t,null)),ee(e,{success:!0})}catch{he(e,400,"Invalid JSON")}}function fO(r,e,{query:t}){dO(uO(null,t)),ee(e,{success:!0})}function dO({type:r,sessionId:e,tool:t}){let n=Date.now(),i=ya();if(!i||!e)return;let s={type:r,sessionId:e,tool:t,timestamp:n};if(_T(e,s),wt(i,"chatNotification",s),!yT())return;let o=`${t}:${r}`;n-(lO[o]||0)<u4||(lO[o]=n,i.timeout(5e3).emit("chatNotificationAck",s,(a,c)=>{!a&&c&&c.length>0||vT(s)}))}Gt();Cl();Mo();bt();fi();function hO(){return{mode:ph(),active:uh(),presets:Object.keys(Z.sleepInhibit?.presets||{})}}function mO(r,e){ee(e,hO())}async function gO(r,e){let t=await It(r,e);if(!t)return;let n=Ho(t.mode);vw({sleepInhibitMode:n});let i=hO();St("sleepInhibit",i),ee(e,i)}Gt();async function vO(r,e){try{let t=await hl();ee(e,{sessions:t})}catch(t){he(e,500,t.message)}}async function xO(r,e){let t=await It(r,e);if(t){if(!t.sessionId)return he(e,400,"sessionId required");try{await ui(t.sessionId),ee(e)}catch(n){he(e,500,n.message)}}}Cl();Mo();bt();Ov();var zn=An("server"),Kn=(0,bO.fileURLToPath)(new URL(".",__importMetaUrl)),wO=process.env.NODE_ENV==="development",p4=5173,f4="https://registry.npmjs.org/9remote/latest",Gg=(0,Ci.existsSync)((0,tr.join)(Kn,"ui","dist"))?(0,tr.join)(Kn,"ui","dist"):(0,tr.join)(Kn,"ui"),d4={".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 h4(r,e,t){let n=(0,zu.request)({hostname:"localhost",port:p4,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 yO(r,e){if(!(0,Ci.existsSync)(e))return!1;let t=d4[(0,tr.extname)(e)]||"application/octet-stream";return r.setHeader("Content-Type",t),r.writeHead(200),r.end((0,Ci.readFileSync)(e)),!0}async function m4(r){try{let e=await eo(f4);if(!e.ok)return;let{version:t}=await e.json();t&&Gk(r,t)&&St("updateAvailable",{version:t})}catch{}}function g4(r,e){if(process.env.CODESPACES!=="true"){he(e,400,"Not running on Codespaces");return}let t=process.env.CODESPACE_NAME;if(!t){he(e,400,"Codespace name not found");return}let n=ya();n&&n.emit("codespace:stopping"),ee(e,{success:!0,message:"Stopping codespace..."}),setTimeout(()=>(0,Ku.execFile)("gh",["codespace","stop","-c",t],{windowsHide:!0}),500)}var SO;async function _O(r,e,{pathname:t}){let n=r.headers.authorization;if(!n||!n.startsWith("Bearer ")||!Gu(n.slice(7))){he(e,401,"Unauthorized");return}let{parseJsonBody:i}=await Promise.resolve().then(()=>(Gt(),ki)),s=await i(r,e);if(s){if(!s.port){he(e,400,"Port required");return}t.endsWith("start")?Rk(s.port):kk(s.port),ee(e,{success:!0})}}function v4(r,e,{pathname:t,search:n}){let i=t.match(/^\/proxy\/(\d+)(\/.*)?$/);i?Pk(SO,r,e,i[1],i[2]||"/",n):he(e,404,"Not found")}var x4=[{path:"/api/health",method:"GET",public:!0,handler:(r,e)=>ee(e,{status:"ok",timestamp:Date.now()})},{path:"/api/version",method:"GET",public:!0,handler:(r,e)=>{ee(e,{version:"2.0.26"})}},{path:"/api/notify",method:"POST",public:!0,handler:pO},{path:"/api/notify",method:"GET",public:!0,handler:fO},{path:"/proxy/*",method:"*",public:!0,handler:v4},{path:"/api/ui/events",method:"GET",handler:zw},{path:"/api/local-token",method:"GET",handler:qw},{path:"/api/ui/state",method:"GET",handler:Kw},{path:"/api/ui/state",method:"POST",handler:Vw},{path:"/api/ui/stop",method:"POST",handler:Yw},{path:"/api/ui/start",method:"POST",handler:Xw},{path:"/api/ui/shutdown",method:"POST",handler:Jw},{path:"/api/key/one-time",method:"POST",handler:Yk},{path:"/api/key/regenerate",method:"POST",handler:Xk},{path:"/api/device/approve",method:"POST",handler:Jk},{path:"/api/device/reject",method:"POST",handler:Qk},{path:"/api/device/pending",method:"GET",handler:Zk},{path:"/api/device/approved",method:"GET",handler:eO},{path:"/api/device/rejected",method:"GET",handler:tO},{path:"/api/device/approve-rejected",method:"POST",handler:rO},{path:"/api/device/clear-rejected",method:"POST",handler:nO},{path:"/api/device/remove",method:"POST",handler:iO},{path:"/api/device/label",method:"POST",handler:aO},{path:"/api/device/disconnect",method:"POST",handler:sO},{path:"/api/device/auto-approve",method:"GET",handler:oO},{path:"/api/device/auto-approve",method:"POST",handler:cO},{path:"/api/connections",method:"GET",handler:Qw},{path:"/api/logs",method:"GET",handler:Zw},{path:"/api/permissions",method:"GET",handler:tS},{path:"/api/permissions/request",method:"POST",handler:iS},{path:"/api/desktop/toggle",method:"POST",handler:eS},{path:"/api/autostart",method:"GET",handler:rS},{path:"/api/autostart",method:"POST",handler:nS},{path:"/api/sleep-inhibit",method:"GET",handler:mO},{path:"/api/sleep-inhibit",method:"POST",handler:gO},{path:"/api/sessions",method:"GET",handler:vO},{path:"/api/sessions/delete",method:"POST",handler:xO},{path:"/api/local-sites",method:"*",public:!0,handler:Hk},{path:"/api/codespace/stop",method:"POST",handler:g4},{path:"/api/proxy/start",method:"POST",public:!0,handler:_O},{path:"/api/proxy/end",method:"POST",public:!0,handler:_O}];var y4=parseInt(process.env.PORT||"2208",10),Ra=null;function _4(){if(!wO)return;let r=(0,tr.join)(Kn,"vite.config.js");if(!(0,Ci.existsSync)(r))return;let e=(0,Ci.existsSync)((0,tr.join)(Kn,"node_modules",".bin","vite"))?(0,tr.join)(Kn,"node_modules",".bin","vite"):(0,tr.join)(Kn,"..","node_modules",".bin","vite");Ra=(0,Ku.spawn)("node",[e,"--config",r],{cwd:Kn,stdio:"ignore",detached:!1}),Ra.on("error",()=>{}),Ra.unref()}async function EO(){let r=rh(),e=r.sleepInhibitMode;e||(r.sleepInhibit===!1?e="never":e=Z.sleepInhibit?.defaultMode||"never"),Ho(e),await NT(),SO=Ok(),_4();let n=vp(x4,{fallback:(a,c,{pathname:u})=>{if(u.startsWith("/api/")||u.startsWith("/socket.io")){he(c,404,"Not found");return}let p=!!a.headers["cf-connecting-ip"],f=a.socket.remoteAddress==="127.0.0.1"||a.socket.remoteAddress==="::1";if(p||!f){he(c,403,"Forbidden");return}let m=()=>{let y=u==="/"||u===""?(0,tr.join)(Gg,"index.html"):(0,tr.join)(Gg,u);yO(c,y)||yO(c,(0,tr.join)(Gg,"index.html"))};if(wO){h4(a,c,m);return}m()}}),i=(0,zu.createServer)(async(a,c)=>{WR(c),!GR(a,c)&&await n(a,c)});Bd(),Dw(),Bw(),Rl(),process.platform==="darwin"&&setInterval(Rl,Sv),await UR(i),i.listen(y4,a=>{if(a)throw a;m4("2.0.26")});let s=!1,o=async a=>{if(s)return;s=!0,lh(),zn.info(`\u{1F6D1} Received ${a}, shutting down gracefully...`);let c=setTimeout(()=>{zn.error("\u26A0\uFE0F Forced exit"),process.exit(1)},5e3);try{if(i.close(()=>zn.info("\u2713 HTTP server closed")),Ra)try{Ra.kill()}catch{}let u=ya();u&&(u.emit("server:shutdown"),u.close(()=>zn.info("\u2713 Socket.IO closed"))),await new Promise(p=>setTimeout(p,500)),clearTimeout(c),zn.info("\u2705 Server stopped cleanly"),process.exit(0)}catch(u){zn.error(`\u274C Error during shutdown: ${u?.message||u}`),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=>{zn.error(`\u26A0\uFE0F uncaughtException: ${a?.stack||a}`)}),process.on("unhandledRejection",a=>{zn.error(`\u26A0\uFE0F unhandledRejection: ${a?.stack||a}`)}),i}EO();0&&(module.exports={startServer});
|
|
263
263
|
/*! Bundled license information:
|
|
264
264
|
|
|
265
265
|
negotiator/index.js:
|