cfpilot 0.7.0 → 0.7.2

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.
@@ -18,4 +18,4 @@ data: ${JSON.stringify({count:l})}
18
18
  \u5E38\u89C1\u539F\u56E0\uFF1A\u76EE\u6807\u5730\u5740\u5728 Cloudflare \u81EA\u5BB6\u7F51\u6BB5\uFF08Worker \u4E0D\u80FD\u4E3B\u52A8\u8FDE\u56DE CF \u81EA\u5DF1\u7684\u5165\u53E3\uFF09\u3002
19
19
  \u2192 \u6362\u4E00\u4E2A\u7B2C\u4E09\u65B9 IP\uFF0C\u6216\u6539\u7528\u4EE3\u7406\u843D\u5730\u3002`;case"timeout":return`\u51FA\u7AD9\u8D85\u65F6\uFF08${e.candidate}\uFF09\uFF1A${e.message}
20
20
  \u2192 \u8BE5\u5730\u5740\u5F53\u524D\u4E0D\u53EF\u8FBE\uFF0C\u53EF\u6362\u4E00\u6761\u5019\u9009\u6216\u542F\u7528\u4EE3\u7406\u843D\u5730\u3002`;default:return`\u51FA\u7AD9\u5931\u8D25\uFF08${e.candidate}\uFF09\uFF1A${e.message}`}}var Vo,Ft=k(()=>{"use strict";Vo=[["104.16.0.0",13],["104.24.0.0",14],["104.31.0.0",15],["172.64.0.0",13],["162.158.0.0",15],["188.114.96.0",20],["141.101.64.0",18],["108.162.192.0",18],["103.21.244.0",22],["103.22.200.0",22],["103.31.4.0",22],["131.0.72.0",22],["197.234.240.0",22],["198.41.128.0",17],["192.0.0.0",24],["192.0.2.0",24],["192.88.99.0",24],["199.27.128.0",21],["223.5.5.0",24],["1.0.0.0",24],["1.1.1.0",24]]});function Cr(e,t="direct"){let n=e.trim();if(!n)return null;let r=t,o=n,s=/^([a-z0-9+.-]+):\/\//i.exec(n);if(s){let h=s[1].toLowerCase();o=n.slice(s[0].length),h==="socks5"||h==="socks"||h==="socks5h"?r="socks5":h==="https"?r="https":h==="http"&&(r="http")}let i=o.lastIndexOf("@"),a={};if(i>=0){let h=o.slice(0,i);o=o.slice(i+1);let m=h.indexOf(":");m>=0?a={username:h.slice(0,m),password:h.slice(m+1)}:a={username:h}}let c,f=/#sni=([^/#]+)/i.exec(o);f&&(c=f[1].trim(),o=o.slice(0,f.index)+o.slice(f.index+f[0].length));let l=o.lastIndexOf(":");if(l<0)return null;let u=o.slice(0,l).replace(/^\[|\]$/g,""),p=Number(o.slice(l+1));return!u||!Number.isInteger(p)||p<=0||p>65535?null:(!c&&r==="https"&&!Yo(u)&&(c=u),{host:u,port:p,kind:r,...a,...c?{serverName:c}:{}})}function Yo(e){return/^\d{1,3}(\.\d{1,3}){3}$/.test(e)}function ye(e,t="direct"){let n=[];for(let r of e.split(/[\n,;]+/)){let o=r.trim();if(!o)continue;let s=Cr(o,t);s&&n.push(s)}return n}var Bt=k(()=>{"use strict"});async function Xo(){return Ht||(Ht=(async()=>(await import("cloudflare"+":sockets")).connect)()),await Ht}function Jo(e,t){if(!v(e))return null;let n=e.split(".").map(i=>Number(i)),r=(n[0]<<8|n[1]).toString(16),o=(n[2]<<8|n[3]).toString(16);return`${t.replace(/:+$/,"")}::${r}:${o}`}async function Ge(e,t,n,r,o){let i=(await Xo())({hostname:e,port:t},r?{secureTransport:r}:void 0),a=async(f,l)=>{let u,p=new Promise((h,m)=>{u=setTimeout(()=>m(new Error(`${l}\u8D85\u65F6\uFF1A${e}:${t}`)),n)});try{return await Promise.race([f,p])}finally{u&&clearTimeout(u)}},c;try{if(await a(i.opened,"\u8FDE\u63A5"),r==="starttls"){if(c=i.startTls?.(o?{expectedServerHostname:o}:void 0),!c)throw new Error("\u5F53\u524D\u8FD0\u884C\u65F6\u4E0D\u652F\u6301 startTls");return await a(c.opened,"TLS \u63E1\u624B"),c}return i}catch(f){try{await(c??i).close()}catch{}throw f}}async function Qo(e){let t=e.timeoutMs??jt;try{let n=await Ge(e.hostname,e.port,t);return{readable:n.readable,writable:n.writable,via:"direct",endpoint:`${e.hostname}:${e.port}`}}catch(n){if(e.nat64&&v(e.hostname)){let r=Jo(e.hostname,e.nat64);if(r){let o=await Ge(r,e.port,t);return{readable:o.readable,writable:o.writable,via:"nat64",endpoint:`${r}:${e.port}`}}}throw n}}async function _o(e,t){let n=e.timeoutMs??jt;if(t.kind==="direct"){let s=await Ge(t.host,t.port,n);return{readable:s.readable,writable:s.writable,via:"direct",endpoint:`${t.host}:${t.port}`}}let r=t.kind==="https"?"starttls":void 0,o=await Ge(t.host,t.port,n,r,t.kind==="https"?t.serverName:void 0);try{return t.kind==="http"||t.kind==="https"?{readable:await lr(o.readable,o.writable,e.hostname,e.port,{username:t.username,password:t.password}),writable:o.writable,via:t.kind,endpoint:`${t.host}:${t.port}`}:{readable:await ir(o.readable,o.writable,e.hostname,e.port,{username:t.username,password:t.password}),writable:o.writable,via:"socks5",endpoint:`${t.host}:${t.port}`}}catch(s){try{await o.close()}catch{}throw s}}async function zt(e,t){if(e.length===0)throw new Error("\u6CA1\u6709\u53EF\u7528\u7684\u51FA\u7AD9\u62E8\u53F7\u65B9\u5F0F");if(e.length===1||!t){let n=new Error("\u62E8\u53F7\u5931\u8D25");for(let r of e)try{return await r()}catch(o){n=o}throw n}return await new Promise((n,r)=>{let o=e.length,s=!1,i=[];for(let a of e)a().then(c=>{if(s){try{c.writable.getWriter().close()}catch{}return}s=!0,n(c)},c=>{i.push(c),o-=1,o===0&&!s&&(s=!0,r(i[0]??new Error("\u62E8\u53F7\u5931\u8D25")))})})}async function Tr(e,t){let n=[...e];if(!t)return n;try{let r=await ge(t),o=new Set(n.map(s=>`${s.ip}:${s.port}`));for(let s of r){let i=`${s.ip}:${s.port}`;o.has(i)||(o.add(i),n.push(s))}}catch{}return n}async function qo(e,t,n){if(e.length===0)return null;for(let r=0;r<e.length;r+=ie){let s=e.slice(r,r+ie).map(i=>t({source:"relay",host:i.ip,port:i.port,label:`\u53CD\u4EE3 ${i.label}`}));try{return await zt(s,n)}catch{}}return null}async function we(e){let t=e.proxies??[],n=e.concurrent??!0,r=e.budgetMs??Zo,o=Date.now()+r,s=[...e.optimizedIps??[]],i=!1;if(e.resolvePreferred)try{let S=await He(e.hostname,e.port,{deadline:o});if(S.length>0){i=!0;for(let U of S)s.push({ip:U.hostname,port:U.port})}}catch{}let a=ae(e.hostname),c=i&&s.length>0&&s.every(S=>ae(S.ip)),f=[...e.relay??[]],l=c||a;l&&e.relayPool&&(f=await Tr(f,{...e.relayPool,deadline:o}));let u=l?f.slice(0,ie):[],p=l?f.slice(ie):[],h=Ar({targetHost:e.hostname,targetPort:e.port,optimizedIps:s,proxies:t,deprioritizeDirect:a||c,relay:u,relayAsPrimary:u.length>0});if(h.length===0)throw new Error("\u6CA1\u6709\u53EF\u7528\u7684\u51FA\u7AD9\u62E8\u53F7\u65B9\u5F0F");let m=S=>async()=>{let U=o-Date.now();if(U<=0)throw new Error(`\u62E8\u53F7\u9884\u7B97\u5DF2\u7528\u5C3D\uFF08${r}ms\uFF09\uFF1A${e.hostname}:${e.port}`);let A=Math.max(200,Math.min(e.timeoutMs??jt,U)),E={...e,timeoutMs:A};try{return S.source==="proxy"&&S.via?await _o(E,{host:S.via.host,port:S.via.port,kind:S.via.kind,username:S.via.username,password:S.via.password,serverName:S.via.serverName}):await Qo({...E,hostname:S.host,port:S.port})}catch(B){let J=Sr(B,S.label);throw e.onFailure?.(J),B}},b=Er(h),{proxy:y,direct:d,fallback:g}=b;if(y.length>0){let S=y.map(m);try{return await zt(S,n)}catch(U){if(g.length===0)throw U;for(let A of g)try{return await m(A)()}catch{}throw U}}let P=d.map(m);try{return await zt(P,n)}catch(S){let U=p;U.length===0&&e.relayPool&&(U=await Tr([],{...e.relayPool,deadline:o}));let A=await qo(U,m,n);if(A)return A;if(g.length===0)throw S;for(let E of g)try{return await m(E)()}catch{}throw S}}var Ht,jt,Zo,Kt=k(()=>{"use strict";ar();cr();_();Ut();Ke();Ft();Bt();Ht=null;jt=8e3,Zo=15e3});var Or={};Ae(Or,{handleWebSocket:()=>Ve,recentDiagnostics:()=>ts,recordDiagnostics:()=>be,truncateCloseReason:()=>Ir});function Ir(e,t=123){let n=new TextEncoder;if(n.encode(e).length<=t)return e;let r=e.slice(0,t);for(;n.encode(r).length>t;)r=r.slice(0,-1);r=r.replace(/\uFFFD+$/,"");let o="\u2026";for(;r.length>0&&n.encode(r+o).length>t;)r=r.slice(0,-1);return r+o}function be(e,t,n){We.unshift({at:Date.now(),target:e,failures:t,summary:n}),We.length>Ur&&(We.length=Ur)}function ts(){return We}async function Ve(e,t,n,r,o,s){let[i,a]=Object.values(new WebSocketPair);try{a.accept({allowHalfOpen:!0})}catch{a.accept()}a.binaryType="arraybuffer";let c=new Uint8Array(0),f=!1,l=null,u=null,p=null,h=null,m=w=>{try{a.send(w)}catch{}},b=w=>{let x=new Uint8Array(2+w.byteLength);x[0]=0,x[1]=w.byteLength,x.set(w,2),m(x)},y=(w,x)=>{try{a.close(w,Ir(x))}catch{}},d=()=>{if(p&&(clearTimeout(p),p=null),g&&(clearTimeout(g),g=null),l)try{l.writable.close()}catch{}},g=null,P=new Set,S=0,U=async()=>{if(!l)return;let w=l.readable.getReader();g&&clearTimeout(g),g=setTimeout(()=>{g=null,!(A>0)&&(be(`${h.hostname}:${h.port}`,[],`\u76F4\u8FDE ${Nr}ms \u65E0\u4E0B\u884C\u6570\u636E\uFF0C\u6539\u8D70\u53CD\u4EE3\u5165\u53E3`),C())},Nr);try{for(;;){let{done:x,value:N}=await w.read();if(x)break;N&&N.byteLength>0&&(A+=N.byteLength,m(N))}}catch{}finally{try{w.releaseLock()}catch{}g&&(clearTimeout(g),g=null),y(1e3,"done")}},A=0,E=async w=>{if(u)try{await u.write(w)}catch{d()}},B=w=>{if(t==="vless"){let N=$n(w,n.uuid);return N?{command:N.header.command,port:N.header.port,hostname:N.header.hostname,headerLength:N.consumed}:null}let x=or(w,n.trojanPassword);return x?{command:x.header.command,port:x.header.port,hostname:x.header.hostname,headerLength:x.consumed}:null},J=async w=>{let x=B(c);if(!x){w||(p=setTimeout(()=>{p=null,J(!0).catch(G=>y(1011,String(G)))},ns));return}if(p&&(clearTimeout(p),p=null),f)return;f=!0,h=x;let N=t==="vless"?Qn:rr;if(x.command===N){y(1002,"UDP over WebSocket \u6682\u4E0D\u652F\u6301");return}b(new Uint8Array(0));let I=[],V=null;try{l=await we({hostname:x.hostname,port:x.port,proxies:r,timeoutMs:Rr,concurrent:n.concurrentDial,nat64:n.nat64||void 0,resolvePreferred:n.resolvePreferred,relayPool:{userEntries:n.relayPool||void 0,useBuiltin:n.useBuiltinRelay,colo:typeof e.cf?.colo=="string"?e.cf.colo:void 0},onFailure:G=>{I.push(G),s?.failures.push(G)}})}catch(G){V=G}if(!l){let G=I.length>0?I.map(D=>Pr(D)).join(`
