newexpand-autopr
Version:
GitHub PR Automation CLI Tool with AI
4 lines • 10.1 kB
JavaScript
import {a,f,d,p}from'./chunk-FC7BHN76.js';import {exec}from'child_process';import {promisify}from'util';import E from'inquirer';import {createFetch}from'next-type-fetch';import b from'fs';import P from'path';import G from'os';var A=P.join(G.homedir(),".autopr"),k=P.join(A,"token.json"),v=class v{constructor(e="https://api.newextend.com/api"){this.tokenData=null;this.baseUrl=e,this.loadToken(),this.fetch=createFetch({authRetry:{statusCodes:[401,403],handler:a(async()=>await this.getAuthToken(),"handler")}}),this.fetch.interceptors.request.use(async i=>{var s;return i.headers=i.headers||{},i.headers["x-ai-api-key"]=((s=this.tokenData)==null?void 0:s.token)||"",i.headers["x-title"]="github-autopr",i});}loadToken(){try{if(b.existsSync(k)){let e=JSON.parse(b.readFileSync(k,"utf-8"));e&&e.token&&e.expiresAt>Date.now()?(this.tokenData=e,f.debug(d("core.ai_manager.info.token_loaded"))):(f.debug(d("core.ai_manager.warning.token_expired_retrying")),this.tokenData=null);}}catch(e){f.error(d("core.ai_manager.error.token_load_failed"),e),this.tokenData=null;}}saveToken(e){try{b.existsSync(A)||b.mkdirSync(A,{recursive:true}),b.writeFileSync(k,JSON.stringify(e,null,2),"utf-8"),f.debug(d("core.ai_manager.info.token_saved"));}catch(i){f.error(d("core.ai_manager.error.token_save_failed"),i);}}async getAuthToken(e="github-autopr"){var i,s,n;try{let d$1=await createFetch().post(`${this.baseUrl}/ai/google/auth/token`,{title:e});if((i=d$1.data)!=null&&i.success&&((n=(s=d$1.data)==null?void 0:s.data)!=null&&n.token)){let{token:c,expiresIn:o}=d$1.data.data;return this.tokenData={token:c,expiresAt:Date.now()+o*1e3},this.saveToken(this.tokenData),f.info(d("core.ai_manager.info.token_acquired")),true}return false}catch(f$1){return f.error(d("core.ai_manager.error.token_acquisition_failed"),f$1),false}}async callAPI(e,i){return await this.executeRequest(e,i)}async executeRequest(e,i){let s=await this.fetch.post(`${this.baseUrl}${e}`,i);return s.data&&s.data.data?s.data.data:s.data}async getGitHubAppInfo(){try{let e=await this.fetch.get(`${this.baseUrl}/github/app-info`);if(e.data&&e.data.data)return e.data.data;throw new Error(d("core.ai_manager.error.github_app_info_missing"))}catch(e){throw f.error(d("core.ai_manager.error.github_app_info_failed"),e),e}}async getGitHubAppToken(e){try{let i=await this.fetch.get(`${this.baseUrl}/github/app-token/${e}`);if(i.data&&i.data.data&&i.data.data.token)return i.data.data.token;throw new Error(d("core.ai_manager.error.token_missing"))}catch(i){throw f.error(d("core.ai_manager.error.app_token_failed"),i),i}}async getGitHubAppInstallations(){try{let e=await this.fetch.get(`${this.baseUrl}/github/app-installations`);if(e.data&&e.data.data)return e.data.data;throw new Error(d("core.ai_manager.error.installations_missing"))}catch(e){throw f.error(d("core.ai_manager.error.installations_failed"),e),e}}async getGitHubOAuthClientInfo(){try{let e=await this.fetch.get(`${this.baseUrl}/github/oauth-client-info`);if(e.data&&e.data.data)return e.data.data;throw new Error(d("core.ai_manager.error.oauth_client_info_missing"))}catch(e){throw f.error(d("core.ai_manager.error.oauth_client_info_failed"),e),e}}};a(v,"AIClient");var y=v,I=null;function g(){return I||(I=new y),I}a(g,"getAIClient");var _=promisify(exec);async function tt(a){try{let e=await g().getGitHubAppToken(a);return f.debug(d("core.github_app.token.success")),e}catch(e){throw f.error(d("core.github_app.token.failed")),new Error(`${d("core.github_app.error.token_request_failed",{status:e instanceof Error?e.message:d("core.github_app.error.unknown")})}`)}}a(tt,"getInstallationToken");async function et(){try{return await g().getGitHubAppInstallations()}catch(a){throw f.error(d("core.github_app.installations.fetch_failed")),new Error(`${d("core.github_app.error.list_installations_failed",{status:a instanceof Error?a.message:d("core.github_app.error.unknown")})}`)}}a(et,"listInstallations");async function S(){f.info(d("core.github_app.device_flow.initializing"));try{let e={client_id:(await g().getGitHubAppInfo()).clientId,scope:"repo read:user user:email"},i=await fetch("https://github.com/login/device/code",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","User-Agent":"AutoPR-CLI","X-GitHub-Api-Version":"2022-11-28"},body:JSON.stringify(e)});if(!i.ok){let n=await i.text();throw f.error(d("core.github_app.device_flow.error_response"),n),new Error(d("core.github_app.device_flow.init_failed",{status:i.status,error:n}))}return await i.json()}catch(a){throw f.error(d("core.github_app.error.app_info_failed",{status:a instanceof Error?a.message:d("core.github_app.error.unknown")})),new Error(`${d("core.github_app.device_flow.init_failed",{status:"",error:a instanceof Error?a.message:d("core.github_app.error.unknown")})}`)}}a(S,"getDeviceCode");async function U(a,e,i){let n=Date.now()+i*1e3,d$1=(await g().getGitHubAppInfo()).clientId;for(;Date.now()<n;)try{let c=await fetch("https://github.com/login/oauth/access_token",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","User-Agent":"AutoPR-CLI","X-GitHub-Api-Version":"2022-11-28"},body:JSON.stringify({client_id:d$1,device_code:a,grant_type:"urn:ietf:params:oauth:grant-type:device_code"})});if(!c.ok)throw new Error(d("core.github_app.token.request_failed",{status:c.status}));let o=await c.json();if(o.error){if(o.error==="authorization_pending"){await new Promise(p=>setTimeout(p,e*1e3));continue}if(o.error==="slow_down"){e+=5,await new Promise(p=>setTimeout(p,e*1e3));continue}throw o.error==="expired_token"?new Error(d("core.github_app.token.expired")):new Error(d("core.github_app.token.error",{error:o.error}))}if(!o.access_token)throw new Error(d("core.github_app.token.missing"));return o.access_token}catch(c){if(c instanceof Error&&c.message.includes("expired"))throw c;await new Promise(o=>setTimeout(o,e*1e3));}throw new Error(d("core.github_app.token.expired"))}a(U,"pollForToken");async function rt(){try{f.info(`
`+d("core.github_app.setup.starting"));let a=await S();f.section(d("core.github_app.ui.auth_guide_title")),f.info(d("core.github_app.auth.instructions")),f.section(d("core.github_app.ui.auth_steps_title")),f.step("1\uFE0F\u20E3 "+d("core.github_app.auth.open_url",{url:a.verification_uri})),f.step("2\uFE0F\u20E3 "+d("core.github_app.auth.enter_code",{code:a.user_code}));try{process.platform==="darwin"?await _(`open "${a.verification_uri}"`):process.platform==="win32"?await _(`start "${a.verification_uri}"`):await _(`xdg-open "${a.verification_uri}"`);}catch{f.warn(d("core.github_app.auth.browser_open_failed"));}f.section(d("core.github_app.ui.auth_waiting_title")),f.info(d("core.github_app.auth.waiting")),f.info(d("core.github_app.auth.time_limit",{minutes:Math.floor(a.expires_in/60)}));let e=await U(a.device_code,a.interval,a.expires_in);f.info(d("core.github_app.installations.fetching"));let i=await fetch("https://api.github.com/user/installations",{headers:{Authorization:`Bearer ${e}`,Accept:"application/vnd.github.v3+json","User-Agent":"AutoPR-CLI","X-GitHub-Api-Version":"2022-11-28"}});if(!i.ok)throw new Error(d("core.github_app.error.list_installations_failed",{status:i.status}));let n=(await i.json()).installations||[];if(n.length===0){f.info(d("core.github_app.installations.not_found")),f.section(d("core.github_app.ui.install_required_title")),f.warn(d("core.github_app.ui.install_not_found")),f.info(d("core.github_app.ui.install_steps")),f.step(d("core.github_app.ui.install_browser_step"));let o=await g().getGitHubAppInfo(),p$1=o.appId,l="https://github.com/apps/new-autopr-bot/installations/new";try{let m=await fetch("https://api.github.com/app",{headers:{Authorization:`Bearer ${e}`,Accept:"application/vnd.github.v3+json","User-Agent":"AutoPR-CLI","X-GitHub-Api-Version":"2022-11-28"}});if(m.ok){let h=await m.json();f.debug("App info: "+JSON.stringify(h,null,2)),h.id&&(p$1=h.id.toString()),h.html_url&&(l=h.html_url);}}catch{f.debug("Failed to get app info, using default values");}f.step(d("core.github_app.ui.install_url_step",{url:l})),f.step(d("core.github_app.ui.install_select_step"));try{process.platform==="darwin"?await _(`open "${l}"`):process.platform==="win32"?await _(`start "${l}"`):await _(`xdg-open "${l}"`);}catch{f.warn(d("core.github_app.auth.browser_open_failed"));}f.section(d("core.github_app.ui.install_completion_title"));let{confirmed:R}=await E.prompt([{type:"confirm",name:"confirmed",message:d("core.github_app.ui.install_confirm"),default:false}]);if(!R)throw new Error(d("core.github_app.error.installation_cancelled"));f.info(d("core.github_app.installations.verification"));let T=await fetch("https://api.github.com/user/installations",{headers:{Authorization:`Bearer ${e}`,Accept:"application/vnd.github.v3+json","User-Agent":"AutoPR-CLI","X-GitHub-Api-Version":"2022-11-28"}});if(T.ok){let h=(await T.json()).installations||[];if(h.length>0){f.info(d("core.github_app.installations.success"));let $=h[0].id;await p({githubApp:{appId:p$1,clientId:o.clientId,installationId:$}}),f.info(`
`+d("core.github_app.auth.success")),f.info(d("core.github_app.setup.auto_complete"));return}}throw new Error(d("core.github_app.error.installation_verification_failed"))}let f$1=n[0].id,d$1=n[0].app_id?n[0].app_id.toString():(await g().getGitHubAppInfo()).appId;if(n.length>1){f.info(d("core.github_app.setup.multiple_installations")),n.forEach((p,l)=>{f.info(`${l+1}. ${p.account.login} (${p.id})`);});let{selectedInstallation:o}=await E.prompt([{type:"list",name:"selectedInstallation",message:d("core.github_app.ui.multiple_installations"),choices:n.map((p,l)=>({name:`${p.account.login} (${p.id})`,value:l})),default:0}]);f$1=n[o].id;}let c=await g().getGitHubAppInfo();await p({githubApp:{appId:d$1,clientId:c.clientId,installationId:f$1}}),f.info(`
`+d("core.github_app.auth.success")),f.info(d("core.github_app.setup.auto_complete"));}catch(a){throw a instanceof Error?new Error(d("core.github_app.auth.failed",{error:a.message})):a}}a(rt,"setupGitHubAppCredentials");export{g as a,tt as b,et as c,rt as d};