UNPKG

aicommit2

Version:

A Reactive CLI that generates commit messages for Git and Jujutsu with various AI

6 lines (3 loc) 4.26 kB
import u from"chalk";import{concatMap as S,from as E,map as A,catchError as D}from"rxjs";import{fromPromise as w}from"rxjs/internal/observable/innerFrom";import{A as T,l as k,a as v,b as y,c as b,d as P,e as R}from"./ai.service-d8e94c3a.mjs";import{n as x,o as N,p as I,b as $,g as U,C as F,q as B,r as H}from"./cli-8ee62906.mjs";import"fs";import"path";import"@pacote/xxhash";import"winston";import"cleye";import"module";import"crypto";import"os";import"node:buffer";import"node:path";import"node:child_process";import"node:process";import"child_process";import"node:url";import"node:os";import"assert";import"events";import"node:fs";import"buffer";import"stream";import"util";import"node:util";import"inquirer";import"fs/promises";import"readline";import"figlet";import"gradient-string";import"ora";import"inquirer-reactive-list-prompt";import"winston-daily-rotate-file";import"axios";import"url";import"node:fs/promises";import"chokidar";import"rxjs/operators";class j extends T{constructor(o){super(o),this.params=o,this.colors={primary:"#8957e5",secondary:"#FFF"},this.serviceName=u.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[Copilot SDK${this.formatModelSuffix()}]`),this.errorPrefix=u.red.bold(`[Copilot SDK${this.formatModelSuffix()}]`)}getServiceSpecificErrorMessage(o){const t=o.message||"";return o.code==="SDK_NOT_INSTALLED"?"Copilot SDK is not installed. Run: npm install @github/copilot-sdk":x(t)?"Copilot rejected classic ghp_ token. Use COPILOT_GITHUB_TOKEN with a Fine-Grained PAT or authenticate via copilot /login.":o.code==="AUTHENTICATION_FAILED"||N(t)?"Copilot authentication failed. Install/authenticate Copilot CLI, then retry.":t.includes("ERR_UNKNOWN_BUILTIN_MODULE")&&t.includes("node:sqlite")?"Copilot SDK requires a newer Node.js runtime (node:sqlite is unavailable). Please use Node.js 22+ and retry.":o.code==="MODEL_NOT_AVAILABLE"||I(t)?"Model is unavailable in Copilot SDK for this account/plan/client. Try another model.":o.code==="NO_CONTENT"?"Copilot SDK returned no content.":null}generateCommitMessage$(){return w(this.generateMessage("commit")).pipe(S(o=>E(o)),A(this.formatAsChoice),D(this.handleError$))}generateCodeReview$(){return w(this.generateMessage("review")).pipe(S(o=>E(o)),A(this.formatCodeReviewAsChoice),D(this.handleError$))}async generateMessage(o){const t=this.params.stagedDiff.diff,{generate:e,type:i}=this.params.config,s=this.buildPromptOptions(),n=o==="review"?$(s):U(s),g=o==="review"?t:`Here's the diff: ${t}`,a=await this.makeRequest(n,g,o,t);return o==="review"?this.parseCodeReview(a):this.parseMessage(a,i,e)}async loadSdkModule(){try{return await import("@github/copilot-sdk")}catch(o){const t=new Error("Copilot SDK package is missing. Install with: npm install @github/copilot-sdk");throw t.code="SDK_NOT_INSTALLED",t.originalError=o,t}}extractContent(o){if(!o||typeof o!="object")return"";const t=o,e=t.data,i=t.content,s=e?.content;if(typeof i=="string")return i.trim();if(typeof s=="string")return s.trim();const n=e?.message?.content;return typeof n=="string"?n.trim():""}async makeRequest(o,t,e,i){const{CopilotClient:s,approveAll:n}=await this.loadSdkModule(),g=Array.isArray(this.params.config.model)?this.params.config.model[0]:this.params.config.model||F,a=B(g),{logging:l}=this.params.config;let C;for(const m of a){const O="copilot-sdk://session",L={Authorization:"Copilot CLI session"},_={model:m,prompt:t};k(i,e,"Copilot SDK",m,O,L,l),v(i,e,"Copilot SDK",o,t,l),y(i,e,"Copilot SDK",_,l);const M=Date.now();let d;try{const c=H(process.env);d=new s(c);const p=await(await d.createSession({model:m,onPermissionRequest:n})).sendAndWait({prompt:`${o} ${t}`}),h=this.extractContent(p);if(!h){const f=new Error("No content in Copilot SDK response");throw f.code="NO_CONTENT",f}const K=Date.now()-M;return b(i,e,"Copilot SDK",p,l),P(i,e,"Copilot SDK",K,h,l),h}catch(c){const r=c instanceof Error?c:new Error(String(c)),p=r.message||String(c);if(!r.code&&N(p)&&(r.code="AUTHENTICATION_FAILED"),!r.code&&I(p)&&(r.code="MODEL_NOT_AVAILABLE"),R(i,e,"Copilot SDK",r,l),C=r,!(r.code==="MODEL_NOT_AVAILABLE"&&m!==a[a.length-1]))throw r}finally{d?.stop&&await d.stop()}}throw C||new Error("Copilot SDK request failed for all candidate models")}}export{j as CopilotSdkService};