aicommit2
Version:
A Reactive CLI that generates commit messages for Git and Jujutsu with various AI
2 lines (1 loc) • 4.64 kB
JavaScript
import L from"@anthropic-ai/sdk";import P from"chalk";import{concatMap as v,from as w,map as I,catchError as x}from"rxjs";import{fromPromise as S}from"rxjs/internal/observable/innerFrom";import{A as T,l as E,a as $,b,c as _,d as U,e as D}from"./ai.service-d8e94c3a.mjs";import{g as F,b as N}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";const W=["claude-4","claude-haiku-4","claude-sonnet-4","claude-opus-4"],R=M=>{const o=M.toLowerCase();return W.some(t=>o===t||o.startsWith(`${t}-`)||o.startsWith(`${t}.`))},z=10*60*1e3;class H extends T{constructor(o){super(o),this.params=o,this.generateStreamingCommitMessage$=()=>{const{generate:t,type:e}=this.params.config;return this.createStreamingCommitMessages$(r=>{this.streamChunks(r).catch(m=>r.error(m))},e,t)},this.streamChunks=async t=>{const e=this.params.stagedDiff.diff,{logging:r,temperature:m,maxTokens:u,topP:g,model:c}=this.params.config,n=F(this.buildPromptOptions()),p=this.buildUserPrompt(e,"commit"),l=`${this.params.config.url||"https://api.anthropic.com"}/v1/messages`,k={"Content-Type":"application/json","x-api-key":this.params.config.key,"anthropic-version":"2023-06-01"};E(e,"commit","Anthropic",c,l,k,r),$(e,"commit","Anthropic",n,p,r);const A=R(c),d={max_tokens:u,temperature:m,system:n,messages:[{role:"user",content:p}],model:c,stream:!0,...A?{}:{top_p:g}};b(e,"commit","Anthropic",d,r);const y=Date.now();let h="";try{const i=this.anthropic.messages.stream(d);i.on("text",a=>{h+=a,t.next(a)});const s=await i.finalMessage(),C=Date.now()-y;_(e,"commit","Anthropic",s,r),U(e,"commit","Anthropic",C,h,r),t.complete()}catch(i){D(e,"commit","Anthropic",i,r),t.error(i)}},this.colors={primary:"#AE5630",secondary:"#fff"},this.serviceName=P.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[Anthropic${this.formatModelSuffix()}]`),this.errorPrefix=P.red.bold(`[Anthropic${this.formatModelSuffix()}]`),this.anthropic=new L({apiKey:this.params.config.key,...this.params.config.timeout>z&&{timeout:this.params.config.timeout}})}getServiceSpecificErrorMessage(o){const t=o.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Anthropic API key in configuration":t.includes("quota")||t.includes("usage")?"API quota exceeded. Check your Anthropic usage limits":t.includes("model_not_found")||t.includes("Model not found")||/model.*does not exist/i.test(t)?"Model not found or not accessible. Check if the Claude model name is correct":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Claude model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Claude model configuration":t.includes("500")||t.includes("Internal Server Error")?"Anthropic server error. Try again later":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():S(this.generateMessage("commit")).pipe(v(t=>w(t)),I(this.formatAsChoice),x(this.handleError$))}generateCodeReview$(){return S(this.generateMessage("review")).pipe(v(o=>w(o)),I(this.formatCodeReviewAsChoice),x(this.handleError$))}async generateMessage(o){const t=this.params.stagedDiff.diff,{logging:e,temperature:r,generate:m,type:u,maxTokens:g,topP:c,model:n}=this.params.config,p=this.buildPromptOptions(),f=o==="review"?N(p):F(p),l=this.buildUserPrompt(t,o),A=`${this.params.config.url||"https://api.anthropic.com"}/v1/messages`,d={"Content-Type":"application/json","x-api-key":this.params.config.key,"anthropic-version":"2023-06-01"};E(t,o,"Anthropic",n,A,d,e),$(t,o,"Anthropic",f,l,e);const y=R(n),h={max_tokens:g,temperature:r,system:f,messages:[{role:"user",content:l}],model:n,...y?{}:{top_p:c}};b(t,o,"Anthropic",h,e);const i=Date.now();try{const s=await this.anthropic.messages.create(h),C=Date.now()-i;_(t,o,"Anthropic",s,e);const a=s.content.map(({text:O})=>O).join("");return U(t,o,"Anthropic",C,a,e),o==="review"?this.parseCodeReview(a):this.parseMessage(a,u,m)}catch(s){throw D(t,o,"Anthropic",s,e),s}}}export{H as AnthropicService};