21
- `):`\u51FA\u7AD9\u8FDE\u63A5\u5931\u8D25\uFF1A${String(V)}`;be(`${x.hostname}:${x.port}`,I,G),y(1011,G);return}u=l.writable.getWriter();let xe=c.byteLength>x.headerLength?c.slice(x.headerLength):new Uint8Array(0);xe.byteLength>0&&await E(xe),c=new Uint8Array(0),o?.waitUntil(U())},C=async()=>{let w=h;if(!w){y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u76EE\u6807\u672A\u89E3\u6790");return}if(S>=kr){y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u76F4\u8FDE\u4E0E\u53CD\u4EE3\u5165\u53E3\u5747\u65E0\u54CD\u5E94");return}S++;let x=[];try{x=await ge({userEntries:n.relayPool||void 0,useBuiltin:n.useBuiltinRelay,colo:typeof e.cf?.colo=="string"?e.cf.colo:void 0})}catch{x=[]}let N=x.filter(I=>!P.has(`${I.ip}:${I.port}`));if(N.length===0){y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u65E0\u53CD\u4EE3\u5165\u53E3\u53EF\u7528");return}for(let I of N.slice(0,kr)){if(P.add(`${I.ip}:${I.port}`),l)try{l.writable.close()}catch{}u=null,A=0;try{let V=await we({hostname:I.ip,port:I.port,timeoutMs:Rr,resolvePreferred:!1});if(!V)continue;l=V,u=V.writable.getWriter(),c.byteLength>0&&(await u.write(c),c=new Uint8Array(0)),be(`${w.hostname}:${w.port}`,[],`\u5DF2\u5207\u6362\u53CD\u4EE3\u5165\u53E3 ${I.ip}:${I.port}`),o?.waitUntil(U());return}catch(V){be(`${w.hostname}:${w.port}`,[],`\u53CD\u4EE3\u5165\u53E3 ${I.ip}:${I.port} \u5931\u8D25\uFF1A${String(V)}`)}}y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u6240\u6709\u53CD\u4EE3\u5165\u53E3\u5747\u5931\u8D25")};a.addEventListener("message",w=>{(async()=>{let x=w.data,N=typeof x=="string"?new TextEncoder().encode(x):new Uint8Array(x);if(N.byteLength!==0){if(!f){if(c=Rt(c,N),c.byteLength>$o){y(1009,"\u63E1\u624B\u5934\u8D85\u8FC7 64KB");return}await J(!1);return}if(!u){if(c=Rt(c,N),c.byteLength>es){y(1009,"\u62E8\u53F7\u671F\u95F4\u6570\u636E\u8FC7\u591A");return}return}await E(N)}})()});let T=()=>{d()};a.addEventListener("close",T),a.addEventListener("error",T);try{return new Response(null,{status:101,webSocket:i})}catch(w){return console.error("[\u81EA\u7814\u6570\u636E\u9762] 101 \u54CD\u5E94\u6784\u9020\u5931\u8D25\uFF1A",w),new Response(null,{status:200})}}var Rr,Nr,kr,$o,es,We,Ur,ns,Gt=k(()=>{"use strict";Tt();sr();he();Kt();Ft();Ke();Rr=5e3,Nr=2500,kr=2,$o=64*1024,es=8*1024*1024;We=[],Ur=20;ns=80});var Dr={};Ae(Dr,{handleXhttp:()=>Wt,recentXhttpDiagnostics:()=>rs,recordXhttpDiagnostics:()=>vr});function vr(e,t,n){Ye.unshift({at:Date.now(),target:e,...t,summary:n}),Ye.length>20&&(Ye.length=20)}function rs(){return Ye}async function Wt(e,t,n){let r=e.body;if(!r)return new Response("\u7F3A\u5C11\u8BF7\u6C42\u4F53",{status:400});let o=new $(r),s=await qn(o,t.uuid);if(!s)return new Response("VLESS \u5934\u89E3\u6790\u5931\u8D25",{status:400});if(s.header.command!==Jn)return new Response("XHTTP \u6682\u4E0D\u652F\u6301 UDP",{status:400});let i=await we({hostname:s.header.hostname,port:s.header.port,proxies:n,nat64:t.nat64,concurrent:t.concurrentDial,resolvePreferred:t.resolvePreferred,relayPool:{userEntries:t.relayPool||void 0,useBuiltin:t.useBuiltinRelay},onFailure:m=>{vr(`${s.header.hostname}:${s.header.port}`,m,`XHTTP \u51FA\u7AD9\u5931\u8D25\uFF08${m.candidate}\uFF09\uFF1A${m.message}`)}}),{readable:a,writable:c}=new TransformStream;Et(s.payload,i.writable,void 0,!1),Et(i.readable,c);let f=s.header.addons;if(f.byteLength>255)return new Response("Addons \u957F\u5EA6\u8D85\u51FA VLESS \u534F\u8BAE\u4E0A\u9650",{status:400});let l=new Uint8Array(2+f.byteLength);l[0]=s.header.version,l[1]=f.byteLength,l.set(f,2);let u=!1,p=null,h=new ReadableStream({start(m){m.enqueue(l),u=!0},async pull(m){if(u){p||(p=a.getReader());try{let{done:b,value:y}=await p.read();if(b){m.close();return}y&&y.byteLength>0&&m.enqueue(y)}catch{try{m.close()}catch{}}}},cancel(m){a.cancel(m)}});return new Response(h,{status:200,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-store","X-Accel-Buffering":"no"}})}var Ye,Vt=k(()=>{"use strict";he();Tt();St();Kt();Ye=[]});ue();pt();re();var bo=15*1024*1024,xo=2*1024*1024;async function Oe(e){let t=new URL(e.url);if(e.headers.get("Upgrade")?.toLowerCase()==="websocket"){let c=new WebSocketPair,[f,l]=Object.values(c);return l.accept(),l.addEventListener("message",u=>{let p=typeof u.data=="string"?u.data:"";if(p==="PING"||p==="ping"){l.send(JSON.stringify({pong:!0,colo:e.cf?.colo??"UNK",clientIp:e.headers.get("CF-Connecting-IP")??""}));try{l.close(1e3,"Probe complete")}catch{}}}),new Response(null,{status:101,webSocket:f})}let r=Number.parseInt(t.searchParams.get("bytes")??"",10),o=Number.isFinite(r)&&r>0?Math.min(r,bo):xo,s=new Uint8Array(64*1024);for(let c=0;c<s.length;c++)s[c]=97;let i=0,a=new ReadableStream({pull(c){if(i>=o){c.close();return}let f=Math.min(s.byteLength,o-i);c.enqueue(s.subarray(0,f)),i+=f}});return new Response(a,{status:200,headers:{"Content-Type":"application/octet-stream","Cache-Control":"no-store","Access-Control-Allow-Origin":"*","X-Probe-Bytes":String(o),"X-Probe-Nonce":Y(4)}})}var Tn="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";var ve=null;function Ao(e){let t=atob(e),n=new Uint8Array(new ArrayBuffer(t.length));for(let r=0;r<t.length;r++)n[r]=t.charCodeAt(r);return n}async function Rn(){if(ve!==null)return ve;let e=Ao(Tn),t=new Response(e).body;if(!t)throw new Error("\u9762\u677F\u6570\u636E\u635F\u574F");let n=t.pipeThrough(new DecompressionStream("gzip"));return ve=await new Response(n).text(),ve}function dt(e){let t=e===200?"Welcome":e===404?"Not Found":"Service Unavailable",n=`<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${t}</title><style>body{margin:0;min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f7f8fa;color:#333;font-family:-apple-system,"Segoe UI","PingFang SC",sans-serif}.c{text-align:center}h1{font-size:22px;font-weight:600;margin:0 0 10px}p{color:#888;font-size:14px;margin:0}</style></head><body><div class="c"><h1>${t}</h1><p>This site is up and running.</p></div></body></html>`;return new Response(n,{status:e,headers:{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store","X-Content-Type-Options":"nosniff"}})}function se(e,t){return new Response(JSON.stringify({ok:!1,error:e}),{status:t,headers:{"Content-Type":"application/json; charset=utf-8","Cache-Control":"no-store"}})}Me();Me();var Ct=null;async function No(){return Ct||(Ct=await Promise.resolve().then(()=>(Wn(),Gn))),Ct}async function ko(e,t,n,r){let o=await Le(n,r),s=t.pathname.slice(5).split("/")[0]??"";if(!(s===o.uuid||s===o.trojanPassword||t.searchParams.get("token")===o.uuid))return se("\u8BA2\u9605\u4EE4\u724C\u65E0\u6548",403);let a=t.searchParams.get("target")??t.searchParams.get("format"),c=a?At(a):Kn(e.headers.get("User-Agent"))??At(null),f=await n.get(Q)??"",l=await Ie(o,f),u=await n.get($t)??"",p=me(o.subDomain||r.DATA_HOST||t.hostname),h={nodes:l.nodes,groups:l.groups,config:o,domain:p,port:443,ports:Sn(o),protocol:o.subProtocol,transport:o.subTransport,routeProfile:u},m=Cn(c,h);return new Response(m.body,{status:200,headers:{"Content-Type":m.contentType,"Cache-Control":"no-store","Content-Disposition":`inline; filename="${m.fileName}"`,"Profile-Title":ut(o.subName),"Subscription-Userinfo":""}})}async function Vn(e,t){let n=new URL(e.url),r=bt(t);if(e.method==="OPTIONS")return new Response(null,{status:204,headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"86400"}});if(n.pathname==="/__edge_probe")return Oe(e);if(n.pathname.startsWith("/api/")){let{handleApi:s}=await No(),i=await s(e,n,{store:r,env:t,config:await Le(r,t),auth:await xt(r,t),onConfigChanged:jn});if(i)return i}if(n.pathname==="/sub"||n.pathname.startsWith("/sub/"))return await ko(e,n,r,t);let o=await xt(r,t);return n.pathname===o.panelPath||n.pathname===`${o.panelPath}/`?new Response(await Rn(),{status:200,headers:{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store","X-Content-Type-Options":"nosniff","Referrer-Policy":"no-referrer"}}):null}async function Yn(e){let t=bt(e);return await Le(t,e)}Gt();Vt();Bt();var Yt="4144233-aaf28587",Lr="/__cfp_version";function Mr(){return new Response(JSON.stringify({build:Yt,ts:Date.now()}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"}})}function Xt(e){let t=[];return t.push(...ye(e.proxyIp,"direct")),t.push(...ye(e.socks5,"socks5")),t.push(...ye(e.httpProxy,"http")),t}async function Fr(e,t,n){let r=new URL(e.url);if(r.pathname==="/__edge_probe")return Oe(e);if(r.pathname===Lr||r.pathname==="/__version")return Mr();if(r.pathname==="/__diag"){let{recentDiagnostics:i}=await Promise.resolve().then(()=>(Gt(),Or)),{recentXhttpDiagnostics:a}=await Promise.resolve().then(()=>(Vt(),Dr));return new Response(JSON.stringify({ok:!0,impl:"self",build:Yt,recent:i(),xhttp:a()},null,2),{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})}if(r.pathname==="/region"&&e.method==="GET"){let{coloToCountry:i,rankRegions:a}=await Promise.resolve().then(()=>(Ke(),br)),c=e.cf?.colo??"",f=c?i(c):"";return new Response(JSON.stringify({ok:!0,colo:c,region:f,relayPreference:f?a(f):[],timestamp:new Date().toISOString()},null,2),{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})}let o=await Yn(t),s=e.headers.get("Upgrade")?.toLowerCase();return r.pathname===o.wsPath?s!=="websocket"?se("\u8BE5\u8DEF\u5F84\u9700\u8981 WebSocket \u5347\u7EA7",400):await Ve(e,"vless",o,Xt(o),n):o.enableTrojan&&r.pathname===o.trojanPath?s!=="websocket"?se("\u8BE5\u8DEF\u5F84\u9700\u8981 WebSocket \u5347\u7EA7",400):await Ve(e,"trojan",o,Xt(o),n):o.enableXhttp&&r.pathname===o.xhttpPath?e.method!=="POST"?se("XHTTP \u9700\u8981 POST \u8BF7\u6C42",405):await Wt(e,o,Xt(o)):null}var ji={async fetch(e,t,n){try{return await Vn(e,t)??await Fr(e,t,n)??dt(200)}catch{return dt(500)}}};export{ji as default};
21
+ `):`\u51FA\u7AD9\u8FDE\u63A5\u5931\u8D25\uFF1A${String(V)}`;be(`${x.hostname}:${x.port}`,I,G),y(1011,G);return}u=l.writable.getWriter();let xe=c.byteLength>x.headerLength?c.slice(x.headerLength):new Uint8Array(0);xe.byteLength>0&&await E(xe),c=new Uint8Array(0),o?.waitUntil(U())},C=async()=>{let w=h;if(!w){y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u76EE\u6807\u672A\u89E3\u6790");return}if(S>=kr){y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u76F4\u8FDE\u4E0E\u53CD\u4EE3\u5165\u53E3\u5747\u65E0\u54CD\u5E94");return}S++;let x=[];try{x=await ge({userEntries:n.relayPool||void 0,useBuiltin:n.useBuiltinRelay,colo:typeof e.cf?.colo=="string"?e.cf.colo:void 0})}catch{x=[]}let N=x.filter(I=>!P.has(`${I.ip}:${I.port}`));if(N.length===0){y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u65E0\u53CD\u4EE3\u5165\u53E3\u53EF\u7528");return}for(let I of N.slice(0,kr)){if(P.add(`${I.ip}:${I.port}`),l)try{l.writable.close()}catch{}u=null,A=0;try{let V=await we({hostname:I.ip,port:I.port,timeoutMs:Rr,resolvePreferred:!1});if(!V)continue;l=V,u=V.writable.getWriter(),c.byteLength>0&&(await u.write(c),c=new Uint8Array(0)),be(`${w.hostname}:${w.port}`,[],`\u5DF2\u5207\u6362\u53CD\u4EE3\u5165\u53E3 ${I.ip}:${I.port}`),o?.waitUntil(U());return}catch(V){be(`${w.hostname}:${w.port}`,[],`\u53CD\u4EE3\u5165\u53E3 ${I.ip}:${I.port} \u5931\u8D25\uFF1A${String(V)}`)}}y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u6240\u6709\u53CD\u4EE3\u5165\u53E3\u5747\u5931\u8D25")};a.addEventListener("message",w=>{(async()=>{let x=w.data,N=typeof x=="string"?new TextEncoder().encode(x):new Uint8Array(x);if(N.byteLength!==0){if(!f){if(c=Rt(c,N),c.byteLength>$o){y(1009,"\u63E1\u624B\u5934\u8D85\u8FC7 64KB");return}await J(!1);return}if(!u){if(c=Rt(c,N),c.byteLength>es){y(1009,"\u62E8\u53F7\u671F\u95F4\u6570\u636E\u8FC7\u591A");return}return}await E(N)}})()});let T=()=>{d()};a.addEventListener("close",T),a.addEventListener("error",T);try{return new Response(null,{status:101,webSocket:i})}catch(w){return console.error("[\u81EA\u7814\u6570\u636E\u9762] 101 \u54CD\u5E94\u6784\u9020\u5931\u8D25\uFF1A",w),new Response(null,{status:200})}}var Rr,Nr,kr,$o,es,We,Ur,ns,Gt=k(()=>{"use strict";Tt();sr();he();Kt();Ft();Ke();Rr=5e3,Nr=2500,kr=2,$o=64*1024,es=8*1024*1024;We=[],Ur=20;ns=80});var Dr={};Ae(Dr,{handleXhttp:()=>Wt,recentXhttpDiagnostics:()=>rs,recordXhttpDiagnostics:()=>vr});function vr(e,t,n){Ye.unshift({at:Date.now(),target:e,...t,summary:n}),Ye.length>20&&(Ye.length=20)}function rs(){return Ye}async function Wt(e,t,n){let r=e.body;if(!r)return new Response("\u7F3A\u5C11\u8BF7\u6C42\u4F53",{status:400});let o=new $(r),s=await qn(o,t.uuid);if(!s)return new Response("VLESS \u5934\u89E3\u6790\u5931\u8D25",{status:400});if(s.header.command!==Jn)return new Response("XHTTP \u6682\u4E0D\u652F\u6301 UDP",{status:400});let i=await we({hostname:s.header.hostname,port:s.header.port,proxies:n,nat64:t.nat64,concurrent:t.concurrentDial,resolvePreferred:t.resolvePreferred,relayPool:{userEntries:t.relayPool||void 0,useBuiltin:t.useBuiltinRelay},onFailure:m=>{vr(`${s.header.hostname}:${s.header.port}`,m,`XHTTP \u51FA\u7AD9\u5931\u8D25\uFF08${m.candidate}\uFF09\uFF1A${m.message}`)}}),{readable:a,writable:c}=new TransformStream;Et(s.payload,i.writable,void 0,!1),Et(i.readable,c);let f=s.header.addons;if(f.byteLength>255)return new Response("Addons \u957F\u5EA6\u8D85\u51FA VLESS \u534F\u8BAE\u4E0A\u9650",{status:400});let l=new Uint8Array(2+f.byteLength);l[0]=s.header.version,l[1]=f.byteLength,l.set(f,2);let u=!1,p=null,h=new ReadableStream({start(m){m.enqueue(l),u=!0},async pull(m){if(u){p||(p=a.getReader());try{let{done:b,value:y}=await p.read();if(b){m.close();return}y&&y.byteLength>0&&m.enqueue(y)}catch{try{m.close()}catch{}}}},cancel(m){a.cancel(m)}});return new Response(h,{status:200,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-store","X-Accel-Buffering":"no"}})}var Ye,Vt=k(()=>{"use strict";he();Tt();St();Kt();Ye=[]});ue();pt();re();var bo=15*1024*1024,xo=2*1024*1024;async function Oe(e){let t=new URL(e.url);if(e.headers.get("Upgrade")?.toLowerCase()==="websocket"){let c=new WebSocketPair,[f,l]=Object.values(c);return l.accept(),l.addEventListener("message",u=>{let p=typeof u.data=="string"?u.data:"";if(p==="PING"||p==="ping"){l.send(JSON.stringify({pong:!0,colo:e.cf?.colo??"UNK",clientIp:e.headers.get("CF-Connecting-IP")??""}));try{l.close(1e3,"Probe complete")}catch{}}}),new Response(null,{status:101,webSocket:f})}let r=Number.parseInt(t.searchParams.get("bytes")??"",10),o=Number.isFinite(r)&&r>0?Math.min(r,bo):xo,s=new Uint8Array(64*1024);for(let c=0;c<s.length;c++)s[c]=97;let i=0,a=new ReadableStream({pull(c){if(i>=o){c.close();return}let f=Math.min(s.byteLength,o-i);c.enqueue(s.subarray(0,f)),i+=f}});return new Response(a,{status:200,headers:{"Content-Type":"application/octet-stream","Cache-Control":"no-store","Access-Control-Allow-Origin":"*","X-Probe-Bytes":String(o),"X-Probe-Nonce":Y(4)}})}var Tn="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";var ve=null;function Ao(e){let t=atob(e),n=new Uint8Array(new ArrayBuffer(t.length));for(let r=0;r<t.length;r++)n[r]=t.charCodeAt(r);return n}async function Rn(){if(ve!==null)return ve;let e=Ao(Tn),t=new Response(e).body;if(!t)throw new Error("\u9762\u677F\u6570\u636E\u635F\u574F");let n=t.pipeThrough(new DecompressionStream("gzip"));return ve=await new Response(n).text(),ve}function dt(e){let t=e===200?"Welcome":e===404?"Not Found":"Service Unavailable",n=`<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${t}</title><style>body{margin:0;min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f7f8fa;color:#333;font-family:-apple-system,"Segoe UI","PingFang SC",sans-serif}.c{text-align:center}h1{font-size:22px;font-weight:600;margin:0 0 10px}p{color:#888;font-size:14px;margin:0}</style></head><body><div class="c"><h1>${t}</h1><p>This site is up and running.</p></div></body></html>`;return new Response(n,{status:e,headers:{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store","X-Content-Type-Options":"nosniff"}})}function se(e,t){return new Response(JSON.stringify({ok:!1,error:e}),{status:t,headers:{"Content-Type":"application/json; charset=utf-8","Cache-Control":"no-store"}})}Me();Me();var Ct=null;async function No(){return Ct||(Ct=await Promise.resolve().then(()=>(Wn(),Gn))),Ct}async function ko(e,t,n,r){let o=await Le(n,r),s=t.pathname.slice(5).split("/")[0]??"";if(!(s===o.uuid||s===o.trojanPassword||t.searchParams.get("token")===o.uuid))return se("\u8BA2\u9605\u4EE4\u724C\u65E0\u6548",403);let a=t.searchParams.get("target")??t.searchParams.get("format"),c=a?At(a):Kn(e.headers.get("User-Agent"))??At(null),f=await n.get(Q)??"",l=await Ie(o,f),u=await n.get($t)??"",p=me(o.subDomain||r.DATA_HOST||t.hostname),h={nodes:l.nodes,groups:l.groups,config:o,domain:p,port:443,ports:Sn(o),protocol:o.subProtocol,transport:o.subTransport,routeProfile:u},m=Cn(c,h);return new Response(m.body,{status:200,headers:{"Content-Type":m.contentType,"Cache-Control":"no-store","Content-Disposition":`inline; filename="${m.fileName}"`,"Profile-Title":ut(o.subName),"Subscription-Userinfo":""}})}async function Vn(e,t){let n=new URL(e.url),r=bt(t);if(e.method==="OPTIONS")return new Response(null,{status:204,headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"86400"}});if(n.pathname==="/__edge_probe")return Oe(e);if(n.pathname.startsWith("/api/")){let{handleApi:s}=await No(),i=await s(e,n,{store:r,env:t,config:await Le(r,t),auth:await xt(r,t),onConfigChanged:jn});if(i)return i}if(n.pathname==="/sub"||n.pathname.startsWith("/sub/"))return await ko(e,n,r,t);let o=await xt(r,t);return n.pathname===o.panelPath||n.pathname===`${o.panelPath}/`?new Response(await Rn(),{status:200,headers:{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store","X-Content-Type-Options":"nosniff","Referrer-Policy":"no-referrer"}}):null}async function Yn(e){let t=bt(e);return await Le(t,e)}Gt();Vt();Bt();var Yt="f26d38b-aaf28587",Lr="/__cfp_version";function Mr(){return new Response(JSON.stringify({build:Yt,ts:Date.now()}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"}})}function Xt(e){let t=[];return t.push(...ye(e.proxyIp,"direct")),t.push(...ye(e.socks5,"socks5")),t.push(...ye(e.httpProxy,"http")),t}async function Fr(e,t,n){let r=new URL(e.url);if(r.pathname==="/__edge_probe")return Oe(e);if(r.pathname===Lr||r.pathname==="/__version")return Mr();if(r.pathname==="/__diag"){let{recentDiagnostics:i}=await Promise.resolve().then(()=>(Gt(),Or)),{recentXhttpDiagnostics:a}=await Promise.resolve().then(()=>(Vt(),Dr));return new Response(JSON.stringify({ok:!0,impl:"self",build:Yt,recent:i(),xhttp:a()},null,2),{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})}if(r.pathname==="/region"&&e.method==="GET"){let{coloToCountry:i,rankRegions:a}=await Promise.resolve().then(()=>(Ke(),br)),c=e.cf?.colo??"",f=c?i(c):"";return new Response(JSON.stringify({ok:!0,colo:c,region:f,relayPreference:f?a(f):[],timestamp:new Date().toISOString()},null,2),{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})}let o=await Yn(t),s=e.headers.get("Upgrade")?.toLowerCase();return r.pathname===o.wsPath?s!=="websocket"?se("\u8BE5\u8DEF\u5F84\u9700\u8981 WebSocket \u5347\u7EA7",400):await Ve(e,"vless",o,Xt(o),n):o.enableTrojan&&r.pathname===o.trojanPath?s!=="websocket"?se("\u8BE5\u8DEF\u5F84\u9700\u8981 WebSocket \u5347\u7EA7",400):await Ve(e,"trojan",o,Xt(o),n):o.enableXhttp&&r.pathname===o.xhttpPath?e.method!=="POST"?se("XHTTP \u9700\u8981 POST \u8BF7\u6C42",405):await Wt(e,o,Xt(o)):null}var ji={async fetch(e,t,n){try{return await Vn(e,t)??await Fr(e,t,n)??dt(200)}catch{return dt(500)}}};export{ji as default};
package/dist/cli.js CHANGED
@@ -93,7 +93,7 @@ var VERSION, NAME;
93
93
  var init_version = __esm({
94
94
  "src/shared/version.ts"() {
95
95
  "use strict";
96
- VERSION = "0.7.0";
96
+ VERSION = "0.7.2";
97
97
  NAME = "cfpilot";
98
98
  }
99
99
  });
@@ -218,17 +218,18 @@ async function ask(question, options = {}) {
218
218
  if (key?.name === "return" || key?.name === "enter") {
219
219
  const value = buf.trim();
220
220
  if (!value && !fallback && !allowEmpty) {
221
- stdout.write(`\r${c.yellow("!")} \u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165${c.gray(": ")}${password ? "" : buf}`);
221
+ stdout.write(
222
+ `\r${c.yellow("!")} \u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165${c.gray(": ")}${password ? "*".repeat(buf.length) : buf}`
223
+ );
222
224
  return;
223
225
  }
224
226
  finish(value || fallback);
225
227
  return;
226
228
  }
227
229
  if (key?.name === "backspace") {
230
+ if (buf.length === 0) return;
228
231
  buf = buf.slice(0, -1);
229
- if (!password) {
230
- stdout.write("\b \b");
231
- }
232
+ stdout.write("\b \b");
232
233
  return;
233
234
  }
234
235
  if (key?.name === "escape") {
@@ -241,7 +242,7 @@ async function ask(question, options = {}) {
241
242
  }
242
243
  if (str && !key?.ctrl && str >= " ") {
243
244
  buf += str;
244
- if (!password) stdout.write(str);
245
+ stdout.write(password ? "*" : str);
245
246
  }
246
247
  };
247
248
  stdin.setRawMode(true);
@@ -4571,6 +4572,7 @@ async function runScanCommand(args) {
4571
4572
  const top = flagNumber(args, "top", 15);
4572
4573
  let token = flagString(args, "token");
4573
4574
  const noCallback = flagBool(args, "no-callback");
4575
+ const askCallback = flagBool(args, "ask-callback");
4574
4576
  const wsPath = normalizeWsPath(flagString(args, "path"), "/__edge_probe");
4575
4577
  const probePath = normalizeWsPath(flagString(args, "probe-path"), "/__edge_probe");
4576
4578
  const noSpeed = flagBool(args, "no-speed");
@@ -4730,10 +4732,72 @@ ${NAME} v${VERSION}
4730
4732
  `);
4731
4733
  process.exitCode = 1;
4732
4734
  }
4733
- } else if (!quiet) {
4735
+ } else if (askCallback && !quiet && summary.entries.length > 0) {
4736
+ await promptCallback(summary.entries, host, panelHost, panelPassword);
4737
+ } else if (!quiet && !asJson) {
4734
4738
  process.stdout.write("\n\uFF08\u672A\u63D0\u4F9B --token\uFF0C\u8DF3\u8FC7\u56DE\u586B\uFF09\n");
4735
4739
  }
4736
4740
  }
4741
+ async function promptCallback(entries, dataHost, panelHost, panelPassword) {
4742
+ const { createInterface: createInterface2 } = await import("node:readline/promises");
4743
+ const { stdin: stdin2, stdout: stdout2 } = await import("node:process");
4744
+ process.stdout.write("\n" + "\u2500".repeat(50) + "\n");
4745
+ if (!panelHost) {
4746
+ process.stdout.write("\u672A\u914D\u7F6E\u63A7\u5236\u9762\u57DF\u540D\uFF0C\u65E0\u6CD5\u56DE\u586B\u3002\n");
4747
+ process.stdout.write("\u2192 \u53EF\u624B\u52A8\u590D\u5236\u4E0A\u9762\u7684 IP \u5217\u8868\uFF0C\u7C98\u8D34\u5230\u9762\u677F\u300C\u624B\u52A8\u4F18\u9009 IP\u300D\n");
4748
+ return;
4749
+ }
4750
+ const rl = createInterface2({ input: stdin2, output: stdout2 });
4751
+ let answer = "";
4752
+ try {
4753
+ answer = (await rl.question(`\u662F\u5426\u56DE\u586B\u8FD9 ${entries.length} \u6761\u5230\u9762\u677F\uFF1F(y/N): `)).trim().toLowerCase();
4754
+ } finally {
4755
+ rl.close();
4756
+ }
4757
+ if (answer !== "y" && answer !== "yes") {
4758
+ process.stdout.write("\n\u5DF2\u8DF3\u8FC7\u56DE\u586B\u3002\n");
4759
+ process.stdout.write("\u2192 \u4E0A\u9762\u7684 IP \u5217\u8868\u53EF\u76F4\u63A5\u590D\u5236\uFF0C\u7C98\u8D34\u5230\u9762\u677F\u300C\u624B\u52A8\u4F18\u9009 IP\u300D\u6846\n");
4760
+ return;
4761
+ }
4762
+ let password = panelPassword;
4763
+ if (!password) {
4764
+ const rl2 = createInterface2({ input: stdin2, output: stdout2 });
4765
+ try {
4766
+ password = (await rl2.question("\u9762\u677F\u5BC6\u7801\uFF08\u7528\u4E8E\u7533\u8BF7\u4E34\u65F6\u4EE4\u724C\uFF09: ")).trim();
4767
+ } finally {
4768
+ rl2.close();
4769
+ }
4770
+ }
4771
+ if (!password) {
4772
+ process.stdout.write("\n\u672A\u63D0\u4F9B\u9762\u677F\u5BC6\u7801\uFF0C\u5DF2\u8DF3\u8FC7\u56DE\u586B\u3002\n");
4773
+ process.stdout.write("\u2192 \u53EF\u624B\u52A8\u590D\u5236\u4E0A\u9762\u7684 IP \u5217\u8868\u7C98\u8D34\u5230\u9762\u677F\n");
4774
+ return;
4775
+ }
4776
+ process.stdout.write("\n\u6B63\u5728\u7533\u8BF7\u4E34\u65F6\u4EE4\u724C\u2026\n");
4777
+ const tk = await fetchScannerToken(panelHost, password);
4778
+ if (!tk.ok || !tk.token) {
4779
+ process.stdout.write(`\u2717 \u83B7\u53D6\u4EE4\u724C\u5931\u8D25\uFF1A${tk.error ?? "\u672A\u77E5\u9519\u8BEF"}
4780
+ `);
4781
+ process.stdout.write("\u2192 \u53EF\u624B\u52A8\u590D\u5236\u4E0A\u9762\u7684 IP \u5217\u8868\u7C98\u8D34\u5230\u9762\u677F\n");
4782
+ return;
4783
+ }
4784
+ process.stdout.write("\u2713 \u5DF2\u83B7\u53D6\u4E34\u65F6\u4EE4\u724C\uFF0810 \u5206\u949F\u6709\u6548\uFF09\n");
4785
+ const url = `https://${panelHost.replace(/^https?:\/\//, "").replace(/\/$/, "")}/api/v1/preferred-ips`;
4786
+ process.stdout.write(`\u6B63\u5728\u56DE\u586B\u5230 ${url} \u2026
4787
+ `);
4788
+ const result = await postResults(url, tk.token, formatEntries(entries));
4789
+ if (result.ok) {
4790
+ process.stdout.write(`
4791
+ \u2713 \u5DF2\u56DE\u586B ${entries.length} \u6761\u5230\u9762\u677F\u300C\u624B\u52A8\u4F18\u9009 IP\u300D
4792
+ `);
4793
+ process.stdout.write("\u2192 \u6253\u5F00\u9762\u677F\u300C\u8282\u70B9\u6765\u6E90 \u2192 \u624B\u52A8\u4F18\u9009 IP\u300D\u70B9\u300C\u67E5\u770B\u300D\u5373\u53EF\u770B\u5230\n");
4794
+ } else {
4795
+ process.stdout.write(`
4796
+ \u2717 \u56DE\u586B\u5931\u8D25\uFF1A${result.error}
4797
+ `);
4798
+ process.stdout.write("\u2192 \u53EF\u624B\u52A8\u590D\u5236\u4E0A\u9762\u7684 IP \u5217\u8868\u7C98\u8D34\u5230\u9762\u677F\n");
4799
+ }
4800
+ }
4737
4801
  var init_command2 = __esm({
4738
4802
  "src/scan/command.ts"() {
4739
4803
  "use strict";
@@ -4760,19 +4824,81 @@ __export(scan_exports, {
4760
4824
  function makeArgs2(flags) {
4761
4825
  return { command: "", flags, positionals: [] };
4762
4826
  }
4827
+ async function fetchInstances(token) {
4828
+ try {
4829
+ const client = new CloudflareClient({ token });
4830
+ const cfg = loadConfig();
4831
+ const accounts = await client.listAccounts();
4832
+ const accountId = cfg.accountId || accounts[0]?.id;
4833
+ if (!accountId) return [];
4834
+ const list = await listCfPilotNamespaces(client, accountId);
4835
+ return list.map((i) => ({
4836
+ id: i.id,
4837
+ controlProject: i.manifest.controlProject,
4838
+ dataProject: i.manifest.dataProject,
4839
+ controlSubdomain: i.manifest.controlSubdomain,
4840
+ dataSubdomain: i.manifest.dataSubdomain,
4841
+ wsPath: i.manifest.credentials?.wsPath ?? ""
4842
+ }));
4843
+ } catch {
4844
+ return [];
4845
+ }
4846
+ }
4847
+ async function pickInstance(token) {
4848
+ const cfg = loadConfig();
4849
+ status("info", "\u6B63\u5728\u8BC6\u522B\u8D26\u53F7\u4E0B\u7684\u5B9E\u4F8B\u2026");
4850
+ const instances = await fetchInstances(token);
4851
+ if (instances.length === 0) {
4852
+ status("warn", "\u6CA1\u6709\u8BC6\u522B\u5230\u5DF2\u90E8\u7F72\u7684 CFPilot \u5B9E\u4F8B");
4853
+ return null;
4854
+ }
4855
+ let chosen;
4856
+ if (instances.length === 1) {
4857
+ chosen = instances[0];
4858
+ status("ok", `\u5B9E\u4F8B\uFF1A${chosen.controlProject} / ${chosen.dataProject}`);
4859
+ } else {
4860
+ const picked = await select(
4861
+ "\u9009\u62E9\u8981\u4F18\u9009\u7684\u5B9E\u4F8B",
4862
+ instances.map((i) => ({
4863
+ label: `${i.controlProject} / ${i.dataProject}`,
4864
+ value: i.id,
4865
+ hint: i.dataSubdomain
4866
+ })),
4867
+ { initial: Math.max(0, instances.findIndex((i) => i.id === cfg.kvNamespaceId)) }
4868
+ );
4869
+ chosen = instances.find((i) => i.id === picked) ?? instances[0];
4870
+ }
4871
+ saveConfig({
4872
+ kvNamespaceId: chosen.id,
4873
+ panelHost: chosen.controlSubdomain,
4874
+ dataHost: chosen.dataSubdomain,
4875
+ wsPath: chosen.wsPath
4876
+ });
4877
+ return chosen;
4878
+ }
4763
4879
  async function menuScan() {
4880
+ const token = resolveToken();
4881
+ if (!token) {
4882
+ status("warn", "\u5C1A\u672A\u914D\u7F6E API Token");
4883
+ status("info", "\u8BF7\u5148\u5230\u300C\u914D\u7F6E\u300D\u83DC\u5355\u6DFB\u52A0");
4884
+ return;
4885
+ }
4886
+ const instance = await pickInstance(token);
4887
+ if (!instance) {
4888
+ const manual = await ask("\u624B\u52A8\u8F93\u5165\u6570\u636E\u9762\u57DF\u540D\uFF08\u7559\u7A7A\u53D6\u6D88\uFF09", { allowEmpty: true });
4889
+ if (!manual) {
4890
+ status("info", "\u5DF2\u53D6\u6D88");
4891
+ return;
4892
+ }
4893
+ saveConfig({ dataHost: manual });
4894
+ }
4764
4895
  const cfg = loadConfig();
4896
+ process.stdout.write("\n");
4765
4897
  box("\u672C\u5730\u4F18\u9009", [
4766
- `${c.gray("\u76EE\u6807\u57DF\u540D")} ${cfg.dataHost || c.yellow("\u5F85\u586B\u5199")}`,
4767
- `${c.gray("WS \u8DEF\u5F84")} ${cfg.wsPath || c.gray("\uFF08\u81EA\u52A8\u63A2\u6D4B\uFF09")}`
4898
+ `${c.gray("\u76EE\u6807\u57DF\u540D")} ${cfg.dataHost || c.yellow("\u672A\u914D\u7F6E")}`,
4899
+ `${c.gray("WS \u8DEF\u5F84")} ${cfg.wsPath || c.gray("\uFF08\u9ED8\u8BA4\u63A2\u9488\u8DEF\u5F84\uFF09")}`
4768
4900
  ]);
4769
4901
  process.stdout.write("\n");
4770
- const host = await ask("\u6570\u636E\u9762\u57DF\u540D\uFF08\u5982 cpdata-xxx.pages.dev\uFF09", { fallback: cfg.dataHost });
4771
- if (!host) {
4772
- status("warn", "\u5FC5\u987B\u586B\u5199\u6570\u636E\u9762\u57DF\u540D\uFF08\u4EE3\u7406\u6240\u5728\u7684\u90A3\u4E2A\u9879\u76EE\uFF09");
4773
- return;
4774
- }
4775
- if (host !== cfg.dataHost) saveConfig({ dataHost: host });
4776
4902
  const wantFilter = await confirm("\u8981\u6309\u673A\u623F\u5730\u533A\u7B5B\u9009\u5417\uFF1F\uFF08\u4E0D\u7B5B\u9009\u8DD1\u5168\u91CF\uFF09", false);
4777
4903
  let countries = [];
4778
4904
  if (wantFilter) {
@@ -4789,9 +4915,10 @@ async function menuScan() {
4789
4915
  status("info", "\u5F00\u59CB\u4F18\u9009\u2026");
4790
4916
  process.stdout.write("\n");
4791
4917
  const flags = {
4792
- host,
4918
+ host: cfg.dataHost ?? "",
4793
4919
  sample: String(sample),
4794
- "no-callback": true
4920
+ "ask-callback": true,
4921
+ panel: cfg.panelHost ?? ""
4795
4922
  };
4796
4923
  if (skipSpeed) flags["no-speed"] = true;
4797
4924
  if (countries.length > 0) flags["countries"] = countries.join(",");
@@ -4799,30 +4926,31 @@ async function menuScan() {
4799
4926
  await runScanCommand2(makeArgs2(flags));
4800
4927
  }
4801
4928
  async function menuScanPush() {
4802
- const cfg = loadConfig();
4803
- box("\u56DE\u586B\u5230\u9762\u677F", [
4804
- "\u4F18\u9009\u7ED3\u679C\u4F1A\u5199\u5165\u9762\u677F\u7684\u300C\u624B\u52A8\u4F18\u9009 IP\u300D",
4805
- c.gray("\u9700\u8981\u63A7\u5236\u9762\u57DF\u540D + \u9762\u677F\u5BC6\u7801")
4806
- ]);
4807
- process.stdout.write("\n");
4808
- const host = await ask("\u63A7\u5236\u9762\u57DF\u540D\uFF08\u5982 cpmanager.pages.dev\uFF09", { fallback: cfg.panelHost });
4809
- if (!host) {
4810
- status("warn", "\u5FC5\u987B\u586B\u5199\u63A7\u5236\u9762\u57DF\u540D\uFF08\u9762\u677F\u6240\u5728\u7684\u90A3\u4E2A\u9879\u76EE\uFF09");
4929
+ const token = resolveToken();
4930
+ if (!token) {
4931
+ status("warn", "\u5C1A\u672A\u914D\u7F6E API Token");
4811
4932
  return;
4812
4933
  }
4813
- if (host !== cfg.panelHost) saveConfig({ panelHost: host });
4814
- const dataHost = await ask("\u6570\u636E\u9762\u57DF\u540D\uFF08\u4F18\u9009\u76EE\u6807\uFF09", { fallback: cfg.dataHost });
4815
- if (!dataHost) {
4816
- status("warn", "\u5FC5\u987B\u586B\u5199\u6570\u636E\u9762\u57DF\u540D");
4934
+ const instance = await pickInstance(token);
4935
+ if (!instance) {
4936
+ status("warn", "\u9700\u8981\u5148\u6709\u4E00\u4E2A\u5DF2\u90E8\u7F72\u7684\u5B9E\u4F8B");
4817
4937
  return;
4818
4938
  }
4819
- if (dataHost !== cfg.dataHost) saveConfig({ dataHost });
4939
+ const cfg = loadConfig();
4940
+ process.stdout.write("\n");
4941
+ box("\u56DE\u586B\u5230\u9762\u677F", [
4942
+ `${c.gray("\u63A7\u5236\u9762")} ${cfg.panelHost}`,
4943
+ `${c.gray("\u6570\u636E\u9762")} ${cfg.dataHost}`,
4944
+ "\u7ED3\u679C\u4F1A\u5199\u5165\u9762\u677F\u7684\u300C\u624B\u52A8\u4F18\u9009 IP\u300D"
4945
+ ]);
4946
+ process.stdout.write("\n");
4820
4947
  const password = await ask("\u9762\u677F\u5BC6\u7801\uFF08\u7528\u4E8E\u7533\u8BF7\u56DE\u586B\u4EE4\u724C\uFF09", {
4821
4948
  password: true,
4822
4949
  allowEmpty: true
4823
4950
  });
4824
4951
  if (!password) {
4825
4952
  status("warn", "\u9700\u8981\u9762\u677F\u5BC6\u7801\u624D\u80FD\u7533\u8BF7\u4EE4\u724C");
4953
+ status("info", "\u5BC6\u7801\u5728\u90E8\u7F72\u65F6\u751F\u6210\uFF0C\u53EF\u5230\u300C\u90E8\u7F72\u300D\u9875\u6216\u9762\u677F\u51ED\u636E\u91CC\u67E5");
4826
4954
  return;
4827
4955
  }
4828
4956
  const skipSpeed = await confirm("\u8DF3\u8FC7\u6D4B\u901F\uFF1F\uFF08\u5FEB\u5F88\u591A\uFF0C\u4F46\u7ED3\u679C\u8D28\u91CF\u7565\u964D\uFF09", true);
@@ -4831,8 +4959,8 @@ async function menuScanPush() {
4831
4959
  status("info", "\u4EE4\u724C\u4F1A\u5728\u626B\u63CF\u7ED3\u675F\u540E\u624D\u7533\u8BF7\uFF0810 \u5206\u949F\u6709\u6548\uFF09");
4832
4960
  process.stdout.write("\n");
4833
4961
  const flags = {
4834
- host: dataHost,
4835
- panel: host,
4962
+ host: cfg.dataHost ?? "",
4963
+ panel: cfg.panelHost ?? "",
4836
4964
  "panel-password": password,
4837
4965
  sample: "6556"
4838
4966
  };
@@ -4847,6 +4975,8 @@ var init_scan2 = __esm({
4847
4975
  init_prompt();
4848
4976
  init_store();
4849
4977
  init_countries();
4978
+ init_cf_api();
4979
+ init_pages_deploy();
4850
4980
  }
4851
4981
  });
4852
4982
 
@@ -4854,50 +4984,146 @@ var init_scan2 = __esm({
4854
4984
  var config_exports = {};
4855
4985
  __export(config_exports, {
4856
4986
  menuConfig: () => menuConfig,
4857
- runConfig: () => runConfig
4987
+ runConfig: () => runConfig,
4988
+ syncAccount: () => syncAccount
4858
4989
  });
4990
+ async function syncFromCloud(token) {
4991
+ try {
4992
+ const client = new CloudflareClient({ token });
4993
+ const accounts = await client.listAccounts();
4994
+ if (accounts.length === 0) {
4995
+ status("fail", "\u8BE5 Token \u6CA1\u6709\u53EF\u8BBF\u95EE\u7684\u8D26\u53F7");
4996
+ return false;
4997
+ }
4998
+ let account = accounts[0];
4999
+ if (accounts.length > 1) {
5000
+ const picked = await select(
5001
+ "\u68C0\u6D4B\u5230\u591A\u4E2A\u8D26\u53F7\uFF0C\u8BF7\u9009\u62E9",
5002
+ accounts.map((a) => ({ label: a.name, value: a.id, hint: a.id.slice(0, 12) + "\u2026" }))
5003
+ );
5004
+ account = accounts.find((a) => a.id === picked) ?? accounts[0];
5005
+ }
5006
+ saveConfig({ accountId: account.id, accountName: account.name });
5007
+ status("ok", `\u8D26\u53F7\uFF1A${account.name}`);
5008
+ const namespaces = await client.listKvNamespaces(account.id);
5009
+ if (namespaces.length === 0) {
5010
+ status("info", "\u8BE5\u8D26\u53F7\u4E0B\u8FD8\u6CA1\u6709 KV\uFF08\u9996\u6B21\u90E8\u7F72\u65F6\u4F1A\u81EA\u52A8\u521B\u5EFA\uFF09");
5011
+ return true;
5012
+ }
5013
+ const instances = await listCfPilotNamespaces(client, account.id);
5014
+ if (instances.length > 0) {
5015
+ let chosen = instances[0];
5016
+ if (instances.length > 1) {
5017
+ const picked = await select(
5018
+ "\u68C0\u6D4B\u5230\u591A\u4E2A CFPilot \u5B9E\u4F8B\uFF0C\u8BF7\u9009\u62E9\u672C\u6B21\u4F7F\u7528\u54EA\u4E2A",
5019
+ instances.map((i) => ({
5020
+ label: `${i.manifest.controlProject} / ${i.manifest.dataProject}`,
5021
+ value: i.id,
5022
+ hint: i.manifest.controlSubdomain
5023
+ }))
5024
+ );
5025
+ chosen = instances.find((i) => i.id === picked) ?? instances[0];
5026
+ }
5027
+ saveConfig({
5028
+ kvNamespaceId: chosen.id,
5029
+ panelHost: chosen.manifest.controlSubdomain,
5030
+ dataHost: chosen.manifest.dataSubdomain
5031
+ });
5032
+ status("ok", `\u5B9E\u4F8B\uFF1A${chosen.manifest.controlProject} / ${chosen.manifest.dataProject}`);
5033
+ status("info", `\u63A7\u5236\u9762\uFF1A${chosen.manifest.controlSubdomain}`);
5034
+ status("info", `\u6570\u636E\u9762\uFF1A${chosen.manifest.dataSubdomain}`);
5035
+ return true;
5036
+ }
5037
+ if (namespaces.length === 1) {
5038
+ saveConfig({ kvNamespaceId: namespaces[0].id });
5039
+ status("info", `KV\uFF1A${namespaces[0].title}\uFF08\u5C1A\u65E0\u90E8\u7F72\uFF09`);
5040
+ } else {
5041
+ const picked = await select(
5042
+ "\u8BE5\u8D26\u53F7\u6709\u591A\u4E2A KV\uFF0C\u8BF7\u9009\u62E9\uFF08\u6216\u7A0D\u540E\u9996\u6B21\u90E8\u7F72\u65F6\u81EA\u52A8\u521B\u5EFA\uFF09",
5043
+ [
5044
+ ...namespaces.map((ns) => ({
5045
+ label: ns.title,
5046
+ value: ns.id,
5047
+ hint: ns.id.slice(0, 12) + "\u2026"
5048
+ })),
5049
+ { label: "\u4E0D\u6307\u5B9A\uFF08\u90E8\u7F72\u65F6\u81EA\u52A8\u521B\u5EFA\uFF09", value: "" }
5050
+ ]
5051
+ );
5052
+ if (picked) {
5053
+ saveConfig({ kvNamespaceId: picked });
5054
+ status("ok", "KV \u5DF2\u4FDD\u5B58");
5055
+ }
5056
+ }
5057
+ return true;
5058
+ } catch (err) {
5059
+ status("fail", `\u540C\u6B65\u5931\u8D25\uFF1A${err instanceof Error ? err.message : String(err)}`);
5060
+ return false;
5061
+ }
5062
+ }
5063
+ function summaryLines() {
5064
+ const cfg = loadConfig();
5065
+ return [
5066
+ `${c.gray("Token")} ${cfg.token ? c.green("\u5DF2\u4FDD\u5B58") : c.yellow("\u672A\u914D\u7F6E")}`,
5067
+ `${c.gray("\u8D26\u53F7")} ${cfg.accountName || cfg.accountId || c.yellow("\u672A\u914D\u7F6E")}`,
5068
+ `${c.gray("KV")} ${cfg.kvNamespaceId ? cfg.kvNamespaceId.slice(0, 16) + "\u2026" : c.yellow("\u672A\u914D\u7F6E")}`,
5069
+ `${c.gray("\u63A7\u5236\u9762")} ${cfg.panelHost || c.yellow("\u672A\u914D\u7F6E")}`,
5070
+ `${c.gray("\u6570\u636E\u9762")} ${cfg.dataHost || c.yellow("\u672A\u914D\u7F6E")}`
5071
+ ];
5072
+ }
5073
+ function maskSecret(s) {
5074
+ if (s.length <= 12) return "***";
5075
+ return s.slice(0, 6) + "\u2026" + s.slice(-4);
5076
+ }
4859
5077
  async function menuConfig() {
5078
+ const initial = loadConfig();
5079
+ if (initial.token && !initial.accountName) {
5080
+ status("info", "\u68C0\u6D4B\u5230\u5DF2\u4FDD\u5B58 Token\uFF0C\u6B63\u5728\u8BC6\u522B\u8D26\u53F7\u4E0E\u5B9E\u4F8B\u2026");
5081
+ process.stdout.write("\n");
5082
+ await syncFromCloud(initial.token);
5083
+ process.stdout.write("\n");
5084
+ }
4860
5085
  for (; ; ) {
5086
+ box("\u914D\u7F6E", [`${c.gray("\u6587\u4EF6")} ${configPath()}`, ...summaryLines()]);
5087
+ process.stdout.write("\n");
4861
5088
  const cfg = loadConfig();
4862
- box("\u914D\u7F6E", [
4863
- `${c.gray("\u914D\u7F6E\u6587\u4EF6")} ${configPath()}`,
4864
- `${c.gray("Token")} ${cfg.token ? c.green("\u5DF2\u4FDD\u5B58") : c.yellow("\u672A\u914D\u7F6E")}`,
4865
- `${c.gray("\u8D26\u53F7")} ${cfg.accountName || cfg.accountId || c.yellow("\u672A\u914D\u7F6E")}`,
4866
- `${c.gray("KV")} ${cfg.kvNamespaceId || c.yellow("\u672A\u914D\u7F6E")}`,
4867
- `${c.gray("\u63A7\u5236\u9762")} ${cfg.panelHost || c.yellow("\u672A\u914D\u7F6E")}`
4868
- ]);
4869
5089
  const action = await select("\u914D\u7F6E\u64CD\u4F5C", [
4870
- { label: "\u8BBE\u7F6E API Token", value: "token" },
4871
- { label: "\u8BBE\u7F6E\u8D26\u53F7\uFF08\u81EA\u52A8\u68C0\u6D4B\uFF09", value: "account" },
5090
+ {
5091
+ label: "\u6DFB\u52A0 API Token\uFF08\u8D26\u6237\uFF09",
5092
+ value: "token",
5093
+ hint: cfg.token ? "\u5DF2\u4FDD\u5B58\uFF0C\u53EF\u91CD\u65B0\u6DFB\u52A0\u8986\u76D6" : ""
5094
+ },
5095
+ { label: "\u5220\u9664 API Token\uFF08\u8D26\u6237\uFF09", value: "delete", disabled: !cfg.token },
4872
5096
  { label: "\u8BBE\u7F6E KV \u547D\u540D\u7A7A\u95F4", value: "kv" },
4873
5097
  { label: "\u8BBE\u7F6E\u63A7\u5236\u9762\u57DF\u540D", value: "panel" },
4874
5098
  { label: "\u67E5\u770B\u5B8C\u6574\u914D\u7F6E", value: "show" },
4875
- { label: "\u6E05\u7A7A\u914D\u7F6E", value: "clear" },
4876
5099
  { label: "\u8FD4\u56DE", value: "back" }
4877
5100
  ]);
4878
5101
  if (action === null || action === "back") return;
4879
5102
  process.stdout.write("\n");
4880
5103
  switch (action) {
4881
5104
  case "token": {
4882
- const token = await ask("Cloudflare API Token", { password: true });
5105
+ const token = await ask("\u7C98\u8D34 Cloudflare API Token", { password: true });
4883
5106
  if (!token) {
4884
5107
  status("warn", "\u672A\u8F93\u5165\uFF0C\u5DF2\u53D6\u6D88");
4885
5108
  break;
4886
5109
  }
4887
5110
  saveConfig({ token });
4888
- status("ok", "Token \u5DF2\u4FDD\u5B58\u5230\u672C\u5730\u914D\u7F6E");
4889
- status("info", `\u6587\u4EF6\uFF1A${configPath()}`);
4890
- if (await confirm("\u73B0\u5728\u68C0\u6D4B\u8D26\u53F7\uFF1F", true)) {
4891
- await detectAccount(token);
4892
- }
5111
+ status("ok", "Token \u5DF2\u4FDD\u5B58");
5112
+ status("info", "\u6B63\u5728\u8BC6\u522B\u8D26\u53F7\u4E0E\u5B9E\u4F8B\u2026");
5113
+ process.stdout.write("\n");
5114
+ await syncFromCloud(token);
4893
5115
  break;
4894
5116
  }
4895
- case "account": {
4896
- if (!cfg.token) {
4897
- status("warn", "\u8BF7\u5148\u8BBE\u7F6E Token");
4898
- break;
5117
+ case "delete": {
5118
+ process.stdout.write(`\u5F53\u524D\u8D26\u53F7\uFF1A${c.cyan(cfg.accountName || cfg.accountId || "\u672A\u77E5")}
5119
+ `);
5120
+ if (await confirm("\u786E\u8BA4\u5220\u9664\u672C\u5730\u4FDD\u5B58\u7684 Token \u4E0E\u8D26\u53F7\u4FE1\u606F\uFF1F", false)) {
5121
+ clearConfig();
5122
+ status("ok", "\u5DF2\u5220\u9664\u672C\u5730 Token \u4E0E\u8D26\u53F7\u914D\u7F6E");
5123
+ status("info", "\u4E91\u7AEF\u90E8\u7F72\u4E0D\u53D7\u5F71\u54CD\uFF0C\u53EF\u968F\u65F6\u91CD\u65B0\u6DFB\u52A0 Token \u6062\u590D");
5124
+ } else {
5125
+ status("info", "\u5DF2\u53D6\u6D88");
4899
5126
  }
4900
- await detectAccount(cfg.token);
4901
5127
  break;
4902
5128
  }
4903
5129
  case "kv": {
@@ -4925,42 +5151,11 @@ async function menuConfig() {
4925
5151
  rule();
4926
5152
  break;
4927
5153
  }
4928
- case "clear": {
4929
- if (await confirm("\u786E\u5B9A\u6E05\u7A7A\u6240\u6709\u672C\u5730\u914D\u7F6E\uFF1F", false)) {
4930
- clearConfig();
4931
- status("ok", "\u914D\u7F6E\u5DF2\u6E05\u7A7A");
4932
- }
4933
- break;
4934
- }
4935
5154
  }
4936
5155
  process.stdout.write("\n");
4937
5156
  await pause();
4938
5157
  }
4939
5158
  }
4940
- async function detectAccount(token) {
4941
- status("info", "\u6B63\u5728\u68C0\u6D4B\u8D26\u53F7\u2026");
4942
- try {
4943
- const client = new CloudflareClient({ token });
4944
- const accounts = await client.listAccounts();
4945
- if (accounts.length === 0) {
4946
- status("fail", "\u8BE5 Token \u6CA1\u6709\u53EF\u8BBF\u95EE\u7684\u8D26\u53F7");
4947
- return;
4948
- }
4949
- let picked = accounts[0];
4950
- if (accounts.length > 1) {
4951
- const value = await select(
4952
- "\u9009\u62E9\u8D26\u53F7",
4953
- accounts.map((a) => ({ label: a.name, value: a.id, hint: a.id.slice(0, 12) + "\u2026" }))
4954
- );
4955
- picked = accounts.find((a) => a.id === value) ?? accounts[0];
4956
- }
4957
- saveConfig({ accountId: picked.id, accountName: picked.name });
4958
- status("ok", `\u8D26\u53F7\uFF1A${picked.name}`);
4959
- status("info", `ID\uFF1A${picked.id}`);
4960
- } catch (err) {
4961
- status("fail", `\u68C0\u6D4B\u5931\u8D25\uFF1A${err instanceof Error ? err.message : String(err)}`);
4962
- }
4963
- }
4964
5159
  async function runConfig(args) {
4965
5160
  const cfg = loadConfig();
4966
5161
  const flags = args.flags;
@@ -4983,9 +5178,10 @@ async function runConfig(args) {
4983
5178
  saveConfig(patch);
4984
5179
  process.stdout.write("\u5DF2\u4FDD\u5B58\uFF1A" + Object.keys(patch).join(", ") + "\n");
4985
5180
  }
4986
- function maskSecret(s) {
4987
- if (s.length <= 12) return "***";
4988
- return s.slice(0, 6) + "\u2026" + s.slice(-4);
5181
+ async function syncAccount(token) {
5182
+ const t = token || resolveToken();
5183
+ if (!t) return false;
5184
+ return await syncFromCloud(t);
4989
5185
  }
4990
5186
  var init_config = __esm({
4991
5187
  "src/menu/config.ts"() {
@@ -4994,6 +5190,7 @@ var init_config = __esm({
4994
5190
  init_prompt();
4995
5191
  init_store();
4996
5192
  init_cf_api();
5193
+ init_pages_deploy();
4997
5194
  }
4998
5195
  });
4999
5196
 
@@ -5092,7 +5289,6 @@ async function runMenu() {
5092
5289
  { label: "\u66F4\u65B0\u73B0\u6709\u5B9E\u4F8B", value: "deploy-update", hint: "\u6CBF\u7528\u51ED\u636E\uFF0C\u53EA\u66F4\u65B0\u5185\u6838" },
5093
5290
  { label: "\u67E5\u770B\u5B9E\u4F8B\u72B6\u6001", value: "status", hint: "\u8BFB\u53D6\u7EBF\u4E0A\u90E8\u7F72\u4FE1\u606F" },
5094
5291
  { label: "\u672C\u5730\u4F18\u9009\uFF08\u771F\u8FDE\u63A5\u6D4B\u901F\uFF09", value: "scan", hint: "\u626B\u63CF\u53EF\u7528 IP" },
5095
- { label: "\u56DE\u586B\u4F18\u9009\u7ED3\u679C\u5230\u9762\u677F", value: "scan-push", hint: "\u5199\u5165\u9762\u677F\u7684\u300C\u624B\u52A8\u4F18\u9009 IP\u300D" },
5096
5292
  { label: "\u4FEE\u6539\u9762\u677F\u5BC6\u7801", value: "change-password" },
5097
5293
  { label: "\u68C0\u67E5 Token \u6743\u9650", value: "token-check" },
5098
5294
  { label: "\u914D\u7F6E\uFF08Token / \u8D26\u53F7 / KV\uFF09", value: "config" },
@@ -5128,11 +5324,6 @@ async function runMenu() {
5128
5324
  await menuScan2();
5129
5325
  break;
5130
5326
  }
5131
- case "scan-push": {
5132
- const { menuScanPush: menuScanPush2 } = await Promise.resolve().then(() => (init_scan2(), scan_exports));
5133
- await menuScanPush2();
5134
- break;
5135
- }
5136
5327
  case "change-password": {
5137
5328
  const { menuChangePassword: menuChangePassword2 } = await Promise.resolve().then(() => (init_deploy(), deploy_exports));
5138
5329
  await menuChangePassword2();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cfpilot",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "CFPilot —— Cloudflare Pages 代理部署与优选工具(交互菜单 + 子命令)",
5
5
  "type": "module",
6
6
  "license": "MIT",