aicommit2 2.5.7 → 2.5.8

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.
Files changed (21) hide show
  1. package/dist/{ai.service-da8345b1.mjs → ai.service-7cce5ee0.mjs} +1 -1
  2. package/dist/{anthropic.service-bff34bb1.mjs → anthropic.service-96c06fb4.mjs} +1 -1
  3. package/dist/{bedrock.service-419a856c.mjs → bedrock.service-c4a4966a.mjs} +1 -1
  4. package/dist/{cli-83e0874c.mjs → cli-0dd7e35c.mjs} +2 -2
  5. package/dist/cli.mjs +1 -1
  6. package/dist/{codestral.service-59a12e78.mjs → codestral.service-87eb83a7.mjs} +1 -1
  7. package/dist/{cohere.service-80e89971.mjs → cohere.service-57428091.mjs} +1 -1
  8. package/dist/{deep-seek.service-86125741.mjs → deep-seek.service-ddd3ae03.mjs} +1 -1
  9. package/dist/{gemini.service-2c3b0cd4.mjs → gemini.service-561a56c3.mjs} +1 -1
  10. package/dist/{github-models.service-37847903.mjs → github-models.service-181c9920.mjs} +1 -1
  11. package/dist/{groq.service-5cf5b8c9.mjs → groq.service-2d3c6f6f.mjs} +1 -1
  12. package/dist/{hugging-face.service-966de0cf.mjs → hugging-face.service-73d6cacd.mjs} +1 -1
  13. package/dist/{mistral.service-3389f888.mjs → mistral.service-f1a0c8d4.mjs} +1 -1
  14. package/dist/{ollama.service-c5b469be.mjs → ollama.service-c7689836.mjs} +1 -1
  15. package/dist/{openai-compatible.service-599ec5d0.mjs → openai-compatible.service-0f3f1008.mjs} +1 -1
  16. package/dist/{openai-3092588f.mjs → openai-f7aae8f3.mjs} +11 -10
  17. package/dist/{openai.service-df984ad9.mjs → openai.service-cac0981d.mjs} +1 -1
  18. package/dist/{openrouter.service-107eec99.mjs → openrouter.service-393bb505.mjs} +1 -1
  19. package/dist/perplexity.service-6563c4f1.mjs +1 -0
  20. package/package.json +1 -1
  21. package/dist/perplexity.service-eda88944.mjs +0 -1
@@ -1,4 +1,4 @@
1
- import{of as L,Observable as _,Subject as J,catchError as B}from"rxjs";import"fs";import"path";import{xxh64 as M}from"@pacote/xxhash";import $ from"winston";import{A as T,l as p,D as F,g as D,s as b,h as U,d as z,E as H,e as q,f as P}from"./cli-83e0874c.mjs";const y=new Map,d=(f,s,e)=>{const o=M(0).update(s).digest("hex").substring(0,8),r=`${f}_${o}_${e}`;if(y.has(r))return y.get(r);const n=new Date,t=Z(n,f,s,e),c=`${T}/${t}`,i=$.createLogger({level:"info",format:$.format.combine($.format.timestamp({format:"YYYY-MM-DDTHH:mm:ss.SSSZ"}),$.format.printf(({timestamp:u,level:l,message:a,...m})=>m&&Object.keys(m).length>0?`[${u}] ${l}: ${a} ${JSON.stringify(m,null,2)}`:`[${u}] ${l}: ${a}`)),transports:[new $.transports.File({filename:c})]});return i.info(`=== ${f.toUpperCase()} AI SERVICE LOG ===`),i.info(`Diff Hash: ${o}`),i.info(`Request Type: ${e.toUpperCase()}`),i.info(`Start Time: ${n.toISOString()}`),i.info("=".repeat(50)),i.info(""),y.set(r,i),i},K=f=>{const s={...f},e=["authorization","x-api-key","x-goog-api-key","api-key","x-amzn-bedrock-application-key"];for(const o of e){const r=o.toLowerCase(),n=Object.keys(s).find(t=>t.toLowerCase()===r);n&&s[n]&&typeof s[n]=="string"&&(s[n].startsWith("Bearer ")?s[n]="Bearer [MASKED]":s[n]="[MASKED]")}return s},Y=(f,s,e,o,r,n,t=!0)=>{if(!t)return;const c=d(e,f,s);c.info(`Making request to ${e} API with model: ${o}`),c.info(`Request URL: ${r}`),c.info("Request headers:",K(n))},V=(f,s,e,o,r=!0)=>{if(!r)return;d(e,f,s).info("Request payload:",o)},W=(f,s,e,o,r,n=!0)=>{if(!n)return;const t=d(e,f,s);t.info("System prompt:",{prompt:o}),t.info("User prompt:",{prompt:r})},G=(f,s,e,o,r=!0)=>{if(!r)return;d(e,f,s).info("Response received:",o)},Q=(f,s,e,o,r=!0)=>{if(!r)return;d(e,f,s).error("API request failed:",o)},R=(f,s,e,o,r,n=!0)=>{if(!n)return;const t=d(e,f,s);o?t.info(`Request completed successfully in ${o}ms`):t.info("Request completed successfully"),r&&t.info("Final processed response:",{response:r}),t.info(""),t.info("=".repeat(50)),t.info(`End Time: ${new Date().toISOString()}`),t.info("=== REQUEST COMPLETED ===")},X=(f,s,e,o,r,n,t,c=!0)=>{if(!c)return;const i=d(e,f,s);t?i.error(`Request failed after ${n}ms:`,{error:t}):(i.info(`Request completed in ${n}ms`),i.info("Response:",{response:r})),R(f,s,e,n,r,c)},Z=(f,s,e,o)=>{const{year:r,month:n,day:t,hours:c,minutes:i,seconds:u}=ee(f),a=M(0).update(e).digest("hex").substring(0,8),m=s.toLowerCase().replace(/[^a-z0-9]/g,"").substring(0,20);return o==="review"?`${r}-${n}-${t}_${c}-${i}-${u}_${a}_${m}_review.log`:`${r}-${n}-${t}_${c}-${i}-${u}_${a}_${m}_commit.log`},ee=f=>{const s=f.getFullYear().toString(),e=(f.getMonth()+1).toString().padStart(2,"0"),o=f.getDate().toString().padStart(2,"0"),r=f.getHours().toString().padStart(2,"0"),n=f.getMinutes().toString().padStart(2,"0"),t=f.getSeconds().toString().padStart(2,"0");return{year:s,month:e,day:o,hours:r,minutes:n,seconds:t}},w=()=>{for(const[f,s]of y.entries())try{s.close()}catch(e){console.error(`Failed to close logger ${f}:`,e)}y.clear()};process.on("exit",w),process.on("SIGINT",()=>{w(),process.exit(0)}),process.on("SIGTERM",()=>{w(),process.exit(0)});class te{constructor(){this.buffer="",this.arrayStartFound=!1,this.scanPosition=0,this.feed=s=>{this.buffer+=s;const e=[];if(!this.arrayStartFound){const o=this.buffer.indexOf("[");if(o===-1)return e;this.arrayStartFound=!0,this.scanPosition=o+1}for(;;){const o=this.buffer.indexOf("{",this.scanPosition);if(o===-1)break;const r=this.extractBalancedBraces(o);if(!r)break;this.scanPosition=o+r.length;const n=this.tryParseCommitMessage(r);n&&e.push(n)}return e},this.flush=()=>this.feed(""),this.getBuffer=()=>this.buffer,this.getUnparsedBuffer=()=>this.buffer.slice(this.scanPosition),this.extractBalancedBraces=s=>{let e=0,o=!1,r=!1;for(let n=s;n<this.buffer.length;n++){const t=this.buffer[n];if(r){r=!1;continue}if(t==="\\"&&o){r=!0;continue}if(t==='"'){o=!o;continue}if(!o&&(t==="{"&&e++,t==="}"&&e--,e===0))return this.buffer.slice(s,n+1)}return null},this.tryParseCommitMessage=s=>{try{const e=JSON.parse(s);return typeof e.subject!="string"?null:{subject:e.subject,body:typeof e.body=="string"?e.body:void 0,footer:typeof e.footer=="string"?e.footer:void 0}}catch{return null}}}}class se{constructor(s){this.handleError$=e=>{const o=this.getDetailedErrorMessage(e),r=e.status?`HTTP ${e.status}: ${o}`:o;if(this.params.config.logging){const n=this.params.stagedDiff.diff,t=this.serviceName.replace(/\[|\]/g,"").trim();X(n,"commit",t,"Error occurred","",void 0,r)}return p.error(`${this.errorPrefix} ${r}`),e.stack&&p.error(` ${e.stack}`),e.content&&p.error(` Problematic content: ${e.content}`),e.originalError&&p.error(` Original error: ${e.originalError}`),L({name:`${this.errorPrefix} ${r}`,value:r,isError:!0,disabled:!0})},this.extractJsonObjectFromResponse=e=>{const o=e.indexOf("{");return o!==-1?this.extractBalancedJson(e,o,"{","}"):null},this.buildCommitPrompt=()=>{const{systemPrompt:e,systemPromptPath:o,codeReviewPromptPath:r,locale:n,generate:t,type:c,maxLength:i}=this.params.config,u={...F,locale:n,maxLength:i,type:c,generate:t,systemPrompt:e,systemPromptPath:o,codeReviewPromptPath:r,vcs_branch:this.params.branchName||""};return D(u)},this.formatRawCommitMessage=(e,o)=>{const r=this.extractMessageAsType(e,o),n=r.subject,t=`${r.subject}${r.body?`
1
+ import{of as L,Observable as _,Subject as J,catchError as B}from"rxjs";import"fs";import"path";import{xxh64 as M}from"@pacote/xxhash";import $ from"winston";import{A as T,l as p,D as F,g as D,s as b,h as U,d as z,E as H,e as q,f as P}from"./cli-0dd7e35c.mjs";const y=new Map,d=(f,s,e)=>{const o=M(0).update(s).digest("hex").substring(0,8),r=`${f}_${o}_${e}`;if(y.has(r))return y.get(r);const n=new Date,t=Z(n,f,s,e),c=`${T}/${t}`,i=$.createLogger({level:"info",format:$.format.combine($.format.timestamp({format:"YYYY-MM-DDTHH:mm:ss.SSSZ"}),$.format.printf(({timestamp:u,level:l,message:a,...m})=>m&&Object.keys(m).length>0?`[${u}] ${l}: ${a} ${JSON.stringify(m,null,2)}`:`[${u}] ${l}: ${a}`)),transports:[new $.transports.File({filename:c})]});return i.info(`=== ${f.toUpperCase()} AI SERVICE LOG ===`),i.info(`Diff Hash: ${o}`),i.info(`Request Type: ${e.toUpperCase()}`),i.info(`Start Time: ${n.toISOString()}`),i.info("=".repeat(50)),i.info(""),y.set(r,i),i},K=f=>{const s={...f},e=["authorization","x-api-key","x-goog-api-key","api-key","x-amzn-bedrock-application-key"];for(const o of e){const r=o.toLowerCase(),n=Object.keys(s).find(t=>t.toLowerCase()===r);n&&s[n]&&typeof s[n]=="string"&&(s[n].startsWith("Bearer ")?s[n]="Bearer [MASKED]":s[n]="[MASKED]")}return s},Y=(f,s,e,o,r,n,t=!0)=>{if(!t)return;const c=d(e,f,s);c.info(`Making request to ${e} API with model: ${o}`),c.info(`Request URL: ${r}`),c.info("Request headers:",K(n))},V=(f,s,e,o,r=!0)=>{if(!r)return;d(e,f,s).info("Request payload:",o)},W=(f,s,e,o,r,n=!0)=>{if(!n)return;const t=d(e,f,s);t.info("System prompt:",{prompt:o}),t.info("User prompt:",{prompt:r})},G=(f,s,e,o,r=!0)=>{if(!r)return;d(e,f,s).info("Response received:",o)},Q=(f,s,e,o,r=!0)=>{if(!r)return;d(e,f,s).error("API request failed:",o)},R=(f,s,e,o,r,n=!0)=>{if(!n)return;const t=d(e,f,s);o?t.info(`Request completed successfully in ${o}ms`):t.info("Request completed successfully"),r&&t.info("Final processed response:",{response:r}),t.info(""),t.info("=".repeat(50)),t.info(`End Time: ${new Date().toISOString()}`),t.info("=== REQUEST COMPLETED ===")},X=(f,s,e,o,r,n,t,c=!0)=>{if(!c)return;const i=d(e,f,s);t?i.error(`Request failed after ${n}ms:`,{error:t}):(i.info(`Request completed in ${n}ms`),i.info("Response:",{response:r})),R(f,s,e,n,r,c)},Z=(f,s,e,o)=>{const{year:r,month:n,day:t,hours:c,minutes:i,seconds:u}=ee(f),a=M(0).update(e).digest("hex").substring(0,8),m=s.toLowerCase().replace(/[^a-z0-9]/g,"").substring(0,20);return o==="review"?`${r}-${n}-${t}_${c}-${i}-${u}_${a}_${m}_review.log`:`${r}-${n}-${t}_${c}-${i}-${u}_${a}_${m}_commit.log`},ee=f=>{const s=f.getFullYear().toString(),e=(f.getMonth()+1).toString().padStart(2,"0"),o=f.getDate().toString().padStart(2,"0"),r=f.getHours().toString().padStart(2,"0"),n=f.getMinutes().toString().padStart(2,"0"),t=f.getSeconds().toString().padStart(2,"0");return{year:s,month:e,day:o,hours:r,minutes:n,seconds:t}},w=()=>{for(const[f,s]of y.entries())try{s.close()}catch(e){console.error(`Failed to close logger ${f}:`,e)}y.clear()};process.on("exit",w),process.on("SIGINT",()=>{w(),process.exit(0)}),process.on("SIGTERM",()=>{w(),process.exit(0)});class te{constructor(){this.buffer="",this.arrayStartFound=!1,this.scanPosition=0,this.feed=s=>{this.buffer+=s;const e=[];if(!this.arrayStartFound){const o=this.buffer.indexOf("[");if(o===-1)return e;this.arrayStartFound=!0,this.scanPosition=o+1}for(;;){const o=this.buffer.indexOf("{",this.scanPosition);if(o===-1)break;const r=this.extractBalancedBraces(o);if(!r)break;this.scanPosition=o+r.length;const n=this.tryParseCommitMessage(r);n&&e.push(n)}return e},this.flush=()=>this.feed(""),this.getBuffer=()=>this.buffer,this.getUnparsedBuffer=()=>this.buffer.slice(this.scanPosition),this.extractBalancedBraces=s=>{let e=0,o=!1,r=!1;for(let n=s;n<this.buffer.length;n++){const t=this.buffer[n];if(r){r=!1;continue}if(t==="\\"&&o){r=!0;continue}if(t==='"'){o=!o;continue}if(!o&&(t==="{"&&e++,t==="}"&&e--,e===0))return this.buffer.slice(s,n+1)}return null},this.tryParseCommitMessage=s=>{try{const e=JSON.parse(s);return typeof e.subject!="string"?null:{subject:e.subject,body:typeof e.body=="string"?e.body:void 0,footer:typeof e.footer=="string"?e.footer:void 0}}catch{return null}}}}class se{constructor(s){this.handleError$=e=>{const o=this.getDetailedErrorMessage(e),r=e.status?`HTTP ${e.status}: ${o}`:o;if(this.params.config.logging){const n=this.params.stagedDiff.diff,t=this.serviceName.replace(/\[|\]/g,"").trim();X(n,"commit",t,"Error occurred","",void 0,r)}return p.error(`${this.errorPrefix} ${r}`),e.stack&&p.error(` ${e.stack}`),e.content&&p.error(` Problematic content: ${e.content}`),e.originalError&&p.error(` Original error: ${e.originalError}`),L({name:`${this.errorPrefix} ${r}`,value:r,isError:!0,disabled:!0})},this.extractJsonObjectFromResponse=e=>{const o=e.indexOf("{");return o!==-1?this.extractBalancedJson(e,o,"{","}"):null},this.buildCommitPrompt=()=>{const{systemPrompt:e,systemPromptPath:o,codeReviewPromptPath:r,locale:n,generate:t,type:c,maxLength:i}=this.params.config,u={...F,locale:n,maxLength:i,type:c,generate:t,systemPrompt:e,systemPromptPath:o,codeReviewPromptPath:r,vcs_branch:this.params.branchName||""};return D(u)},this.formatRawCommitMessage=(e,o)=>{const r=this.extractMessageAsType(e,o),n=r.subject,t=`${r.subject}${r.body?`
2
2
 
3
3
  ${r.body}`:""}${r.footer?`
4
4
 
@@ -1 +1 @@
1
- import j from"@anthropic-ai/sdk";import S from"chalk";import{concatMap as b,from as D,map as R,catchError as $}from"rxjs";import{fromPromise as U}from"rxjs/internal/observable/innerFrom";import{A as B,l as F,a as O,b as L,c as T,d as N,e as W}from"./ai.service-da8345b1.mjs";import{D as z,g as H,b as G,k as K}from"./cli-83e0874c.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 J=["claude-4","claude-haiku-4","claude-sonnet-4","claude-opus-4"],X=x=>{const e=x.toLowerCase();return J.some(t=>e===t||e.startsWith(`${t}-`)||e.startsWith(`${t}.`))},Q=10*60*1e3;class V extends B{constructor(e){super(e),this.params=e,this.generateStreamingCommitMessage$=()=>{const{generate:t,type:o}=this.params.config;return this.createStreamingCommitMessages$(n=>{this.streamChunks(n).catch(c=>n.error(c))},o,t)},this.streamChunks=async t=>{const o=this.params.stagedDiff.diff,{systemPrompt:n,systemPromptPath:c,codeReviewPromptPath:s,logging:i,temperature:P,locale:l,generate:d,type:y,maxLength:C,maxTokens:k,topP:p,model:m}=this.params.config,g={...z,locale:l,maxLength:C,type:y,generate:d,systemPrompt:n,systemPromptPath:c,codeReviewPromptPath:s,vcs_branch:this.params.branchName||""},h=H(g),v=K(o,"commit"),M=`${this.params.config.url||"https://api.anthropic.com"}/v1/messages`,w={"Content-Type":"application/json","x-api-key":this.params.config.key,"anthropic-version":"2023-06-01"};F(o,"commit","Anthropic",m,M,w,i),O(o,"commit","Anthropic",h,v,i);const u=X(m),f={max_tokens:k,temperature:P,system:h,messages:[{role:"user",content:v}],model:m,stream:!0,...u?{}:{top_p:p}};L(o,"commit","Anthropic",f,i);const a=Date.now();let A="";try{const r=this.anthropic.messages.stream(f);r.on("text",E=>{A+=E,t.next(E)});const I=await r.finalMessage(),Y=Date.now()-a;T(o,"commit","Anthropic",I,i),N(o,"commit","Anthropic",Y,A,i),t.complete()}catch(r){W(o,"commit","Anthropic",r,i),t.error(r)}},this.colors={primary:"#AE5630",secondary:"#fff"},this.serviceName=S.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Anthropic]"),this.errorPrefix=S.red.bold("[Anthropic]"),this.anthropic=new j({apiKey:this.params.config.key,...this.params.config.timeout>Q&&{timeout:this.params.config.timeout}})}getServiceSpecificErrorMessage(e){const t=e.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$():U(this.generateMessage("commit")).pipe(b(t=>D(t)),R(this.formatAsChoice),$(this.handleError$))}generateCodeReview$(){return U(this.generateMessage("review")).pipe(b(e=>D(e)),R(this.formatCodeReviewAsChoice),$(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:c,logging:s,temperature:i,locale:P,generate:l,type:d,maxLength:y,maxTokens:C,topP:k,model:p}=this.params.config,m={...z,locale:P,maxLength:y,type:d,generate:l,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:c,vcs_branch:this.params.branchName||""},g=e==="review"?G(m):H(m),h=K(t,e),_=`${this.params.config.url||"https://api.anthropic.com"}/v1/messages`,M={"Content-Type":"application/json","x-api-key":this.params.config.key,"anthropic-version":"2023-06-01"};F(t,e,"Anthropic",p,_,M,s),O(t,e,"Anthropic",g,h,s);const w=X(p),u={max_tokens:C,temperature:i,system:g,messages:[{role:"user",content:h}],model:p,...w?{}:{top_p:k}};L(t,e,"Anthropic",u,s);const f=Date.now();try{const a=await this.anthropic.messages.create(u),A=Date.now()-f;T(t,e,"Anthropic",a,s);const r=a.content.map(({text:I})=>I).join("");return N(t,e,"Anthropic",A,r,s),e==="review"?this.parseCodeReview(r):this.parseMessage(r,d,l)}catch(a){throw W(t,e,"Anthropic",a,s),a}}}export{V as AnthropicService};
1
+ import j from"@anthropic-ai/sdk";import S from"chalk";import{concatMap as b,from as D,map as R,catchError as $}from"rxjs";import{fromPromise as U}from"rxjs/internal/observable/innerFrom";import{A as B,l as F,a as O,b as L,c as T,d as N,e as W}from"./ai.service-7cce5ee0.mjs";import{D as z,g as H,b as G,k as K}from"./cli-0dd7e35c.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 J=["claude-4","claude-haiku-4","claude-sonnet-4","claude-opus-4"],X=x=>{const e=x.toLowerCase();return J.some(t=>e===t||e.startsWith(`${t}-`)||e.startsWith(`${t}.`))},Q=10*60*1e3;class V extends B{constructor(e){super(e),this.params=e,this.generateStreamingCommitMessage$=()=>{const{generate:t,type:o}=this.params.config;return this.createStreamingCommitMessages$(n=>{this.streamChunks(n).catch(c=>n.error(c))},o,t)},this.streamChunks=async t=>{const o=this.params.stagedDiff.diff,{systemPrompt:n,systemPromptPath:c,codeReviewPromptPath:s,logging:i,temperature:P,locale:l,generate:d,type:y,maxLength:C,maxTokens:k,topP:p,model:m}=this.params.config,g={...z,locale:l,maxLength:C,type:y,generate:d,systemPrompt:n,systemPromptPath:c,codeReviewPromptPath:s,vcs_branch:this.params.branchName||""},h=H(g),v=K(o,"commit"),M=`${this.params.config.url||"https://api.anthropic.com"}/v1/messages`,w={"Content-Type":"application/json","x-api-key":this.params.config.key,"anthropic-version":"2023-06-01"};F(o,"commit","Anthropic",m,M,w,i),O(o,"commit","Anthropic",h,v,i);const u=X(m),f={max_tokens:k,temperature:P,system:h,messages:[{role:"user",content:v}],model:m,stream:!0,...u?{}:{top_p:p}};L(o,"commit","Anthropic",f,i);const a=Date.now();let A="";try{const r=this.anthropic.messages.stream(f);r.on("text",E=>{A+=E,t.next(E)});const I=await r.finalMessage(),Y=Date.now()-a;T(o,"commit","Anthropic",I,i),N(o,"commit","Anthropic",Y,A,i),t.complete()}catch(r){W(o,"commit","Anthropic",r,i),t.error(r)}},this.colors={primary:"#AE5630",secondary:"#fff"},this.serviceName=S.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Anthropic]"),this.errorPrefix=S.red.bold("[Anthropic]"),this.anthropic=new j({apiKey:this.params.config.key,...this.params.config.timeout>Q&&{timeout:this.params.config.timeout}})}getServiceSpecificErrorMessage(e){const t=e.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$():U(this.generateMessage("commit")).pipe(b(t=>D(t)),R(this.formatAsChoice),$(this.handleError$))}generateCodeReview$(){return U(this.generateMessage("review")).pipe(b(e=>D(e)),R(this.formatCodeReviewAsChoice),$(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:c,logging:s,temperature:i,locale:P,generate:l,type:d,maxLength:y,maxTokens:C,topP:k,model:p}=this.params.config,m={...z,locale:P,maxLength:y,type:d,generate:l,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:c,vcs_branch:this.params.branchName||""},g=e==="review"?G(m):H(m),h=K(t,e),_=`${this.params.config.url||"https://api.anthropic.com"}/v1/messages`,M={"Content-Type":"application/json","x-api-key":this.params.config.key,"anthropic-version":"2023-06-01"};F(t,e,"Anthropic",p,_,M,s),O(t,e,"Anthropic",g,h,s);const w=X(p),u={max_tokens:C,temperature:i,system:g,messages:[{role:"user",content:h}],model:p,...w?{}:{top_p:k}};L(t,e,"Anthropic",u,s);const f=Date.now();try{const a=await this.anthropic.messages.create(u),A=Date.now()-f;T(t,e,"Anthropic",a,s);const r=a.content.map(({text:I})=>I).join("");return N(t,e,"Anthropic",A,r,s),e==="review"?this.parseCodeReview(r):this.parseMessage(r,d,l)}catch(a){throw W(t,e,"Anthropic",a,s),a}}}export{V as AnthropicService};
@@ -1 +1 @@
1
- import F from"https";import h from"chalk";import{concatMap as $,from as T,map as x,catchError as L}from"rxjs";import{fromPromise as W}from"rxjs/internal/observable/innerFrom";import{A as q,l as Y,a as H,b as z,d as V,e as _,c as K}from"./ai.service-da8345b1.mjs";import{D as J,b as j,g as Q,p as O,s as X,k as Z}from"./cli-83e0874c.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 g="Bedrock",S={MISSING_DEPENDENCY:"MissingDependencyError",MISSING_REGION:"MissingRegionError",MISSING_MODEL_ID:"MissingModelIdError",MISSING_API_KEY:"MissingApiKeyError",MISSING_APPLICATION_KEY:"MissingApplicationKeyError",INVALID_RESPONSE:"InvalidResponseError",EMPTY_RESPONSE:"EmptyResponseError"},i=f=>typeof f=="string"&&f.length>0;let v=null,M=null;const G=f=>{const e=new Error('Amazon Bedrock support requires "@aws-sdk/client-bedrock-runtime" and "@aws-sdk/credential-providers". Install them with `pnpm add @aws-sdk/client-bedrock-runtime @aws-sdk/credential-providers`.');return e.name=S.MISSING_DEPENDENCY,e.originalError=f,e},ee=async()=>{if(v)return v;try{return v=await import("@aws-sdk/client-bedrock-runtime"),v}catch(f){throw v=null,G(f)}},U=async()=>{if(M)return M;try{return M=await import("@aws-sdk/credential-providers"),M}catch(f){throw M=null,G(f)}};class oe extends q{constructor(e){super(e),this.params=e,this.credentialCache=void 0,this.credentialCacheTimestamp=0,this.CREDENTIAL_CACHE_TTL=5*60*1e3,this.bedrockConfig=this.params.config,this.colors={primary:"#232F3E",secondary:"#FF9900"},this.serviceName=h.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[${g}]`),this.errorPrefix=h.red.bold(`[${g}]`),this.validateConfiguration()}validateConfiguration(){const e=this.bedrockConfig;if(!i(e.model)){const t=new Error("Model ID or inference profile ARN is required.");throw t.name=S.MISSING_MODEL_ID,t}if(!this.getRegion()){const t=new Error("AWS region is required. Configure BEDROCK.region or set AWS_REGION/AWS_DEFAULT_REGION.");throw t.name=S.MISSING_REGION,t}const r=i(e.key),o=this.canUseAwsSdk();if(!r&&!o){const t=new Error("Authentication required: Configure AWS credentials (profile, access keys, IAM role) or API key (BEDROCK.key).");throw t.name=S.MISSING_API_KEY,t}if(r&&!o&&!this.getRegion()&&!i(e.applicationBaseUrl)){const t=new Error("Bearer token authentication requires region or applicationBaseUrl to construct endpoint.");throw t.name=S.MISSING_REGION,t}}canUseAwsSdk(){const e=this.bedrockConfig,r=i(e.profile)||i(process.env.AWS_PROFILE),o=i(e.accessKeyId)&&i(e.secretAccessKey)||i(process.env.AWS_ACCESS_KEY_ID)&&i(process.env.AWS_SECRET_ACCESS_KEY);return r||o}determineAuthMethod(){const e=i(this.bedrockConfig.key);if(this.canUseAwsSdk())return"aws-sdk";if(e)return"bearer-token";throw new Error("No authentication method configured")}getServiceSpecificErrorMessage(e){const r=e?.name||e.code,o=e.message||"";switch(r){case"UnrecognizedClientException":case"InvalidSignatureException":return"Authentication with AWS failed. Check your IAM credentials or Bedrock API key settings.";case"AccessDeniedException":return"Access denied. Ensure the IAM principal or application key has permission to invoke the Bedrock resource.";case"ValidationException":return"Invalid request for the selected Bedrock model. Verify the model ID and payload.";case"ResourceNotFoundException":return"The specified Bedrock model, endpoint, or inference profile could not be found.";case"ThrottlingException":return"Request throttled by Bedrock. Reduce request rate or check service quotas."}return o.includes("Region")?"AWS region is required for Bedrock. Configure BEDROCK.region or set AWS_REGION/AWS_DEFAULT_REGION.":null}generateCommitMessage$(){return W(this.generateMessage("commit")).pipe($(e=>T(e)),x(this.formatAsChoice),L(this.handleError$))}generateCodeReview$(){return W(this.generateMessage("review")).pipe($(e=>T(e)),x(this.formatCodeReviewAsChoice),L(this.handleError$))}async generateMessage(e){const r=this.params.stagedDiff.diff,o=this.bedrockConfig,t=o.model,{logging:c,inferenceParameters:n}=o,s={...J,locale:o.locale,maxLength:o.maxLength,type:o.type,generate:o.generate,systemPrompt:o.systemPrompt,systemPromptPath:o.systemPromptPath,codeReviewPromptPath:o.codeReviewPromptPath},a=e==="review"?j(s):Q(s),m=Z(r,e),y={region:this.getRegion(),profile:o.profile,modelId:t},w=`https://bedrock-runtime.${this.getRegion()||"unknown"}.amazonaws.com/model/${encodeURIComponent(t)}/converse`;Y(r,e,g,t,w,y,c),H(r,e,g,a,m,c);const R={modelId:t,systemPrompt:a,userPrompt:m,...n&&Object.keys(n).length>0&&{inferenceConfig:n}};z(r,e,g,R,c);const u=Date.now();try{const l=this.determineAuthMethod();O()&&(console.log(h.cyan(`[Bedrock] Authentication method: ${l}`)),console.log(h.cyan(`[Bedrock] Model ID: ${t}`)),console.log(h.cyan(`[Bedrock] Region: ${this.getRegion()}`)),console.log(h.cyan(`[Bedrock] Has AWS credentials: ${this.canUseAwsSdk()}`)),console.log(h.cyan(`[Bedrock] Has API key: ${i(o.key)}`)));const E=l==="bearer-token"?await this.invokeWithBearerToken({model:t,systemPrompt:a,userPrompt:m,logging:c,requestType:e,diff:r,inferenceConfig:n}):await this.invokeWithAwsSdk({model:t,systemPrompt:a,userPrompt:m,logging:c,requestType:e,diff:r,inferenceConfig:n}),I=Date.now()-u;return V(r,e,g,I,E,c),e==="review"?this.parseCodeReview(E):this.parseMessage(E,o.type,o.generate)}catch(l){throw _(r,e,g,l,c),l instanceof Error&&(l.status=l?.status||l?.$metadata?.httpStatusCode),l}}async invokeWithAwsSdk(e){const r=this.getRegion(),{model:o,systemPrompt:t,userPrompt:c,inferenceConfig:n,logging:s,requestType:a,diff:m}=e,{BedrockRuntimeClient:y,ConverseCommand:w}=await ee(),R=this.bedrockConfig,u={region:r,requestHandler:{requestTimeout:R.timeout||12e4}},l=await this.resolveCredentials();l&&(u.credentials=l);const E=new y(u),I=new w({modelId:o,messages:[{role:"user",content:[{text:c}]}],...t?{system:[{text:t}]}:{},...n&&Object.keys(n).length>0&&{inferenceConfig:n}});O()&&console.log(h.cyan(`[Bedrock] Sending ConverseCommand with modelId: ${o}`));let C;try{C=await E.send(I),K(m,a,g,C,s)}catch(d){throw O()&&(console.error(h.red(`[Bedrock] AWS SDK Error: ${d.name}`)),console.error(h.red(`[Bedrock] Error message: ${d.message}`)),d.$metadata&&(console.error(h.red(`[Bedrock] Request ID: ${d.$metadata.requestId}`)),console.error(h.red(`[Bedrock] HTTP Status: ${d.$metadata.httpStatusCode}`))),d.$fault&&console.error(h.red(`[Bedrock] Fault: ${d.$fault}`))),d}const A=C.output?.message?.content?.[0]?.text||"";if(!A){const d=new Error("No text content found in Bedrock response.");throw d.name=S.EMPTY_RESPONSE,d.content=C,d}return A}invokeWithBearerToken(e){const{model:r,systemPrompt:o,userPrompt:t,inferenceConfig:c,logging:n,requestType:s,diff:a}=e,m=this.bedrockConfig,y=this.getRegion(),w=encodeURIComponent(r),R=m.applicationBaseUrl||`https://bedrock-runtime.${y}.amazonaws.com/model/${w}/converse`,u=new URL(R),l={modelId:r,messages:[{role:"user",content:[{text:t}]}],...c&&Object.keys(c).length>0&&{inferenceConfig:c}};o&&(l.system=[{text:o}]);const E=JSON.stringify(l),I={"Content-Type":"application/json","Content-Length":Buffer.byteLength(E).toString()};return i(m.key)&&(I.Authorization=`Bearer ${m.key}`),i(m.applicationInferenceProfileArn)&&(I["x-amzn-bedrock-inference-profile-arn"]=m.applicationInferenceProfileArn),i(m.applicationEndpointId)&&(I["x-amzn-bedrock-endpoint-id"]=m.applicationEndpointId),new Promise((C,A)=>{const d=F.request({method:"POST",protocol:u.protocol,hostname:u.hostname,port:u.port,path:u.pathname+u.search,headers:I,timeout:m.timeout},k=>{const P=[];k.on("data",N=>P.push(N)),k.on("end",()=>{const N=Buffer.concat(P).toString("utf8");if(k.statusCode&&k.statusCode>=400){const p=new Error(`Bedrock application endpoint responded with status ${k.statusCode}.`);return p.status=k.statusCode,p.content=N,_(a,s,g,p,n),A(p)}const D=X(N);if(!D.ok){const p=new Error("Failed to parse Bedrock application response as JSON. The Bedrock Converse API should always return valid JSON.");return p.name=S.INVALID_RESPONSE,p.content=N,_(a,s,g,p,n),A(p)}const B=D.data;K(a,s,g,B,n);const b=B.output?.message?.content?.[0]?.text||"";if(!b){const p=new Error("No text content found in Bedrock response.");return p.name=S.EMPTY_RESPONSE,p.content=B,_(a,s,g,p,n),A(p)}C(b)})});d.on("error",k=>{const P=k;_(a,s,g,P,n),A(P)}),d.write(E),d.end()})}getRegion(){return this.bedrockConfig.region||process.env.AWS_REGION||process.env.AWS_DEFAULT_REGION||""}async resolveCredentials(){const e=Date.now();if(this.credentialCache&&e-this.credentialCacheTimestamp<this.CREDENTIAL_CACHE_TTL)return this.credentialCache;const r=this.bedrockConfig,o=r.profile,t=r.accessKeyId,c=r.secretAccessKey,n=r.sessionToken;let s;if(i(o)){const{fromIni:a}=await U();s=a({profile:o})}else if(i(t)&&i(c))s=async()=>({accessKeyId:t,secretAccessKey:c,sessionToken:n||process.env.AWS_SESSION_TOKEN||void 0});else if(process.env.AWS_PROFILE){const{fromIni:a}=await U();s=a({profile:process.env.AWS_PROFILE})}return s&&(this.credentialCache=s,this.credentialCacheTimestamp=e),s}}export{oe as BedrockService};
1
+ import F from"https";import h from"chalk";import{concatMap as $,from as T,map as x,catchError as L}from"rxjs";import{fromPromise as W}from"rxjs/internal/observable/innerFrom";import{A as q,l as Y,a as H,b as z,d as V,e as _,c as K}from"./ai.service-7cce5ee0.mjs";import{D as J,b as j,g as Q,p as O,s as X,k as Z}from"./cli-0dd7e35c.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 g="Bedrock",S={MISSING_DEPENDENCY:"MissingDependencyError",MISSING_REGION:"MissingRegionError",MISSING_MODEL_ID:"MissingModelIdError",MISSING_API_KEY:"MissingApiKeyError",MISSING_APPLICATION_KEY:"MissingApplicationKeyError",INVALID_RESPONSE:"InvalidResponseError",EMPTY_RESPONSE:"EmptyResponseError"},i=f=>typeof f=="string"&&f.length>0;let v=null,M=null;const G=f=>{const e=new Error('Amazon Bedrock support requires "@aws-sdk/client-bedrock-runtime" and "@aws-sdk/credential-providers". Install them with `pnpm add @aws-sdk/client-bedrock-runtime @aws-sdk/credential-providers`.');return e.name=S.MISSING_DEPENDENCY,e.originalError=f,e},ee=async()=>{if(v)return v;try{return v=await import("@aws-sdk/client-bedrock-runtime"),v}catch(f){throw v=null,G(f)}},U=async()=>{if(M)return M;try{return M=await import("@aws-sdk/credential-providers"),M}catch(f){throw M=null,G(f)}};class oe extends q{constructor(e){super(e),this.params=e,this.credentialCache=void 0,this.credentialCacheTimestamp=0,this.CREDENTIAL_CACHE_TTL=5*60*1e3,this.bedrockConfig=this.params.config,this.colors={primary:"#232F3E",secondary:"#FF9900"},this.serviceName=h.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[${g}]`),this.errorPrefix=h.red.bold(`[${g}]`),this.validateConfiguration()}validateConfiguration(){const e=this.bedrockConfig;if(!i(e.model)){const t=new Error("Model ID or inference profile ARN is required.");throw t.name=S.MISSING_MODEL_ID,t}if(!this.getRegion()){const t=new Error("AWS region is required. Configure BEDROCK.region or set AWS_REGION/AWS_DEFAULT_REGION.");throw t.name=S.MISSING_REGION,t}const r=i(e.key),o=this.canUseAwsSdk();if(!r&&!o){const t=new Error("Authentication required: Configure AWS credentials (profile, access keys, IAM role) or API key (BEDROCK.key).");throw t.name=S.MISSING_API_KEY,t}if(r&&!o&&!this.getRegion()&&!i(e.applicationBaseUrl)){const t=new Error("Bearer token authentication requires region or applicationBaseUrl to construct endpoint.");throw t.name=S.MISSING_REGION,t}}canUseAwsSdk(){const e=this.bedrockConfig,r=i(e.profile)||i(process.env.AWS_PROFILE),o=i(e.accessKeyId)&&i(e.secretAccessKey)||i(process.env.AWS_ACCESS_KEY_ID)&&i(process.env.AWS_SECRET_ACCESS_KEY);return r||o}determineAuthMethod(){const e=i(this.bedrockConfig.key);if(this.canUseAwsSdk())return"aws-sdk";if(e)return"bearer-token";throw new Error("No authentication method configured")}getServiceSpecificErrorMessage(e){const r=e?.name||e.code,o=e.message||"";switch(r){case"UnrecognizedClientException":case"InvalidSignatureException":return"Authentication with AWS failed. Check your IAM credentials or Bedrock API key settings.";case"AccessDeniedException":return"Access denied. Ensure the IAM principal or application key has permission to invoke the Bedrock resource.";case"ValidationException":return"Invalid request for the selected Bedrock model. Verify the model ID and payload.";case"ResourceNotFoundException":return"The specified Bedrock model, endpoint, or inference profile could not be found.";case"ThrottlingException":return"Request throttled by Bedrock. Reduce request rate or check service quotas."}return o.includes("Region")?"AWS region is required for Bedrock. Configure BEDROCK.region or set AWS_REGION/AWS_DEFAULT_REGION.":null}generateCommitMessage$(){return W(this.generateMessage("commit")).pipe($(e=>T(e)),x(this.formatAsChoice),L(this.handleError$))}generateCodeReview$(){return W(this.generateMessage("review")).pipe($(e=>T(e)),x(this.formatCodeReviewAsChoice),L(this.handleError$))}async generateMessage(e){const r=this.params.stagedDiff.diff,o=this.bedrockConfig,t=o.model,{logging:c,inferenceParameters:n}=o,s={...J,locale:o.locale,maxLength:o.maxLength,type:o.type,generate:o.generate,systemPrompt:o.systemPrompt,systemPromptPath:o.systemPromptPath,codeReviewPromptPath:o.codeReviewPromptPath},a=e==="review"?j(s):Q(s),m=Z(r,e),y={region:this.getRegion(),profile:o.profile,modelId:t},w=`https://bedrock-runtime.${this.getRegion()||"unknown"}.amazonaws.com/model/${encodeURIComponent(t)}/converse`;Y(r,e,g,t,w,y,c),H(r,e,g,a,m,c);const R={modelId:t,systemPrompt:a,userPrompt:m,...n&&Object.keys(n).length>0&&{inferenceConfig:n}};z(r,e,g,R,c);const u=Date.now();try{const l=this.determineAuthMethod();O()&&(console.log(h.cyan(`[Bedrock] Authentication method: ${l}`)),console.log(h.cyan(`[Bedrock] Model ID: ${t}`)),console.log(h.cyan(`[Bedrock] Region: ${this.getRegion()}`)),console.log(h.cyan(`[Bedrock] Has AWS credentials: ${this.canUseAwsSdk()}`)),console.log(h.cyan(`[Bedrock] Has API key: ${i(o.key)}`)));const E=l==="bearer-token"?await this.invokeWithBearerToken({model:t,systemPrompt:a,userPrompt:m,logging:c,requestType:e,diff:r,inferenceConfig:n}):await this.invokeWithAwsSdk({model:t,systemPrompt:a,userPrompt:m,logging:c,requestType:e,diff:r,inferenceConfig:n}),I=Date.now()-u;return V(r,e,g,I,E,c),e==="review"?this.parseCodeReview(E):this.parseMessage(E,o.type,o.generate)}catch(l){throw _(r,e,g,l,c),l instanceof Error&&(l.status=l?.status||l?.$metadata?.httpStatusCode),l}}async invokeWithAwsSdk(e){const r=this.getRegion(),{model:o,systemPrompt:t,userPrompt:c,inferenceConfig:n,logging:s,requestType:a,diff:m}=e,{BedrockRuntimeClient:y,ConverseCommand:w}=await ee(),R=this.bedrockConfig,u={region:r,requestHandler:{requestTimeout:R.timeout||12e4}},l=await this.resolveCredentials();l&&(u.credentials=l);const E=new y(u),I=new w({modelId:o,messages:[{role:"user",content:[{text:c}]}],...t?{system:[{text:t}]}:{},...n&&Object.keys(n).length>0&&{inferenceConfig:n}});O()&&console.log(h.cyan(`[Bedrock] Sending ConverseCommand with modelId: ${o}`));let C;try{C=await E.send(I),K(m,a,g,C,s)}catch(d){throw O()&&(console.error(h.red(`[Bedrock] AWS SDK Error: ${d.name}`)),console.error(h.red(`[Bedrock] Error message: ${d.message}`)),d.$metadata&&(console.error(h.red(`[Bedrock] Request ID: ${d.$metadata.requestId}`)),console.error(h.red(`[Bedrock] HTTP Status: ${d.$metadata.httpStatusCode}`))),d.$fault&&console.error(h.red(`[Bedrock] Fault: ${d.$fault}`))),d}const A=C.output?.message?.content?.[0]?.text||"";if(!A){const d=new Error("No text content found in Bedrock response.");throw d.name=S.EMPTY_RESPONSE,d.content=C,d}return A}invokeWithBearerToken(e){const{model:r,systemPrompt:o,userPrompt:t,inferenceConfig:c,logging:n,requestType:s,diff:a}=e,m=this.bedrockConfig,y=this.getRegion(),w=encodeURIComponent(r),R=m.applicationBaseUrl||`https://bedrock-runtime.${y}.amazonaws.com/model/${w}/converse`,u=new URL(R),l={modelId:r,messages:[{role:"user",content:[{text:t}]}],...c&&Object.keys(c).length>0&&{inferenceConfig:c}};o&&(l.system=[{text:o}]);const E=JSON.stringify(l),I={"Content-Type":"application/json","Content-Length":Buffer.byteLength(E).toString()};return i(m.key)&&(I.Authorization=`Bearer ${m.key}`),i(m.applicationInferenceProfileArn)&&(I["x-amzn-bedrock-inference-profile-arn"]=m.applicationInferenceProfileArn),i(m.applicationEndpointId)&&(I["x-amzn-bedrock-endpoint-id"]=m.applicationEndpointId),new Promise((C,A)=>{const d=F.request({method:"POST",protocol:u.protocol,hostname:u.hostname,port:u.port,path:u.pathname+u.search,headers:I,timeout:m.timeout},k=>{const P=[];k.on("data",N=>P.push(N)),k.on("end",()=>{const N=Buffer.concat(P).toString("utf8");if(k.statusCode&&k.statusCode>=400){const p=new Error(`Bedrock application endpoint responded with status ${k.statusCode}.`);return p.status=k.statusCode,p.content=N,_(a,s,g,p,n),A(p)}const D=X(N);if(!D.ok){const p=new Error("Failed to parse Bedrock application response as JSON. The Bedrock Converse API should always return valid JSON.");return p.name=S.INVALID_RESPONSE,p.content=N,_(a,s,g,p,n),A(p)}const B=D.data;K(a,s,g,B,n);const b=B.output?.message?.content?.[0]?.text||"";if(!b){const p=new Error("No text content found in Bedrock response.");return p.name=S.EMPTY_RESPONSE,p.content=B,_(a,s,g,p,n),A(p)}C(b)})});d.on("error",k=>{const P=k;_(a,s,g,P,n),A(P)}),d.write(E),d.end()})}getRegion(){return this.bedrockConfig.region||process.env.AWS_REGION||process.env.AWS_DEFAULT_REGION||""}async resolveCredentials(){const e=Date.now();if(this.credentialCache&&e-this.credentialCacheTimestamp<this.CREDENTIAL_CACHE_TTL)return this.credentialCache;const r=this.bedrockConfig,o=r.profile,t=r.accessKeyId,c=r.secretAccessKey,n=r.sessionToken;let s;if(i(o)){const{fromIni:a}=await U();s=a({profile:o})}else if(i(t)&&i(c))s=async()=>({accessKeyId:t,secretAccessKey:c,sessionToken:n||process.env.AWS_SESSION_TOKEN||void 0});else if(process.env.AWS_PROFILE){const{fromIni:a}=await U();s=a({profile:process.env.AWS_PROFILE})}return s&&(this.credentialCache=s,this.credentialCacheTimestamp=e),s}}export{oe as BedrockService};
@@ -1,4 +1,4 @@
1
- import{command as j,cli as Kn}from"cleye";import{createRequire as qn}from"module";import Wn from"crypto";import N from"fs";import $e from"os";import E from"path";import{Buffer as Qt}from"node:buffer";import Q from"node:path";import st,{ChildProcess as Zt,exec as Yn}from"node:child_process";import F from"node:process";import zn,{execSync as Re,exec as Vn}from"child_process";import{fileURLToPath as eo}from"node:url";import Jn,{constants as to}from"node:os";import Xn from"assert";import Qn from"events";import{createWriteStream as Zn,createReadStream as er,readFileSync as tr}from"node:fs";import or from"buffer";import it from"stream";import nr,{promisify as rr}from"util";import{debuglog as sr,promisify as ir}from"node:util";import O from"inquirer";import{from as Ie,switchMap as oo,of as ar,tap as cr,mergeMap as no,catchError as lr,BehaviorSubject as ro,ReplaySubject as ur,Subscription as at,lastValueFrom as ct,toArray as lt,filter as so,map as io,Subject as dr}from"rxjs";import I from"fs/promises";import g from"chalk";import xe from"readline";import ao from"figlet";import mr from"gradient-string";import co from"ora";import pr from"inquirer-reactive-list-prompt";import G from"winston";import"winston-daily-rotate-file";import fr from"axios";import{fileURLToPath as hr,pathToFileURL as gr}from"url";import{readdir as lo,stat as yr,rm as wr}from"node:fs/promises";import br from"chokidar";import{takeUntil as uo,finalize as mo}from"rxjs/operators";var Er="aicommit2",po="2.5.7",vr="A Reactive CLI that generates commit messages for Git and Jujutsu with various AI",Cr=["cli","ai","git","jujutsu","jj","vcs","version-control","commit","git-commit","jujutsu-commit","command-line","commandline","aipick","aicommit","aicommits","aicommit2","openai","huggingface","anthropic","claude","claude3","gemini","gemini-pro","generative-ai","mistral","ollama","llama3","llama3.2","llama3.3","gemma","llm","chatgpt","cohere","groq","codestral","perplexity","deepseek","deepseek-r1","pre-commit"],Ar="MIT",Pr="tak-bro/aicommit2",Sr="Hyungtak Jin(@tak-bro)",$r="module",Rr=["dist"],Ir={aicommit2:"./dist/cli.mjs",aic2:"./dist/cli.mjs"},xr={prepare:"simple-git-hooks",build:"pkgroll --minify",lint:"eslint --cache .","type-check":"tsc",test:"tsx tests",prepack:"pnpm build && clean-pkg-json",prettier:"prettier"},kr={"@anthropic-ai/sdk":"^0.39.0","@aws-sdk/client-bedrock-runtime":"^3.678.0","@aws-sdk/credential-providers":"^3.678.0","@dqbd/tiktoken":"^1.0.21","@google/generative-ai":"^0.24.1","@inquirer/prompts":"^3.3.2","@pacote/xxhash":"^0.3.2","@types/winston":"^2.4.4",axios:"^1.9.0",chalk:"^5.4.1",chokidar:"^4.0.3",cleye:"^1.3.4","cohere-ai":"^7.19.0","copy-paste":"^1.5.3",figlet:"^1.8.1","formdata-node":"^6.0.3","gradient-string":"^3.0.0","groq-sdk":"^0.7.0",inquirer:"9.2.8","inquirer-reactive-list-prompt":"^1.0.16",ollama:"^0.5.15",openai:"^6.3.0",ora:"^8.2.0",readline:"^1.3.0",rxjs:"^7.8.2",undici:"^7.10.0",uuid:"^9.0.1",winston:"^3.17.0","winston-daily-rotate-file":"^5.0.0"},Mr={"@pvtnbr/eslint-config":"^0.33.0","@semantic-release/changelog":"^6.0.3","@semantic-release/commit-analyzer":"^12.0.0","@semantic-release/git":"^10.0.1","@semantic-release/github":"^10.3.5","@semantic-release/npm":"^12.0.1","@semantic-release/release-notes-generator":"^13.0.0","@types/figlet":"^1.7.0","@types/ini":"^1.3.34","@types/inquirer":"^9.0.8","@types/node":"^18.19.103","@types/uuid":"^9.0.8","@typescript-eslint/eslint-plugin":"^6.21.0","@typescript-eslint/parser":"^6.21.0","clean-pkg-json":"^1.3.0","conventional-changelog-conventionalcommits":"^7.0.2","conventional-commits-parser":"^5.0.0",eslint:"^8.57.1","eslint-config-prettier":"^8.10.0","eslint-plugin-eslint-comments":"^3.2.0","eslint-plugin-import":"^2.31.0","eslint-plugin-jsonc":"^2.20.1","eslint-plugin-no-use-extend-native":"^0.5.0","eslint-plugin-promise":"^6.6.0","eslint-plugin-unicorn":"^49.0.0","eslint-plugin-unused-imports":"^3.2.0",execa:"^7.2.0","fs-fixture":"^1.2.0","https-proxy-agent":"^5.0.1",ini:"^3.0.1","lint-staged":"^13.3.0",manten:"^0.7.0",pkgroll:"^1.11.1",prettier:"^3.5.3","semantic-release":"^23.1.1","simple-git-hooks":"^2.13.0",tsx:"^3.14.0",typescript:"^4.9.5","undici-types":"^7.10.0"},Or={extends:["@pvtnbr","prettier"],rules:{"unicorn/no-process-exit":"off"},overrides:[{files:"./src/commands/prepare-commit-msg-hook.ts",rules:{"unicorn/prevent-abbreviations":"off"}}]},Tr={branches:["main"],plugins:[["@semantic-release/commit-analyzer",{preset:"conventionalcommits",releaseRules:[{type:"docs",release:!1},{type:"style",release:!1},{type:"test",release:!1},{type:"ci",release:!1},{type:"refactor",release:"patch"},{type:"chore",release:"patch"},{type:"feat",release:"patch"},{scope:"major",release:"major"},{scope:"minor",release:"minor"},{scope:"patch",release:"patch"}]}],"@semantic-release/release-notes-generator",["@semantic-release/changelog",{changelogFile:"CHANGELOG.md"}],"@semantic-release/github",["@semantic-release/git",{assets:["CHANGELOG.md"],message:"chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}],"@semantic-release/npm"]},Lr={name:Er,version:po,description:vr,keywords:Cr,license:Ar,repository:Pr,author:Sr,type:$r,files:Rr,bin:Ir,scripts:xr,"simple-git-hooks":{"pre-commit":"pnpm lint-staged"},"lint-staged":{"*.ts":["prettier --config ./.prettierrc --write","eslint --fix"]},dependencies:kr,devDependencies:Mr,eslintConfig:Or,release:Tr},Dr=qn(import.meta.url),Y=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ne(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var re={exports:{}},ut,fo;function Nr(){if(fo)return ut;fo=1,ut=n,n.sync=r;var e=N;function t(s,i){var c=i.pathExt!==void 0?i.pathExt:process.env.PATHEXT;if(!c||(c=c.split(";"),c.indexOf("")!==-1))return!0;for(var u=0;u<c.length;u++){var l=c[u].toLowerCase();if(l&&s.substr(-l.length).toLowerCase()===l)return!0}return!1}function o(s,i,c){return!s.isSymbolicLink()&&!s.isFile()?!1:t(i,c)}function n(s,i,c){e.stat(s,function(u,l){c(u,u?!1:o(l,s,i))})}function r(s,i){return o(e.statSync(s),s,i)}return ut}var dt,ho;function jr(){if(ho)return dt;ho=1,dt=t,t.sync=o;var e=N;function t(s,i,c){e.stat(s,function(u,l){c(u,u?!1:n(l,i))})}function o(s,i){return n(e.statSync(s),i)}function n(s,i){return s.isFile()&&r(s,i)}function r(s,i){var c=s.mode,u=s.uid,l=s.gid,d=i.uid!==void 0?i.uid:process.getuid&&process.getuid(),f=i.gid!==void 0?i.gid:process.getgid&&process.getgid(),y=parseInt("100",8),h=parseInt("010",8),m=parseInt("001",8),A=y|h,v=c&m||c&h&&l===f||c&y&&u===d||c&A&&d===0;return v}return dt}var ke;process.platform==="win32"||Y.TESTING_WINDOWS?ke=Nr():ke=jr();var _r=mt;mt.sync=Fr;function mt(e,t,o){if(typeof t=="function"&&(o=t,t={}),!o){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(n,r){mt(e,t||{},function(s,i){s?r(s):n(i)})})}ke(e,t||{},function(n,r){n&&(n.code==="EACCES"||t&&t.ignoreErrors)&&(n=null,r=!1),o(n,r)})}function Fr(e,t){try{return ke.sync(e,t||{})}catch(o){if(t&&t.ignoreErrors||o.code==="EACCES")return!1;throw o}}const se=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",go=E,Gr=se?";":":",yo=_r,wo=e=>Object.assign(new Error(`not found: ${e}`),{code:"ENOENT"}),bo=(e,t)=>{const o=t.colon||Gr,n=e.match(/\//)||se&&e.match(/\\/)?[""]:[...se?[process.cwd()]:[],...(t.path||process.env.PATH||"").split(o)],r=se?t.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=se?r.split(o):[""];return se&&e.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:n,pathExt:s,pathExtExe:r}},Eo=(e,t,o)=>{typeof t=="function"&&(o=t,t={}),t||(t={});const{pathEnv:n,pathExt:r,pathExtExe:s}=bo(e,t),i=[],c=l=>new Promise((d,f)=>{if(l===n.length)return t.all&&i.length?d(i):f(wo(e));const y=n[l],h=/^".*"$/.test(y)?y.slice(1,-1):y,m=go.join(h,e),A=!h&&/^\.[\\\/]/.test(e)?e.slice(0,2)+m:m;d(u(A,l,0))}),u=(l,d,f)=>new Promise((y,h)=>{if(f===r.length)return y(c(d+1));const m=r[f];yo(l+m,{pathExt:s},(A,v)=>{if(!A&&v)if(t.all)i.push(l+m);else return y(l+m);return y(u(l,d,f+1))})});return o?c(0).then(l=>o(null,l),o):c(0)},Br=(e,t)=>{t=t||{};const{pathEnv:o,pathExt:n,pathExtExe:r}=bo(e,t),s=[];for(let i=0;i<o.length;i++){const c=o[i],u=/^".*"$/.test(c)?c.slice(1,-1):c,l=go.join(u,e),d=!u&&/^\.[\\\/]/.test(e)?e.slice(0,2)+l:l;for(let f=0;f<n.length;f++){const y=d+n[f];try{if(yo.sync(y,{pathExt:r}))if(t.all)s.push(y);else return y}catch{}}}if(t.all&&s.length)return s;if(t.nothrow)return null;throw wo(e)};var Hr=Eo;Eo.sync=Br;var pt={exports:{}};const vo=(e={})=>{const t=e.env||process.env;return(e.platform||process.platform)!=="win32"?"PATH":Object.keys(t).reverse().find(n=>n.toUpperCase()==="PATH")||"Path"};pt.exports=vo,pt.exports.default=vo;var Ur=pt.exports;const Co=E,Kr=Hr,qr=Ur;function Ao(e,t){const o=e.options.env||process.env,n=process.cwd(),r=e.options.cwd!=null,s=r&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(e.options.cwd)}catch{}let i;try{i=Kr.sync(e.command,{path:o[qr({env:o})],pathExt:t?Co.delimiter:void 0})}catch{}finally{s&&process.chdir(n)}return i&&(i=Co.resolve(r?e.options.cwd:"",i)),i}function Wr(e){return Ao(e)||Ao(e,!0)}var Yr=Wr,ft={};const ht=/([()\][%!^"`<>&|;, *?])/g;function zr(e){return e=e.replace(ht,"^$1"),e}function Vr(e,t){return e=`${e}`,e=e.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),e=e.replace(/(?=(\\+?)?)\1$/,"$1$1"),e=`"${e}"`,e=e.replace(ht,"^$1"),t&&(e=e.replace(ht,"^$1")),e}ft.command=zr,ft.argument=Vr;var Jr=/^#!(.*)/;const Xr=Jr;var Qr=(e="")=>{const t=e.match(Xr);if(!t)return null;const[o,n]=t[0].replace(/#! ?/,"").split(" "),r=o.split("/").pop();return r==="env"?n:n?`${r} ${n}`:r};const gt=N,Zr=Qr;function es(e){const o=Buffer.alloc(150);let n;try{n=gt.openSync(e,"r"),gt.readSync(n,o,0,150,0),gt.closeSync(n)}catch{}return Zr(o.toString())}var ts=es;const os=E,Po=Yr,So=ft,ns=ts,rs=process.platform==="win32",ss=/\.(?:com|exe)$/i,is=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function as(e){e.file=Po(e);const t=e.file&&ns(e.file);return t?(e.args.unshift(e.file),e.command=t,Po(e)):e.file}function cs(e){if(!rs)return e;const t=as(e),o=!ss.test(t);if(e.options.forceShell||o){const n=is.test(t);e.command=os.normalize(e.command),e.command=So.command(e.command),e.args=e.args.map(s=>So.argument(s,n));const r=[e.command].concat(e.args).join(" ");e.args=["/d","/s","/c",`"${r}"`],e.command=process.env.comspec||"cmd.exe",e.options.windowsVerbatimArguments=!0}return e}function ls(e,t,o){t&&!Array.isArray(t)&&(o=t,t=null),t=t?t.slice(0):[],o=Object.assign({},o);const n={command:e,args:t,options:o,file:void 0,original:{command:e,args:t}};return o.shell?n:cs(n)}var us=ls;const yt=process.platform==="win32";function wt(e,t){return Object.assign(new Error(`${t} ${e.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${t} ${e.command}`,path:e.command,spawnargs:e.args})}function ds(e,t){if(!yt)return;const o=e.emit;e.emit=function(n,r){if(n==="exit"){const s=$o(r,t);if(s)return o.call(e,"error",s)}return o.apply(e,arguments)}}function $o(e,t){return yt&&e===1&&!t.file?wt(t.original,"spawn"):null}function ms(e,t){return yt&&e===1&&!t.file?wt(t.original,"spawnSync"):null}var ps={hookChildProcess:ds,verifyENOENT:$o,verifyENOENTSync:ms,notFoundError:wt};const Ro=zn,bt=us,Et=ps;function Io(e,t,o){const n=bt(e,t,o),r=Ro.spawn(n.command,n.args,n.options);return Et.hookChildProcess(r,n),r}function fs(e,t,o){const n=bt(e,t,o),r=Ro.spawnSync(n.command,n.args,n.options);return r.error=r.error||Et.verifyENOENTSync(r.status,n),r}re.exports=Io,re.exports.spawn=Io,re.exports.sync=fs,re.exports._parse=bt,re.exports._enoent=Et;var hs=re.exports,gs=ne(hs);function ys(e){const t=typeof e=="string"?`
1
+ import{command as j,cli as Kn}from"cleye";import{createRequire as qn}from"module";import Wn from"crypto";import N from"fs";import $e from"os";import E from"path";import{Buffer as Qt}from"node:buffer";import Q from"node:path";import st,{ChildProcess as Zt,exec as Yn}from"node:child_process";import F from"node:process";import zn,{execSync as Re,exec as Vn}from"child_process";import{fileURLToPath as eo}from"node:url";import Jn,{constants as to}from"node:os";import Xn from"assert";import Qn from"events";import{createWriteStream as Zn,createReadStream as er,readFileSync as tr}from"node:fs";import or from"buffer";import it from"stream";import nr,{promisify as rr}from"util";import{debuglog as sr,promisify as ir}from"node:util";import O from"inquirer";import{from as Ie,switchMap as oo,of as ar,tap as cr,mergeMap as no,catchError as lr,BehaviorSubject as ro,ReplaySubject as ur,Subscription as at,lastValueFrom as ct,toArray as lt,filter as so,map as io,Subject as dr}from"rxjs";import I from"fs/promises";import g from"chalk";import xe from"readline";import ao from"figlet";import mr from"gradient-string";import co from"ora";import pr from"inquirer-reactive-list-prompt";import G from"winston";import"winston-daily-rotate-file";import fr from"axios";import{fileURLToPath as hr,pathToFileURL as gr}from"url";import{readdir as lo,stat as yr,rm as wr}from"node:fs/promises";import br from"chokidar";import{takeUntil as uo,finalize as mo}from"rxjs/operators";var Er="aicommit2",po="2.5.8",vr="A Reactive CLI that generates commit messages for Git and Jujutsu with various AI",Cr=["cli","ai","git","jujutsu","jj","vcs","version-control","commit","git-commit","jujutsu-commit","command-line","commandline","aipick","aicommit","aicommits","aicommit2","openai","huggingface","anthropic","claude","claude3","gemini","gemini-pro","generative-ai","mistral","ollama","llama3","llama3.2","llama3.3","gemma","llm","chatgpt","cohere","groq","codestral","perplexity","deepseek","deepseek-r1","pre-commit"],Ar="MIT",Pr="tak-bro/aicommit2",Sr="Hyungtak Jin(@tak-bro)",$r="module",Rr=["dist"],Ir={aicommit2:"./dist/cli.mjs",aic2:"./dist/cli.mjs"},xr={prepare:"simple-git-hooks",build:"pkgroll --minify",lint:"eslint --cache .","type-check":"tsc",test:"tsx tests",prepack:"pnpm build && clean-pkg-json",prettier:"prettier"},kr={"@anthropic-ai/sdk":"^0.39.0","@aws-sdk/client-bedrock-runtime":"^3.678.0","@aws-sdk/credential-providers":"^3.678.0","@dqbd/tiktoken":"^1.0.21","@google/generative-ai":"^0.24.1","@inquirer/prompts":"^3.3.2","@pacote/xxhash":"^0.3.2","@types/winston":"^2.4.4",axios:"^1.9.0",chalk:"^5.4.1",chokidar:"^4.0.3",cleye:"^1.3.4","cohere-ai":"^7.19.0","copy-paste":"^1.5.3",figlet:"^1.8.1","formdata-node":"^6.0.3","gradient-string":"^3.0.0","groq-sdk":"^0.7.0",inquirer:"9.2.8","inquirer-reactive-list-prompt":"^1.0.16",ollama:"^0.5.15",openai:"^6.3.0",ora:"^8.2.0",readline:"^1.3.0",rxjs:"^7.8.2",undici:"^7.10.0",uuid:"^9.0.1",winston:"^3.17.0","winston-daily-rotate-file":"^5.0.0"},Mr={"@pvtnbr/eslint-config":"^0.33.0","@semantic-release/changelog":"^6.0.3","@semantic-release/commit-analyzer":"^12.0.0","@semantic-release/git":"^10.0.1","@semantic-release/github":"^10.3.5","@semantic-release/npm":"^12.0.1","@semantic-release/release-notes-generator":"^13.0.0","@types/figlet":"^1.7.0","@types/ini":"^1.3.34","@types/inquirer":"^9.0.8","@types/node":"^18.19.103","@types/uuid":"^9.0.8","@typescript-eslint/eslint-plugin":"^6.21.0","@typescript-eslint/parser":"^6.21.0","clean-pkg-json":"^1.3.0","conventional-changelog-conventionalcommits":"^7.0.2","conventional-commits-parser":"^5.0.0",eslint:"^8.57.1","eslint-config-prettier":"^8.10.0","eslint-plugin-eslint-comments":"^3.2.0","eslint-plugin-import":"^2.31.0","eslint-plugin-jsonc":"^2.20.1","eslint-plugin-no-use-extend-native":"^0.5.0","eslint-plugin-promise":"^6.6.0","eslint-plugin-unicorn":"^49.0.0","eslint-plugin-unused-imports":"^3.2.0",execa:"^7.2.0","fs-fixture":"^1.2.0","https-proxy-agent":"^5.0.1",ini:"^3.0.1","lint-staged":"^13.3.0",manten:"^0.7.0",pkgroll:"^1.11.1",prettier:"^3.5.3","semantic-release":"^23.1.1","simple-git-hooks":"^2.13.0",tsx:"^3.14.0",typescript:"^4.9.5","undici-types":"^7.10.0"},Or={extends:["@pvtnbr","prettier"],rules:{"unicorn/no-process-exit":"off"},overrides:[{files:"./src/commands/prepare-commit-msg-hook.ts",rules:{"unicorn/prevent-abbreviations":"off"}}]},Tr={branches:["main"],plugins:[["@semantic-release/commit-analyzer",{preset:"conventionalcommits",releaseRules:[{type:"docs",release:!1},{type:"style",release:!1},{type:"test",release:!1},{type:"ci",release:!1},{type:"refactor",release:"patch"},{type:"chore",release:"patch"},{type:"feat",release:"patch"},{scope:"major",release:"major"},{scope:"minor",release:"minor"},{scope:"patch",release:"patch"}]}],"@semantic-release/release-notes-generator",["@semantic-release/changelog",{changelogFile:"CHANGELOG.md"}],"@semantic-release/github",["@semantic-release/git",{assets:["CHANGELOG.md"],message:"chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}],"@semantic-release/npm"]},Lr={name:Er,version:po,description:vr,keywords:Cr,license:Ar,repository:Pr,author:Sr,type:$r,files:Rr,bin:Ir,scripts:xr,"simple-git-hooks":{"pre-commit":"pnpm lint-staged"},"lint-staged":{"*.ts":["prettier --config ./.prettierrc --write","eslint --fix"]},dependencies:kr,devDependencies:Mr,eslintConfig:Or,release:Tr},Dr=qn(import.meta.url),Y=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ne(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var re={exports:{}},ut,fo;function Nr(){if(fo)return ut;fo=1,ut=n,n.sync=r;var e=N;function t(s,i){var c=i.pathExt!==void 0?i.pathExt:process.env.PATHEXT;if(!c||(c=c.split(";"),c.indexOf("")!==-1))return!0;for(var u=0;u<c.length;u++){var l=c[u].toLowerCase();if(l&&s.substr(-l.length).toLowerCase()===l)return!0}return!1}function o(s,i,c){return!s.isSymbolicLink()&&!s.isFile()?!1:t(i,c)}function n(s,i,c){e.stat(s,function(u,l){c(u,u?!1:o(l,s,i))})}function r(s,i){return o(e.statSync(s),s,i)}return ut}var dt,ho;function jr(){if(ho)return dt;ho=1,dt=t,t.sync=o;var e=N;function t(s,i,c){e.stat(s,function(u,l){c(u,u?!1:n(l,i))})}function o(s,i){return n(e.statSync(s),i)}function n(s,i){return s.isFile()&&r(s,i)}function r(s,i){var c=s.mode,u=s.uid,l=s.gid,d=i.uid!==void 0?i.uid:process.getuid&&process.getuid(),f=i.gid!==void 0?i.gid:process.getgid&&process.getgid(),y=parseInt("100",8),h=parseInt("010",8),m=parseInt("001",8),A=y|h,v=c&m||c&h&&l===f||c&y&&u===d||c&A&&d===0;return v}return dt}var ke;process.platform==="win32"||Y.TESTING_WINDOWS?ke=Nr():ke=jr();var _r=mt;mt.sync=Fr;function mt(e,t,o){if(typeof t=="function"&&(o=t,t={}),!o){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(n,r){mt(e,t||{},function(s,i){s?r(s):n(i)})})}ke(e,t||{},function(n,r){n&&(n.code==="EACCES"||t&&t.ignoreErrors)&&(n=null,r=!1),o(n,r)})}function Fr(e,t){try{return ke.sync(e,t||{})}catch(o){if(t&&t.ignoreErrors||o.code==="EACCES")return!1;throw o}}const se=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",go=E,Gr=se?";":":",yo=_r,wo=e=>Object.assign(new Error(`not found: ${e}`),{code:"ENOENT"}),bo=(e,t)=>{const o=t.colon||Gr,n=e.match(/\//)||se&&e.match(/\\/)?[""]:[...se?[process.cwd()]:[],...(t.path||process.env.PATH||"").split(o)],r=se?t.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=se?r.split(o):[""];return se&&e.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:n,pathExt:s,pathExtExe:r}},Eo=(e,t,o)=>{typeof t=="function"&&(o=t,t={}),t||(t={});const{pathEnv:n,pathExt:r,pathExtExe:s}=bo(e,t),i=[],c=l=>new Promise((d,f)=>{if(l===n.length)return t.all&&i.length?d(i):f(wo(e));const y=n[l],h=/^".*"$/.test(y)?y.slice(1,-1):y,m=go.join(h,e),A=!h&&/^\.[\\\/]/.test(e)?e.slice(0,2)+m:m;d(u(A,l,0))}),u=(l,d,f)=>new Promise((y,h)=>{if(f===r.length)return y(c(d+1));const m=r[f];yo(l+m,{pathExt:s},(A,v)=>{if(!A&&v)if(t.all)i.push(l+m);else return y(l+m);return y(u(l,d,f+1))})});return o?c(0).then(l=>o(null,l),o):c(0)},Br=(e,t)=>{t=t||{};const{pathEnv:o,pathExt:n,pathExtExe:r}=bo(e,t),s=[];for(let i=0;i<o.length;i++){const c=o[i],u=/^".*"$/.test(c)?c.slice(1,-1):c,l=go.join(u,e),d=!u&&/^\.[\\\/]/.test(e)?e.slice(0,2)+l:l;for(let f=0;f<n.length;f++){const y=d+n[f];try{if(yo.sync(y,{pathExt:r}))if(t.all)s.push(y);else return y}catch{}}}if(t.all&&s.length)return s;if(t.nothrow)return null;throw wo(e)};var Hr=Eo;Eo.sync=Br;var pt={exports:{}};const vo=(e={})=>{const t=e.env||process.env;return(e.platform||process.platform)!=="win32"?"PATH":Object.keys(t).reverse().find(n=>n.toUpperCase()==="PATH")||"Path"};pt.exports=vo,pt.exports.default=vo;var Ur=pt.exports;const Co=E,Kr=Hr,qr=Ur;function Ao(e,t){const o=e.options.env||process.env,n=process.cwd(),r=e.options.cwd!=null,s=r&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(e.options.cwd)}catch{}let i;try{i=Kr.sync(e.command,{path:o[qr({env:o})],pathExt:t?Co.delimiter:void 0})}catch{}finally{s&&process.chdir(n)}return i&&(i=Co.resolve(r?e.options.cwd:"",i)),i}function Wr(e){return Ao(e)||Ao(e,!0)}var Yr=Wr,ft={};const ht=/([()\][%!^"`<>&|;, *?])/g;function zr(e){return e=e.replace(ht,"^$1"),e}function Vr(e,t){return e=`${e}`,e=e.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),e=e.replace(/(?=(\\+?)?)\1$/,"$1$1"),e=`"${e}"`,e=e.replace(ht,"^$1"),t&&(e=e.replace(ht,"^$1")),e}ft.command=zr,ft.argument=Vr;var Jr=/^#!(.*)/;const Xr=Jr;var Qr=(e="")=>{const t=e.match(Xr);if(!t)return null;const[o,n]=t[0].replace(/#! ?/,"").split(" "),r=o.split("/").pop();return r==="env"?n:n?`${r} ${n}`:r};const gt=N,Zr=Qr;function es(e){const o=Buffer.alloc(150);let n;try{n=gt.openSync(e,"r"),gt.readSync(n,o,0,150,0),gt.closeSync(n)}catch{}return Zr(o.toString())}var ts=es;const os=E,Po=Yr,So=ft,ns=ts,rs=process.platform==="win32",ss=/\.(?:com|exe)$/i,is=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function as(e){e.file=Po(e);const t=e.file&&ns(e.file);return t?(e.args.unshift(e.file),e.command=t,Po(e)):e.file}function cs(e){if(!rs)return e;const t=as(e),o=!ss.test(t);if(e.options.forceShell||o){const n=is.test(t);e.command=os.normalize(e.command),e.command=So.command(e.command),e.args=e.args.map(s=>So.argument(s,n));const r=[e.command].concat(e.args).join(" ");e.args=["/d","/s","/c",`"${r}"`],e.command=process.env.comspec||"cmd.exe",e.options.windowsVerbatimArguments=!0}return e}function ls(e,t,o){t&&!Array.isArray(t)&&(o=t,t=null),t=t?t.slice(0):[],o=Object.assign({},o);const n={command:e,args:t,options:o,file:void 0,original:{command:e,args:t}};return o.shell?n:cs(n)}var us=ls;const yt=process.platform==="win32";function wt(e,t){return Object.assign(new Error(`${t} ${e.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${t} ${e.command}`,path:e.command,spawnargs:e.args})}function ds(e,t){if(!yt)return;const o=e.emit;e.emit=function(n,r){if(n==="exit"){const s=$o(r,t);if(s)return o.call(e,"error",s)}return o.apply(e,arguments)}}function $o(e,t){return yt&&e===1&&!t.file?wt(t.original,"spawn"):null}function ms(e,t){return yt&&e===1&&!t.file?wt(t.original,"spawnSync"):null}var ps={hookChildProcess:ds,verifyENOENT:$o,verifyENOENTSync:ms,notFoundError:wt};const Ro=zn,bt=us,Et=ps;function Io(e,t,o){const n=bt(e,t,o),r=Ro.spawn(n.command,n.args,n.options);return Et.hookChildProcess(r,n),r}function fs(e,t,o){const n=bt(e,t,o),r=Ro.spawnSync(n.command,n.args,n.options);return r.error=r.error||Et.verifyENOENTSync(r.status,n),r}re.exports=Io,re.exports.spawn=Io,re.exports.sync=fs,re.exports._parse=bt,re.exports._enoent=Et;var hs=re.exports,gs=ne(hs);function ys(e){const t=typeof e=="string"?`
2
2
  `:`
3
3
  `.charCodeAt(),o=typeof e=="string"?"\r":"\r".charCodeAt();return e[e.length-1]===t&&(e=e.slice(0,-1)),e[e.length-1]===o&&(e=e.slice(0,-1)),e}function xo(e={}){const{env:t=process.env,platform:o=process.platform}=e;return o!=="win32"?"PATH":Object.keys(t).reverse().find(n=>n.toUpperCase()==="PATH")||"Path"}const ws=({cwd:e=F.cwd(),path:t=F.env[xo()],preferLocal:o=!0,execPath:n=F.execPath,addExecPath:r=!0}={})=>{const s=e instanceof URL?eo(e):e,i=Q.resolve(s),c=[];return o&&bs(c,i),r&&Es(c,n,i),[...c,t].join(Q.delimiter)},bs=(e,t)=>{let o;for(;o!==t;)e.push(Q.join(t,"node_modules/.bin")),o=t,t=Q.resolve(t,"..")},Es=(e,t,o)=>{const n=t instanceof URL?eo(t):t;e.push(Q.resolve(o,n,".."))},vs=({env:e=F.env,...t}={})=>{e={...e};const o=xo({env:e});return t.path=e[o],e[o]=ws(t),e},Cs=(e,t,o,n)=>{if(o==="length"||o==="prototype"||o==="arguments"||o==="caller")return;const r=Object.getOwnPropertyDescriptor(e,o),s=Object.getOwnPropertyDescriptor(t,o);!As(r,s)&&n||Object.defineProperty(e,o,s)},As=function(e,t){return e===void 0||e.configurable||e.writable===t.writable&&e.enumerable===t.enumerable&&e.configurable===t.configurable&&(e.writable||e.value===t.value)},Ps=(e,t)=>{const o=Object.getPrototypeOf(t);o!==Object.getPrototypeOf(e)&&Object.setPrototypeOf(e,o)},Ss=(e,t)=>`/* Wrapped ${e}*/
4
4
  ${t}`,$s=Object.getOwnPropertyDescriptor(Function.prototype,"toString"),Rs=Object.getOwnPropertyDescriptor(Function.prototype.toString,"name"),Is=(e,t,o)=>{const n=o===""?"":`with ${o.trim()}() `,r=Ss.bind(null,n,t.toString());Object.defineProperty(r,"name",Rs),Object.defineProperty(e,"toString",{...$s,value:r})};function xs(e,t,{ignoreNonConfigurable:o=!1}={}){const{name:n}=e;for(const r of Reflect.ownKeys(t))Cs(e,t,r,o);return Ps(e,t),Is(e,t,n),e}const Me=new WeakMap,ko=(e,t={})=>{if(typeof e!="function")throw new TypeError("Expected a function");let o,n=0;const r=e.displayName||e.name||"<anonymous>",s=function(...i){if(Me.set(s,++n),n===1)o=e.apply(this,i),e=null;else if(t.throw===!0)throw new Error(`Function \`${r}\` can only be called once`);return o};return xs(s,e),Me.set(s,n),s};ko.callCount=e=>{if(!Me.has(e))throw new Error(`The given function \`${e.name}\` is not wrapped by the \`onetime\` package`);return Me.get(e)};const ks=()=>{const e=Oo-Mo+1;return Array.from({length:e},Ms)},Ms=(e,t)=>({name:`SIGRT${t+1}`,number:Mo+t,action:"terminate",description:"Application-specific signal (realtime)",standard:"posix"}),Mo=34,Oo=64,Os=[{name:"SIGHUP",number:1,action:"terminate",description:"Terminal closed",standard:"posix"},{name:"SIGINT",number:2,action:"terminate",description:"User interruption with CTRL-C",standard:"ansi"},{name:"SIGQUIT",number:3,action:"core",description:"User interruption with CTRL-\\",standard:"posix"},{name:"SIGILL",number:4,action:"core",description:"Invalid machine instruction",standard:"ansi"},{name:"SIGTRAP",number:5,action:"core",description:"Debugger breakpoint",standard:"posix"},{name:"SIGABRT",number:6,action:"core",description:"Aborted",standard:"ansi"},{name:"SIGIOT",number:6,action:"core",description:"Aborted",standard:"bsd"},{name:"SIGBUS",number:7,action:"core",description:"Bus error due to misaligned, non-existing address or paging error",standard:"bsd"},{name:"SIGEMT",number:7,action:"terminate",description:"Command should be emulated but is not implemented",standard:"other"},{name:"SIGFPE",number:8,action:"core",description:"Floating point arithmetic error",standard:"ansi"},{name:"SIGKILL",number:9,action:"terminate",description:"Forced termination",standard:"posix",forced:!0},{name:"SIGUSR1",number:10,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGSEGV",number:11,action:"core",description:"Segmentation fault",standard:"ansi"},{name:"SIGUSR2",number:12,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGPIPE",number:13,action:"terminate",description:"Broken pipe or socket",standard:"posix"},{name:"SIGALRM",number:14,action:"terminate",description:"Timeout or timer",standard:"posix"},{name:"SIGTERM",number:15,action:"terminate",description:"Termination",standard:"ansi"},{name:"SIGSTKFLT",number:16,action:"terminate",description:"Stack is empty or overflowed",standard:"other"},{name:"SIGCHLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"posix"},{name:"SIGCLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"other"},{name:"SIGCONT",number:18,action:"unpause",description:"Unpaused",standard:"posix",forced:!0},{name:"SIGSTOP",number:19,action:"pause",description:"Paused",standard:"posix",forced:!0},{name:"SIGTSTP",number:20,action:"pause",description:'Paused using CTRL-Z or "suspend"',standard:"posix"},{name:"SIGTTIN",number:21,action:"pause",description:"Background process cannot read terminal input",standard:"posix"},{name:"SIGBREAK",number:21,action:"terminate",description:"User interruption with CTRL-BREAK",standard:"other"},{name:"SIGTTOU",number:22,action:"pause",description:"Background process cannot write to terminal output",standard:"posix"},{name:"SIGURG",number:23,action:"ignore",description:"Socket received out-of-band data",standard:"bsd"},{name:"SIGXCPU",number:24,action:"core",description:"Process timed out",standard:"bsd"},{name:"SIGXFSZ",number:25,action:"core",description:"File too big",standard:"bsd"},{name:"SIGVTALRM",number:26,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGPROF",number:27,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGWINCH",number:28,action:"ignore",description:"Terminal window size changed",standard:"bsd"},{name:"SIGIO",number:29,action:"terminate",description:"I/O is available",standard:"other"},{name:"SIGPOLL",number:29,action:"terminate",description:"Watched event",standard:"other"},{name:"SIGINFO",number:29,action:"ignore",description:"Request for process information",standard:"other"},{name:"SIGPWR",number:30,action:"terminate",description:"Device running out of power",standard:"systemv"},{name:"SIGSYS",number:31,action:"core",description:"Invalid system call",standard:"other"},{name:"SIGUNUSED",number:31,action:"terminate",description:"Invalid system call",standard:"other"}],To=()=>{const e=ks();return[...Os,...e].map(Ts)},Ts=({name:e,number:t,description:o,action:n,forced:r=!1,standard:s})=>{const{signals:{[e]:i}}=to,c=i!==void 0;return{name:e,number:c?i:t,description:o,supported:c,action:n,forced:r,standard:s}},Ls=()=>{const e=To();return Object.fromEntries(e.map(Ds))},Ds=({name:e,number:t,description:o,supported:n,action:r,forced:s,standard:i})=>[e,{name:e,number:t,description:o,supported:n,action:r,forced:s,standard:i}],Ns=Ls(),js=()=>{const e=To(),t=Oo+1,o=Array.from({length:t},(n,r)=>_s(r,e));return Object.assign({},...o)},_s=(e,t)=>{const o=Fs(e,t);if(o===void 0)return{};const{name:n,description:r,supported:s,action:i,forced:c,standard:u}=o;return{[e]:{name:n,number:e,description:r,supported:s,action:i,forced:c,standard:u}}},Fs=(e,t)=>{const o=t.find(({name:n})=>to.signals[n]===e);return o!==void 0?o:t.find(n=>n.number===e)};js();const Gs=({timedOut:e,timeout:t,errorCode:o,signal:n,signalDescription:r,exitCode:s,isCanceled:i})=>e?`timed out after ${t} milliseconds`:i?"was canceled":o!==void 0?`failed with ${o}`:n!==void 0?`was killed with ${n} (${r})`:s!==void 0?`failed with exit code ${s}`:"failed",Oe=({stdout:e,stderr:t,all:o,error:n,signal:r,exitCode:s,command:i,escapedCommand:c,timedOut:u,isCanceled:l,killed:d,parsed:{options:{timeout:f,cwd:y=F.cwd()}}})=>{s=s===null?void 0:s,r=r===null?void 0:r;const h=r===void 0?void 0:Ns[r].description,m=n&&n.code,v=`Command ${Gs({timedOut:u,timeout:f,errorCode:m,signal:r,signalDescription:h,exitCode:s,isCanceled:l})}: ${i}`,S=Object.prototype.toString.call(n)==="[object Error]",P=S?`${v}
@@ -15,7 +15,7 @@ Expected formats:
15
15
  - Foundation model: "provider.model-name-version" (e.g., "anthropic.claude-haiku-4-5-20251001-v1:0")
16
16
  - Inference profile: "prefix.provider.model-name-version" (e.g., "us.anthropic.claude-haiku-4-5-20251001-v1:0")
17
17
  - ARN: Full Amazon Resource Name
18
- See https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles.html`),n}).filter(o=>!!o&&o.length>0):["anthropic.claude-haiku-4-5-20251001-v1:0"],runtimeMode:e=>{e&&console.warn("[Bedrock] DEPRECATION: runtimeMode is no longer used. Authentication method is now auto-detected from configured credentials.")},region:e=>e||process.env.AWS_REGION||process.env.AWS_DEFAULT_REGION||"",profile:e=>e||process.env.AWS_PROFILE||"",accessKeyId:e=>e||process.env.AWS_ACCESS_KEY_ID||"",secretAccessKey:e=>e||process.env.AWS_SECRET_ACCESS_KEY||"",sessionToken:e=>e||process.env.AWS_SESSION_TOKEN||"",applicationEndpointId:e=>e||process.env.BEDROCK_APPLICATION_ENDPOINT_ID||"",applicationInferenceProfileArn:e=>e||process.env.BEDROCK_APPLICATION_INFERENCE_PROFILE_ARN||process.env.BEDROCK_INFERENCE_PROFILE_ARN||"",applicationBaseUrl:e=>e||process.env.BEDROCK_APPLICATION_BASE_URL||"",systemPrompt:a.systemPrompt,systemPromptPath:a.systemPromptPath,codeReviewPromptPath:a.codeReviewPromptPath,timeout:a.timeout,temperature:e=>{if(!e)return;C("temperature",/^(2|\d)(\.\d{1,2})?$/.test(e),"Must be decimal between 0 and 2");const t=Number(e);return C("temperature",t>0,"Must be greater than 0"),C("temperature",t<=2,"Must be less than or equal to 2"),t},maxTokens:e=>{if(e)return C("maxTokens",/^\d+$/.test(e),"Must be an integer"),Number(e)},logging:a.logging,locale:a.locale,generate:a.generate,type:a.type,maxLength:a.maxLength,includeBody:a.includeBody,topP:e=>{if(!e)return;C("topP",/^(1|\d)(\.\d{1,2})?$/.test(e),"Must be decimal between 0 and 1");const t=Number(e);return C("topP",t>0,"Must be greater than 0"),C("topP",t<=1,"Must be less than or equal to 1"),t},codeReview:a.codeReview,disabled:a.disabled,stream:a.stream,watchMode:a.watchMode,disableLowerCase:a.disableLowerCase,inferenceParameters:Be("BEDROCK.inferenceParameters")}},ta=e=>typeof e=="object"&&e!==null,mn=(e,t)=>{Object.keys(e).forEach(o=>{const n=e[o];ta(n)&&t in n&&(n[t]=!0)})},oa=e=>{mn(e,"includeBody")},na=e=>{mn(e,"disableLowerCase")};let Ce,Ae=null,Lt=null;const ra=(e=[])=>{const t={};for(const o of e)if(o.startsWith("--")){const[n,r]=o.slice(2).split("="),[s,i]=n.split(".");s&&i&&s in ve?(t[s]||(t[s]={}),t[s][i]=r):t[n]=r}return t},sa=()=>{const e=$e.homedir(),t=process.env.AICOMMIT_CONFIG_PATH,o=ln,n=E.join(e,".aicommit2");return[t,o,n].filter(r=>!!r)},de=async()=>{const e=sa();for(const t of e)if(await Fe(t))return t;return ln},ia=e=>e.replace(/\$\{([a-zA-Z_][a-zA-Z0-9_]*)\}|\$([a-zA-Z_][a-zA-Z0-9_]*)/g,(t,o,n)=>{const r=o||n;return process.env[r]??""}),pn=e=>{if(Array.isArray(e)||e===null||typeof e!="object")return e;const t={};for(const[o,n]of Object.entries(e)){const r=pn(n);if(!o.includes(".")){t[o]=r;continue}const s=o.split(".");let i=t;for(const c of s.slice(0,-1)){const u=i[c];(!u||typeof u!="object"||Array.isArray(u))&&(i[c]={}),i=i[c]}i[s[s.length-1]]=r}return t},Pe=async()=>{const e=await de();if(Ae&&Lt===e)return Ae;Ce=e;try{const t=await I.readFile(e,"utf8"),o=ia(t);return Ae=pn(le.parse(o)),Lt=e,Ae}catch(t){return t.code==="ENOENT"?(Ce=void 0,{}):(console.error(`Error reading config file ${e}:`,t),Ce=void 0,{})}},fn=()=>{Ae=null,Lt=null},J=async(e,t=[])=>{const o=await Pe(),n=ra(t),r={...e,...n},s={},i=ea(o),c={};for(const l of i){const d=o[l]?.envKey;let f;d?(f=[d],l==="BEDROCK"&&d!=="BEDROCK_APPLICATION_API_KEY"&&f.push("BEDROCK_APPLICATION_API_KEY")):l==="BEDROCK"?f=["BEDROCK_API_KEY","BEDROCK_APPLICATION_API_KEY"]:f=[`${l}_API_KEY`];const y=f.map(h=>h?process.env[h]:void 0).find(h=>typeof h=="string"&&h.length>0);y&&(c[l]={key:y})}const u=(l,d)=>{const f=r[`${l}.${d}`]??r[l]?.[d],y=c[l]?.[d],h=o[l]?.[d],m=r[d]??o[d];return f!==void 0?f:y!==void 0?y:h!==void 0?h:m};for(const[l,d]of Object.entries(a)){const f=r[l]??o[l];s[l]=d(f)}for(const l of i){s[l]={};const d=ve[l]||Ue(l);for(const[f,y]of Object.entries(d)){const h=u(l,f);s[l][f]=y(h)}}return s},He=async e=>{const t=await Pe();for(const[r,s]of e){const[i,c]=r.split(".");if(!c){const d=a[r];if(!d)throw new p(`Invalid config property: ${r}`);t[r]=d(s);continue}if(t[i]||(t[i]={}),ue.includes(i)){const d=ve[i][c];if(!d)throw new p(`Invalid config property: ${r}`);t[i][c]=d(s);continue}if(!/^[A-Z][A-Z0-9_]*$/.test(i))throw new p(`Invalid service name: ${i}. Service names must be uppercase letters, numbers, and underscores.`);const l=Ue(i);if(!l[c])throw new p(`Invalid config property for custom service: ${r}`);try{t[i][c]=l[c](s)}catch(d){throw d instanceof p?d:new p(`Invalid value for ${r}: ${d.message}`)}}const o=await de(),n=E.dirname(o);await I.mkdir(n,{recursive:!0}),await I.writeFile(o,le.stringify(t),"utf8"),fn()},aa=async e=>{const t=await Pe();for(const[r,s]of e){const[i,c]=r.split("."),u=t[i];if(c==="model"){u||(t[i]={});const d=t[i][c]||[],f=typeof s=="string"?s.split(",").map(y=>y.trim()).filter(y=>!!y):s;t[i][c]=Ot([...d,...f]);continue}if(u&&u.compatible===!0){u||(t[i]={});const d=Ue(i);if(!d[c])throw new p(`Invalid config property: ${r}`);try{t[i][c]=d[c](s)}catch(f){throw f instanceof p?f:new p(`Invalid value for ${r}: ${f.message}`)}continue}if(i in ve){u||(t[i]={});const d=ve[i][c];if(!d)throw new p(`Invalid config property: ${r}`);t[i][c]=d(s)}else{const d=Ue(i);if(!d[c])throw new p(`Invalid config property: ${r}`);t[i]||(t[i]={}),t[i][c]=d[c](s)}}const o=await de(),n=E.dirname(o);await I.mkdir(n,{recursive:!0}),await I.writeFile(o,le.stringify(t),"utf8"),fn()},ca=async()=>{const e=await Pe();console.log(le.stringify(e))},la=async()=>{console.log(await de())},Ue=e=>({compatible:_("compatible"),stream:_("stream"),url:t=>t?(C(`${e}.url`,/^https?:\/\//.test(t),"Must be a valid URL"),t):"",path:t=>t||"",key:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(n=>n.trim()).filter(n=>!!n&&n.length>0):[],systemPrompt:a.systemPrompt,systemPromptPath:a.systemPromptPath,codeReviewPromptPath:a.codeReviewPromptPath,timeout:a.timeout,temperature:a.temperature,maxTokens:a.maxTokens,logging:a.logging,locale:a.locale,generate:a.generate,type:a.type,maxLength:a.maxLength,includeBody:a.includeBody,topP:a.topP,codeReview:a.codeReview,disabled:a.disabled,watchMode:a.watchMode,disableLowerCase:a.disableLowerCase,autoCopy:a.autoCopy}),L=e=>typeof e=="string"&&e.trim().length>0,ee=e=>(Array.isArray(e.model)?e.model:L(e.model)?[e.model.trim()]:[]).length>0,Ke=e=>{const t=L(e.key),o=L(e.region)||L(process.env.AWS_REGION)||L(process.env.AWS_DEFAULT_REGION),n=L(e.profile)||L(process.env.AWS_PROFILE),r=L(e.accessKeyId)&&L(e.secretAccessKey)||L(process.env.AWS_ACCESS_KEY_ID)&&L(process.env.AWS_SECRET_ACCESS_KEY),s=L(e.applicationBaseUrl)||L(process.env.BEDROCK_APPLICATION_BASE_URL),i=L(e.applicationEndpointId)||L(process.env.BEDROCK_APPLICATION_ENDPOINT_ID),c=L(process.env.BEDROCK_APPLICATION_API_KEY);return o&&(t||n||r)||(s&&t||i&&c)},me=(e,t)=>Object.entries(e).map(([o,n])=>[o,n]).filter(([o,n])=>!n.disabled).filter(([o,n])=>ue.includes(o)||n.compatible===!0).filter(([o,n])=>{switch(t){case"commit":return o==="OLLAMA"?!!n&&ee(n):o==="HUGGINGFACE"?!!n&&!!n.cookie:o==="BEDROCK"?ee(n)&&Ke(n):!!n.key&&n.key.length>0;case"review":const r=e.codeReview||n.codeReview;return o==="OLLAMA"?!!n&&ee(n)&&r:o==="HUGGINGFACE"?!!n&&!!n.cookie&&r:o==="BEDROCK"?ee(n)&&Ke(n)&&r:!!n.key&&n.key.length>0&&r;case"watch":const s=e.watchMode||n.watchMode;return o==="OLLAMA"?!!n&&ee(n)&&s:o==="HUGGINGFACE"?!!n&&!!n.cookie&&s:o==="BEDROCK"?ee(n)&&Ke(n)&&s:n.compatible?!!n.url&&!!n.key&&s:!!n.key&&n.key.length>0&&s}}).map(([o])=>o);class ua{static create(t,o){return new t(o)}}const da="stats.json",qe=2,ma=30,Dt=()=>E.join(cn,da),We=async()=>{const e=Dt();if(!await Fe(e))return{version:qe,metrics:[],selections:[]};try{const t=await I.readFile(e,"utf-8"),o=JSON.parse(t);return!o.version||o.version<qe?{version:qe,metrics:o.metrics||[],selections:o.selections||[]}:o}catch{return{version:qe,metrics:[],selections:[]}}},pa=(e,t)=>{const o=Date.now()-t*24*60*60*1e3;return{version:e.version,metrics:e.metrics.filter(n=>n.timestamp>=o),selections:e.selections.filter(n=>n.timestamp>=o)}},hn=async(e,t)=>{const o=Dt(),n=E.dirname(o),r=t?pa(e,t):e;await I.mkdir(n,{recursive:!0}),await I.writeFile(o,JSON.stringify(r,null,2),"utf-8")},fa=async e=>{const t={timestamp:Date.now(),provider:e.provider,model:e.model,responseTimeMs:e.responseTimeMs,success:e.success,errorCode:e.errorCode,tokensUsed:e.tokensUsed},o=await We();o.metrics.push(t),await hn(o,e.statsDays)},ha=async e=>{const t={timestamp:Date.now(),provider:e.provider,model:e.model},o=await We();o.selections.push(t),await hn(o,e.statsDays)},ga=(e,t,o)=>{const n=t.filter(l=>l.provider===e),r=o.filter(l=>l.provider===e);if(n.length===0)return{provider:e,totalRequests:0,successCount:0,failureCount:0,selectedCount:r.length,selectionRate:0,avgResponseTimeMs:0,minResponseTimeMs:0,maxResponseTimeMs:0};const s=n.filter(l=>l.success),i=n.map(l=>l.responseTimeMs),c=r.length,u=s.length>0?Math.min(100,Math.round(c/s.length*1e3)/10):0;return{provider:e,totalRequests:n.length,successCount:s.length,failureCount:n.length-s.length,selectedCount:c,selectionRate:u,avgResponseTimeMs:Math.round(i.reduce((l,d)=>l+d,0)/i.length),minResponseTimeMs:Math.min(...i),maxResponseTimeMs:Math.max(...i)}},ya=async(e=ma)=>{const t=await We(),o=Date.now()-e*24*60*60*1e3,n=t.metrics.filter(l=>l.timestamp>=o),r=t.selections.filter(l=>l.timestamp>=o);if(n.length===0)return{totalRequests:0,successRate:0,avgResponseTimeMs:0,providerStats:[],periodStart:o,periodEnd:Date.now()};const i=[...new Set(n.map(l=>l.provider))].map(l=>ga(l,n,r)).sort((l,d)=>d.totalRequests-l.totalRequests),c=n.filter(l=>l.success).length,u=n.reduce((l,d)=>l+d.responseTimeMs,0);return{totalRequests:n.length,successRate:Math.round(c/n.length*1e3)/10,avgResponseTimeMs:Math.round(u/n.length),providerStats:i,periodStart:Math.min(...n.map(l=>l.timestamp)),periodEnd:Math.max(...n.map(l=>l.timestamp))}},wa=async()=>{const e=Dt();await Fe(e)&&await I.unlink(e)},ba=async()=>(await We()).metrics.length>0,gn=(e,t)=>{const o=g.red.bold(`[${e}]`);return ar({name:`${o} ${t}`,value:t,isError:!0,disabled:!0})},yn=e=>{let t=!1;return cr({next:o=>{if(Object.assign(o,{provider:e.provider,model:e.model}),e.statsEnabled===!1||t)return;t=!0;const n=o.isError===!0,r={provider:e.provider,model:e.model,responseTimeMs:Date.now()-e.startTime,success:!n,errorCode:n?"REQUEST_ERROR":void 0,statsDays:e.statsDays};fa(r).catch(()=>{})}})};class Ea{constructor(){this.loaders=new Map,this.cache=new Map,this.loadService=async t=>{const o=this.cache.get(t);if(o)return o;const n=this.loaders.get(t);if(!n)return null;const r=await n();return this.cache.set(t,r),r},this.createService=async(t,o)=>{const n=await this.loadService(t);return n?new n(o):null},this.createRequest$=(t,o,n)=>{const r=Date.now(),s=Array.isArray(o.config.model)?o.config.model[0]:o.config.model;return Ie(this.createService(t,o)).pipe(oo(i=>i?(n==="commit"?i.generateCommitMessage$():i.generateCodeReview$()).pipe(yn({provider:t,model:s||"unknown",startTime:r,statsEnabled:o.statsEnabled,statsDays:o.statsDays})):gn(t,"Invalid AI type")))},this.registerBuiltinProviders=()=>{this.loaders.set("OPENAI",()=>import("./openai.service-df984ad9.mjs").then(t=>t.OpenAIService)),this.loaders.set("OPENROUTER",()=>import("./openrouter.service-107eec99.mjs").then(t=>t.OpenRouterService)),this.loaders.set("GEMINI",()=>import("./gemini.service-2c3b0cd4.mjs").then(t=>t.GeminiService)),this.loaders.set("ANTHROPIC",()=>import("./anthropic.service-bff34bb1.mjs").then(t=>t.AnthropicService)),this.loaders.set("HUGGINGFACE",()=>import("./hugging-face.service-966de0cf.mjs").then(t=>t.HuggingFaceService)),this.loaders.set("MISTRAL",()=>import("./mistral.service-3389f888.mjs").then(t=>t.MistralService)),this.loaders.set("CODESTRAL",()=>import("./codestral.service-59a12e78.mjs").then(t=>t.CodestralService)),this.loaders.set("OLLAMA",()=>import("./ollama.service-c5b469be.mjs").then(t=>t.OllamaService)),this.loaders.set("COHERE",()=>import("./cohere.service-80e89971.mjs").then(t=>t.CohereService)),this.loaders.set("GROQ",()=>import("./groq.service-5cf5b8c9.mjs").then(t=>t.GroqService)),this.loaders.set("PERPLEXITY",()=>import("./perplexity.service-eda88944.mjs").then(t=>t.PerplexityService)),this.loaders.set("BEDROCK",()=>import("./bedrock.service-419a856c.mjs").then(t=>t.BedrockService)),this.loaders.set("GITHUB_MODELS",()=>import("./github-models.service-37847903.mjs").then(t=>t.GitHubModelsService)),this.loaders.set("DEEPSEEK",()=>import("./deep-seek.service-86125741.mjs").then(t=>t.DeepSeekService))},this.registerBuiltinProviders()}}const va=new Ea;class Ye{constructor(t,o,n=""){this.config=t,this.stagedDiff=o,this.branchName=n,this.extractProviderName=r=>{if(!r)return"compatible";try{return new URL(r).hostname}catch{return"compatible"}},this.createCommitMsgRequests$=r=>this.createServiceRequests$(r,"commit"),this.createCodeReviewRequests$=r=>this.createServiceRequests$(r,"review"),this.createServiceRequests$=(r,s)=>Ie(r).pipe(no(i=>this.createProviderRequests$(i,s)),lr(i=>gn("UNKNOWN",i.message||"Unknown error"))),this.createProviderRequests$=(r,s)=>{const i=this.config[r],c=Array.isArray(i.model)?i.model:[i.model];return Ie(c).pipe(no(u=>this.createModelRequest$(r,u,s)))},this.createModelRequest$=(r,s,i)=>{const c=this.config[r];return c.compatible?this.createCompatibleServiceRequest$(c,s,i):va.createRequest$(r,{config:{...c,model:s},stagedDiff:this.stagedDiff,keyName:s,branchName:this.branchName,statsEnabled:this.config.useStats,statsDays:this.config.statsDays},i)},this.createCompatibleServiceRequest$=(r,s,i)=>{const c=Date.now(),u=this.extractProviderName(r.url);return Ie(import("./openai-compatible.service-599ec5d0.mjs")).pipe(oo(({OpenAICompatibleService:l})=>{const d=ua.create(l,{config:{...r,url:r.url||"",path:r.path||"",model:s},stagedDiff:this.stagedDiff,keyName:s,branchName:this.branchName});return(i==="commit"?d.generateCommitMessage$():d.generateCodeReview$()).pipe(yn({provider:u,model:s,startTime:c,statsEnabled:this.config.useStats,statsDays:this.config.statsDays}))}))}}}class Nt{getDetectedMessage(t){return`Detected ${t.files.length.toLocaleString()} changed file${t.files.length>1?"s":""} (${t.diff.length.toLocaleString()} characters)`}getDetectedFiles(t){return`Detected ${t.length.toLocaleString()} changed file${t.length>1?"s":""}`}}class ze extends Nt{constructor(){super(...arguments),this.name="git",this.excludeFromDiff=t=>`:(exclude)${t}`,this.filesToExclude=["package-lock.json","pnpm-lock.yaml","*.lock","*.lockb"].map(this.excludeFromDiff)}async assertRepo(){try{const{stdout:t}=await b("git",["rev-parse","--show-toplevel"],{reject:!0});return t.trim()}catch(t){const o=t;if(o.code==="ENOENT")throw new p(`Git command not found!
18
+ See https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles.html`),n}).filter(o=>!!o&&o.length>0):["anthropic.claude-haiku-4-5-20251001-v1:0"],runtimeMode:e=>{e&&console.warn("[Bedrock] DEPRECATION: runtimeMode is no longer used. Authentication method is now auto-detected from configured credentials.")},region:e=>e||process.env.AWS_REGION||process.env.AWS_DEFAULT_REGION||"",profile:e=>e||process.env.AWS_PROFILE||"",accessKeyId:e=>e||process.env.AWS_ACCESS_KEY_ID||"",secretAccessKey:e=>e||process.env.AWS_SECRET_ACCESS_KEY||"",sessionToken:e=>e||process.env.AWS_SESSION_TOKEN||"",applicationEndpointId:e=>e||process.env.BEDROCK_APPLICATION_ENDPOINT_ID||"",applicationInferenceProfileArn:e=>e||process.env.BEDROCK_APPLICATION_INFERENCE_PROFILE_ARN||process.env.BEDROCK_INFERENCE_PROFILE_ARN||"",applicationBaseUrl:e=>e||process.env.BEDROCK_APPLICATION_BASE_URL||"",systemPrompt:a.systemPrompt,systemPromptPath:a.systemPromptPath,codeReviewPromptPath:a.codeReviewPromptPath,timeout:a.timeout,temperature:e=>{if(!e)return;C("temperature",/^(2|\d)(\.\d{1,2})?$/.test(e),"Must be decimal between 0 and 2");const t=Number(e);return C("temperature",t>0,"Must be greater than 0"),C("temperature",t<=2,"Must be less than or equal to 2"),t},maxTokens:e=>{if(e)return C("maxTokens",/^\d+$/.test(e),"Must be an integer"),Number(e)},logging:a.logging,locale:a.locale,generate:a.generate,type:a.type,maxLength:a.maxLength,includeBody:a.includeBody,topP:e=>{if(!e)return;C("topP",/^(1|\d)(\.\d{1,2})?$/.test(e),"Must be decimal between 0 and 1");const t=Number(e);return C("topP",t>0,"Must be greater than 0"),C("topP",t<=1,"Must be less than or equal to 1"),t},codeReview:a.codeReview,disabled:a.disabled,stream:a.stream,watchMode:a.watchMode,disableLowerCase:a.disableLowerCase,inferenceParameters:Be("BEDROCK.inferenceParameters")}},ta=e=>typeof e=="object"&&e!==null,mn=(e,t)=>{Object.keys(e).forEach(o=>{const n=e[o];ta(n)&&t in n&&(n[t]=!0)})},oa=e=>{mn(e,"includeBody")},na=e=>{mn(e,"disableLowerCase")};let Ce,Ae=null,Lt=null;const ra=(e=[])=>{const t={};for(const o of e)if(o.startsWith("--")){const[n,r]=o.slice(2).split("="),[s,i]=n.split(".");s&&i&&s in ve?(t[s]||(t[s]={}),t[s][i]=r):t[n]=r}return t},sa=()=>{const e=$e.homedir(),t=process.env.AICOMMIT_CONFIG_PATH,o=ln,n=E.join(e,".aicommit2");return[t,o,n].filter(r=>!!r)},de=async()=>{const e=sa();for(const t of e)if(await Fe(t))return t;return ln},ia=e=>e.replace(/\$\{([a-zA-Z_][a-zA-Z0-9_]*)\}|\$([a-zA-Z_][a-zA-Z0-9_]*)/g,(t,o,n)=>{const r=o||n;return process.env[r]??""}),pn=e=>{if(Array.isArray(e)||e===null||typeof e!="object")return e;const t={};for(const[o,n]of Object.entries(e)){const r=pn(n);if(!o.includes(".")){t[o]=r;continue}const s=o.split(".");let i=t;for(const c of s.slice(0,-1)){const u=i[c];(!u||typeof u!="object"||Array.isArray(u))&&(i[c]={}),i=i[c]}i[s[s.length-1]]=r}return t},Pe=async()=>{const e=await de();if(Ae&&Lt===e)return Ae;Ce=e;try{const t=await I.readFile(e,"utf8"),o=ia(t);return Ae=pn(le.parse(o)),Lt=e,Ae}catch(t){return t.code==="ENOENT"?(Ce=void 0,{}):(console.error(`Error reading config file ${e}:`,t),Ce=void 0,{})}},fn=()=>{Ae=null,Lt=null},J=async(e,t=[])=>{const o=await Pe(),n=ra(t),r={...e,...n},s={},i=ea(o),c={};for(const l of i){const d=o[l]?.envKey;let f;d?(f=[d],l==="BEDROCK"&&d!=="BEDROCK_APPLICATION_API_KEY"&&f.push("BEDROCK_APPLICATION_API_KEY")):l==="BEDROCK"?f=["BEDROCK_API_KEY","BEDROCK_APPLICATION_API_KEY"]:f=[`${l}_API_KEY`];const y=f.map(h=>h?process.env[h]:void 0).find(h=>typeof h=="string"&&h.length>0);y&&(c[l]={key:y})}const u=(l,d)=>{const f=r[`${l}.${d}`]??r[l]?.[d],y=c[l]?.[d],h=o[l]?.[d],m=r[d]??o[d];return f!==void 0?f:y!==void 0?y:h!==void 0?h:m};for(const[l,d]of Object.entries(a)){const f=r[l]??o[l];s[l]=d(f)}for(const l of i){s[l]={};const d=ve[l]||Ue(l);for(const[f,y]of Object.entries(d)){const h=u(l,f);s[l][f]=y(h)}}return s},He=async e=>{const t=await Pe();for(const[r,s]of e){const[i,c]=r.split(".");if(!c){const d=a[r];if(!d)throw new p(`Invalid config property: ${r}`);t[r]=d(s);continue}if(t[i]||(t[i]={}),ue.includes(i)){const d=ve[i][c];if(!d)throw new p(`Invalid config property: ${r}`);t[i][c]=d(s);continue}if(!/^[A-Z][A-Z0-9_]*$/.test(i))throw new p(`Invalid service name: ${i}. Service names must be uppercase letters, numbers, and underscores.`);const l=Ue(i);if(!l[c])throw new p(`Invalid config property for custom service: ${r}`);try{t[i][c]=l[c](s)}catch(d){throw d instanceof p?d:new p(`Invalid value for ${r}: ${d.message}`)}}const o=await de(),n=E.dirname(o);await I.mkdir(n,{recursive:!0}),await I.writeFile(o,le.stringify(t),"utf8"),fn()},aa=async e=>{const t=await Pe();for(const[r,s]of e){const[i,c]=r.split("."),u=t[i];if(c==="model"){u||(t[i]={});const d=t[i][c]||[],f=typeof s=="string"?s.split(",").map(y=>y.trim()).filter(y=>!!y):s;t[i][c]=Ot([...d,...f]);continue}if(u&&u.compatible===!0){u||(t[i]={});const d=Ue(i);if(!d[c])throw new p(`Invalid config property: ${r}`);try{t[i][c]=d[c](s)}catch(f){throw f instanceof p?f:new p(`Invalid value for ${r}: ${f.message}`)}continue}if(i in ve){u||(t[i]={});const d=ve[i][c];if(!d)throw new p(`Invalid config property: ${r}`);t[i][c]=d(s)}else{const d=Ue(i);if(!d[c])throw new p(`Invalid config property: ${r}`);t[i]||(t[i]={}),t[i][c]=d[c](s)}}const o=await de(),n=E.dirname(o);await I.mkdir(n,{recursive:!0}),await I.writeFile(o,le.stringify(t),"utf8"),fn()},ca=async()=>{const e=await Pe();console.log(le.stringify(e))},la=async()=>{console.log(await de())},Ue=e=>({compatible:_("compatible"),stream:_("stream"),url:t=>t?(C(`${e}.url`,/^https?:\/\//.test(t),"Must be a valid URL"),t):"",path:t=>t||"",key:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(n=>n.trim()).filter(n=>!!n&&n.length>0):[],systemPrompt:a.systemPrompt,systemPromptPath:a.systemPromptPath,codeReviewPromptPath:a.codeReviewPromptPath,timeout:a.timeout,temperature:a.temperature,maxTokens:a.maxTokens,logging:a.logging,locale:a.locale,generate:a.generate,type:a.type,maxLength:a.maxLength,includeBody:a.includeBody,topP:a.topP,codeReview:a.codeReview,disabled:a.disabled,watchMode:a.watchMode,disableLowerCase:a.disableLowerCase,autoCopy:a.autoCopy}),L=e=>typeof e=="string"&&e.trim().length>0,ee=e=>(Array.isArray(e.model)?e.model:L(e.model)?[e.model.trim()]:[]).length>0,Ke=e=>{const t=L(e.key),o=L(e.region)||L(process.env.AWS_REGION)||L(process.env.AWS_DEFAULT_REGION),n=L(e.profile)||L(process.env.AWS_PROFILE),r=L(e.accessKeyId)&&L(e.secretAccessKey)||L(process.env.AWS_ACCESS_KEY_ID)&&L(process.env.AWS_SECRET_ACCESS_KEY),s=L(e.applicationBaseUrl)||L(process.env.BEDROCK_APPLICATION_BASE_URL),i=L(e.applicationEndpointId)||L(process.env.BEDROCK_APPLICATION_ENDPOINT_ID),c=L(process.env.BEDROCK_APPLICATION_API_KEY);return o&&(t||n||r)||(s&&t||i&&c)},me=(e,t)=>Object.entries(e).map(([o,n])=>[o,n]).filter(([o,n])=>!n.disabled).filter(([o,n])=>ue.includes(o)||n.compatible===!0).filter(([o,n])=>{switch(t){case"commit":return o==="OLLAMA"?!!n&&ee(n):o==="HUGGINGFACE"?!!n&&!!n.cookie:o==="BEDROCK"?ee(n)&&Ke(n):!!n.key&&n.key.length>0;case"review":const r=e.codeReview||n.codeReview;return o==="OLLAMA"?!!n&&ee(n)&&r:o==="HUGGINGFACE"?!!n&&!!n.cookie&&r:o==="BEDROCK"?ee(n)&&Ke(n)&&r:!!n.key&&n.key.length>0&&r;case"watch":const s=e.watchMode||n.watchMode;return o==="OLLAMA"?!!n&&ee(n)&&s:o==="HUGGINGFACE"?!!n&&!!n.cookie&&s:o==="BEDROCK"?ee(n)&&Ke(n)&&s:n.compatible?!!n.url&&!!n.key&&s:!!n.key&&n.key.length>0&&s}}).map(([o])=>o);class ua{static create(t,o){return new t(o)}}const da="stats.json",qe=2,ma=30,Dt=()=>E.join(cn,da),We=async()=>{const e=Dt();if(!await Fe(e))return{version:qe,metrics:[],selections:[]};try{const t=await I.readFile(e,"utf-8"),o=JSON.parse(t);return!o.version||o.version<qe?{version:qe,metrics:o.metrics||[],selections:o.selections||[]}:o}catch{return{version:qe,metrics:[],selections:[]}}},pa=(e,t)=>{const o=Date.now()-t*24*60*60*1e3;return{version:e.version,metrics:e.metrics.filter(n=>n.timestamp>=o),selections:e.selections.filter(n=>n.timestamp>=o)}},hn=async(e,t)=>{const o=Dt(),n=E.dirname(o),r=t?pa(e,t):e;await I.mkdir(n,{recursive:!0}),await I.writeFile(o,JSON.stringify(r,null,2),"utf-8")},fa=async e=>{const t={timestamp:Date.now(),provider:e.provider,model:e.model,responseTimeMs:e.responseTimeMs,success:e.success,errorCode:e.errorCode,tokensUsed:e.tokensUsed},o=await We();o.metrics.push(t),await hn(o,e.statsDays)},ha=async e=>{const t={timestamp:Date.now(),provider:e.provider,model:e.model},o=await We();o.selections.push(t),await hn(o,e.statsDays)},ga=(e,t,o)=>{const n=t.filter(l=>l.provider===e),r=o.filter(l=>l.provider===e);if(n.length===0)return{provider:e,totalRequests:0,successCount:0,failureCount:0,selectedCount:r.length,selectionRate:0,avgResponseTimeMs:0,minResponseTimeMs:0,maxResponseTimeMs:0};const s=n.filter(l=>l.success),i=n.map(l=>l.responseTimeMs),c=r.length,u=s.length>0?Math.min(100,Math.round(c/s.length*1e3)/10):0;return{provider:e,totalRequests:n.length,successCount:s.length,failureCount:n.length-s.length,selectedCount:c,selectionRate:u,avgResponseTimeMs:Math.round(i.reduce((l,d)=>l+d,0)/i.length),minResponseTimeMs:Math.min(...i),maxResponseTimeMs:Math.max(...i)}},ya=async(e=ma)=>{const t=await We(),o=Date.now()-e*24*60*60*1e3,n=t.metrics.filter(l=>l.timestamp>=o),r=t.selections.filter(l=>l.timestamp>=o);if(n.length===0)return{totalRequests:0,successRate:0,avgResponseTimeMs:0,providerStats:[],periodStart:o,periodEnd:Date.now()};const i=[...new Set(n.map(l=>l.provider))].map(l=>ga(l,n,r)).sort((l,d)=>d.totalRequests-l.totalRequests),c=n.filter(l=>l.success).length,u=n.reduce((l,d)=>l+d.responseTimeMs,0);return{totalRequests:n.length,successRate:Math.round(c/n.length*1e3)/10,avgResponseTimeMs:Math.round(u/n.length),providerStats:i,periodStart:Math.min(...n.map(l=>l.timestamp)),periodEnd:Math.max(...n.map(l=>l.timestamp))}},wa=async()=>{const e=Dt();await Fe(e)&&await I.unlink(e)},ba=async()=>(await We()).metrics.length>0,gn=(e,t)=>{const o=g.red.bold(`[${e}]`);return ar({name:`${o} ${t}`,value:t,isError:!0,disabled:!0})},yn=e=>{let t=!1;return cr({next:o=>{if(Object.assign(o,{provider:e.provider,model:e.model}),e.statsEnabled===!1||t)return;t=!0;const n=o.isError===!0,r={provider:e.provider,model:e.model,responseTimeMs:Date.now()-e.startTime,success:!n,errorCode:n?"REQUEST_ERROR":void 0,statsDays:e.statsDays};fa(r).catch(()=>{})}})};class Ea{constructor(){this.loaders=new Map,this.cache=new Map,this.loadService=async t=>{const o=this.cache.get(t);if(o)return o;const n=this.loaders.get(t);if(!n)return null;const r=await n();return this.cache.set(t,r),r},this.createService=async(t,o)=>{const n=await this.loadService(t);return n?new n(o):null},this.createRequest$=(t,o,n)=>{const r=Date.now(),s=Array.isArray(o.config.model)?o.config.model[0]:o.config.model;return Ie(this.createService(t,o)).pipe(oo(i=>i?(n==="commit"?i.generateCommitMessage$():i.generateCodeReview$()).pipe(yn({provider:t,model:s||"unknown",startTime:r,statsEnabled:o.statsEnabled,statsDays:o.statsDays})):gn(t,"Invalid AI type")))},this.registerBuiltinProviders=()=>{this.loaders.set("OPENAI",()=>import("./openai.service-cac0981d.mjs").then(t=>t.OpenAIService)),this.loaders.set("OPENROUTER",()=>import("./openrouter.service-393bb505.mjs").then(t=>t.OpenRouterService)),this.loaders.set("GEMINI",()=>import("./gemini.service-561a56c3.mjs").then(t=>t.GeminiService)),this.loaders.set("ANTHROPIC",()=>import("./anthropic.service-96c06fb4.mjs").then(t=>t.AnthropicService)),this.loaders.set("HUGGINGFACE",()=>import("./hugging-face.service-73d6cacd.mjs").then(t=>t.HuggingFaceService)),this.loaders.set("MISTRAL",()=>import("./mistral.service-f1a0c8d4.mjs").then(t=>t.MistralService)),this.loaders.set("CODESTRAL",()=>import("./codestral.service-87eb83a7.mjs").then(t=>t.CodestralService)),this.loaders.set("OLLAMA",()=>import("./ollama.service-c7689836.mjs").then(t=>t.OllamaService)),this.loaders.set("COHERE",()=>import("./cohere.service-57428091.mjs").then(t=>t.CohereService)),this.loaders.set("GROQ",()=>import("./groq.service-2d3c6f6f.mjs").then(t=>t.GroqService)),this.loaders.set("PERPLEXITY",()=>import("./perplexity.service-6563c4f1.mjs").then(t=>t.PerplexityService)),this.loaders.set("BEDROCK",()=>import("./bedrock.service-c4a4966a.mjs").then(t=>t.BedrockService)),this.loaders.set("GITHUB_MODELS",()=>import("./github-models.service-181c9920.mjs").then(t=>t.GitHubModelsService)),this.loaders.set("DEEPSEEK",()=>import("./deep-seek.service-ddd3ae03.mjs").then(t=>t.DeepSeekService))},this.registerBuiltinProviders()}}const va=new Ea;class Ye{constructor(t,o,n=""){this.config=t,this.stagedDiff=o,this.branchName=n,this.extractProviderName=r=>{if(!r)return"compatible";try{return new URL(r).hostname}catch{return"compatible"}},this.createCommitMsgRequests$=r=>this.createServiceRequests$(r,"commit"),this.createCodeReviewRequests$=r=>this.createServiceRequests$(r,"review"),this.createServiceRequests$=(r,s)=>Ie(r).pipe(no(i=>this.createProviderRequests$(i,s)),lr(i=>gn("UNKNOWN",i.message||"Unknown error"))),this.createProviderRequests$=(r,s)=>{const i=this.config[r],c=Array.isArray(i.model)?i.model:[i.model];return Ie(c).pipe(no(u=>this.createModelRequest$(r,u,s)))},this.createModelRequest$=(r,s,i)=>{const c=this.config[r];return c.compatible?this.createCompatibleServiceRequest$(c,s,i):va.createRequest$(r,{config:{...c,model:s},stagedDiff:this.stagedDiff,keyName:s,branchName:this.branchName,statsEnabled:this.config.useStats,statsDays:this.config.statsDays},i)},this.createCompatibleServiceRequest$=(r,s,i)=>{const c=Date.now(),u=this.extractProviderName(r.url);return Ie(import("./openai-compatible.service-0f3f1008.mjs")).pipe(oo(({OpenAICompatibleService:l})=>{const d=ua.create(l,{config:{...r,url:r.url||"",path:r.path||"",model:s},stagedDiff:this.stagedDiff,keyName:s,branchName:this.branchName});return(i==="commit"?d.generateCommitMessage$():d.generateCodeReview$()).pipe(yn({provider:u,model:s,startTime:c,statsEnabled:this.config.useStats,statsDays:this.config.statsDays}))}))}}}class Nt{getDetectedMessage(t){return`Detected ${t.files.length.toLocaleString()} changed file${t.files.length>1?"s":""} (${t.diff.length.toLocaleString()} characters)`}getDetectedFiles(t){return`Detected ${t.length.toLocaleString()} changed file${t.length>1?"s":""}`}}class ze extends Nt{constructor(){super(...arguments),this.name="git",this.excludeFromDiff=t=>`:(exclude)${t}`,this.filesToExclude=["package-lock.json","pnpm-lock.yaml","*.lock","*.lockb"].map(this.excludeFromDiff)}async assertRepo(){try{const{stdout:t}=await b("git",["rev-parse","--show-toplevel"],{reject:!0});return t.trim()}catch(t){const o=t;if(o.code==="ENOENT")throw new p(`Git command not found!
19
19
 
20
20
  Please install Git first: https://git-scm.com/downloads`);if(o.stderr){if(o.stderr.includes("not a git repository"))throw new p(`Not in a Git repository!
21
21
 
package/dist/cli.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import"cleye";import"./cli-83e0874c.mjs";import"module";import"crypto";import"fs";import"os";import"path";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"rxjs";import"fs/promises";import"chalk";import"readline";import"figlet";import"gradient-string";import"ora";import"inquirer-reactive-list-prompt";import"winston";import"winston-daily-rotate-file";import"axios";import"url";import"node:fs/promises";import"chokidar";import"rxjs/operators";
2
+ import"cleye";import"./cli-0dd7e35c.mjs";import"module";import"crypto";import"fs";import"os";import"path";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"rxjs";import"fs/promises";import"chalk";import"readline";import"figlet";import"gradient-string";import"ora";import"inquirer-reactive-list-prompt";import"winston";import"winston-daily-rotate-file";import"axios";import"url";import"node:fs/promises";import"chokidar";import"rxjs/operators";
@@ -1 +1 @@
1
- import f from"chalk";import{concatMap as g,from as u,map as C,catchError as y}from"rxjs";import{fromPromise as v}from"rxjs/internal/observable/innerFrom";import{A as M,l as k,a as R,b as _,c as x,e as P,d as D}from"./ai.service-da8345b1.mjs";import{D as E,b as N,g as S,k as A,n as $,H as B}from"./cli-83e0874c.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 U extends M{constructor(t){super(t),this.params=t,this.apiKey="",this.colors={primary:"#e28c58",secondary:"#fff"},this.serviceName=f.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Codestral]"),this.errorPrefix=f.red.bold("[Codestral]"),this.apiKey=this.params.config.key}getServiceSpecificErrorMessage(t){const e=t.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your Codestral API key in configuration":e.includes("rate_limit")||e.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Codestral plan":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the Codestral model name is correct":e.includes("Invalid model type")?"Invalid model type. Use supported models: codestral-latest, codestral-2501":e.includes("overloaded")||e.includes("capacity")?"Codestral service is overloaded. Try again in a few minutes":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this Codestral model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your Codestral model configuration":e.includes("500")||e.includes("Internal Server Error")?"Codestral server error. Try again later":null}generateCommitMessage$(){return v(this.generateMessage("commit")).pipe(g(t=>u(t)),C(this.formatAsChoice),y(this.handleError$))}generateCodeReview$(){return v(this.generateMessage("review")).pipe(g(t=>u(t)),C(this.formatCodeReviewAsChoice),y(this.handleError$))}async generateMessage(t){const e=this.params.stagedDiff.diff,{systemPrompt:r,systemPromptPath:s,codeReviewPromptPath:m,logging:i,locale:l,generate:a,type:n,maxLength:p}=this.params.config,o={...E,locale:l,maxLength:p,type:n,generate:a,systemPrompt:r,systemPromptPath:s,codeReviewPromptPath:m,vcs_branch:this.params.branchName||""},d=t==="review"?N(o):S(o);this.checkAvailableModels();const c=A(e,t),I=`${this.params.config.url||"https://codestral.mistral.ai"}/v1/chat/completions`,b={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};k(e,t,"Codestral",this.params.config.model,I,b,i),R(e,t,"Codestral",d,c,i);const h=await this.createChatCompletions(d,t);return t==="review"?this.parseCodeReview(h):this.parseMessage(h,n,a)}checkAvailableModels(){if(["codestral-latest","codestral-2501"].includes(this.params.config.model))return!0;throw new Error("Invalid model type of Codestral AI")}async createChatCompletions(t,e){const r=this.params.stagedDiff.diff,{logging:s}=this.params.config,m=this.params.config.url||"https://codestral.mistral.ai",i={model:this.params.config.model,messages:[{role:"system",content:t},{role:"user",content:A(this.params.stagedDiff.diff,e)}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1,safe_prompt:!1,random_seed:$(10,1e3)};e==="commit"&&(i.response_format={type:"json_object"}),_(r,e,"Codestral",i,s);const l=Date.now();try{const n=await new B({method:"POST",baseURL:`${m}/v1/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(i).execute(),p=Date.now()-l,o=n.data;if(x(r,e,"Codestral",o,s),!o.choices||o.choices.length===0||!o.choices[0].message?.content)throw P(r,e,"Codestral",{message:"No Content on response",result:o},s),new Error("No Content on response. Please open a Bug report");const c=o.choices[0].message.content;return D(r,e,"Codestral",p,c,s),c}catch(a){throw P(r,e,"Codestral",a,s),a}}}export{U as CodestralService};
1
+ import f from"chalk";import{concatMap as g,from as u,map as C,catchError as y}from"rxjs";import{fromPromise as v}from"rxjs/internal/observable/innerFrom";import{A as M,l as k,a as R,b as _,c as x,e as P,d as D}from"./ai.service-7cce5ee0.mjs";import{D as E,b as N,g as S,k as A,n as $,H as B}from"./cli-0dd7e35c.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 U extends M{constructor(t){super(t),this.params=t,this.apiKey="",this.colors={primary:"#e28c58",secondary:"#fff"},this.serviceName=f.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Codestral]"),this.errorPrefix=f.red.bold("[Codestral]"),this.apiKey=this.params.config.key}getServiceSpecificErrorMessage(t){const e=t.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your Codestral API key in configuration":e.includes("rate_limit")||e.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Codestral plan":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the Codestral model name is correct":e.includes("Invalid model type")?"Invalid model type. Use supported models: codestral-latest, codestral-2501":e.includes("overloaded")||e.includes("capacity")?"Codestral service is overloaded. Try again in a few minutes":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this Codestral model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your Codestral model configuration":e.includes("500")||e.includes("Internal Server Error")?"Codestral server error. Try again later":null}generateCommitMessage$(){return v(this.generateMessage("commit")).pipe(g(t=>u(t)),C(this.formatAsChoice),y(this.handleError$))}generateCodeReview$(){return v(this.generateMessage("review")).pipe(g(t=>u(t)),C(this.formatCodeReviewAsChoice),y(this.handleError$))}async generateMessage(t){const e=this.params.stagedDiff.diff,{systemPrompt:r,systemPromptPath:s,codeReviewPromptPath:m,logging:i,locale:l,generate:a,type:n,maxLength:p}=this.params.config,o={...E,locale:l,maxLength:p,type:n,generate:a,systemPrompt:r,systemPromptPath:s,codeReviewPromptPath:m,vcs_branch:this.params.branchName||""},d=t==="review"?N(o):S(o);this.checkAvailableModels();const c=A(e,t),I=`${this.params.config.url||"https://codestral.mistral.ai"}/v1/chat/completions`,b={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};k(e,t,"Codestral",this.params.config.model,I,b,i),R(e,t,"Codestral",d,c,i);const h=await this.createChatCompletions(d,t);return t==="review"?this.parseCodeReview(h):this.parseMessage(h,n,a)}checkAvailableModels(){if(["codestral-latest","codestral-2501"].includes(this.params.config.model))return!0;throw new Error("Invalid model type of Codestral AI")}async createChatCompletions(t,e){const r=this.params.stagedDiff.diff,{logging:s}=this.params.config,m=this.params.config.url||"https://codestral.mistral.ai",i={model:this.params.config.model,messages:[{role:"system",content:t},{role:"user",content:A(this.params.stagedDiff.diff,e)}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1,safe_prompt:!1,random_seed:$(10,1e3)};e==="commit"&&(i.response_format={type:"json_object"}),_(r,e,"Codestral",i,s);const l=Date.now();try{const n=await new B({method:"POST",baseURL:`${m}/v1/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(i).execute(),p=Date.now()-l,o=n.data;if(x(r,e,"Codestral",o,s),!o.choices||o.choices.length===0||!o.choices[0].message?.content)throw P(r,e,"Codestral",{message:"No Content on response",result:o},s),new Error("No Content on response. Please open a Bug report");const c=o.choices[0].message.content;return D(r,e,"Codestral",p,c,s),c}catch(a){throw P(r,e,"Codestral",a,s),a}}}export{U as CodestralService};
@@ -1 +1 @@
1
- import h from"chalk";import{CohereClientV2 as x}from"cohere-ai";import{concatMap as d,from as l,map as g,catchError as f}from"rxjs";import{fromPromise as u}from"rxjs/internal/observable/innerFrom";import{A as E,l as S,a as D,b as _,c as $,d as N,e as V}from"./ai.service-da8345b1.mjs";import{D as O,b as F,g as U,n as H}from"./cli-83e0874c.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 L extends E{constructor(r){super(r),this.params=r,this.colors={primary:"#D18EE2",secondary:"#fff"},this.serviceName=h.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Cohere]"),this.errorPrefix=h.red.bold("[Cohere]"),this.cohere=new x({token:this.params.config.key})}isValidCohereV2Response(r){const e=r;return e?.message?.content!==void 0&&Array.isArray(e.message.content)&&e.message.content.length>0&&typeof e.message.content[0]?.text=="string"}getServiceSpecificErrorMessage(r){const e=r.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your Cohere API key in configuration":e.includes("rate_limit")||e.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Cohere plan":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the Cohere model name is correct":e.includes("overloaded")||e.includes("capacity")?"Cohere service is overloaded. Try again in a few minutes":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this Cohere model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your Cohere model configuration":e.includes("500")||e.includes("Internal Server Error")?"Cohere server error. Try again later":null}generateCommitMessage$(){return u(this.generateMessage("commit")).pipe(d(r=>l(r)),g(this.formatAsChoice),f(this.handleError$))}generateCodeReview$(){return u(this.generateMessage("review")).pipe(d(r=>l(r)),g(this.formatCodeReviewAsChoice),f(this.handleError$))}async generateMessage(r){const e=this.params.stagedDiff.diff,{systemPrompt:C,systemPromptPath:v,codeReviewPromptPath:y,logging:o,temperature:P,locale:A,generate:n,type:a,maxLength:I,maxTokens:w}=this.params.config,m={...O,locale:A,maxLength:I,type:a,generate:n,systemPrompt:C,systemPromptPath:v,codeReviewPromptPath:y,vcs_branch:this.params.branchName||""},i=r==="review"?F(m):U(m),c=`Here is the diff: ${e}`,k=[...i?[{role:"system",content:i}]:[],{role:"user",content:c}],M=`${this.params.config.url}/v2/chat`;S(e,r,"Cohere",this.params.config.model,M,{},o),D(e,r,"Cohere",i,c,o);const p={model:this.params.config.model,messages:k,max_tokens:w,temperature:P,seed:H(10,1e3),p:this.params.config.topP};_(e,r,"Cohere",p,o);const R=Date.now();try{const t=await this.cohere.chat(p,{timeoutInSeconds:Math.floor(this.params.config.timeout/1e3)}),b=Date.now()-R;if(!this.isValidCohereV2Response(t))throw new Error("Invalid response structure from Cohere v2 API");const s=t.message.content[0].text;return $(e,r,"Cohere",t,o),N(e,r,"Cohere",b,s,o),r==="review"?this.parseCodeReview(s):this.parseMessage(s,a,n)}catch(t){throw V(e,r,"Cohere",t,o),t}}}export{L as CohereService};
1
+ import h from"chalk";import{CohereClientV2 as x}from"cohere-ai";import{concatMap as d,from as l,map as g,catchError as f}from"rxjs";import{fromPromise as u}from"rxjs/internal/observable/innerFrom";import{A as E,l as S,a as D,b as _,c as $,d as N,e as V}from"./ai.service-7cce5ee0.mjs";import{D as O,b as F,g as U,n as H}from"./cli-0dd7e35c.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 L extends E{constructor(r){super(r),this.params=r,this.colors={primary:"#D18EE2",secondary:"#fff"},this.serviceName=h.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Cohere]"),this.errorPrefix=h.red.bold("[Cohere]"),this.cohere=new x({token:this.params.config.key})}isValidCohereV2Response(r){const e=r;return e?.message?.content!==void 0&&Array.isArray(e.message.content)&&e.message.content.length>0&&typeof e.message.content[0]?.text=="string"}getServiceSpecificErrorMessage(r){const e=r.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your Cohere API key in configuration":e.includes("rate_limit")||e.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Cohere plan":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the Cohere model name is correct":e.includes("overloaded")||e.includes("capacity")?"Cohere service is overloaded. Try again in a few minutes":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this Cohere model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your Cohere model configuration":e.includes("500")||e.includes("Internal Server Error")?"Cohere server error. Try again later":null}generateCommitMessage$(){return u(this.generateMessage("commit")).pipe(d(r=>l(r)),g(this.formatAsChoice),f(this.handleError$))}generateCodeReview$(){return u(this.generateMessage("review")).pipe(d(r=>l(r)),g(this.formatCodeReviewAsChoice),f(this.handleError$))}async generateMessage(r){const e=this.params.stagedDiff.diff,{systemPrompt:C,systemPromptPath:v,codeReviewPromptPath:y,logging:o,temperature:P,locale:A,generate:n,type:a,maxLength:I,maxTokens:w}=this.params.config,m={...O,locale:A,maxLength:I,type:a,generate:n,systemPrompt:C,systemPromptPath:v,codeReviewPromptPath:y,vcs_branch:this.params.branchName||""},i=r==="review"?F(m):U(m),c=`Here is the diff: ${e}`,k=[...i?[{role:"system",content:i}]:[],{role:"user",content:c}],M=`${this.params.config.url}/v2/chat`;S(e,r,"Cohere",this.params.config.model,M,{},o),D(e,r,"Cohere",i,c,o);const p={model:this.params.config.model,messages:k,max_tokens:w,temperature:P,seed:H(10,1e3),p:this.params.config.topP};_(e,r,"Cohere",p,o);const R=Date.now();try{const t=await this.cohere.chat(p,{timeoutInSeconds:Math.floor(this.params.config.timeout/1e3)}),b=Date.now()-R;if(!this.isValidCohereV2Response(t))throw new Error("Invalid response structure from Cohere v2 API");const s=t.message.content[0].text;return $(e,r,"Cohere",t,o),N(e,r,"Cohere",b,s,o),r==="review"?this.parseCodeReview(s):this.parseMessage(s,a,n)}catch(t){throw V(e,r,"Cohere",t,o),t}}}export{L as CohereService};
@@ -1 +1 @@
1
- import v from"chalk";import K from"openai";import{concatMap as w,from as A,map as C,catchError as I}from"rxjs";import{fromPromise as M}from"rxjs/internal/observable/innerFrom";import{A as W,l as b,a as x,b as R,c as $,d as _,e as E}from"./ai.service-da8345b1.mjs";import{D as U,g as O,b as Y,k as L}from"./cli-83e0874c.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 G extends W{constructor(t){super(t),this.params=t,this.generateStreamingCommitMessage$=()=>{const{generate:s,type:o}=this.params.config;return this.createStreamingCommitMessages$(i=>{this.streamChunks(i).catch(a=>i.error(a))},o,s)},this.streamChunks=async s=>{const o=this.params.stagedDiff.diff,{systemPrompt:i,systemPromptPath:a,codeReviewPromptPath:p,logging:r,locale:c,generate:m,type:n,maxLength:l}=this.params.config,h={...U,locale:c,maxLength:l,type:n,generate:m,systemPrompt:i,systemPromptPath:a,codeReviewPromptPath:p,vcs_branch:this.params.branchName||""},f=O(h);this.checkAvailableModels();const d=L(o,"commit"),g=`${this.params.config.url||"https://api.deepseek.com"}/chat/completions`,N={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};b(o,"commit","DeepSeek",this.params.config.model,g,N,r),x(o,"commit","DeepSeek",f,d,r);const D={messages:[{role:"system",content:f},{role:"user",content:d}],model:this.params.config.model,max_tokens:this.params.config.maxTokens,top_p:this.params.config.topP,temperature:this.params.config.temperature,stream:!0};R(o,"commit","DeepSeek",D,r);const T=Date.now();let u="";try{const F=await this.deepSeek.chat.completions.create(D,{timeout:this.params.config.timeout});for await(const P of F){const B=P.choices?.[0]?.delta?.content||"",H=P.choices?.[0]?.delta?.reasoning_content||"",S=`${B}${H}`;S&&(u+=S,s.next(S))}const z=Date.now()-T;$(o,"commit","DeepSeek",{streamed:!0,totalLength:u.length},r),_(o,"commit","DeepSeek",z,u,r),s.complete()}catch(k){E(o,"commit","DeepSeek",k,r),s.error(k)}},this.colors={primary:"#53a3f9",secondary:"#fff"},this.serviceName=v.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[DeepSeek]"),this.errorPrefix=v.red.bold("[DeepSeek]");const e=this.params.config.url||"https://api.deepseek.com";this.deepSeek=new K({baseURL:e,apiKey:this.params.config.key})}getServiceSpecificErrorMessage(t){const e=t.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your DeepSeek API key in configuration":e.includes("rate_limit")||e.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your DeepSeek plan":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the DeepSeek model name is correct":e.includes("Invalid model type")?"Invalid model type. Use supported models: deepseek-reasoner, deepseek-chat":e.includes("overloaded")||e.includes("capacity")?"DeepSeek service is overloaded. Try again in a few minutes":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this DeepSeek model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your DeepSeek model configuration":e.includes("500")||e.includes("Internal Server Error")?"DeepSeek server error. Try again later":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():M(this.generateMessage("commit")).pipe(w(e=>A(e)),C(this.formatAsChoice),I(this.handleError$))}generateCodeReview$(){return M(this.generateMessage("review")).pipe(w(t=>A(t)),C(this.formatCodeReviewAsChoice),I(this.handleError$))}async generateMessage(t){const e=this.params.stagedDiff.diff,{systemPrompt:s,systemPromptPath:o,codeReviewPromptPath:i,logging:a,locale:p,generate:r,type:c,maxLength:m}=this.params.config,n={...U,locale:p,maxLength:m,type:c,generate:r,systemPrompt:s,systemPromptPath:o,codeReviewPromptPath:i,vcs_branch:this.params.branchName||""},l=t==="review"?Y(n):O(n);this.checkAvailableModels();const h=L(e,t),d=`${this.params.config.url||"https://api.deepseek.com"}/chat/completions`,y={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};b(e,t,"DeepSeek",this.params.config.model,d,y,a),x(e,t,"DeepSeek",l,h,a);const g=await this.createChatCompletions(l,h,t);return t==="review"?this.parseCodeReview(g):this.parseMessage(g,c,r)}checkAvailableModels(){if(["deepseek-reasoner","deepseek-chat"].includes(this.params.config.model))return!0;throw new Error("Invalid model type of DeepSeek")}async createChatCompletions(t,e,s){const o=this.params.stagedDiff.diff,{logging:i}=this.params.config,a={messages:[{role:"system",content:t},{role:"user",content:e}],model:this.params.config.model,max_tokens:this.params.config.maxTokens,top_p:this.params.config.topP,temperature:this.params.config.temperature};R(o,s,"DeepSeek",a,i);const p=Date.now();try{const r=await this.deepSeek.chat.completions.create(a,{timeout:this.params.config.timeout}),c=Date.now()-p,m=r.choices?.[0];if(!m?.message)throw new Error("DeepSeek API returned invalid response structure");const n=m.message.content||m.message.reasoning_content||"";if(!n)throw new Error("DeepSeek API returned empty response");return $(o,s,"DeepSeek",r,i),_(o,s,"DeepSeek",c,n,i),n}catch(r){throw E(o,s,"DeepSeek",r,i),r}}}export{G as DeepSeekService};
1
+ import v from"chalk";import K from"openai";import{concatMap as w,from as A,map as C,catchError as I}from"rxjs";import{fromPromise as M}from"rxjs/internal/observable/innerFrom";import{A as W,l as b,a as x,b as R,c as $,d as _,e as E}from"./ai.service-7cce5ee0.mjs";import{D as U,g as O,b as Y,k as L}from"./cli-0dd7e35c.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 G extends W{constructor(t){super(t),this.params=t,this.generateStreamingCommitMessage$=()=>{const{generate:s,type:o}=this.params.config;return this.createStreamingCommitMessages$(i=>{this.streamChunks(i).catch(a=>i.error(a))},o,s)},this.streamChunks=async s=>{const o=this.params.stagedDiff.diff,{systemPrompt:i,systemPromptPath:a,codeReviewPromptPath:p,logging:r,locale:c,generate:m,type:n,maxLength:l}=this.params.config,h={...U,locale:c,maxLength:l,type:n,generate:m,systemPrompt:i,systemPromptPath:a,codeReviewPromptPath:p,vcs_branch:this.params.branchName||""},f=O(h);this.checkAvailableModels();const d=L(o,"commit"),g=`${this.params.config.url||"https://api.deepseek.com"}/chat/completions`,N={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};b(o,"commit","DeepSeek",this.params.config.model,g,N,r),x(o,"commit","DeepSeek",f,d,r);const D={messages:[{role:"system",content:f},{role:"user",content:d}],model:this.params.config.model,max_tokens:this.params.config.maxTokens,top_p:this.params.config.topP,temperature:this.params.config.temperature,stream:!0};R(o,"commit","DeepSeek",D,r);const T=Date.now();let u="";try{const F=await this.deepSeek.chat.completions.create(D,{timeout:this.params.config.timeout});for await(const P of F){const B=P.choices?.[0]?.delta?.content||"",H=P.choices?.[0]?.delta?.reasoning_content||"",S=`${B}${H}`;S&&(u+=S,s.next(S))}const z=Date.now()-T;$(o,"commit","DeepSeek",{streamed:!0,totalLength:u.length},r),_(o,"commit","DeepSeek",z,u,r),s.complete()}catch(k){E(o,"commit","DeepSeek",k,r),s.error(k)}},this.colors={primary:"#53a3f9",secondary:"#fff"},this.serviceName=v.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[DeepSeek]"),this.errorPrefix=v.red.bold("[DeepSeek]");const e=this.params.config.url||"https://api.deepseek.com";this.deepSeek=new K({baseURL:e,apiKey:this.params.config.key})}getServiceSpecificErrorMessage(t){const e=t.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your DeepSeek API key in configuration":e.includes("rate_limit")||e.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your DeepSeek plan":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the DeepSeek model name is correct":e.includes("Invalid model type")?"Invalid model type. Use supported models: deepseek-reasoner, deepseek-chat":e.includes("overloaded")||e.includes("capacity")?"DeepSeek service is overloaded. Try again in a few minutes":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this DeepSeek model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your DeepSeek model configuration":e.includes("500")||e.includes("Internal Server Error")?"DeepSeek server error. Try again later":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():M(this.generateMessage("commit")).pipe(w(e=>A(e)),C(this.formatAsChoice),I(this.handleError$))}generateCodeReview$(){return M(this.generateMessage("review")).pipe(w(t=>A(t)),C(this.formatCodeReviewAsChoice),I(this.handleError$))}async generateMessage(t){const e=this.params.stagedDiff.diff,{systemPrompt:s,systemPromptPath:o,codeReviewPromptPath:i,logging:a,locale:p,generate:r,type:c,maxLength:m}=this.params.config,n={...U,locale:p,maxLength:m,type:c,generate:r,systemPrompt:s,systemPromptPath:o,codeReviewPromptPath:i,vcs_branch:this.params.branchName||""},l=t==="review"?Y(n):O(n);this.checkAvailableModels();const h=L(e,t),d=`${this.params.config.url||"https://api.deepseek.com"}/chat/completions`,y={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};b(e,t,"DeepSeek",this.params.config.model,d,y,a),x(e,t,"DeepSeek",l,h,a);const g=await this.createChatCompletions(l,h,t);return t==="review"?this.parseCodeReview(g):this.parseMessage(g,c,r)}checkAvailableModels(){if(["deepseek-reasoner","deepseek-chat"].includes(this.params.config.model))return!0;throw new Error("Invalid model type of DeepSeek")}async createChatCompletions(t,e,s){const o=this.params.stagedDiff.diff,{logging:i}=this.params.config,a={messages:[{role:"system",content:t},{role:"user",content:e}],model:this.params.config.model,max_tokens:this.params.config.maxTokens,top_p:this.params.config.topP,temperature:this.params.config.temperature};R(o,s,"DeepSeek",a,i);const p=Date.now();try{const r=await this.deepSeek.chat.completions.create(a,{timeout:this.params.config.timeout}),c=Date.now()-p,m=r.choices?.[0];if(!m?.message)throw new Error("DeepSeek API returned invalid response structure");const n=m.message.content||m.message.reasoning_content||"";if(!n)throw new Error("DeepSeek API returned empty response");return $(o,s,"DeepSeek",r,i),_(o,s,"DeepSeek",c,n,i),n}catch(r){throw E(o,s,"DeepSeek",r,i),r}}}export{G as DeepSeekService};
@@ -1 +1 @@
1
- import{HarmCategory as n,HarmBlockThreshold as a,GoogleGenerativeAI as W}from"@google/generative-ai";import S from"chalk";import{concatMap as x,from as v,map as L,catchError as N}from"rxjs";import{fromPromise as w}from"rxjs/internal/observable/innerFrom";import{A as X,l as D,a as b,b as B,c as H,d as $,e as Y}from"./ai.service-da8345b1.mjs";import{D as U,g as K,b as F,k as V}from"./cli-83e0874c.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 q extends X{constructor(t){super(t),this.params=t,this.generateStreamingCommitMessage$=()=>{const{generate:e,type:o}=this.params.config;return this.createStreamingCommitMessages$(c=>{this.streamChunks(c).catch(r=>c.error(r))},o,e)},this.streamChunks=async e=>{const o=this.params.stagedDiff.diff,{systemPrompt:c,systemPromptPath:r,codeReviewPromptPath:O,logging:s,locale:f,generate:A,type:E,maxLength:T}=this.params.config,_=this.params.config.maxTokens,h={...U,locale:f,maxLength:T,type:E,generate:A,systemPrompt:c,systemPromptPath:r,codeReviewPromptPath:O,vcs_branch:this.params.branchName||""},p=K(h),y={maxOutputTokens:_,temperature:this.params.config.temperature,topP:this.params.config.topP},u=this.genAI.getGenerativeModel({model:this.params.config.model,systemInstruction:p,generationConfig:y,safetySettings:[{category:n.HARM_CATEGORY_HATE_SPEECH,threshold:a.BLOCK_LOW_AND_ABOVE},{category:n.HARM_CATEGORY_SEXUALLY_EXPLICIT,threshold:a.BLOCK_LOW_AND_ABOVE},{category:n.HARM_CATEGORY_HARASSMENT,threshold:a.BLOCK_LOW_AND_ABOVE},{category:n.HARM_CATEGORY_DANGEROUS_CONTENT,threshold:a.BLOCK_LOW_AND_ABOVE}]}),C=V(o,"commit"),k=`${this.params.config.url||"https://generativelanguage.googleapis.com"}/v1beta/models/${this.params.config.model}:streamGenerateContent`,I={"Content-Type":"application/json","x-goog-api-key":this.params.config.key};D(o,"commit","Gemini",this.params.config.model,k,I,s),b(o,"commit","Gemini",p,C,s),B(o,"commit","Gemini",{systemInstruction:{parts:[{text:p}]},contents:[{parts:[{text:C}]}],generationConfig:y},s);const g=Date.now();let m="";try{const i=this.params.config.timeout>1e4?{request:{timeout:this.params.config.timeout}}:void 0,M=await u.generateContentStream(C,i);for await(const P of M.stream){const l=P.text();l&&(m+=l,e.next(l))}const d=Date.now()-g;H(o,"commit","Gemini",{streamed:!0,totalLength:m.length},s),$(o,"commit","Gemini",d,m,s),e.complete()}catch(i){Y(o,"commit","Gemini",i,s),e.error(i)}},this.colors={primary:"#0077FF",secondary:"#fff"},this.serviceName=S.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Gemini]"),this.errorPrefix=S.red.bold("[Gemini]"),this.genAI=new W(this.params.config.key)}getServiceSpecificErrorMessage(t){const e=t.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your Google AI Studio API key in configuration":e.includes("quota")||e.includes("QUOTA_EXCEEDED")?"API quota exceeded. Check your Google AI Studio usage limits":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the Gemini model name is correct":e.includes("SAFETY")||e.includes("safety")?"Content blocked by safety filters. Try rephrasing your request":e.includes("RECITATION")||e.includes("recitation")?"Content blocked due to recitation concerns. Try a different approach":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this Gemini model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your Gemini model configuration":e.includes("500")||e.includes("Internal Server Error")?"Google AI service error. Try again later":e.includes("MAX_TOKENS")||e.includes("truncated")||e.includes("maxOutputTokens")?"Response truncated due to token limit. Gemini 2.5+ models use thinking tokens. Try increasing maxTokens (recommended: 8192+)":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():w(this.generateMessage("commit")).pipe(x(e=>v(e)),L(this.formatAsChoice),N(this.handleError$))}generateCodeReview$(){return w(this.generateMessage("review")).pipe(x(t=>v(t)),L(this.formatCodeReviewAsChoice),N(this.handleError$))}async generateMessage(t){const e=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:c,logging:r,locale:O,codeReviewPromptPath:s,generate:f,type:A,maxLength:E}=this.params.config,T=this.params.config.maxTokens,_={...U,locale:O,maxLength:E,type:A,generate:f,systemPrompt:o,systemPromptPath:c,codeReviewPromptPath:s,vcs_branch:this.params.branchName||""},h=t==="review"?F(_):K(_),p={maxOutputTokens:T,temperature:this.params.config.temperature,topP:this.params.config.topP},y=this.genAI.getGenerativeModel({model:this.params.config.model,systemInstruction:h,generationConfig:p,safetySettings:[{category:n.HARM_CATEGORY_HATE_SPEECH,threshold:a.BLOCK_LOW_AND_ABOVE},{category:n.HARM_CATEGORY_SEXUALLY_EXPLICIT,threshold:a.BLOCK_LOW_AND_ABOVE},{category:n.HARM_CATEGORY_HARASSMENT,threshold:a.BLOCK_LOW_AND_ABOVE},{category:n.HARM_CATEGORY_DANGEROUS_CONTENT,threshold:a.BLOCK_LOW_AND_ABOVE}]}),u=V(e,t),G=`${this.params.config.url||"https://generativelanguage.googleapis.com"}/v1beta/models/${this.params.config.model}:generateContent`,k={"Content-Type":"application/json","x-goog-api-key":this.params.config.key};D(e,t,"Gemini",this.params.config.model,G,k,r),b(e,t,"Gemini",h,u,r),B(e,t,"Gemini",{systemInstruction:{parts:[{text:h}]},contents:[{parts:[{text:u}]}],generationConfig:p},r);const R=Date.now();try{const g=this.params.config.timeout>1e4?{request:{timeout:this.params.config.timeout}}:void 0,m=await y.generateContent(u,g),i=m.response;if(i.candidates?.[0]?.finishReason==="MAX_TOKENS"){const l=i.usageMetadata;throw new Error(`Response truncated: maxOutputTokens exceeded. Thinking tokens: ${l?.thoughtsTokenCount??"N/A"}, Output tokens: ${l?.candidatesTokenCount??"N/A"}. Increase maxTokens config for Gemini 2.5+ thinking models.`)}const d=i.text(),P=Date.now()-R;return H(e,t,"Gemini",{response:d,candidates:m.response.candidates,usageMetadata:m.response.usageMetadata},r),$(e,t,"Gemini",P,d,r),t==="review"?this.parseCodeReview(d):this.parseMessage(d,A,f)}catch(g){throw Y(e,t,"Gemini",g,r),g}}}export{q as GeminiService};
1
+ import{HarmCategory as n,HarmBlockThreshold as a,GoogleGenerativeAI as W}from"@google/generative-ai";import S from"chalk";import{concatMap as x,from as v,map as L,catchError as N}from"rxjs";import{fromPromise as w}from"rxjs/internal/observable/innerFrom";import{A as X,l as D,a as b,b as B,c as H,d as $,e as Y}from"./ai.service-7cce5ee0.mjs";import{D as U,g as K,b as F,k as V}from"./cli-0dd7e35c.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 q extends X{constructor(t){super(t),this.params=t,this.generateStreamingCommitMessage$=()=>{const{generate:e,type:o}=this.params.config;return this.createStreamingCommitMessages$(c=>{this.streamChunks(c).catch(r=>c.error(r))},o,e)},this.streamChunks=async e=>{const o=this.params.stagedDiff.diff,{systemPrompt:c,systemPromptPath:r,codeReviewPromptPath:O,logging:s,locale:f,generate:A,type:E,maxLength:T}=this.params.config,_=this.params.config.maxTokens,h={...U,locale:f,maxLength:T,type:E,generate:A,systemPrompt:c,systemPromptPath:r,codeReviewPromptPath:O,vcs_branch:this.params.branchName||""},p=K(h),y={maxOutputTokens:_,temperature:this.params.config.temperature,topP:this.params.config.topP},u=this.genAI.getGenerativeModel({model:this.params.config.model,systemInstruction:p,generationConfig:y,safetySettings:[{category:n.HARM_CATEGORY_HATE_SPEECH,threshold:a.BLOCK_LOW_AND_ABOVE},{category:n.HARM_CATEGORY_SEXUALLY_EXPLICIT,threshold:a.BLOCK_LOW_AND_ABOVE},{category:n.HARM_CATEGORY_HARASSMENT,threshold:a.BLOCK_LOW_AND_ABOVE},{category:n.HARM_CATEGORY_DANGEROUS_CONTENT,threshold:a.BLOCK_LOW_AND_ABOVE}]}),C=V(o,"commit"),k=`${this.params.config.url||"https://generativelanguage.googleapis.com"}/v1beta/models/${this.params.config.model}:streamGenerateContent`,I={"Content-Type":"application/json","x-goog-api-key":this.params.config.key};D(o,"commit","Gemini",this.params.config.model,k,I,s),b(o,"commit","Gemini",p,C,s),B(o,"commit","Gemini",{systemInstruction:{parts:[{text:p}]},contents:[{parts:[{text:C}]}],generationConfig:y},s);const g=Date.now();let m="";try{const i=this.params.config.timeout>1e4?{request:{timeout:this.params.config.timeout}}:void 0,M=await u.generateContentStream(C,i);for await(const P of M.stream){const l=P.text();l&&(m+=l,e.next(l))}const d=Date.now()-g;H(o,"commit","Gemini",{streamed:!0,totalLength:m.length},s),$(o,"commit","Gemini",d,m,s),e.complete()}catch(i){Y(o,"commit","Gemini",i,s),e.error(i)}},this.colors={primary:"#0077FF",secondary:"#fff"},this.serviceName=S.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Gemini]"),this.errorPrefix=S.red.bold("[Gemini]"),this.genAI=new W(this.params.config.key)}getServiceSpecificErrorMessage(t){const e=t.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your Google AI Studio API key in configuration":e.includes("quota")||e.includes("QUOTA_EXCEEDED")?"API quota exceeded. Check your Google AI Studio usage limits":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the Gemini model name is correct":e.includes("SAFETY")||e.includes("safety")?"Content blocked by safety filters. Try rephrasing your request":e.includes("RECITATION")||e.includes("recitation")?"Content blocked due to recitation concerns. Try a different approach":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this Gemini model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your Gemini model configuration":e.includes("500")||e.includes("Internal Server Error")?"Google AI service error. Try again later":e.includes("MAX_TOKENS")||e.includes("truncated")||e.includes("maxOutputTokens")?"Response truncated due to token limit. Gemini 2.5+ models use thinking tokens. Try increasing maxTokens (recommended: 8192+)":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():w(this.generateMessage("commit")).pipe(x(e=>v(e)),L(this.formatAsChoice),N(this.handleError$))}generateCodeReview$(){return w(this.generateMessage("review")).pipe(x(t=>v(t)),L(this.formatCodeReviewAsChoice),N(this.handleError$))}async generateMessage(t){const e=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:c,logging:r,locale:O,codeReviewPromptPath:s,generate:f,type:A,maxLength:E}=this.params.config,T=this.params.config.maxTokens,_={...U,locale:O,maxLength:E,type:A,generate:f,systemPrompt:o,systemPromptPath:c,codeReviewPromptPath:s,vcs_branch:this.params.branchName||""},h=t==="review"?F(_):K(_),p={maxOutputTokens:T,temperature:this.params.config.temperature,topP:this.params.config.topP},y=this.genAI.getGenerativeModel({model:this.params.config.model,systemInstruction:h,generationConfig:p,safetySettings:[{category:n.HARM_CATEGORY_HATE_SPEECH,threshold:a.BLOCK_LOW_AND_ABOVE},{category:n.HARM_CATEGORY_SEXUALLY_EXPLICIT,threshold:a.BLOCK_LOW_AND_ABOVE},{category:n.HARM_CATEGORY_HARASSMENT,threshold:a.BLOCK_LOW_AND_ABOVE},{category:n.HARM_CATEGORY_DANGEROUS_CONTENT,threshold:a.BLOCK_LOW_AND_ABOVE}]}),u=V(e,t),G=`${this.params.config.url||"https://generativelanguage.googleapis.com"}/v1beta/models/${this.params.config.model}:generateContent`,k={"Content-Type":"application/json","x-goog-api-key":this.params.config.key};D(e,t,"Gemini",this.params.config.model,G,k,r),b(e,t,"Gemini",h,u,r),B(e,t,"Gemini",{systemInstruction:{parts:[{text:h}]},contents:[{parts:[{text:u}]}],generationConfig:p},r);const R=Date.now();try{const g=this.params.config.timeout>1e4?{request:{timeout:this.params.config.timeout}}:void 0,m=await y.generateContent(u,g),i=m.response;if(i.candidates?.[0]?.finishReason==="MAX_TOKENS"){const l=i.usageMetadata;throw new Error(`Response truncated: maxOutputTokens exceeded. Thinking tokens: ${l?.thoughtsTokenCount??"N/A"}, Output tokens: ${l?.candidatesTokenCount??"N/A"}. Increase maxTokens config for Gemini 2.5+ thinking models.`)}const d=i.text(),P=Date.now()-R;return H(e,t,"Gemini",{response:d,candidates:m.response.candidates,usageMetadata:m.response.usageMetadata},r),$(e,t,"Gemini",P,d,r),t==="review"?this.parseCodeReview(d):this.parseMessage(d,A,f)}catch(g){throw Y(e,t,"Gemini",g,r),g}}}export{q as GeminiService};
@@ -1,4 +1,4 @@
1
- import G from"chalk";import{concatMap as I,from as N,map as T,catchError as D}from"rxjs";import{fromPromise as O}from"rxjs/internal/observable/innerFrom";import{A as R,l as _,a as P,b as S,e as M,c as v,d as k}from"./ai.service-da8345b1.mjs";import{i as C}from"./openai-3092588f.mjs";import{D as x,b as $,g as y}from"./cli-83e0874c.mjs";import"fs";import"path";import"@pacote/xxhash";import"winston";import"http";import"https";import"net";import"tls";import"url";import"assert";import"tty";import"util";import"os";import"events";import"cleye";import"module";import"crypto";import"node:buffer";import"node:path";import"node:child_process";import"node:process";import"child_process";import"node:url";import"node:os";import"node:fs";import"buffer";import"stream";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"node:fs/promises";import"chokidar";import"rxjs/operators";class U extends R{constructor(r){super(r),this.params=r,this.baseURL="https://models.github.ai",this.colors={primary:"#24292e",secondary:"#FFF"},this.serviceName=G.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[GitHub Models]"),this.errorPrefix=G.red.bold("[GitHub Models]")}getServiceSpecificErrorMessage(r){switch(r.code){case"MISSING_TOKEN":return"GitHub token is required. Run: aicommit2 github-login";case"AUTHENTICATION_FAILED":return"Authentication failed. Your GitHub token may be expired or invalid. Run: aicommit2 github-login";case"ACCESS_DENIED":return'Access denied. Make sure your GitHub token has "Models" permission in GitHub settings';case"NO_CONTENT":return"No content received from GitHub Models. The model may have failed to generate a response";default:return null}}generateCommitMessage$(){return O(this.generateMessage("commit")).pipe(I(r=>N(r)),T(this.formatAsChoice),D(this.handleError$))}generateCodeReview$(){return O(this.generateMessage("review")).pipe(I(r=>N(r)),T(this.formatCodeReviewAsChoice),D(this.handleError$))}async generateMessage(r){if(!this.params.config.key){const o=new Error("GitHub token is required for GitHub Models. Use: aicommit2 github-login");throw o.code="MISSING_TOKEN",o}const s=this.params.stagedDiff.diff,{systemPrompt:i,systemPromptPath:l,codeReviewPromptPath:w,locale:H,generate:u,type:p,maxLength:g}=this.params.config,a={...x,locale:H,maxLength:g,type:p,generate:u,systemPrompt:i,systemPromptPath:l,codeReviewPromptPath:w,vcs_branch:this.params.branchName||""},E=r==="review"?$(a):y(a),d=await this.makeRequest(E,s,r);return r==="review"?this.parseCodeReview(d):this.parseMessage(d,p,u)}async makeRequest(r,s,i){const l=Array.isArray(this.params.config.model)?this.params.config.model[0]:this.params.config.model||"gpt-4o-mini",w=[{role:"system",content:r},{role:"user",content:i==="review"?s:`Here's the diff:
1
+ import G from"chalk";import{concatMap as I,from as N,map as T,catchError as D}from"rxjs";import{fromPromise as O}from"rxjs/internal/observable/innerFrom";import{A as R,l as _,a as P,b as S,e as M,c as v,d as k}from"./ai.service-7cce5ee0.mjs";import{i as C}from"./openai-f7aae8f3.mjs";import{D as x,b as $,g as y}from"./cli-0dd7e35c.mjs";import"fs";import"path";import"@pacote/xxhash";import"winston";import"http";import"https";import"net";import"tls";import"url";import"assert";import"tty";import"util";import"os";import"events";import"cleye";import"module";import"crypto";import"node:buffer";import"node:path";import"node:child_process";import"node:process";import"child_process";import"node:url";import"node:os";import"node:fs";import"buffer";import"stream";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"node:fs/promises";import"chokidar";import"rxjs/operators";class U extends R{constructor(r){super(r),this.params=r,this.baseURL="https://models.github.ai",this.colors={primary:"#24292e",secondary:"#FFF"},this.serviceName=G.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[GitHub Models]"),this.errorPrefix=G.red.bold("[GitHub Models]")}getServiceSpecificErrorMessage(r){switch(r.code){case"MISSING_TOKEN":return"GitHub token is required. Run: aicommit2 github-login";case"AUTHENTICATION_FAILED":return"Authentication failed. Your GitHub token may be expired or invalid. Run: aicommit2 github-login";case"ACCESS_DENIED":return'Access denied. Make sure your GitHub token has "Models" permission in GitHub settings';case"NO_CONTENT":return"No content received from GitHub Models. The model may have failed to generate a response";default:return null}}generateCommitMessage$(){return O(this.generateMessage("commit")).pipe(I(r=>N(r)),T(this.formatAsChoice),D(this.handleError$))}generateCodeReview$(){return O(this.generateMessage("review")).pipe(I(r=>N(r)),T(this.formatCodeReviewAsChoice),D(this.handleError$))}async generateMessage(r){if(!this.params.config.key){const o=new Error("GitHub token is required for GitHub Models. Use: aicommit2 github-login");throw o.code="MISSING_TOKEN",o}const s=this.params.stagedDiff.diff,{systemPrompt:i,systemPromptPath:l,codeReviewPromptPath:w,locale:H,generate:u,type:p,maxLength:g}=this.params.config,a={...x,locale:H,maxLength:g,type:p,generate:u,systemPrompt:i,systemPromptPath:l,codeReviewPromptPath:w,vcs_branch:this.params.branchName||""},E=r==="review"?$(a):y(a),d=await this.makeRequest(E,s,r);return r==="review"?this.parseCodeReview(d):this.parseMessage(d,p,u)}async makeRequest(r,s,i){const l=Array.isArray(this.params.config.model)?this.params.config.model[0]:this.params.config.model||"gpt-4o-mini",w=[{role:"system",content:r},{role:"user",content:i==="review"?s:`Here's the diff:
2
2
 
3
3
  ${s}`}],H=C(l),u={messages:w,model:l,stream:!1,...H?{max_completion_tokens:this.params.config.maxTokens||1024,temperature:1}:{max_tokens:this.params.config.maxTokens||1024,top_p:this.params.config.topP||.95,temperature:this.params.config.temperature||.7}},p=`${this.baseURL}/inference/chat/completions`,g={"Content-Type":"application/json",Accept:"application/vnd.github+json",Authorization:`Bearer ${this.params.config.key}`},{logging:a}=this.params.config;_(s,i,"GitHub Models",l,p,g,a),P(s,i,"GitHub Models",r,i==="review"?s:`Here's the diff:
4
4
 
@@ -1 +1 @@
1
- import A from"chalk";import L from"groq-sdk";import{concatMap as C,from as x,map as M,catchError as I}from"rxjs";import{fromPromise as S}from"rxjs/internal/observable/innerFrom";import{A as F,l as $,a as b,b as R,c as _,d as D,e as E}from"./ai.service-da8345b1.mjs";import{D as T,g as N,b as H}from"./cli-83e0874c.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 z extends F{constructor(e){super(e),this.params=e,this.generateStreamingCommitMessage$=()=>{const{generate:t,type:o}=this.params.config;return this.createStreamingCommitMessages$(n=>{this.streamChunks(n).catch(m=>n.error(m))},o,t)},this.streamChunks=async t=>{const o=this.params.stagedDiff.diff,{systemPrompt:n,systemPromptPath:m,codeReviewPromptPath:r,logging:i,locale:y,temperature:h,generate:l,type:P,maxLength:v}=this.params.config,g=this.params.config.maxTokens,d={...T,locale:y,maxLength:v,type:P,generate:l,systemPrompt:n,systemPromptPath:m,codeReviewPromptPath:r,vcs_branch:this.params.branchName||""},c=N(d),G=`Here is the diff: ${o}`,q=`${this.params.config.url||"https://api.groq.com"}/openai/v1/chat/completions`,f={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};$(o,"commit","Groq",this.params.config.model,q,f,i),b(o,"commit","Groq",c,G,i);const u={messages:[{role:"system",content:c},{role:"user",content:G}],model:this.params.config.model,max_tokens:g,top_p:this.params.config.topP,temperature:h,stream:!0};R(o,"commit","Groq",u,i);const a=Date.now();let p="";try{const s=await this.groq.chat.completions.create(u,{timeout:this.params.config.timeout});for await(const U of s){const k=U.choices?.[0]?.delta?.content||"";k&&(p+=k,t.next(k))}const O=Date.now()-a;_(o,"commit","Groq",{streamed:!0,totalLength:p.length},i),D(o,"commit","Groq",O,p,i),t.complete()}catch(s){E(o,"commit","Groq",s,i),t.error(s)}},this.colors={primary:"#f55036",secondary:"#fff"},this.serviceName=A.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Groq]"),this.errorPrefix=A.red.bold("[Groq]"),this.groq=new L({apiKey:this.params.config.key})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Groq API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Groq plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Groq model name is correct":t.includes("overloaded")||t.includes("capacity")?"Groq service is overloaded. Try again in a few minutes":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Groq model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Groq model configuration":t.includes("500")||t.includes("Internal Server Error")?"Groq server error. Try again later":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():S(this.generateMessage("commit")).pipe(C(t=>x(t)),M(this.formatAsChoice),I(this.handleError$))}generateCodeReview$(){return S(this.generateMessage("review")).pipe(C(e=>x(e)),M(this.formatCodeReviewAsChoice),I(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:m,logging:r,locale:i,temperature:y,generate:h,type:l,maxLength:P}=this.params.config,v=this.params.config.maxTokens,g={...T,locale:i,maxLength:P,type:l,generate:h,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:m,vcs_branch:this.params.branchName||""},d=e==="review"?H(g):N(g),c=`Here is the diff: ${t}`,w=`${this.params.config.url||"https://api.groq.com"}/openai/v1/chat/completions`,q={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};$(t,e,"Groq",this.params.config.model,w,q,r),b(t,e,"Groq",d,c,r);const f={messages:[{role:"system",content:d},{role:"user",content:c}],model:this.params.config.model,max_tokens:v,top_p:this.params.config.topP,temperature:y};R(t,e,"Groq",f,r);const u=Date.now();try{const a=await this.groq.chat.completions.create(f,{timeout:this.params.config.timeout}),p=Date.now()-u,s=a.choices[0].message.content||"";return _(t,e,"Groq",a,r),D(t,e,"Groq",p,s,r),e==="review"?this.parseCodeReview(s):this.parseMessage(s,l,h)}catch(a){throw E(t,e,"Groq",a,r),a}}}export{z as GroqService};
1
+ import A from"chalk";import L from"groq-sdk";import{concatMap as C,from as x,map as M,catchError as I}from"rxjs";import{fromPromise as S}from"rxjs/internal/observable/innerFrom";import{A as F,l as $,a as b,b as R,c as _,d as D,e as E}from"./ai.service-7cce5ee0.mjs";import{D as T,g as N,b as H}from"./cli-0dd7e35c.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 z extends F{constructor(e){super(e),this.params=e,this.generateStreamingCommitMessage$=()=>{const{generate:t,type:o}=this.params.config;return this.createStreamingCommitMessages$(n=>{this.streamChunks(n).catch(m=>n.error(m))},o,t)},this.streamChunks=async t=>{const o=this.params.stagedDiff.diff,{systemPrompt:n,systemPromptPath:m,codeReviewPromptPath:r,logging:i,locale:y,temperature:h,generate:l,type:P,maxLength:v}=this.params.config,g=this.params.config.maxTokens,d={...T,locale:y,maxLength:v,type:P,generate:l,systemPrompt:n,systemPromptPath:m,codeReviewPromptPath:r,vcs_branch:this.params.branchName||""},c=N(d),G=`Here is the diff: ${o}`,q=`${this.params.config.url||"https://api.groq.com"}/openai/v1/chat/completions`,f={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};$(o,"commit","Groq",this.params.config.model,q,f,i),b(o,"commit","Groq",c,G,i);const u={messages:[{role:"system",content:c},{role:"user",content:G}],model:this.params.config.model,max_tokens:g,top_p:this.params.config.topP,temperature:h,stream:!0};R(o,"commit","Groq",u,i);const a=Date.now();let p="";try{const s=await this.groq.chat.completions.create(u,{timeout:this.params.config.timeout});for await(const U of s){const k=U.choices?.[0]?.delta?.content||"";k&&(p+=k,t.next(k))}const O=Date.now()-a;_(o,"commit","Groq",{streamed:!0,totalLength:p.length},i),D(o,"commit","Groq",O,p,i),t.complete()}catch(s){E(o,"commit","Groq",s,i),t.error(s)}},this.colors={primary:"#f55036",secondary:"#fff"},this.serviceName=A.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Groq]"),this.errorPrefix=A.red.bold("[Groq]"),this.groq=new L({apiKey:this.params.config.key})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Groq API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Groq plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Groq model name is correct":t.includes("overloaded")||t.includes("capacity")?"Groq service is overloaded. Try again in a few minutes":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Groq model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Groq model configuration":t.includes("500")||t.includes("Internal Server Error")?"Groq server error. Try again later":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():S(this.generateMessage("commit")).pipe(C(t=>x(t)),M(this.formatAsChoice),I(this.handleError$))}generateCodeReview$(){return S(this.generateMessage("review")).pipe(C(e=>x(e)),M(this.formatCodeReviewAsChoice),I(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:m,logging:r,locale:i,temperature:y,generate:h,type:l,maxLength:P}=this.params.config,v=this.params.config.maxTokens,g={...T,locale:i,maxLength:P,type:l,generate:h,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:m,vcs_branch:this.params.branchName||""},d=e==="review"?H(g):N(g),c=`Here is the diff: ${t}`,w=`${this.params.config.url||"https://api.groq.com"}/openai/v1/chat/completions`,q={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};$(t,e,"Groq",this.params.config.model,w,q,r),b(t,e,"Groq",d,c,r);const f={messages:[{role:"system",content:d},{role:"user",content:c}],model:this.params.config.model,max_tokens:v,top_p:this.params.config.topP,temperature:y};R(t,e,"Groq",f,r);const u=Date.now();try{const a=await this.groq.chat.completions.create(f,{timeout:this.params.config.timeout}),p=Date.now()-u,s=a.choices[0].message.content||"";return _(t,e,"Groq",a,r),D(t,e,"Groq",p,s,r),e==="review"?this.parseCodeReview(s):this.parseMessage(s,l,h)}catch(a){throw E(t,e,"Groq",a,r),a}}}export{z as GroqService};
@@ -1,2 +1,2 @@
1
- import b from"chalk";import{concatMap as k,from as D,map as P,catchError as E}from"rxjs";import{fromPromise as F}from"rxjs/internal/observable/innerFrom";import{A as H,l as R,a as $,c as U,d as S,e as x}from"./ai.service-da8345b1.mjs";import{D as N,b as T,g as _}from"./cli-83e0874c.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 H{constructor(o){super(o),this.params=o,this.headers={},this.models=[],this.currentModelId=null,this.currentConversation=void 0,this.currentConversionID=void 0,this.cookie="",this.colors={primary:"#FED21F",secondary:"#000"},this.serviceName=b.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[HuggingFace]"),this.errorPrefix=b.red.bold("[HuggingFace]"),this.cookie=this.params.config.cookie;const e=this.params.config.url||"https://huggingface.co";this.headers={accept:"*/*","accept-language":"en-US,en;q=0.9","sec-ch-ua":'"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',"sec-ch-ua-mobile":"?0","sec-ch-ua-platform":'"Windows"',"sec-fetch-dest":"empty","sec-fetch-mode":"cors","sec-fetch-site":"same-origin",origin:e,"Referrer-Policy":"strict-origin-when-cross-origin"}}getServiceSpecificErrorMessage(o){const e=o.message||"";return e.includes("cookie")||e.includes("Cookie")?"Invalid cookie. Check your Hugging Face session cookie in configuration":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the Hugging Face model name is correct":e.includes("conversation")||e.includes("conversion")?"Failed to create conversation. Try again or check your session":e.includes("401")||e.includes("Unauthorized")?"Authentication failed. Your Hugging Face session may have expired":e.includes("403")||e.includes("Forbidden")?"Access denied. You may not have permission to access this model":e.includes("404")||e.includes("Not Found")?"Model not found. Check your Hugging Face model configuration":e.includes("500")||e.includes("Internal Server Error")?"Hugging Face server error. Try again later":e.includes("overloaded")||e.includes("capacity")?"Hugging Face service is overloaded. Try again in a few minutes":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(k(o=>D(o)),P(this.formatAsChoice),E(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(k(o=>D(o)),P(this.formatCodeReviewAsChoice),E(this.handleError$))}async generateMessage(o){await this.initialize();const e=this.params.stagedDiff.diff,{systemPrompt:r,systemPromptPath:t,codeReviewPromptPath:p,logging:a,locale:i,generate:d,type:s,maxLength:u,temperature:m,maxTokens:v,topP:h,timeout:g}=this.params.config,n={...N,locale:i,maxLength:u,type:s,generate:d,systemPrompt:r,systemPromptPath:t,codeReviewPromptPath:p,vcs_branch:this.params.branchName||""},c=o==="review"?T(n):_(n),l=`Here is the diff: ${e}`,w=`${this.params.config.url||"https://huggingface.co"}/chat/conversation`,I={...this.headers,cookie:this.cookie};R(e,o,"HuggingFace",this.params.config.model,w,I,a),$(e,o,"HuggingFace",c,l,a);const A=Date.now();try{const y=await this.getNewChat(c),C=await(await this.sendMessage(l,y.id)).completeResponsePromise();await this.deleteConversation(y.id);const M=Date.now()-A;return U(e,o,"HuggingFace",{response:C},a),S(e,o,"HuggingFace",M,C,a),o==="review"?this.parseCodeReview(C):this.parseMessage(C,s,d)}catch(y){throw x(e,o,"HuggingFace",y,a),y}}async initialize(){const o=await this.getRemoteLlms(),e=o.find(r=>r.name?.toLowerCase()===this.params.config.model.toLowerCase());if(e){this.currentModel=e,this.currentModelId=e.id;return}this.currentModel=o[0],this.currentModelId=o[0].id}async getRemoteLlms(){const o=this.params.config.url||"https://huggingface.co",e=await fetch(`${o}/chat/__data.json`,{headers:{...this.headers,cookie:this.cookie},body:null,method:"GET"});if(e.status!==200)throw new Error(`Failed to get remote LLMs with status code: ${e.status}`);const t=(await e.json()).nodes[0].data,p=t[t[0].models],a=[],i=d=>d===-1?null:t[d];for(const d of p){const s=t[d];if(t[s.unlisted])continue;const u={id:i(s.id),name:i(s.name),displayName:i(s.displayName),preprompt:i(s.preprompt),promptExamples:[],websiteUrl:i(s.websiteUrl),description:i(s.description),datasetName:i(s.datasetName),datasetUrl:i(s.datasetUrl),modelUrl:i(s.modelUrl),parameters:{}},m=i(s.promptExamples);if(m!==null){const g=m.map(n=>i(n));u.promptExamples=g.map(n=>({title:t[n.title],prompt:t[n.prompt]}))}const v=i(s.parameters),h={};for(const[g,n]of Object.entries(v)){if(n===-1){h[g]=null;continue}if(Array.isArray(t[n])){h[g]=t[n].map(c=>t[c]);continue}h[g]=t[n]}u.parameters=h,a.push(u)}return this.models=a,a}async getNewChat(o){const e={model:this.currentModelId,preprompt:o};let r=0;const t=this.params.config.url||"https://huggingface.co";for(;r<5;){const p=await fetch(`${t}/chat/conversation`,{headers:{...this.headers,"content-type":"application/json",cookie:this.cookie,Referer:`${t}/chat/`},body:JSON.stringify(e),method:"POST"}),{conversationId:a}=await p.json();if(a){this.currentConversionID=a;break}else r++}if(!this.currentConversionID)throw new Error("Failed to create new conversion");return await this.getConversationHistory(this.currentConversionID)}async getConversationHistory(o){if(!o)throw new Error("conversationId is required for getConversationHistory");const e=this.params.config.url||"https://huggingface.co",r=await fetch(`${e}/chat/conversation/${o}/__data.json`,{headers:{...this.headers,cookie:this.cookie,Referer:`${e}/chat/`},body:null,method:"GET"});if(r.status!=200)throw new Error("Unable get conversation details "+r);{const t=await r.json();return this.metadataParser(t,o)}}metadataParser(o,e){const r={id:"",model:"",systemPrompt:"",title:"",history:[]},t=o.nodes[1].data,p=t[t[0].model],a=t[t[0].preprompt],i=t[t[0].title],d=t[t[0].messages],s=[];for(const u of d){const m=t[u],v=new Date(t[m.createdAt][1]).getTime()/1e3,h=new Date(t[m.updatedAt][1]).getTime()/1e3;s.push({id:t[m.id],role:t[m.from],content:t[m.content],createdAt:v,updatedAt:h})}return r.id=e,r.model=p,r.systemPrompt=a,r.title=i,r.history=s,this.currentConversation=r,r}async sendMessage(o,e){if(o==="")throw new Error("the prompt can not be empty.");if(!e&&!this.currentConversionID?await this.getNewChat():e?(this.currentConversionID=e,await this.getConversationHistory(e)):this.currentConversionID&&await this.getConversationHistory(this.currentConversionID),!this.currentConversation)throw new Error("Failed to create new conversion");const r={inputs:o,id:this.currentConversation.history[this.currentConversation.history.length-1].id,is_retry:!1,is_continue:!1,web_search:!1,tools:[]},t=new FormData;t.append("data",JSON.stringify(r));const p=this.params.config.url||"https://huggingface.co",a=new AbortController,i=setTimeout(()=>a.abort(),this.params.config.timeout),d=await fetch(`${p}/chat/conversation/${this.currentConversionID}`,{headers:{...this.headers,cookie:this.cookie,Referer:`${p}/chat/conversation/${this.currentConversionID}`},body:t,method:"POST",signal:a.signal});clearTimeout(i);function s(n){try{const c=n.split(`
1
+ import b from"chalk";import{concatMap as k,from as D,map as P,catchError as E}from"rxjs";import{fromPromise as F}from"rxjs/internal/observable/innerFrom";import{A as H,l as R,a as $,c as U,d as S,e as x}from"./ai.service-7cce5ee0.mjs";import{D as N,b as T,g as _}from"./cli-0dd7e35c.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 H{constructor(o){super(o),this.params=o,this.headers={},this.models=[],this.currentModelId=null,this.currentConversation=void 0,this.currentConversionID=void 0,this.cookie="",this.colors={primary:"#FED21F",secondary:"#000"},this.serviceName=b.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[HuggingFace]"),this.errorPrefix=b.red.bold("[HuggingFace]"),this.cookie=this.params.config.cookie;const e=this.params.config.url||"https://huggingface.co";this.headers={accept:"*/*","accept-language":"en-US,en;q=0.9","sec-ch-ua":'"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',"sec-ch-ua-mobile":"?0","sec-ch-ua-platform":'"Windows"',"sec-fetch-dest":"empty","sec-fetch-mode":"cors","sec-fetch-site":"same-origin",origin:e,"Referrer-Policy":"strict-origin-when-cross-origin"}}getServiceSpecificErrorMessage(o){const e=o.message||"";return e.includes("cookie")||e.includes("Cookie")?"Invalid cookie. Check your Hugging Face session cookie in configuration":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the Hugging Face model name is correct":e.includes("conversation")||e.includes("conversion")?"Failed to create conversation. Try again or check your session":e.includes("401")||e.includes("Unauthorized")?"Authentication failed. Your Hugging Face session may have expired":e.includes("403")||e.includes("Forbidden")?"Access denied. You may not have permission to access this model":e.includes("404")||e.includes("Not Found")?"Model not found. Check your Hugging Face model configuration":e.includes("500")||e.includes("Internal Server Error")?"Hugging Face server error. Try again later":e.includes("overloaded")||e.includes("capacity")?"Hugging Face service is overloaded. Try again in a few minutes":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(k(o=>D(o)),P(this.formatAsChoice),E(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(k(o=>D(o)),P(this.formatCodeReviewAsChoice),E(this.handleError$))}async generateMessage(o){await this.initialize();const e=this.params.stagedDiff.diff,{systemPrompt:r,systemPromptPath:t,codeReviewPromptPath:p,logging:a,locale:i,generate:d,type:s,maxLength:u,temperature:m,maxTokens:v,topP:h,timeout:g}=this.params.config,n={...N,locale:i,maxLength:u,type:s,generate:d,systemPrompt:r,systemPromptPath:t,codeReviewPromptPath:p,vcs_branch:this.params.branchName||""},c=o==="review"?T(n):_(n),l=`Here is the diff: ${e}`,w=`${this.params.config.url||"https://huggingface.co"}/chat/conversation`,I={...this.headers,cookie:this.cookie};R(e,o,"HuggingFace",this.params.config.model,w,I,a),$(e,o,"HuggingFace",c,l,a);const A=Date.now();try{const y=await this.getNewChat(c),C=await(await this.sendMessage(l,y.id)).completeResponsePromise();await this.deleteConversation(y.id);const M=Date.now()-A;return U(e,o,"HuggingFace",{response:C},a),S(e,o,"HuggingFace",M,C,a),o==="review"?this.parseCodeReview(C):this.parseMessage(C,s,d)}catch(y){throw x(e,o,"HuggingFace",y,a),y}}async initialize(){const o=await this.getRemoteLlms(),e=o.find(r=>r.name?.toLowerCase()===this.params.config.model.toLowerCase());if(e){this.currentModel=e,this.currentModelId=e.id;return}this.currentModel=o[0],this.currentModelId=o[0].id}async getRemoteLlms(){const o=this.params.config.url||"https://huggingface.co",e=await fetch(`${o}/chat/__data.json`,{headers:{...this.headers,cookie:this.cookie},body:null,method:"GET"});if(e.status!==200)throw new Error(`Failed to get remote LLMs with status code: ${e.status}`);const t=(await e.json()).nodes[0].data,p=t[t[0].models],a=[],i=d=>d===-1?null:t[d];for(const d of p){const s=t[d];if(t[s.unlisted])continue;const u={id:i(s.id),name:i(s.name),displayName:i(s.displayName),preprompt:i(s.preprompt),promptExamples:[],websiteUrl:i(s.websiteUrl),description:i(s.description),datasetName:i(s.datasetName),datasetUrl:i(s.datasetUrl),modelUrl:i(s.modelUrl),parameters:{}},m=i(s.promptExamples);if(m!==null){const g=m.map(n=>i(n));u.promptExamples=g.map(n=>({title:t[n.title],prompt:t[n.prompt]}))}const v=i(s.parameters),h={};for(const[g,n]of Object.entries(v)){if(n===-1){h[g]=null;continue}if(Array.isArray(t[n])){h[g]=t[n].map(c=>t[c]);continue}h[g]=t[n]}u.parameters=h,a.push(u)}return this.models=a,a}async getNewChat(o){const e={model:this.currentModelId,preprompt:o};let r=0;const t=this.params.config.url||"https://huggingface.co";for(;r<5;){const p=await fetch(`${t}/chat/conversation`,{headers:{...this.headers,"content-type":"application/json",cookie:this.cookie,Referer:`${t}/chat/`},body:JSON.stringify(e),method:"POST"}),{conversationId:a}=await p.json();if(a){this.currentConversionID=a;break}else r++}if(!this.currentConversionID)throw new Error("Failed to create new conversion");return await this.getConversationHistory(this.currentConversionID)}async getConversationHistory(o){if(!o)throw new Error("conversationId is required for getConversationHistory");const e=this.params.config.url||"https://huggingface.co",r=await fetch(`${e}/chat/conversation/${o}/__data.json`,{headers:{...this.headers,cookie:this.cookie,Referer:`${e}/chat/`},body:null,method:"GET"});if(r.status!=200)throw new Error("Unable get conversation details "+r);{const t=await r.json();return this.metadataParser(t,o)}}metadataParser(o,e){const r={id:"",model:"",systemPrompt:"",title:"",history:[]},t=o.nodes[1].data,p=t[t[0].model],a=t[t[0].preprompt],i=t[t[0].title],d=t[t[0].messages],s=[];for(const u of d){const m=t[u],v=new Date(t[m.createdAt][1]).getTime()/1e3,h=new Date(t[m.updatedAt][1]).getTime()/1e3;s.push({id:t[m.id],role:t[m.from],content:t[m.content],createdAt:v,updatedAt:h})}return r.id=e,r.model=p,r.systemPrompt=a,r.title=i,r.history=s,this.currentConversation=r,r}async sendMessage(o,e){if(o==="")throw new Error("the prompt can not be empty.");if(!e&&!this.currentConversionID?await this.getNewChat():e?(this.currentConversionID=e,await this.getConversationHistory(e)):this.currentConversionID&&await this.getConversationHistory(this.currentConversionID),!this.currentConversation)throw new Error("Failed to create new conversion");const r={inputs:o,id:this.currentConversation.history[this.currentConversation.history.length-1].id,is_retry:!1,is_continue:!1,web_search:!1,tools:[]},t=new FormData;t.append("data",JSON.stringify(r));const p=this.params.config.url||"https://huggingface.co",a=new AbortController,i=setTimeout(()=>a.abort(),this.params.config.timeout),d=await fetch(`${p}/chat/conversation/${this.currentConversionID}`,{headers:{...this.headers,cookie:this.cookie,Referer:`${p}/chat/conversation/${this.currentConversionID}`},body:t,method:"POST",signal:a.signal});clearTimeout(i);function s(n){try{const c=n.split(`
2
2
  `),l=[];for(const f of c)f.trim()&&l.push(JSON.parse(f));return l}catch{return[{}]}}const u=new TextDecoder;let m="";const v=new TransformStream({async transform(n,c){const l=u.decode(n);try{const f=s(l);for(const w of f)w.type==="finalAnswer"?(m=w?.text||"",c.terminate()):w.type==="stream"&&c.enqueue(w?.token||"")}catch{throw new Error("Error during parsing response")}}}),h=d.body?.pipeThrough(v);async function g(){return new Promise(async(n,c)=>{try{if(!h)c("ModifiedStream undefined");else{const l=h.getReader();for(;;){const{done:f,value:w}=await l.read();if(f){n(m);break}}}}catch(l){c(l)}})}return{id:this.currentConversionID,stream:h,completeResponsePromise:g}}async deleteConversation(o){const e=this.params.config.url||"https://huggingface.co";return(await fetch(`${e}/chat/conversation/${o}`,{headers:{...this.headers,cookie:this.cookie,Referer:`${e}/chat/`},body:null,method:"DELETE"})).json()}}export{j as HuggingFaceService};
@@ -1 +1 @@
1
- import f from"chalk";import{concatMap as g,from as u,map as A,catchError as M}from"rxjs";import{fromPromise as y}from"rxjs/internal/observable/innerFrom";import{A as C,l as k,a as R,b as $,c as x,e as I,d as E}from"./ai.service-da8345b1.mjs";import{D as N,b as D,g as S,H as v,n as _}from"./cli-83e0874c.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 U extends C{constructor(e){super(e),this.params=e,this.apiKey="",this.colors={primary:"#ff7000",secondary:"#fff"},this.serviceName=f.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[MistralAI]"),this.errorPrefix=f.red.bold("[MistralAI]"),this.apiKey=this.params.config.key}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Mistral AI API key in configuration":t.includes("quota")||t.includes("usage")?"API quota exceeded. Check your Mistral AI usage limits":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Mistral model name is correct":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Mistral model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Mistral model configuration":t.includes("500")||t.includes("Internal Server Error")?"Mistral AI server error. Try again later":null}generateCommitMessage$(){return y(this.generateMessage("commit")).pipe(g(e=>u(e)),A(this.formatAsChoice),M(this.handleError$))}generateCodeReview$(){return y(this.generateMessage("review")).pipe(g(e=>u(e)),A(this.formatCodeReviewAsChoice),M(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:i,logging:n,locale:p,generate:a,type:c,maxLength:l}=this.params.config,r={...N,locale:p,maxLength:l,type:c,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:i,vcs_branch:this.params.branchName||""},h=e==="review"?D(r):S(r);await this.checkAvailableModels();const m=`Here is the diff: ${t}`,b=`${this.params.config.url||"https://api.mistral.ai"}/v1/chat/completions`,w={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};k(t,e,"MistralAI",this.params.config.model,b,w,n),R(t,e,"MistralAI",h,m,n);const d=await this.createChatCompletions(h,m,e);return e==="review"?this.parseCodeReview(d):this.parseMessage(d,c,a)}async checkAvailableModels(){if((await this.getAvailableModels()).includes(this.params.config.model))return!0;throw new Error(`Invalid model type of Mistral AI: ${this.params.config.model}`)}async getAvailableModels(){const e=this.params.config.url||"https://api.mistral.ai";return(await new v({method:"GET",baseURL:`${e}/v1/models`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).execute()).data.data.filter(o=>o.object==="model").map(o=>o.id)}async createChatCompletions(e,t,o){const s=this.params.stagedDiff.diff,{logging:i}=this.params.config,n={model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:t}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1,safe_prompt:!1,random_seed:_(10,1e3)};$(s,o,"MistralAI",n,i);const p=Date.now();try{const a=this.params.config.url||"https://api.mistral.ai",c=await new v({method:"POST",baseURL:`${a}/v1/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(n).execute(),l=Date.now()-p,r=c.data;if(x(s,o,"MistralAI",r,i),!r.choices||r.choices.length===0||!r.choices[0].message?.content)throw I(s,o,"MistralAI",{message:"No Content on response",result:r},i),new Error("No Content on response. Please open a Bug report");const m=r.choices[0].message.content;return E(s,o,"MistralAI",l,m,i),m}catch(a){throw I(s,o,"MistralAI",a,i),a}}}export{U as MistralService};
1
+ import f from"chalk";import{concatMap as g,from as u,map as A,catchError as M}from"rxjs";import{fromPromise as y}from"rxjs/internal/observable/innerFrom";import{A as C,l as k,a as R,b as $,c as x,e as I,d as E}from"./ai.service-7cce5ee0.mjs";import{D as N,b as D,g as S,H as v,n as _}from"./cli-0dd7e35c.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 U extends C{constructor(e){super(e),this.params=e,this.apiKey="",this.colors={primary:"#ff7000",secondary:"#fff"},this.serviceName=f.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[MistralAI]"),this.errorPrefix=f.red.bold("[MistralAI]"),this.apiKey=this.params.config.key}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Mistral AI API key in configuration":t.includes("quota")||t.includes("usage")?"API quota exceeded. Check your Mistral AI usage limits":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Mistral model name is correct":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Mistral model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Mistral model configuration":t.includes("500")||t.includes("Internal Server Error")?"Mistral AI server error. Try again later":null}generateCommitMessage$(){return y(this.generateMessage("commit")).pipe(g(e=>u(e)),A(this.formatAsChoice),M(this.handleError$))}generateCodeReview$(){return y(this.generateMessage("review")).pipe(g(e=>u(e)),A(this.formatCodeReviewAsChoice),M(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:i,logging:n,locale:p,generate:a,type:c,maxLength:l}=this.params.config,r={...N,locale:p,maxLength:l,type:c,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:i,vcs_branch:this.params.branchName||""},h=e==="review"?D(r):S(r);await this.checkAvailableModels();const m=`Here is the diff: ${t}`,b=`${this.params.config.url||"https://api.mistral.ai"}/v1/chat/completions`,w={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};k(t,e,"MistralAI",this.params.config.model,b,w,n),R(t,e,"MistralAI",h,m,n);const d=await this.createChatCompletions(h,m,e);return e==="review"?this.parseCodeReview(d):this.parseMessage(d,c,a)}async checkAvailableModels(){if((await this.getAvailableModels()).includes(this.params.config.model))return!0;throw new Error(`Invalid model type of Mistral AI: ${this.params.config.model}`)}async getAvailableModels(){const e=this.params.config.url||"https://api.mistral.ai";return(await new v({method:"GET",baseURL:`${e}/v1/models`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).execute()).data.data.filter(o=>o.object==="model").map(o=>o.id)}async createChatCompletions(e,t,o){const s=this.params.stagedDiff.diff,{logging:i}=this.params.config,n={model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:t}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1,safe_prompt:!1,random_seed:_(10,1e3)};$(s,o,"MistralAI",n,i);const p=Date.now();try{const a=this.params.config.url||"https://api.mistral.ai",c=await new v({method:"POST",baseURL:`${a}/v1/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(n).execute(),l=Date.now()-p,r=c.data;if(x(s,o,"MistralAI",r,i),!r.choices||r.choices.length===0||!r.choices[0].message?.content)throw I(s,o,"MistralAI",{message:"No Content on response",result:r},i),new Error("No Content on response. Please open a Bug report");const m=r.choices[0].message.content;return E(s,o,"MistralAI",l,m,i),m}catch(a){throw I(s,o,"MistralAI",a,i),a}}}export{U as MistralService};
@@ -1 +1 @@
1
- import P from"chalk";import{Ollama as L}from"ollama";import{concatMap as w,from as k,map as A,catchError as v}from"rxjs";import{fromPromise as C}from"rxjs/internal/observable/innerFrom";import{fetch as T,Agent as z}from"undici";import{A as H,l as x,a as D,b as S,c as _,d as M,e as O}from"./ai.service-da8345b1.mjs";import{o as R,t as U,n as E,c as N,P as b,D as B,b as G,g as J,H as K}from"./cli-83e0874c.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 Q extends H{constructor(s){super(s),this.params=s,this.host=R,this.model="",this.key="",this.auth="",this.getTruncatedDiff=()=>{const t=this.params.stagedDiff.diff,e=this.params.config.maxDiffSize||0;if(e<=0)return t;const{diff:o}=U(t,e);return o},this.generateStreamingCommitMessage$=()=>{const{generate:t,type:e}=this.params.config;return this.createStreamingCommitMessages$(o=>{this.streamChunks(o).catch(n=>o.error(n))},e,t)},this.streamChunks=async t=>{const e=this.getTruncatedDiff(),{logging:o}=this.params.config,n=this.buildCommitPrompt();await this.checkIsAvailableOllama();const h=`Here is the diff: ${e}`,i=`Ollama_${this.model}`,d=`${this.host}/api/chat`,a=this.key?{Authorization:`${this.auth} ${this.key}`}:{};x(e,"commit",i,this.model,d,a,o),D(e,"commit",i,n,h,o);const{numCtx:c,temperature:m,topP:p,timeout:f,maxTokens:r}=this.params.config,g={model:this.model,messages:[{role:"system",content:n},{role:"user",content:h}],stream:!0,keep_alive:f,options:{num_ctx:c,temperature:m,top_p:p,seed:E(10,1e3),num_predict:r??-1}};S(e,"commit",i,g,o);const l=Date.now();let u="";try{const y=await this.ollama.chat(g);for await(const F of y){const $=F.message.content;$&&(u+=$,t.next($))}const I=Date.now()-l;_(e,"commit",i,{streamed:!0,totalLength:u.length},o),M(e,"commit",i,I,u,o),t.complete()}catch(y){O(e,"commit",i,y,o),t.error(y)}},this.setupFetch=(t,e={})=>T(t,{...e,dispatcher:new z({headersTimeout:this.params.config.timeout})}),this.colors={primary:"#FFF",secondary:"#000"},this.model=this.params.keyName,this.serviceName=P.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[${N(this.model)}]`),this.errorPrefix=P.red.bold(`[${N(this.model)}]`),this.host=this.params.config.host||R,this.auth=this.params.config.auth||"Bearer",this.key=this.params.config.key||"",this.ollama=new L({host:this.host,fetch:this.setupFetch,...this.key&&{headers:{Authorization:`${this.auth} ${this.key}`}}})}getServiceSpecificErrorMessage(s){const t=s.message||"";return t.includes("ECONNREFUSED")||t.includes("connection refused")?b.ollamaNotRunning():t.includes("model")&&(t.includes("not found")||t.includes("404"))?b.ollamaModelNotPulled(this.model):null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():C(this.generateMessage("commit")).pipe(w(t=>k(t)),A(this.formatAsChoice),v(this.handleError$))}generateCodeReview$(){return C(this.generateMessage("review")).pipe(w(s=>k(s)),A(this.formatCodeReviewAsChoice),v(this.handleError$))}async generateMessage(s){const t=this.getTruncatedDiff(),{systemPrompt:e,systemPromptPath:o,codeReviewPromptPath:n,logging:h,locale:i,generate:d,type:a,maxLength:c}=this.params.config,m={...B,locale:i,maxLength:c,type:a,generate:d,systemPrompt:e,systemPromptPath:o,codeReviewPromptPath:n,vcs_branch:this.params.branchName||""},p=s==="review"?G(m):J(m);await this.checkIsAvailableOllama();const f=`Here is the diff: ${t}`,r=`Ollama_${this.model}`,g=`${this.host}/api/chat`,l=this.key?{Authorization:`${this.auth} ${this.key}`}:{};x(t,s,r,this.model,g,l,h),D(t,s,r,p,f,h);const u=await this.createChatCompletions(p,f,s);return s==="review"?this.parseCodeReview(u):this.parseMessage(u,a,d)}async checkIsAvailableOllama(){const s=new K({method:"GET",baseURL:`${this.host}`,timeout:this.params.config.timeout});return this.key&&s.setHeaders({Authorization:`${this.auth} ${this.key}`}),(await s.execute()).data}async createChatCompletions(s,t,e){const{numCtx:o,temperature:n,topP:h,timeout:i,maxTokens:d,logging:a}=this.params.config,c=this.params.stagedDiff.diff,m=`Ollama_${this.model}`,p={model:this.model,messages:[{role:"system",content:s},{role:"user",content:t}],stream:!1,keep_alive:i,options:{num_ctx:o,temperature:n,top_p:h,seed:E(10,1e3),num_predict:d??-1}};S(c,e,m,p,a);const f=Date.now();try{const r=await this.ollama.chat(p),g=Date.now()-f,l=r.message.content;return _(c,e,m,{response:l,fullResponse:r},a),M(c,e,m,g,l,a),l}catch(r){throw O(c,e,m,r,a),r}}}export{Q as OllamaService};
1
+ import P from"chalk";import{Ollama as L}from"ollama";import{concatMap as w,from as k,map as A,catchError as v}from"rxjs";import{fromPromise as C}from"rxjs/internal/observable/innerFrom";import{fetch as T,Agent as z}from"undici";import{A as H,l as x,a as D,b as S,c as _,d as M,e as O}from"./ai.service-7cce5ee0.mjs";import{o as R,t as U,n as E,c as N,P as b,D as B,b as G,g as J,H as K}from"./cli-0dd7e35c.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 Q extends H{constructor(s){super(s),this.params=s,this.host=R,this.model="",this.key="",this.auth="",this.getTruncatedDiff=()=>{const t=this.params.stagedDiff.diff,e=this.params.config.maxDiffSize||0;if(e<=0)return t;const{diff:o}=U(t,e);return o},this.generateStreamingCommitMessage$=()=>{const{generate:t,type:e}=this.params.config;return this.createStreamingCommitMessages$(o=>{this.streamChunks(o).catch(n=>o.error(n))},e,t)},this.streamChunks=async t=>{const e=this.getTruncatedDiff(),{logging:o}=this.params.config,n=this.buildCommitPrompt();await this.checkIsAvailableOllama();const h=`Here is the diff: ${e}`,i=`Ollama_${this.model}`,d=`${this.host}/api/chat`,a=this.key?{Authorization:`${this.auth} ${this.key}`}:{};x(e,"commit",i,this.model,d,a,o),D(e,"commit",i,n,h,o);const{numCtx:c,temperature:m,topP:p,timeout:f,maxTokens:r}=this.params.config,g={model:this.model,messages:[{role:"system",content:n},{role:"user",content:h}],stream:!0,keep_alive:f,options:{num_ctx:c,temperature:m,top_p:p,seed:E(10,1e3),num_predict:r??-1}};S(e,"commit",i,g,o);const l=Date.now();let u="";try{const y=await this.ollama.chat(g);for await(const F of y){const $=F.message.content;$&&(u+=$,t.next($))}const I=Date.now()-l;_(e,"commit",i,{streamed:!0,totalLength:u.length},o),M(e,"commit",i,I,u,o),t.complete()}catch(y){O(e,"commit",i,y,o),t.error(y)}},this.setupFetch=(t,e={})=>T(t,{...e,dispatcher:new z({headersTimeout:this.params.config.timeout})}),this.colors={primary:"#FFF",secondary:"#000"},this.model=this.params.keyName,this.serviceName=P.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[${N(this.model)}]`),this.errorPrefix=P.red.bold(`[${N(this.model)}]`),this.host=this.params.config.host||R,this.auth=this.params.config.auth||"Bearer",this.key=this.params.config.key||"",this.ollama=new L({host:this.host,fetch:this.setupFetch,...this.key&&{headers:{Authorization:`${this.auth} ${this.key}`}}})}getServiceSpecificErrorMessage(s){const t=s.message||"";return t.includes("ECONNREFUSED")||t.includes("connection refused")?b.ollamaNotRunning():t.includes("model")&&(t.includes("not found")||t.includes("404"))?b.ollamaModelNotPulled(this.model):null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():C(this.generateMessage("commit")).pipe(w(t=>k(t)),A(this.formatAsChoice),v(this.handleError$))}generateCodeReview$(){return C(this.generateMessage("review")).pipe(w(s=>k(s)),A(this.formatCodeReviewAsChoice),v(this.handleError$))}async generateMessage(s){const t=this.getTruncatedDiff(),{systemPrompt:e,systemPromptPath:o,codeReviewPromptPath:n,logging:h,locale:i,generate:d,type:a,maxLength:c}=this.params.config,m={...B,locale:i,maxLength:c,type:a,generate:d,systemPrompt:e,systemPromptPath:o,codeReviewPromptPath:n,vcs_branch:this.params.branchName||""},p=s==="review"?G(m):J(m);await this.checkIsAvailableOllama();const f=`Here is the diff: ${t}`,r=`Ollama_${this.model}`,g=`${this.host}/api/chat`,l=this.key?{Authorization:`${this.auth} ${this.key}`}:{};x(t,s,r,this.model,g,l,h),D(t,s,r,p,f,h);const u=await this.createChatCompletions(p,f,s);return s==="review"?this.parseCodeReview(u):this.parseMessage(u,a,d)}async checkIsAvailableOllama(){const s=new K({method:"GET",baseURL:`${this.host}`,timeout:this.params.config.timeout});return this.key&&s.setHeaders({Authorization:`${this.auth} ${this.key}`}),(await s.execute()).data}async createChatCompletions(s,t,e){const{numCtx:o,temperature:n,topP:h,timeout:i,maxTokens:d,logging:a}=this.params.config,c=this.params.stagedDiff.diff,m=`Ollama_${this.model}`,p={model:this.model,messages:[{role:"system",content:s},{role:"user",content:t}],stream:!1,keep_alive:i,options:{num_ctx:o,temperature:n,top_p:h,seed:E(10,1e3),num_predict:d??-1}};S(c,e,m,p,a);const f=Date.now();try{const r=await this.ollama.chat(p),g=Date.now()-f,l=r.message.content;return _(c,e,m,{response:l,fullResponse:r},a),M(c,e,m,g,l,a),l}catch(r){throw O(c,e,m,r,a),r}}}export{Q as OllamaService};
@@ -1 +1 @@
1
- import S from"chalk";import Q from"openai";import{concatMap as _,from as b,map as N,catchError as R}from"rxjs";import{fromPromise as O}from"rxjs/internal/observable/innerFrom";import{A as V,l as E,a as T,b as D,c as L,d as F,e as z}from"./ai.service-da8345b1.mjs";import{i as B}from"./openai-3092588f.mjs";import{D as H,g as U,a as X,c as K,b as Z}from"./cli-83e0874c.mjs";import"fs";import"path";import"@pacote/xxhash";import"winston";import"http";import"https";import"net";import"tls";import"url";import"assert";import"tty";import"util";import"os";import"events";import"cleye";import"module";import"crypto";import"node:buffer";import"node:path";import"node:child_process";import"node:process";import"child_process";import"node:url";import"node:os";import"node:fs";import"buffer";import"stream";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"node:fs/promises";import"chokidar";import"rxjs/operators";class j extends V{constructor(t){super(t),this.params=t,this.generateStreamingCommitMessage$=()=>{const{generate:m,type:o}=this.params.config;return this.createStreamingCommitMessages$(c=>{this.streamChunks(c).catch(r=>c.error(r))},o,m)},this.streamChunks=async m=>{const o=this.params.stagedDiff.diff,{systemPrompt:c,systemPromptPath:r,codeReviewPromptPath:A,logging:s,locale:d,temperature:g,generate:I,type:C,maxLength:f,timeout:u}=this.params.config,p=this.params.config.maxTokens,y={...H,locale:d,maxLength:f,type:C,generate:I,systemPrompt:c,systemPromptPath:r,codeReviewPromptPath:A,vcs_branch:this.params.branchName||""},i=U(y),P=`Here is the diff: ${o}`,a=this.params.keyName||"OpenAI-Compatible",v=`${this.params.config.url}${this.params.config.path}`,k={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};E(o,"commit",a,this.params.config.model,v,k,s),T(o,"commit",a,i,P,s);const w=B(this.params.config.model),n={messages:[{role:"system",content:i},{role:"user",content:P}],model:this.params.config.model,stream:!0,...w?{max_completion_tokens:p,temperature:1}:{max_tokens:p,top_p:this.params.config.topP,temperature:g}};D(o,"commit",a,n,s);const l=Date.now();let h="";try{const W=await this.openAI.chat.completions.create(n,{timeout:u});for await(const M of W){const G=M.choices?.[0]?.delta?.content||"",J=M.choices?.[0]?.delta?.reasoning_content||"",x=`${G}${J}`;x&&(h+=x,m.next(x))}const Y=Date.now()-l;L(o,"commit",a,{streamed:!0,totalLength:h.length},s),F(o,"commit",a,Y,h,s),m.complete()}catch($){z(o,"commit",a,$,s),m.error($)}};const e=this.params.keyName||"OPENAI_COMPATIBLE";this.colors=X(e),this.serviceName=S.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[${K(e)}]`),this.errorPrefix=S.red.bold(`[${K(e)}]`),this.openAI=new Q({apiKey:this.params.config.key,baseURL:`${this.params.config.url}${this.params.config.path}`})}getServiceSpecificErrorMessage(t){const e=t.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your OpenAI-compatible API key in configuration":e.includes("rate_limit")||e.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or check your service limits":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the model name is correct":e.includes("network")||e.includes("connection")?"Network error. Check your internet connection and API endpoint":e.includes("quota")||e.includes("usage")?"API quota exceeded. Check your usage limits":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your API configuration":e.includes("500")||e.includes("Internal Server Error")?"Server error. Try again later":e.includes("overloaded")||e.includes("capacity")?"Service is overloaded. Try again in a few minutes":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():O(this.generateMessage("commit")).pipe(_(e=>b(e)),N(this.formatAsChoice),R(this.handleError$))}generateCodeReview$(){return O(this.generateMessage("review")).pipe(_(t=>b(t)),N(this.formatCodeReviewAsChoice),R(this.handleError$))}async generateMessage(t){const e=this.params.stagedDiff.diff,{systemPrompt:m,systemPromptPath:o,codeReviewPromptPath:c,logging:r,locale:A,temperature:s,generate:d,type:g,maxLength:I,timeout:C}=this.params.config,f=this.params.config.maxTokens,u={...H,locale:A,maxLength:I,type:g,generate:d,systemPrompt:m,systemPromptPath:o,codeReviewPromptPath:c,vcs_branch:this.params.branchName||""},p=t==="review"?Z(u):U(u),y=`Here is the diff: ${e}`,i=this.params.keyName||"OpenAI-Compatible",P=`${this.params.config.url}${this.params.config.path}`,a={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};E(e,t,i,this.params.config.model,P,a,r),T(e,t,i,p,y,r);const v=B(this.params.config.model),k={messages:[{role:"system",content:p},{role:"user",content:y}],model:this.params.config.model,stream:!1,...v?{max_completion_tokens:f,temperature:1}:{max_tokens:f,top_p:this.params.config.topP,temperature:s}};D(e,t,i,k,r);const w=Date.now();try{const n=await this.openAI.chat.completions.create(k,{timeout:C}),l=n.choices?.[0]?.message.content||"",h=Date.now()-w;return L(e,t,i,n,r),F(e,t,i,h,l,r),t==="review"?this.parseCodeReview(l):this.parseMessage(l,g,d)}catch(n){throw z(e,t,i,n,r),n}}}export{j as OpenAICompatibleService};
1
+ import S from"chalk";import Q from"openai";import{concatMap as _,from as b,map as N,catchError as R}from"rxjs";import{fromPromise as O}from"rxjs/internal/observable/innerFrom";import{A as V,l as E,a as T,b as D,c as L,d as F,e as z}from"./ai.service-7cce5ee0.mjs";import{i as B}from"./openai-f7aae8f3.mjs";import{D as H,g as U,a as X,c as K,b as Z}from"./cli-0dd7e35c.mjs";import"fs";import"path";import"@pacote/xxhash";import"winston";import"http";import"https";import"net";import"tls";import"url";import"assert";import"tty";import"util";import"os";import"events";import"cleye";import"module";import"crypto";import"node:buffer";import"node:path";import"node:child_process";import"node:process";import"child_process";import"node:url";import"node:os";import"node:fs";import"buffer";import"stream";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"node:fs/promises";import"chokidar";import"rxjs/operators";class j extends V{constructor(t){super(t),this.params=t,this.generateStreamingCommitMessage$=()=>{const{generate:m,type:o}=this.params.config;return this.createStreamingCommitMessages$(c=>{this.streamChunks(c).catch(r=>c.error(r))},o,m)},this.streamChunks=async m=>{const o=this.params.stagedDiff.diff,{systemPrompt:c,systemPromptPath:r,codeReviewPromptPath:A,logging:s,locale:d,temperature:g,generate:I,type:C,maxLength:f,timeout:u}=this.params.config,p=this.params.config.maxTokens,y={...H,locale:d,maxLength:f,type:C,generate:I,systemPrompt:c,systemPromptPath:r,codeReviewPromptPath:A,vcs_branch:this.params.branchName||""},i=U(y),P=`Here is the diff: ${o}`,a=this.params.keyName||"OpenAI-Compatible",v=`${this.params.config.url}${this.params.config.path}`,k={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};E(o,"commit",a,this.params.config.model,v,k,s),T(o,"commit",a,i,P,s);const w=B(this.params.config.model),n={messages:[{role:"system",content:i},{role:"user",content:P}],model:this.params.config.model,stream:!0,...w?{max_completion_tokens:p,temperature:1}:{max_tokens:p,top_p:this.params.config.topP,temperature:g}};D(o,"commit",a,n,s);const l=Date.now();let h="";try{const W=await this.openAI.chat.completions.create(n,{timeout:u});for await(const M of W){const G=M.choices?.[0]?.delta?.content||"",J=M.choices?.[0]?.delta?.reasoning_content||"",x=`${G}${J}`;x&&(h+=x,m.next(x))}const Y=Date.now()-l;L(o,"commit",a,{streamed:!0,totalLength:h.length},s),F(o,"commit",a,Y,h,s),m.complete()}catch($){z(o,"commit",a,$,s),m.error($)}};const e=this.params.keyName||"OPENAI_COMPATIBLE";this.colors=X(e),this.serviceName=S.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[${K(e)}]`),this.errorPrefix=S.red.bold(`[${K(e)}]`),this.openAI=new Q({apiKey:this.params.config.key,baseURL:`${this.params.config.url}${this.params.config.path}`})}getServiceSpecificErrorMessage(t){const e=t.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your OpenAI-compatible API key in configuration":e.includes("rate_limit")||e.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or check your service limits":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the model name is correct":e.includes("network")||e.includes("connection")?"Network error. Check your internet connection and API endpoint":e.includes("quota")||e.includes("usage")?"API quota exceeded. Check your usage limits":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your API configuration":e.includes("500")||e.includes("Internal Server Error")?"Server error. Try again later":e.includes("overloaded")||e.includes("capacity")?"Service is overloaded. Try again in a few minutes":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():O(this.generateMessage("commit")).pipe(_(e=>b(e)),N(this.formatAsChoice),R(this.handleError$))}generateCodeReview$(){return O(this.generateMessage("review")).pipe(_(t=>b(t)),N(this.formatCodeReviewAsChoice),R(this.handleError$))}async generateMessage(t){const e=this.params.stagedDiff.diff,{systemPrompt:m,systemPromptPath:o,codeReviewPromptPath:c,logging:r,locale:A,temperature:s,generate:d,type:g,maxLength:I,timeout:C}=this.params.config,f=this.params.config.maxTokens,u={...H,locale:A,maxLength:I,type:g,generate:d,systemPrompt:m,systemPromptPath:o,codeReviewPromptPath:c,vcs_branch:this.params.branchName||""},p=t==="review"?Z(u):U(u),y=`Here is the diff: ${e}`,i=this.params.keyName||"OpenAI-Compatible",P=`${this.params.config.url}${this.params.config.path}`,a={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};E(e,t,i,this.params.config.model,P,a,r),T(e,t,i,p,y,r);const v=B(this.params.config.model),k={messages:[{role:"system",content:p},{role:"user",content:y}],model:this.params.config.model,stream:!1,...v?{max_completion_tokens:f,temperature:1}:{max_tokens:f,top_p:this.params.config.topP,temperature:s}};D(e,t,i,k,r);const w=Date.now();try{const n=await this.openAI.chat.completions.create(k,{timeout:C}),l=n.choices?.[0]?.message.content||"",h=Date.now()-w;return L(e,t,i,n,r),F(e,t,i,h,l,r),t==="review"?this.parseCodeReview(l):this.parseMessage(l,g,d)}catch(n){throw z(e,t,i,n,r),n}}}export{j as OpenAICompatibleService};
@@ -1,16 +1,17 @@
1
- import ae from"http";import ce from"https";import{i as y,j as ue,k as le,K as M}from"./cli-83e0874c.mjs";import fe from"net";import pe from"tls";import de from"url";import he from"assert";import V from"tty";import me from"util";import Ce from"os";import ge from"events";import{l as ye,a as be,b as we,c as ve,d as Fe,e as _e}from"./ai.service-da8345b1.mjs";var T={},k={exports:{}},E={exports:{}},S,W;function Oe(){if(W)return S;W=1;var t=1e3,n=t*60,i=n*60,e=i*24,l=e*7,s=e*365.25;S=function(u,r){r=r||{};var o=typeof u;if(o==="string"&&u.length>0)return d(u);if(o==="number"&&isFinite(u))return r.long?a(u):h(u);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(u))};function d(u){if(u=String(u),!(u.length>100)){var r=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(u);if(r){var o=parseFloat(r[1]),c=(r[2]||"ms").toLowerCase();switch(c){case"years":case"year":case"yrs":case"yr":case"y":return o*s;case"weeks":case"week":case"w":return o*l;case"days":case"day":case"d":return o*e;case"hours":case"hour":case"hrs":case"hr":case"h":return o*i;case"minutes":case"minute":case"mins":case"min":case"m":return o*n;case"seconds":case"second":case"secs":case"sec":case"s":return o*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return o;default:return}}}}function h(u){var r=Math.abs(u);return r>=e?Math.round(u/e)+"d":r>=i?Math.round(u/i)+"h":r>=n?Math.round(u/n)+"m":r>=t?Math.round(u/t)+"s":u+"ms"}function a(u){var r=Math.abs(u);return r>=e?f(u,r,e,"day"):r>=i?f(u,r,i,"hour"):r>=n?f(u,r,n,"minute"):r>=t?f(u,r,t,"second"):u+" ms"}function f(u,r,o,c){var p=r>=o*1.5;return Math.round(u/o)+" "+c+(p?"s":"")}return S}var L,Y;function K(){if(Y)return L;Y=1;function t(n){e.debug=e,e.default=e,e.coerce=f,e.disable=h,e.enable=s,e.enabled=a,e.humanize=Oe(),e.destroy=u,Object.keys(n).forEach(r=>{e[r]=n[r]}),e.names=[],e.skips=[],e.formatters={};function i(r){let o=0;for(let c=0;c<r.length;c++)o=(o<<5)-o+r.charCodeAt(c),o|=0;return e.colors[Math.abs(o)%e.colors.length]}e.selectColor=i;function e(r){let o,c=null,p,m;function C(...g){if(!C.enabled)return;const b=C,F=Number(new Date),I=F-(o||F);b.diff=I,b.prev=o,b.curr=F,o=F,g[0]=e.coerce(g[0]),typeof g[0]!="string"&&g.unshift("%O");let v=0;g[0]=g[0].replace(/%([a-zA-Z%])/g,(O,w)=>{if(O==="%%")return"%";v++;const J=e.formatters[w];if(typeof J=="function"){const ie=g[v];O=J.call(b,ie),g.splice(v,1),v--}return O}),e.formatArgs.call(b,g),(b.log||e.log).apply(b,g)}return C.namespace=r,C.useColors=e.useColors(),C.color=e.selectColor(r),C.extend=l,C.destroy=e.destroy,Object.defineProperty(C,"enabled",{enumerable:!0,configurable:!1,get:()=>c!==null?c:(p!==e.namespaces&&(p=e.namespaces,m=e.enabled(r)),m),set:g=>{c=g}}),typeof e.init=="function"&&e.init(C),C}function l(r,o){const c=e(this.namespace+(typeof o>"u"?":":o)+r);return c.log=this.log,c}function s(r){e.save(r),e.namespaces=r,e.names=[],e.skips=[];const o=(typeof r=="string"?r:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(const c of o)c[0]==="-"?e.skips.push(c.slice(1)):e.names.push(c)}function d(r,o){let c=0,p=0,m=-1,C=0;for(;c<r.length;)if(p<o.length&&(o[p]===r[c]||o[p]==="*"))o[p]==="*"?(m=p,C=c,p++):(c++,p++);else if(m!==-1)p=m+1,C++,c=C;else return!1;for(;p<o.length&&o[p]==="*";)p++;return p===o.length}function h(){const r=[...e.names,...e.skips.map(o=>"-"+o)].join(",");return e.enable(""),r}function a(r){for(const o of e.skips)if(d(r,o))return!1;for(const o of e.names)if(d(r,o))return!0;return!1}function f(r){return r instanceof Error?r.stack||r.message:r}function u(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return e.enable(e.load()),e}return L=t,L}E.exports;var Z;function Ee(){return Z||(Z=1,function(t,n){n.formatArgs=e,n.save=l,n.load=s,n.useColors=i,n.storage=d(),n.destroy=(()=>{let a=!1;return()=>{a||(a=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),n.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function i(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let a;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(a=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(a[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function e(a){if(a[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+a[0]+(this.useColors?"%c ":" ")+"+"+t.exports.humanize(this.diff),!this.useColors)return;const f="color: "+this.color;a.splice(1,0,f,"color: inherit");let u=0,r=0;a[0].replace(/%[a-zA-Z%]/g,o=>{o!=="%%"&&(u++,o==="%c"&&(r=u))}),a.splice(r,0,f)}n.log=console.debug||console.log||(()=>{});function l(a){try{a?n.storage.setItem("debug",a):n.storage.removeItem("debug")}catch{}}function s(){let a;try{a=n.storage.getItem("debug")||n.storage.getItem("DEBUG")}catch{}return!a&&typeof process<"u"&&"env"in process&&(a=process.env.DEBUG),a}function d(){try{return localStorage}catch{}}t.exports=K()(n);const{formatters:h}=t.exports;h.j=function(a){try{return JSON.stringify(a)}catch(f){return"[UnexpectedJSONParseError]: "+f.message}}}(E,E.exports)),E.exports}var $={exports:{}},D,X;function $e(){return X||(X=1,D=(t,n=process.argv)=>{const i=t.startsWith("-")?"":t.length===1?"-":"--",e=n.indexOf(i+t),l=n.indexOf("--");return e!==-1&&(l===-1||e<l)}),D}var j,Q;function xe(){if(Q)return j;Q=1;const t=Ce,n=V,i=$e(),{env:e}=process;let l;i("no-color")||i("no-colors")||i("color=false")||i("color=never")?l=0:(i("color")||i("colors")||i("color=true")||i("color=always"))&&(l=1),"FORCE_COLOR"in e&&(e.FORCE_COLOR==="true"?l=1:e.FORCE_COLOR==="false"?l=0:l=e.FORCE_COLOR.length===0?1:Math.min(parseInt(e.FORCE_COLOR,10),3));function s(a){return a===0?!1:{level:a,hasBasic:!0,has256:a>=2,has16m:a>=3}}function d(a,f){if(l===0)return 0;if(i("color=16m")||i("color=full")||i("color=truecolor"))return 3;if(i("color=256"))return 2;if(a&&!f&&l===void 0)return 0;const u=l||0;if(e.TERM==="dumb")return u;if(process.platform==="win32"){const r=t.release().split(".");return Number(r[0])>=10&&Number(r[2])>=10586?Number(r[2])>=14931?3:2:1}if("CI"in e)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(r=>r in e)||e.CI_NAME==="codeship"?1:u;if("TEAMCITY_VERSION"in e)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(e.TEAMCITY_VERSION)?1:0;if(e.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in e){const r=parseInt((e.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(e.TERM_PROGRAM){case"iTerm.app":return r>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(e.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(e.TERM)||"COLORTERM"in e?1:u}function h(a){const f=d(a,a&&a.isTTY);return s(f)}return j={supportsColor:h,stdout:s(d(!0,n.isatty(1))),stderr:s(d(!0,n.isatty(2)))},j}$.exports;var ee;function Ae(){return ee||(ee=1,function(t,n){const i=V,e=me;n.init=u,n.log=h,n.formatArgs=s,n.save=a,n.load=f,n.useColors=l,n.destroy=e.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."),n.colors=[6,2,3,4,5,1];try{const o=xe();o&&(o.stderr||o).level>=2&&(n.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}n.inspectOpts=Object.keys(process.env).filter(o=>/^debug_/i.test(o)).reduce((o,c)=>{const p=c.substring(6).toLowerCase().replace(/_([a-z])/g,(C,g)=>g.toUpperCase());let m=process.env[c];return/^(yes|on|true|enabled)$/i.test(m)?m=!0:/^(no|off|false|disabled)$/i.test(m)?m=!1:m==="null"?m=null:m=Number(m),o[p]=m,o},{});function l(){return"colors"in n.inspectOpts?!!n.inspectOpts.colors:i.isatty(process.stderr.fd)}function s(o){const{namespace:c,useColors:p}=this;if(p){const m=this.color,C="\x1B[3"+(m<8?m:"8;5;"+m),g=` ${C};1m${c} \x1B[0m`;o[0]=g+o[0].split(`
1
+ import ae from"http";import ce from"https";import{i as y,j as ue,k as le,K as R}from"./cli-0dd7e35c.mjs";import fe from"net";import pe from"tls";import de from"url";import he from"assert";import V from"tty";import me from"util";import Ce from"os";import ge from"events";import{l as ye,a as be,b as we,c as Fe,d as ve,e as _e}from"./ai.service-7cce5ee0.mjs";var T={},k={exports:{}},E={exports:{}},S,W;function Oe(){if(W)return S;W=1;var t=1e3,n=t*60,i=n*60,e=i*24,f=e*7,s=e*365.25;S=function(u,r){r=r||{};var o=typeof u;if(o==="string"&&u.length>0)return d(u);if(o==="number"&&isFinite(u))return r.long?a(u):h(u);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(u))};function d(u){if(u=String(u),!(u.length>100)){var r=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(u);if(r){var o=parseFloat(r[1]),c=(r[2]||"ms").toLowerCase();switch(c){case"years":case"year":case"yrs":case"yr":case"y":return o*s;case"weeks":case"week":case"w":return o*f;case"days":case"day":case"d":return o*e;case"hours":case"hour":case"hrs":case"hr":case"h":return o*i;case"minutes":case"minute":case"mins":case"min":case"m":return o*n;case"seconds":case"second":case"secs":case"sec":case"s":return o*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return o;default:return}}}}function h(u){var r=Math.abs(u);return r>=e?Math.round(u/e)+"d":r>=i?Math.round(u/i)+"h":r>=n?Math.round(u/n)+"m":r>=t?Math.round(u/t)+"s":u+"ms"}function a(u){var r=Math.abs(u);return r>=e?l(u,r,e,"day"):r>=i?l(u,r,i,"hour"):r>=n?l(u,r,n,"minute"):r>=t?l(u,r,t,"second"):u+" ms"}function l(u,r,o,c){var p=r>=o*1.5;return Math.round(u/o)+" "+c+(p?"s":"")}return S}var L,Y;function K(){if(Y)return L;Y=1;function t(n){e.debug=e,e.default=e,e.coerce=l,e.disable=h,e.enable=s,e.enabled=a,e.humanize=Oe(),e.destroy=u,Object.keys(n).forEach(r=>{e[r]=n[r]}),e.names=[],e.skips=[],e.formatters={};function i(r){let o=0;for(let c=0;c<r.length;c++)o=(o<<5)-o+r.charCodeAt(c),o|=0;return e.colors[Math.abs(o)%e.colors.length]}e.selectColor=i;function e(r){let o,c=null,p,m;function C(...g){if(!C.enabled)return;const b=C,v=Number(new Date),M=v-(o||v);b.diff=M,b.prev=o,b.curr=v,o=v,g[0]=e.coerce(g[0]),typeof g[0]!="string"&&g.unshift("%O");let F=0;g[0]=g[0].replace(/%([a-zA-Z%])/g,(O,w)=>{if(O==="%%")return"%";F++;const J=e.formatters[w];if(typeof J=="function"){const ie=g[F];O=J.call(b,ie),g.splice(F,1),F--}return O}),e.formatArgs.call(b,g),(b.log||e.log).apply(b,g)}return C.namespace=r,C.useColors=e.useColors(),C.color=e.selectColor(r),C.extend=f,C.destroy=e.destroy,Object.defineProperty(C,"enabled",{enumerable:!0,configurable:!1,get:()=>c!==null?c:(p!==e.namespaces&&(p=e.namespaces,m=e.enabled(r)),m),set:g=>{c=g}}),typeof e.init=="function"&&e.init(C),C}function f(r,o){const c=e(this.namespace+(typeof o>"u"?":":o)+r);return c.log=this.log,c}function s(r){e.save(r),e.namespaces=r,e.names=[],e.skips=[];const o=(typeof r=="string"?r:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(const c of o)c[0]==="-"?e.skips.push(c.slice(1)):e.names.push(c)}function d(r,o){let c=0,p=0,m=-1,C=0;for(;c<r.length;)if(p<o.length&&(o[p]===r[c]||o[p]==="*"))o[p]==="*"?(m=p,C=c,p++):(c++,p++);else if(m!==-1)p=m+1,C++,c=C;else return!1;for(;p<o.length&&o[p]==="*";)p++;return p===o.length}function h(){const r=[...e.names,...e.skips.map(o=>"-"+o)].join(",");return e.enable(""),r}function a(r){for(const o of e.skips)if(d(r,o))return!1;for(const o of e.names)if(d(r,o))return!0;return!1}function l(r){return r instanceof Error?r.stack||r.message:r}function u(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return e.enable(e.load()),e}return L=t,L}E.exports;var Z;function Ee(){return Z||(Z=1,function(t,n){n.formatArgs=e,n.save=f,n.load=s,n.useColors=i,n.storage=d(),n.destroy=(()=>{let a=!1;return()=>{a||(a=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),n.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function i(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let a;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(a=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(a[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function e(a){if(a[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+a[0]+(this.useColors?"%c ":" ")+"+"+t.exports.humanize(this.diff),!this.useColors)return;const l="color: "+this.color;a.splice(1,0,l,"color: inherit");let u=0,r=0;a[0].replace(/%[a-zA-Z%]/g,o=>{o!=="%%"&&(u++,o==="%c"&&(r=u))}),a.splice(r,0,l)}n.log=console.debug||console.log||(()=>{});function f(a){try{a?n.storage.setItem("debug",a):n.storage.removeItem("debug")}catch{}}function s(){let a;try{a=n.storage.getItem("debug")||n.storage.getItem("DEBUG")}catch{}return!a&&typeof process<"u"&&"env"in process&&(a=process.env.DEBUG),a}function d(){try{return localStorage}catch{}}t.exports=K()(n);const{formatters:h}=t.exports;h.j=function(a){try{return JSON.stringify(a)}catch(l){return"[UnexpectedJSONParseError]: "+l.message}}}(E,E.exports)),E.exports}var $={exports:{}},D,X;function $e(){return X||(X=1,D=(t,n=process.argv)=>{const i=t.startsWith("-")?"":t.length===1?"-":"--",e=n.indexOf(i+t),f=n.indexOf("--");return e!==-1&&(f===-1||e<f)}),D}var j,Q;function Ae(){if(Q)return j;Q=1;const t=Ce,n=V,i=$e(),{env:e}=process;let f;i("no-color")||i("no-colors")||i("color=false")||i("color=never")?f=0:(i("color")||i("colors")||i("color=true")||i("color=always"))&&(f=1),"FORCE_COLOR"in e&&(e.FORCE_COLOR==="true"?f=1:e.FORCE_COLOR==="false"?f=0:f=e.FORCE_COLOR.length===0?1:Math.min(parseInt(e.FORCE_COLOR,10),3));function s(a){return a===0?!1:{level:a,hasBasic:!0,has256:a>=2,has16m:a>=3}}function d(a,l){if(f===0)return 0;if(i("color=16m")||i("color=full")||i("color=truecolor"))return 3;if(i("color=256"))return 2;if(a&&!l&&f===void 0)return 0;const u=f||0;if(e.TERM==="dumb")return u;if(process.platform==="win32"){const r=t.release().split(".");return Number(r[0])>=10&&Number(r[2])>=10586?Number(r[2])>=14931?3:2:1}if("CI"in e)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(r=>r in e)||e.CI_NAME==="codeship"?1:u;if("TEAMCITY_VERSION"in e)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(e.TEAMCITY_VERSION)?1:0;if(e.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in e){const r=parseInt((e.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(e.TERM_PROGRAM){case"iTerm.app":return r>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(e.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(e.TERM)||"COLORTERM"in e?1:u}function h(a){const l=d(a,a&&a.isTTY);return s(l)}return j={supportsColor:h,stdout:s(d(!0,n.isatty(1))),stderr:s(d(!0,n.isatty(2)))},j}$.exports;var ee;function xe(){return ee||(ee=1,function(t,n){const i=V,e=me;n.init=u,n.log=h,n.formatArgs=s,n.save=a,n.load=l,n.useColors=f,n.destroy=e.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."),n.colors=[6,2,3,4,5,1];try{const o=Ae();o&&(o.stderr||o).level>=2&&(n.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}n.inspectOpts=Object.keys(process.env).filter(o=>/^debug_/i.test(o)).reduce((o,c)=>{const p=c.substring(6).toLowerCase().replace(/_([a-z])/g,(C,g)=>g.toUpperCase());let m=process.env[c];return/^(yes|on|true|enabled)$/i.test(m)?m=!0:/^(no|off|false|disabled)$/i.test(m)?m=!1:m==="null"?m=null:m=Number(m),o[p]=m,o},{});function f(){return"colors"in n.inspectOpts?!!n.inspectOpts.colors:i.isatty(process.stderr.fd)}function s(o){const{namespace:c,useColors:p}=this;if(p){const m=this.color,C="\x1B[3"+(m<8?m:"8;5;"+m),g=` ${C};1m${c} \x1B[0m`;o[0]=g+o[0].split(`
2
2
  `).join(`
3
3
  `+g),o.push(C+"m+"+t.exports.humanize(this.diff)+"\x1B[0m")}else o[0]=d()+c+" "+o[0]}function d(){return n.inspectOpts.hideDate?"":new Date().toISOString()+" "}function h(...o){return process.stderr.write(e.formatWithOptions(n.inspectOpts,...o)+`
4
- `)}function a(o){o?process.env.DEBUG=o:delete process.env.DEBUG}function f(){return process.env.DEBUG}function u(o){o.inspectOpts={};const c=Object.keys(n.inspectOpts);for(let p=0;p<c.length;p++)o.inspectOpts[c[p]]=n.inspectOpts[c[p]]}t.exports=K()(n);const{formatters:r}=t.exports;r.o=function(o){return this.inspectOpts.colors=this.useColors,e.inspect(o,this.inspectOpts).split(`
5
- `).map(c=>c.trim()).join(" ")},r.O=function(o){return this.inspectOpts.colors=this.useColors,e.inspect(o,this.inspectOpts)}}($,$.exports)),$.exports}typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?k.exports=Ee():k.exports=Ae();var B=k.exports,N={};Object.defineProperty(N,"__esModule",{value:!0});function Pe(t){return function(n,i){return new Promise((e,l)=>{t.call(this,n,i,(s,d)=>{s?l(s):e(d)})})}}N.default=Pe;var te=y&&y.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};const Re=ge,Ie=te(B),Me=te(N),x=Ie.default("agent-base");function Te(t){return!!t&&typeof t.addRequest=="function"}function U(){const{stack:t}=new Error;return typeof t!="string"?!1:t.split(`
6
- `).some(n=>n.indexOf("(https.js:")!==-1||n.indexOf("node:https:")!==-1)}function R(t,n){return new R.Agent(t,n)}(function(t){class n extends Re.EventEmitter{constructor(e,l){super();let s=l;typeof e=="function"?this.callback=e:e&&(s=e),this.timeout=null,s&&typeof s.timeout=="number"&&(this.timeout=s.timeout),this.maxFreeSockets=1,this.maxSockets=1,this.maxTotalSockets=1/0,this.sockets={},this.freeSockets={},this.requests={},this.options={}}get defaultPort(){return typeof this.explicitDefaultPort=="number"?this.explicitDefaultPort:U()?443:80}set defaultPort(e){this.explicitDefaultPort=e}get protocol(){return typeof this.explicitProtocol=="string"?this.explicitProtocol:U()?"https:":"http:"}set protocol(e){this.explicitProtocol=e}callback(e,l,s){throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`')}addRequest(e,l){const s=Object.assign({},l);typeof s.secureEndpoint!="boolean"&&(s.secureEndpoint=U()),s.host==null&&(s.host="localhost"),s.port==null&&(s.port=s.secureEndpoint?443:80),s.protocol==null&&(s.protocol=s.secureEndpoint?"https:":"http:"),s.host&&s.path&&delete s.path,delete s.agent,delete s.hostname,delete s._defaultAgent,delete s.defaultPort,delete s.createConnection,e._last=!0,e.shouldKeepAlive=!1;let d=!1,h=null;const a=s.timeout||this.timeout,f=c=>{e._hadError||(e.emit("error",c),e._hadError=!0)},u=()=>{h=null,d=!0;const c=new Error(`A "socket" was not created for HTTP request before ${a}ms`);c.code="ETIMEOUT",f(c)},r=c=>{d||(h!==null&&(clearTimeout(h),h=null),f(c))},o=c=>{if(d)return;if(h!=null&&(clearTimeout(h),h=null),Te(c)){x("Callback returned another Agent instance %o",c.constructor.name),c.addRequest(e,s);return}if(c){c.once("free",()=>{this.freeSocket(c,s)}),e.onSocket(c);return}const p=new Error(`no Duplex stream was returned to agent-base for \`${e.method} ${e.path}\``);f(p)};if(typeof this.callback!="function"){f(new Error("`callback` is not defined"));return}this.promisifiedCallback||(this.callback.length>=3?(x("Converting legacy callback function to promise"),this.promisifiedCallback=Me.default(this.callback)):this.promisifiedCallback=this.callback),typeof a=="number"&&a>0&&(h=setTimeout(u,a)),"port"in s&&typeof s.port!="number"&&(s.port=Number(s.port));try{x("Resolving socket for %o request: %o",s.protocol,`${e.method} ${e.path}`),Promise.resolve(this.promisifiedCallback(e,s)).then(o,r)}catch(c){Promise.reject(c).catch(r)}}freeSocket(e,l){x("Freeing socket %o %o",e.constructor.name,l),e.destroy()}destroy(){x("Destroying agent %o",this.constructor.name)}}t.Agent=n,t.prototype=t.Agent.prototype})(R||(R={}));var ke=R,q={},Se=y&&y.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(q,"__esModule",{value:!0});const Le=Se(B),A=Le.default("https-proxy-agent:parse-proxy-response");function De(t){return new Promise((n,i)=>{let e=0;const l=[];function s(){const r=t.read();r?u(r):t.once("readable",s)}function d(){t.removeListener("end",a),t.removeListener("error",f),t.removeListener("close",h),t.removeListener("readable",s)}function h(r){A("onclose had error %o",r)}function a(){A("onend")}function f(r){d(),A("onerror %o",r),i(r)}function u(r){l.push(r),e+=r.length;const o=Buffer.concat(l,e);if(o.indexOf(`\r
4
+ `)}function a(o){o?process.env.DEBUG=o:delete process.env.DEBUG}function l(){return process.env.DEBUG}function u(o){o.inspectOpts={};const c=Object.keys(n.inspectOpts);for(let p=0;p<c.length;p++)o.inspectOpts[c[p]]=n.inspectOpts[c[p]]}t.exports=K()(n);const{formatters:r}=t.exports;r.o=function(o){return this.inspectOpts.colors=this.useColors,e.inspect(o,this.inspectOpts).split(`
5
+ `).map(c=>c.trim()).join(" ")},r.O=function(o){return this.inspectOpts.colors=this.useColors,e.inspect(o,this.inspectOpts)}}($,$.exports)),$.exports}typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?k.exports=Ee():k.exports=xe();var B=k.exports,N={};Object.defineProperty(N,"__esModule",{value:!0});function Pe(t){return function(n,i){return new Promise((e,f)=>{t.call(this,n,i,(s,d)=>{s?f(s):e(d)})})}}N.default=Pe;var te=y&&y.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};const Re=ge,Ie=te(B),Me=te(N),A=Ie.default("agent-base");function Te(t){return!!t&&typeof t.addRequest=="function"}function U(){const{stack:t}=new Error;return typeof t!="string"?!1:t.split(`
6
+ `).some(n=>n.indexOf("(https.js:")!==-1||n.indexOf("node:https:")!==-1)}function I(t,n){return new I.Agent(t,n)}(function(t){class n extends Re.EventEmitter{constructor(e,f){super();let s=f;typeof e=="function"?this.callback=e:e&&(s=e),this.timeout=null,s&&typeof s.timeout=="number"&&(this.timeout=s.timeout),this.maxFreeSockets=1,this.maxSockets=1,this.maxTotalSockets=1/0,this.sockets={},this.freeSockets={},this.requests={},this.options={}}get defaultPort(){return typeof this.explicitDefaultPort=="number"?this.explicitDefaultPort:U()?443:80}set defaultPort(e){this.explicitDefaultPort=e}get protocol(){return typeof this.explicitProtocol=="string"?this.explicitProtocol:U()?"https:":"http:"}set protocol(e){this.explicitProtocol=e}callback(e,f,s){throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`')}addRequest(e,f){const s=Object.assign({},f);typeof s.secureEndpoint!="boolean"&&(s.secureEndpoint=U()),s.host==null&&(s.host="localhost"),s.port==null&&(s.port=s.secureEndpoint?443:80),s.protocol==null&&(s.protocol=s.secureEndpoint?"https:":"http:"),s.host&&s.path&&delete s.path,delete s.agent,delete s.hostname,delete s._defaultAgent,delete s.defaultPort,delete s.createConnection,e._last=!0,e.shouldKeepAlive=!1;let d=!1,h=null;const a=s.timeout||this.timeout,l=c=>{e._hadError||(e.emit("error",c),e._hadError=!0)},u=()=>{h=null,d=!0;const c=new Error(`A "socket" was not created for HTTP request before ${a}ms`);c.code="ETIMEOUT",l(c)},r=c=>{d||(h!==null&&(clearTimeout(h),h=null),l(c))},o=c=>{if(d)return;if(h!=null&&(clearTimeout(h),h=null),Te(c)){A("Callback returned another Agent instance %o",c.constructor.name),c.addRequest(e,s);return}if(c){c.once("free",()=>{this.freeSocket(c,s)}),e.onSocket(c);return}const p=new Error(`no Duplex stream was returned to agent-base for \`${e.method} ${e.path}\``);l(p)};if(typeof this.callback!="function"){l(new Error("`callback` is not defined"));return}this.promisifiedCallback||(this.callback.length>=3?(A("Converting legacy callback function to promise"),this.promisifiedCallback=Me.default(this.callback)):this.promisifiedCallback=this.callback),typeof a=="number"&&a>0&&(h=setTimeout(u,a)),"port"in s&&typeof s.port!="number"&&(s.port=Number(s.port));try{A("Resolving socket for %o request: %o",s.protocol,`${e.method} ${e.path}`),Promise.resolve(this.promisifiedCallback(e,s)).then(o,r)}catch(c){Promise.reject(c).catch(r)}}freeSocket(e,f){A("Freeing socket %o %o",e.constructor.name,f),e.destroy()}destroy(){A("Destroying agent %o",this.constructor.name)}}t.Agent=n,t.prototype=t.Agent.prototype})(I||(I={}));var ke=I,q={},Se=y&&y.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(q,"__esModule",{value:!0});const Le=Se(B),x=Le.default("https-proxy-agent:parse-proxy-response");function De(t){return new Promise((n,i)=>{let e=0;const f=[];function s(){const r=t.read();r?u(r):t.once("readable",s)}function d(){t.removeListener("end",a),t.removeListener("error",l),t.removeListener("close",h),t.removeListener("readable",s)}function h(r){x("onclose had error %o",r)}function a(){x("onend")}function l(r){d(),x("onerror %o",r),i(r)}function u(r){f.push(r),e+=r.length;const o=Buffer.concat(f,e);if(o.indexOf(`\r
7
7
  \r
8
- `)===-1){A("have not received end of HTTP headers yet..."),s();return}const p=o.toString("ascii",0,o.indexOf(`\r
9
- `)),m=+p.split(" ")[1];A("got proxy server response: %o",p),n({statusCode:m,buffered:o})}t.on("error",f),t.on("close",h),t.on("end",a),s()})}q.default=De;var je=y&&y.__awaiter||function(t,n,i,e){function l(s){return s instanceof i?s:new i(function(d){d(s)})}return new(i||(i=Promise))(function(s,d){function h(u){try{f(e.next(u))}catch(r){d(r)}}function a(u){try{f(e.throw(u))}catch(r){d(r)}}function f(u){u.done?s(u.value):l(u.value).then(h,a)}f((e=e.apply(t,n||[])).next())})},_=y&&y.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(T,"__esModule",{value:!0});const re=_(fe),oe=_(pe),Be=_(de),Ne=_(he),Ue=_(B),qe=ke,He=_(q),P=Ue.default("https-proxy-agent:agent");class Ge extends qe.Agent{constructor(n){let i;if(typeof n=="string"?i=Be.default.parse(n):i=n,!i)throw new Error("an HTTP(S) proxy server `host` and `port` must be specified!");P("creating new HttpsProxyAgent instance: %o",i),super(i);const e=Object.assign({},i);this.secureProxy=i.secureProxy||Ve(e.protocol),e.host=e.hostname||e.host,typeof e.port=="string"&&(e.port=parseInt(e.port,10)),!e.port&&e.host&&(e.port=this.secureProxy?443:80),this.secureProxy&&!("ALPNProtocols"in e)&&(e.ALPNProtocols=["http 1.1"]),e.host&&e.path&&(delete e.path,delete e.pathname),this.proxy=e}callback(n,i){return je(this,void 0,void 0,function*(){const{proxy:e,secureProxy:l}=this;let s;l?(P("Creating `tls.Socket`: %o",e),s=oe.default.connect(e)):(P("Creating `net.Socket`: %o",e),s=re.default.connect(e));const d=Object.assign({},e.headers);let a=`CONNECT ${`${i.host}:${i.port}`} HTTP/1.1\r
10
- `;e.auth&&(d["Proxy-Authorization"]=`Basic ${Buffer.from(e.auth).toString("base64")}`);let{host:f,port:u,secureEndpoint:r}=i;Je(u,r)||(f+=`:${u}`),d.Host=f,d.Connection="close";for(const C of Object.keys(d))a+=`${C}: ${d[C]}\r
8
+ `)===-1){x("have not received end of HTTP headers yet..."),s();return}const p=o.toString("ascii",0,o.indexOf(`\r
9
+ `)),m=+p.split(" ")[1];x("got proxy server response: %o",p),n({statusCode:m,buffered:o})}t.on("error",l),t.on("close",h),t.on("end",a),s()})}q.default=De;var je=y&&y.__awaiter||function(t,n,i,e){function f(s){return s instanceof i?s:new i(function(d){d(s)})}return new(i||(i=Promise))(function(s,d){function h(u){try{l(e.next(u))}catch(r){d(r)}}function a(u){try{l(e.throw(u))}catch(r){d(r)}}function l(u){u.done?s(u.value):f(u.value).then(h,a)}l((e=e.apply(t,n||[])).next())})},_=y&&y.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(T,"__esModule",{value:!0});const re=_(fe),oe=_(pe),Be=_(de),Ne=_(he),Ue=_(B),qe=ke,He=_(q),P=Ue.default("https-proxy-agent:agent");class Ge extends qe.Agent{constructor(n){let i;if(typeof n=="string"?i=Be.default.parse(n):i=n,!i)throw new Error("an HTTP(S) proxy server `host` and `port` must be specified!");P("creating new HttpsProxyAgent instance: %o",i),super(i);const e=Object.assign({},i);this.secureProxy=i.secureProxy||Ve(e.protocol),e.host=e.hostname||e.host,typeof e.port=="string"&&(e.port=parseInt(e.port,10)),!e.port&&e.host&&(e.port=this.secureProxy?443:80),this.secureProxy&&!("ALPNProtocols"in e)&&(e.ALPNProtocols=["http 1.1"]),e.host&&e.path&&(delete e.path,delete e.pathname),this.proxy=e}callback(n,i){return je(this,void 0,void 0,function*(){const{proxy:e,secureProxy:f}=this;let s;f?(P("Creating `tls.Socket`: %o",e),s=oe.default.connect(e)):(P("Creating `net.Socket`: %o",e),s=re.default.connect(e));const d=Object.assign({},e.headers);let a=`CONNECT ${`${i.host}:${i.port}`} HTTP/1.1\r
10
+ `;e.auth&&(d["Proxy-Authorization"]=`Basic ${Buffer.from(e.auth).toString("base64")}`);let{host:l,port:u,secureEndpoint:r}=i;Je(u,r)||(l+=`:${u}`),d.Host=l,d.Connection="close";for(const C of Object.keys(d))a+=`${C}: ${d[C]}\r
11
11
  `;const o=He.default(s);s.write(`${a}\r
12
- `);const{statusCode:c,buffered:p}=yield o;if(c===200){if(n.once("socket",ze),i.secureEndpoint){P("Upgrading socket connection to TLS");const C=i.servername||i.host;return oe.default.connect(Object.assign(Object.assign({},We(i,"host","hostname","path","port")),{socket:s,servername:C}))}return s}s.destroy();const m=new re.default.Socket({writable:!1});return m.readable=!0,n.once("socket",C=>{P("replaying proxy buffer for failed request"),Ne.default(C.listenerCount("data")>0),C.push(p),C.push(null)}),m})}}T.default=Ge;function ze(t){t.resume()}function Je(t,n){return!!(!n&&t===80||n&&t===443)}function Ve(t){return typeof t=="string"?/^https:?$/i.test(t):!1}function We(t,...n){const i={};let e;for(e in t)n.includes(e)||(i[e]=t[e]);return i}var Ye=y&&y.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};const H=Ye(T);function G(t){return new H.default(t)}(function(t){t.HttpsProxyAgent=H.default,t.prototype=H.default.prototype})(G||(G={}));var Ke=G,Ze=ue(Ke);const Xe=async(t,n,i,e,l,s,d)=>new Promise((h,a)=>{const f=JSON.stringify(e),r=(t.protocol.includes("https")?ce:ae).request({port:d||void 0,hostname:t.hostname,path:n,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(f),...i},timeout:l,agent:s?Ze(s):void 0},o=>{const c=[];o.on("data",p=>c.push(p)),o.on("end",()=>{h({request:r,response:o,data:Buffer.concat(c).toString()})})});r.on("error",a),r.on("timeout",()=>{r.destroy(),a(new M(`Time out error: request took over ${l}ms. Try increasing the \`timeout\` config`))}),r.write(f),r.end()}),Qe=async(t,n,i,e,l,s)=>{const d=new URL(t),{response:h,data:a}=await Xe(d,n,{Authorization:`Bearer ${i}`},e,l,s);if(!h.statusCode||h.statusCode<200||h.statusCode>299){let f=`API Error: ${h.statusCode} - ${h.statusMessage}`;throw a&&(f+=`
12
+ `);const{statusCode:c,buffered:p}=yield o;if(c===200){if(n.once("socket",ze),i.secureEndpoint){P("Upgrading socket connection to TLS");const C=i.servername||i.host;return oe.default.connect(Object.assign(Object.assign({},We(i,"host","hostname","path","port")),{socket:s,servername:C}))}return s}s.destroy();const m=new re.default.Socket({writable:!1});return m.readable=!0,n.once("socket",C=>{P("replaying proxy buffer for failed request"),Ne.default(C.listenerCount("data")>0),C.push(p),C.push(null)}),m})}}T.default=Ge;function ze(t){t.resume()}function Je(t,n){return!!(!n&&t===80||n&&t===443)}function Ve(t){return typeof t=="string"?/^https:?$/i.test(t):!1}function We(t,...n){const i={};let e;for(e in t)n.includes(e)||(i[e]=t[e]);return i}var Ye=y&&y.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};const H=Ye(T);function G(t){return new H.default(t)}(function(t){t.HttpsProxyAgent=H.default,t.prototype=H.default.prototype})(G||(G={}));var Ke=G,Ze=ue(Ke);const Xe=async(t,n,i,e,f,s,d)=>new Promise((h,a)=>{const l=JSON.stringify(e),r=(t.protocol.includes("https")?ce:ae).request({port:d||void 0,hostname:t.hostname,path:n,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(l),...i},timeout:f,agent:s?Ze(s):void 0},o=>{const c=[];o.on("data",p=>c.push(p)),o.on("end",()=>{h({request:r,response:o,data:Buffer.concat(c).toString()})})});r.on("error",a),r.on("timeout",()=>{r.destroy(),a(new R(`Time out error: request took over ${f}ms. Try increasing the \`timeout\` config`))}),r.write(l),r.end()}),Qe=async(t,n,i,e,f,s)=>{const d=new URL(t),{response:h,data:a}=await Xe(d,n,{Authorization:`Bearer ${i}`},e,f,s);if(!h.statusCode||h.statusCode<200||h.statusCode>299){let l=`API Error: ${h.statusCode} - ${h.statusMessage}`;throw a&&(l+=`
13
13
 
14
- ${a}`),h.statusCode===500&&(f+=`
14
+ ${a}`),h.statusCode===500&&(l+=`
15
15
 
16
- Check the API status: ${t}`),new M(f)}return JSON.parse(a)},ne=t=>t.trim(),et=["gpt-5","gpt-5-mini","gpt-5-nano","gpt-5-codex","o1","o1-mini","o1-pro","o3","o3-mini","o3-pro","o4-mini"],se=t=>{const n=t.toLowerCase();return et.some(i=>n===i||n.startsWith(`${i}-`)||n.startsWith(`${i}.`))},tt=async(t,n,i,e,l,s,d,h,a,f,u,r,o,c)=>{try{const p=le(s,o),m=se(l),C={model:l,messages:[{role:"system",content:u},{role:"user",content:p}],stream:!1,n:1,frequency_penalty:0,presence_penalty:0,...m?{max_completion_tokens:h,temperature:1}:{max_tokens:h,top_p:f,temperature:a}},g=new URL(n),b=`${g.protocol}//${g.host}${i}`,F={Authorization:`Bearer ${e}`,"Content-Type":"application/json"};ye(s,o,t,l,b,F,r),be(s,o,t,u,p,r),we(s,o,t,C,r);const I=Date.now(),v=await Qe(n,i,e,C,d,c),z=Date.now()-I;ve(s,o,t,v,r);const O=v.choices.filter(w=>w.message?.content).map(w=>ne(w.message.content)).join();return Fe(s,o,t,z,O,r),v.choices.filter(w=>w.message?.content).map(w=>ne(w.message.content))}catch(p){_e(s,o,t,p,r);const m=p;throw m.code==="ENOTFOUND"?new M(`Error connecting to ${m.hostname} (${m.syscall})`):m}};export{tt as g,se as i};
16
+ Check the API status: ${t}`),new R(l)}try{return JSON.parse(a)}catch(l){throw new R(`Failed to parse API response as JSON: ${l.message}
17
+ Response: ${a.substring(0,200)}`)}},ne=t=>t.trim(),et=["gpt-5","gpt-5-mini","gpt-5-nano","gpt-5-codex","o1","o1-mini","o1-pro","o3","o3-mini","o3-pro","o4-mini"],se=t=>{const n=t.toLowerCase();return et.some(i=>n===i||n.startsWith(`${i}-`)||n.startsWith(`${i}.`))},tt=async(t,n,i,e,f,s,d,h,a,l,u,r,o,c)=>{try{const p=le(s,o),m=se(f),C={model:f,messages:[{role:"system",content:u},{role:"user",content:p}],stream:!1,n:1,frequency_penalty:0,presence_penalty:0,...m?{max_completion_tokens:h,temperature:1}:{max_tokens:h,top_p:l,temperature:a}},g=new URL(n),b=`${g.protocol}//${g.host}${i}`,v={Authorization:`Bearer ${e}`,"Content-Type":"application/json"};ye(s,o,t,f,b,v,r),be(s,o,t,u,p,r),we(s,o,t,C,r);const M=Date.now(),F=await Qe(n,i,e,C,d,c),z=Date.now()-M;Fe(s,o,t,F,r);const O=F.choices.filter(w=>w.message?.content).map(w=>ne(w.message.content)).join();return ve(s,o,t,z,O,r),F.choices.filter(w=>w.message?.content).map(w=>ne(w.message.content))}catch(p){_e(s,o,t,p,r);const m=p;throw m.code==="ENOTFOUND"?new R(`Error connecting to ${m.hostname} (${m.syscall})`):m}};export{tt as g,se as i};
@@ -1 +1 @@
1
- import k from"chalk";import N from"openai";import{concatMap as T,from as w,map as x,catchError as M}from"rxjs";import{fromPromise as $}from"rxjs/internal/observable/innerFrom";import{A as U,l as H,a as q,b as z,c as B,d as K,e as J}from"./ai.service-da8345b1.mjs";import{i as Q,g as V}from"./openai-3092588f.mjs";import{D as S,g as R,b as W,m as O}from"./cli-83e0874c.mjs";import"fs";import"path";import"@pacote/xxhash";import"winston";import"http";import"https";import"net";import"tls";import"url";import"assert";import"tty";import"util";import"os";import"events";import"cleye";import"module";import"crypto";import"node:buffer";import"node:path";import"node:child_process";import"node:process";import"child_process";import"node:url";import"node:os";import"node:fs";import"buffer";import"stream";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"node:fs/promises";import"chokidar";import"rxjs/operators";class X extends U{constructor(t){super(t),this.params=t,this.generateStreamingCommitMessage$=()=>{const{generate:s,type:e}=this.params.config;return this.createStreamingCommitMessages$(a=>{this.streamChunks(a).catch(m=>a.error(m))},e,s)},this.streamChunks=async s=>{const e=this.params.stagedDiff.diff,{systemPrompt:a,systemPromptPath:m,codeReviewPromptPath:g,temperature:p,logging:o,locale:l,generate:f,type:d,maxLength:u,maxTokens:n,timeout:P}=this.params.config,c={...S,locale:l,maxLength:u,type:d,generate:f,systemPrompt:a,systemPromptPath:m,codeReviewPromptPath:g,vcs_branch:this.params.branchName||""},i=R(c),I=`Here is the diff: ${e}`,b=`${this.params.config.url}${this.params.config.path}`,G={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};H(e,"commit","ChatGPT",this.params.config.model,b,G,o),q(e,"commit","ChatGPT",i,I,o);const _=Q(this.params.config.model),v={messages:[{role:"system",content:i},{role:"user",content:I}],model:this.params.config.model,stream:!0,..._?{max_completion_tokens:n,temperature:1}:{max_tokens:n,top_p:this.params.config.topP,temperature:p}};z(e,"commit","ChatGPT",v,o);const D=Date.now();let y="";try{const E=await this.openAI.chat.completions.create(v,{timeout:P});for await(const F of E){const A=F.choices?.[0]?.delta?.content||"";A&&(y+=A,s.next(A))}const L=Date.now()-D;B(e,"commit","ChatGPT",{streamed:!0,totalLength:y.length},o),K(e,"commit","ChatGPT",L,y,o),s.complete()}catch(C){J(e,"commit","ChatGPT",C,o),s.error(C)}},this.colors={primary:"#74AA9C",secondary:"#FFF"},this.serviceName=k.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[ChatGPT]"),this.errorPrefix=k.red.bold("[ChatGPT]");const r=this.params.config.url||"https://api.openai.com",h=(this.params.config.path||"/v1/chat/completions").replace(/\/chat\/completions\/?$/,"");this.openAI=new N({apiKey:this.params.config.key,baseURL:`${r}${h}`})}getServiceSpecificErrorMessage(t){const r=t.message||"";return r.includes("API key")?"Invalid API key. Check your OpenAI API key in configuration":r.includes("quota")?"API quota exceeded. Check your OpenAI usage limits":r.includes("500")?"OpenAI server error. Try again later":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():$(this.generateMessage("commit")).pipe(T(r=>w(r)),x(this.formatAsChoice),M(this.handleError$))}generateCodeReview$(){return $(this.generateMessage("review")).pipe(T(t=>w(t)),x(this.formatCodeReviewAsChoice),M(this.handleError$))}async generateMessage(t){const r=this.params.stagedDiff.diff,{systemPrompt:h,systemPromptPath:s,codeReviewPromptPath:e,temperature:a,logging:m,locale:g,generate:p,type:o,maxLength:l,proxy:f,maxTokens:d,timeout:u}=this.params.config,n={...S,locale:g,maxLength:l,type:o,generate:p,systemPrompt:h,systemPromptPath:s,codeReviewPromptPath:e,vcs_branch:this.params.branchName||""},P=t==="review"?W(n):R(n),c=await V("ChatGPT",this.params.config.url,this.params.config.path,this.params.config.key,this.params.config.model,r,u,d,a,this.params.config.topP,P,m,t,f);return t==="review"?O(c.map(i=>this.parseCodeReview(i))):O(c.map(i=>this.parseMessage(i,o,p)))}}export{X as OpenAIService};
1
+ import k from"chalk";import N from"openai";import{concatMap as T,from as w,map as x,catchError as M}from"rxjs";import{fromPromise as $}from"rxjs/internal/observable/innerFrom";import{A as U,l as H,a as q,b as z,c as B,d as K,e as J}from"./ai.service-7cce5ee0.mjs";import{i as Q,g as V}from"./openai-f7aae8f3.mjs";import{D as S,g as R,b as W,m as O}from"./cli-0dd7e35c.mjs";import"fs";import"path";import"@pacote/xxhash";import"winston";import"http";import"https";import"net";import"tls";import"url";import"assert";import"tty";import"util";import"os";import"events";import"cleye";import"module";import"crypto";import"node:buffer";import"node:path";import"node:child_process";import"node:process";import"child_process";import"node:url";import"node:os";import"node:fs";import"buffer";import"stream";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"node:fs/promises";import"chokidar";import"rxjs/operators";class X extends U{constructor(t){super(t),this.params=t,this.generateStreamingCommitMessage$=()=>{const{generate:s,type:e}=this.params.config;return this.createStreamingCommitMessages$(a=>{this.streamChunks(a).catch(m=>a.error(m))},e,s)},this.streamChunks=async s=>{const e=this.params.stagedDiff.diff,{systemPrompt:a,systemPromptPath:m,codeReviewPromptPath:g,temperature:p,logging:o,locale:l,generate:f,type:d,maxLength:u,maxTokens:n,timeout:P}=this.params.config,c={...S,locale:l,maxLength:u,type:d,generate:f,systemPrompt:a,systemPromptPath:m,codeReviewPromptPath:g,vcs_branch:this.params.branchName||""},i=R(c),I=`Here is the diff: ${e}`,b=`${this.params.config.url}${this.params.config.path}`,G={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};H(e,"commit","ChatGPT",this.params.config.model,b,G,o),q(e,"commit","ChatGPT",i,I,o);const _=Q(this.params.config.model),v={messages:[{role:"system",content:i},{role:"user",content:I}],model:this.params.config.model,stream:!0,..._?{max_completion_tokens:n,temperature:1}:{max_tokens:n,top_p:this.params.config.topP,temperature:p}};z(e,"commit","ChatGPT",v,o);const D=Date.now();let y="";try{const E=await this.openAI.chat.completions.create(v,{timeout:P});for await(const F of E){const A=F.choices?.[0]?.delta?.content||"";A&&(y+=A,s.next(A))}const L=Date.now()-D;B(e,"commit","ChatGPT",{streamed:!0,totalLength:y.length},o),K(e,"commit","ChatGPT",L,y,o),s.complete()}catch(C){J(e,"commit","ChatGPT",C,o),s.error(C)}},this.colors={primary:"#74AA9C",secondary:"#FFF"},this.serviceName=k.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[ChatGPT]"),this.errorPrefix=k.red.bold("[ChatGPT]");const r=this.params.config.url||"https://api.openai.com",h=(this.params.config.path||"/v1/chat/completions").replace(/\/chat\/completions\/?$/,"");this.openAI=new N({apiKey:this.params.config.key,baseURL:`${r}${h}`})}getServiceSpecificErrorMessage(t){const r=t.message||"";return r.includes("API key")?"Invalid API key. Check your OpenAI API key in configuration":r.includes("quota")?"API quota exceeded. Check your OpenAI usage limits":r.includes("500")?"OpenAI server error. Try again later":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():$(this.generateMessage("commit")).pipe(T(r=>w(r)),x(this.formatAsChoice),M(this.handleError$))}generateCodeReview$(){return $(this.generateMessage("review")).pipe(T(t=>w(t)),x(this.formatCodeReviewAsChoice),M(this.handleError$))}async generateMessage(t){const r=this.params.stagedDiff.diff,{systemPrompt:h,systemPromptPath:s,codeReviewPromptPath:e,temperature:a,logging:m,locale:g,generate:p,type:o,maxLength:l,proxy:f,maxTokens:d,timeout:u}=this.params.config,n={...S,locale:g,maxLength:l,type:o,generate:p,systemPrompt:h,systemPromptPath:s,codeReviewPromptPath:e,vcs_branch:this.params.branchName||""},P=t==="review"?W(n):R(n),c=await V("ChatGPT",this.params.config.url,this.params.config.path,this.params.config.key,this.params.config.model,r,u,d,a,this.params.config.topP,P,m,t,f);return t==="review"?O(c.map(i=>this.parseCodeReview(i))):O(c.map(i=>this.parseMessage(i,o,p)))}}export{X as OpenAIService};
@@ -1 +1 @@
1
- import b from"chalk";import L from"openai";import{concatMap as $,from as k,map as S,catchError as I}from"rxjs";import{fromPromise as H}from"rxjs/internal/observable/innerFrom";import{A as z,l as _,a as E,b as T,c as j,d as U,e as D}from"./ai.service-da8345b1.mjs";import{i as X}from"./openai-3092588f.mjs";import{D as F,g as K,H as G,b as W}from"./cli-83e0874c.mjs";import"fs";import"path";import"@pacote/xxhash";import"winston";import"http";import"https";import"net";import"tls";import"url";import"assert";import"tty";import"util";import"os";import"events";import"cleye";import"module";import"crypto";import"node:buffer";import"node:path";import"node:child_process";import"node:process";import"child_process";import"node:url";import"node:os";import"node:fs";import"buffer";import"stream";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"node:fs/promises";import"chokidar";import"rxjs/operators";const x=class d extends z{constructor(r){super(r),this.params=r,this.getOpenRouterBaseUrl=()=>(this.params.config.url||"https://openrouter.ai").replace(/\/$/,""),this.getOpenRouterCatalogUrl=()=>`${this.getOpenRouterBaseUrl()}/api/v1`,this.getOpenRouterHeaders=()=>({"HTTP-Referer":"https://github.com/tak-bro/aicommit2","X-OpenRouter-Title":"aicommit2","X-OpenRouter-Categories":"cli-agent"}),this.getOpenRouterAuthHeaders=()=>({Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json",...this.getOpenRouterHeaders()}),this.hasRequestObject=t=>typeof t=="object"&&t!==null&&!Array.isArray(t)&&Object.keys(t).length>0,this.getRequestedModel=()=>Array.isArray(this.params.config.model)?this.params.config.model[0]||"":typeof this.params.config.model=="string"?this.params.config.model:"",this.getCatalogCacheKey=()=>`${this.getOpenRouterCatalogUrl()}|${this.params.config.key||""}`,this.getModelCacheKey=()=>`${this.getCatalogCacheKey()}|${this.getRequestedModel()}`,this.matchOpenRouterModel=(t,o)=>{const s=t.trim();return o.find(a=>[a.id,a.canonical_slug,a.name].filter(i=>!!i).some(i=>i===s))},this.getRequestPayloadExtras=async()=>{const t=this.params.config,o={},s=this.hasRequestObject(t.responseFormat)?t.responseFormat:{type:"json_object"};s&&await this.isResponseFormatSupported()&&(o.response_format=s),this.hasRequestObject(t.provider)&&(o.provider=t.provider);const a=await this.getReasoningPayload();return a&&(o.reasoning=a),o},this.extractOpenRouterText=t=>{if(!t||typeof t!="object")return"";const o=t;return o.content||o.reasoning_content||o.reasoning||""},this.buildChatCompletionPayload=async(t,o,s)=>{const a=this.params.config.maxTokens,m=this.params.config.temperature,i=X(this.params.config.model),u=this.getRequestedModel();return{messages:[{role:"system",content:t},{role:"user",content:o}],model:u,stream:s,...await this.getRequestPayloadExtras()||{},...i?{max_completion_tokens:a,temperature:1}:{max_tokens:a,top_p:this.params.config.topP,temperature:m}}},this.generateStreamingCommitMessage$=()=>{const{generate:t,type:o}=this.params.config;return this.createStreamingCommitMessages$(s=>{this.streamChunks(s).catch(a=>s.error(a))},o,t)},this.streamChunks=async t=>{const o=this.params.stagedDiff.diff,{systemPrompt:s,systemPromptPath:a,codeReviewPromptPath:m,logging:i,locale:u,generate:C,type:g,maxLength:f,timeout:R}=this.params.config,p={...F,locale:u,maxLength:f,type:g,generate:C,systemPrompt:s,systemPromptPath:a,codeReviewPromptPath:m,vcs_branch:this.params.branchName||""},y=K(p),O=`Here is the diff: ${o}`,c="OpenRouter",P=`${this.params.config.url||"https://openrouter.ai"}${this.params.config.path||"/api/v1/chat/completions"}`,h={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json",...this.getOpenRouterHeaders()};_(o,"commit",c,this.params.config.model,P,h,i),E(o,"commit",c,y,O,i);const l=await this.buildChatCompletionPayload(y,O,!0);T(o,"commit",c,l,i);const w=Date.now();let M="";try{const q=await this.openAI.chat.completions.create(l,{timeout:R});for await(const B of q){const A=this.extractOpenRouterText(B.choices?.[0]?.delta);A&&(M+=A,t.next(A))}const N=Date.now()-w;j(o,"commit",c,{streamed:!0,totalLength:M.length},i),U(o,"commit",c,N,M,i),t.complete()}catch(v){D(o,"commit",c,v,i),t.error(v)}},this.colors={primary:"#f97316",secondary:"#fff"},this.serviceName=b.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[OpenRouter]"),this.errorPrefix=b.red.bold("[OpenRouter]");const e=this.params.config.url||"https://openrouter.ai",n=(this.params.config.path||"/api/v1/chat/completions").replace(/\/chat\/completions\/?$/,"");this.openAI=new L({apiKey:this.params.config.key,baseURL:`${e}${n}`,defaultHeaders:{...this.getOpenRouterHeaders()}})}async fetchOpenRouterCatalog(){const r=this.getCatalogCacheKey(),e=d.catalogCache.get(r);if(e)return e;const n=["/models/user","/models"];let t;for(const o of n)try{const a=(await new G({method:"GET",baseURL:`${this.getOpenRouterCatalogUrl()}${o}`,timeout:this.params.config.timeout}).setHeaders(this.getOpenRouterAuthHeaders()).execute()).data?.data??[];return d.catalogCache.set(r,a),a}catch(s){if(t=s,!(s instanceof Error?s.message:String(s)).includes("404"))throw s}throw t instanceof Error?t:new Error(String(t))}async getOpenRouterModel(){const r=this.getRequestedModel();if(!r||r==="openrouter/auto")return null;const e=this.getModelCacheKey(),n=d.modelCache.get(e);if(n!==void 0)return n;try{const t=await this.fetchOpenRouterCatalog(),o=this.matchOpenRouterModel(r,t)||null;return d.modelCache.set(e,o),o}catch{return null}}async supportsOpenRouterParameters(r){const e=await this.getOpenRouterModel();return e?r.some(n=>e.supported_parameters?.includes(n)??!1):!1}async isResponseFormatSupported(){return this.supportsOpenRouterParameters(["response_format"])}async isReasoningSupported(){return this.supportsOpenRouterParameters(["reasoning","include_reasoning"])}async getReasoningPayload(){if(!await this.isReasoningSupported())return;const r=this.params.config,e=this.hasRequestObject(r.reasoning)?{...r.reasoning}:void 0,n=e?{...e}:{};return"exclude"in n||(n.exclude=!0),n}getServiceSpecificErrorMessage(r){const e=r.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your OpenRouter API key in configuration":e.includes("402")||e.includes("Payment Required")?"OpenRouter credits are exhausted or billing is required. Check your account balance.":e.includes("rate_limit")||e.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or check your OpenRouter limits":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the OpenRouter model name is correct":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this OpenRouter model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your OpenRouter configuration":e.includes("500")||e.includes("Internal Server Error")?"OpenRouter server error. Try again later":e.includes("overloaded")||e.includes("capacity")?"OpenRouter is overloaded. Try again in a few minutes":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():H(this.generateMessage("commit")).pipe($(e=>k(e)),S(this.formatAsChoice),I(this.handleError$))}generateCodeReview$(){return H(this.generateMessage("review")).pipe($(r=>k(r)),S(this.formatCodeReviewAsChoice),I(this.handleError$))}async generateMessage(r){const e=this.params.stagedDiff.diff,{systemPrompt:n,systemPromptPath:t,codeReviewPromptPath:o,logging:s,locale:a,generate:m,type:i,maxLength:u,timeout:C}=this.params.config,g={...F,locale:a,maxLength:u,type:i,generate:m,systemPrompt:n,systemPromptPath:t,codeReviewPromptPath:o,vcs_branch:this.params.branchName||""},f=r==="review"?W(g):K(g),R=`Here is the diff: ${e}`,p="OpenRouter",y=`${this.params.config.url||"https://openrouter.ai"}${this.params.config.path||"/api/v1/chat/completions"}`,O={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json",...this.getOpenRouterHeaders()};_(e,r,p,this.params.config.model,y,O,s),E(e,r,p,f,R,s);const c=await this.buildChatCompletionPayload(f,R,!1);T(e,r,p,c,s);const P=Date.now();try{const h=await this.openAI.chat.completions.create(c,{timeout:C}),l=this.extractOpenRouterText(h.choices?.[0]?.message),w=Date.now()-P;return j(e,r,p,h,s),U(e,r,p,w,l,s),r==="review"?this.parseCodeReview(l):this.parseMessage(l,i,m)}catch(h){throw D(e,r,p,h,s),h}}};x.catalogCache=new Map,x.modelCache=new Map;let Y=x;export{Y as OpenRouterService};
1
+ import b from"chalk";import L from"openai";import{concatMap as $,from as k,map as S,catchError as I}from"rxjs";import{fromPromise as H}from"rxjs/internal/observable/innerFrom";import{A as z,l as _,a as E,b as T,c as j,d as U,e as D}from"./ai.service-7cce5ee0.mjs";import{i as X}from"./openai-f7aae8f3.mjs";import{D as F,g as K,H as G,b as W}from"./cli-0dd7e35c.mjs";import"fs";import"path";import"@pacote/xxhash";import"winston";import"http";import"https";import"net";import"tls";import"url";import"assert";import"tty";import"util";import"os";import"events";import"cleye";import"module";import"crypto";import"node:buffer";import"node:path";import"node:child_process";import"node:process";import"child_process";import"node:url";import"node:os";import"node:fs";import"buffer";import"stream";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"node:fs/promises";import"chokidar";import"rxjs/operators";const x=class d extends z{constructor(r){super(r),this.params=r,this.getOpenRouterBaseUrl=()=>(this.params.config.url||"https://openrouter.ai").replace(/\/$/,""),this.getOpenRouterCatalogUrl=()=>`${this.getOpenRouterBaseUrl()}/api/v1`,this.getOpenRouterHeaders=()=>({"HTTP-Referer":"https://github.com/tak-bro/aicommit2","X-OpenRouter-Title":"aicommit2","X-OpenRouter-Categories":"cli-agent"}),this.getOpenRouterAuthHeaders=()=>({Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json",...this.getOpenRouterHeaders()}),this.hasRequestObject=t=>typeof t=="object"&&t!==null&&!Array.isArray(t)&&Object.keys(t).length>0,this.getRequestedModel=()=>Array.isArray(this.params.config.model)?this.params.config.model[0]||"":typeof this.params.config.model=="string"?this.params.config.model:"",this.getCatalogCacheKey=()=>`${this.getOpenRouterCatalogUrl()}|${this.params.config.key||""}`,this.getModelCacheKey=()=>`${this.getCatalogCacheKey()}|${this.getRequestedModel()}`,this.matchOpenRouterModel=(t,o)=>{const s=t.trim();return o.find(a=>[a.id,a.canonical_slug,a.name].filter(i=>!!i).some(i=>i===s))},this.getRequestPayloadExtras=async()=>{const t=this.params.config,o={},s=this.hasRequestObject(t.responseFormat)?t.responseFormat:{type:"json_object"};s&&await this.isResponseFormatSupported()&&(o.response_format=s),this.hasRequestObject(t.provider)&&(o.provider=t.provider);const a=await this.getReasoningPayload();return a&&(o.reasoning=a),o},this.extractOpenRouterText=t=>{if(!t||typeof t!="object")return"";const o=t;return o.content||o.reasoning_content||o.reasoning||""},this.buildChatCompletionPayload=async(t,o,s)=>{const a=this.params.config.maxTokens,m=this.params.config.temperature,i=X(this.params.config.model),u=this.getRequestedModel();return{messages:[{role:"system",content:t},{role:"user",content:o}],model:u,stream:s,...await this.getRequestPayloadExtras()||{},...i?{max_completion_tokens:a,temperature:1}:{max_tokens:a,top_p:this.params.config.topP,temperature:m}}},this.generateStreamingCommitMessage$=()=>{const{generate:t,type:o}=this.params.config;return this.createStreamingCommitMessages$(s=>{this.streamChunks(s).catch(a=>s.error(a))},o,t)},this.streamChunks=async t=>{const o=this.params.stagedDiff.diff,{systemPrompt:s,systemPromptPath:a,codeReviewPromptPath:m,logging:i,locale:u,generate:C,type:g,maxLength:f,timeout:R}=this.params.config,p={...F,locale:u,maxLength:f,type:g,generate:C,systemPrompt:s,systemPromptPath:a,codeReviewPromptPath:m,vcs_branch:this.params.branchName||""},y=K(p),O=`Here is the diff: ${o}`,c="OpenRouter",P=`${this.params.config.url||"https://openrouter.ai"}${this.params.config.path||"/api/v1/chat/completions"}`,h={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json",...this.getOpenRouterHeaders()};_(o,"commit",c,this.params.config.model,P,h,i),E(o,"commit",c,y,O,i);const l=await this.buildChatCompletionPayload(y,O,!0);T(o,"commit",c,l,i);const w=Date.now();let M="";try{const q=await this.openAI.chat.completions.create(l,{timeout:R});for await(const B of q){const A=this.extractOpenRouterText(B.choices?.[0]?.delta);A&&(M+=A,t.next(A))}const N=Date.now()-w;j(o,"commit",c,{streamed:!0,totalLength:M.length},i),U(o,"commit",c,N,M,i),t.complete()}catch(v){D(o,"commit",c,v,i),t.error(v)}},this.colors={primary:"#f97316",secondary:"#fff"},this.serviceName=b.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[OpenRouter]"),this.errorPrefix=b.red.bold("[OpenRouter]");const e=this.params.config.url||"https://openrouter.ai",n=(this.params.config.path||"/api/v1/chat/completions").replace(/\/chat\/completions\/?$/,"");this.openAI=new L({apiKey:this.params.config.key,baseURL:`${e}${n}`,defaultHeaders:{...this.getOpenRouterHeaders()}})}async fetchOpenRouterCatalog(){const r=this.getCatalogCacheKey(),e=d.catalogCache.get(r);if(e)return e;const n=["/models/user","/models"];let t;for(const o of n)try{const a=(await new G({method:"GET",baseURL:`${this.getOpenRouterCatalogUrl()}${o}`,timeout:this.params.config.timeout}).setHeaders(this.getOpenRouterAuthHeaders()).execute()).data?.data??[];return d.catalogCache.set(r,a),a}catch(s){if(t=s,!(s instanceof Error?s.message:String(s)).includes("404"))throw s}throw t instanceof Error?t:new Error(String(t))}async getOpenRouterModel(){const r=this.getRequestedModel();if(!r||r==="openrouter/auto")return null;const e=this.getModelCacheKey(),n=d.modelCache.get(e);if(n!==void 0)return n;try{const t=await this.fetchOpenRouterCatalog(),o=this.matchOpenRouterModel(r,t)||null;return d.modelCache.set(e,o),o}catch{return null}}async supportsOpenRouterParameters(r){const e=await this.getOpenRouterModel();return e?r.some(n=>e.supported_parameters?.includes(n)??!1):!1}async isResponseFormatSupported(){return this.supportsOpenRouterParameters(["response_format"])}async isReasoningSupported(){return this.supportsOpenRouterParameters(["reasoning","include_reasoning"])}async getReasoningPayload(){if(!await this.isReasoningSupported())return;const r=this.params.config,e=this.hasRequestObject(r.reasoning)?{...r.reasoning}:void 0,n=e?{...e}:{};return"exclude"in n||(n.exclude=!0),n}getServiceSpecificErrorMessage(r){const e=r.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your OpenRouter API key in configuration":e.includes("402")||e.includes("Payment Required")?"OpenRouter credits are exhausted or billing is required. Check your account balance.":e.includes("rate_limit")||e.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or check your OpenRouter limits":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the OpenRouter model name is correct":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this OpenRouter model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your OpenRouter configuration":e.includes("500")||e.includes("Internal Server Error")?"OpenRouter server error. Try again later":e.includes("overloaded")||e.includes("capacity")?"OpenRouter is overloaded. Try again in a few minutes":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():H(this.generateMessage("commit")).pipe($(e=>k(e)),S(this.formatAsChoice),I(this.handleError$))}generateCodeReview$(){return H(this.generateMessage("review")).pipe($(r=>k(r)),S(this.formatCodeReviewAsChoice),I(this.handleError$))}async generateMessage(r){const e=this.params.stagedDiff.diff,{systemPrompt:n,systemPromptPath:t,codeReviewPromptPath:o,logging:s,locale:a,generate:m,type:i,maxLength:u,timeout:C}=this.params.config,g={...F,locale:a,maxLength:u,type:i,generate:m,systemPrompt:n,systemPromptPath:t,codeReviewPromptPath:o,vcs_branch:this.params.branchName||""},f=r==="review"?W(g):K(g),R=`Here is the diff: ${e}`,p="OpenRouter",y=`${this.params.config.url||"https://openrouter.ai"}${this.params.config.path||"/api/v1/chat/completions"}`,O={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json",...this.getOpenRouterHeaders()};_(e,r,p,this.params.config.model,y,O,s),E(e,r,p,f,R,s);const c=await this.buildChatCompletionPayload(f,R,!1);T(e,r,p,c,s);const P=Date.now();try{const h=await this.openAI.chat.completions.create(c,{timeout:C}),l=this.extractOpenRouterText(h.choices?.[0]?.message),w=Date.now()-P;return j(e,r,p,h,s),U(e,r,p,w,l,s),r==="review"?this.parseCodeReview(l):this.parseMessage(l,i,m)}catch(h){throw D(e,r,p,h,s),h}}};x.catalogCache=new Map,x.modelCache=new Map;let Y=x;export{Y as OpenRouterService};
@@ -0,0 +1 @@
1
+ import g from"chalk";import{concatMap as f,from as u,map as y,catchError as P}from"rxjs";import{fromPromise as x}from"rxjs/internal/observable/innerFrom";import{A as b,l as k,a as I,b as R,c as M,e as v,d as E}from"./ai.service-7cce5ee0.mjs";import{D as N,b as S,g as D,H as O}from"./cli-0dd7e35c.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 $ extends b{constructor(r){super(r),this.params=r,this.apiKey="",this.colors={primary:"#20808D",secondary:"#FFF"},this.serviceName=g.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Perplexity]"),this.errorPrefix=g.red.bold("[Perplexity]"),this.apiKey=this.params.config.key}getServiceSpecificErrorMessage(r){const e=r.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your Perplexity API key in configuration":e.includes("rate_limit")||e.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Perplexity plan":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the Perplexity model name is correct":e.includes("overloaded")||e.includes("capacity")?"Perplexity service is overloaded. Try again in a few minutes":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this Perplexity model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your Perplexity model configuration":e.includes("500")||e.includes("Internal Server Error")?"Perplexity server error. Try again later":null}generateCommitMessage$(){return x(this.generateMessage("commit")).pipe(f(r=>u(r)),y(this.formatAsChoice),P(this.handleError$))}generateCodeReview$(){return x(this.generateMessage("review")).pipe(f(r=>u(r)),y(this.formatCodeReviewAsChoice),P(this.handleError$))}extractJSONFromError(r){const e=/[{[]{1}([,:{}[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/gis,o=r.match(e);if(o){const t={};for(const i of o)try{Object.assign(t,JSON.parse(i))}catch{}return Object.keys(t).length>0?t:{error:{message:"Unknown error"}}}return{error:{message:"Unknown error"}}}async generateMessage(r){const e=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:t,codeReviewPromptPath:i,logging:n,locale:m,generate:a,type:c,maxLength:l}=this.params.config,s={...N,locale:m,maxLength:l,type:c,generate:a,systemPrompt:o,systemPromptPath:t,codeReviewPromptPath:i,vcs_branch:this.params.branchName||""},h=r==="review"?S(s):D(s),p=`Here is the diff: ${e}`,A=`${this.params.config.url||"https://api.perplexity.ai"}/chat/completions`,C={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};k(e,r,"Perplexity",this.params.config.model,A,C,n),I(e,r,"Perplexity",h,p,n);const d=await this.createChatCompletions(h,p,r);return r==="review"?this.parseCodeReview(d):this.parseMessage(d,c,a)}async createChatCompletions(r,e,o){const t=this.params.stagedDiff.diff,{logging:i}=this.params.config,n={model:this.params.config.model,messages:[{role:"system",content:r},{role:"user",content:e}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1};R(t,o,"Perplexity",n,i);const m=Date.now();try{const a=this.params.config.url||"https://api.perplexity.ai",c=await new O({method:"POST",baseURL:`${a}/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(n).execute(),l=Date.now()-m,s=c.data;if(M(t,o,"Perplexity",s,i),!s.choices||s.choices.length===0||!s.choices[0].message?.content)throw v(t,o,"Perplexity",{message:"No Content on response",result:s},i),new Error("No Content on response. Please open a Bug report");const p=s.choices[0].message.content;return E(t,o,"Perplexity",l,p,i),p}catch(a){throw v(t,o,"Perplexity",a,i),a}}}export{$ as PerplexityService};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aicommit2",
3
- "version": "2.5.7",
3
+ "version": "2.5.8",
4
4
  "description": "A Reactive CLI that generates commit messages for Git and Jujutsu with various AI",
5
5
  "keywords": [
6
6
  "cli",
@@ -1 +0,0 @@
1
- import g from"chalk";import{concatMap as f,from as u,map as y,catchError as P}from"rxjs";import{fromPromise as x}from"rxjs/internal/observable/innerFrom";import{A as b,l as I,a as k,b as R,c as M,e as v,d as E}from"./ai.service-da8345b1.mjs";import{D as N,b as S,g as D,H as $}from"./cli-83e0874c.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 O extends b{constructor(t){super(t),this.params=t,this.apiKey="",this.colors={primary:"#20808D",secondary:"#FFF"},this.serviceName=g.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Perplexity]"),this.errorPrefix=g.red.bold("[Perplexity]"),this.apiKey=this.params.config.key}getServiceSpecificErrorMessage(t){const e=t.message||"";return e.includes("API key")||e.includes("api_key")?"Invalid API key. Check your Perplexity API key in configuration":e.includes("rate_limit")||e.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Perplexity plan":e.includes("model")||e.includes("Model")?"Model not found or not accessible. Check if the Perplexity model name is correct":e.includes("overloaded")||e.includes("capacity")?"Perplexity service is overloaded. Try again in a few minutes":e.includes("403")||e.includes("Forbidden")?"Access denied. Your API key may not have permission for this Perplexity model":e.includes("404")||e.includes("Not Found")?"Model or endpoint not found. Check your Perplexity model configuration":e.includes("500")||e.includes("Internal Server Error")?"Perplexity server error. Try again later":null}generateCommitMessage$(){return x(this.generateMessage("commit")).pipe(f(t=>u(t)),y(this.formatAsChoice),P(this.handleError$))}generateCodeReview$(){return x(this.generateMessage("review")).pipe(f(t=>u(t)),y(this.formatCodeReviewAsChoice),P(this.handleError$))}extractJSONFromError(t){const e=/[{[]{1}([,:{}[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/gis,r=t.match(e);return r?Object.assign({},...r.map(o=>JSON.parse(o))):{error:{message:"Unknown error"}}}async generateMessage(t){const e=this.params.stagedDiff.diff,{systemPrompt:r,systemPromptPath:o,codeReviewPromptPath:s,logging:n,locale:m,generate:a,type:c,maxLength:l}=this.params.config,i={...N,locale:m,maxLength:l,type:c,generate:a,systemPrompt:r,systemPromptPath:o,codeReviewPromptPath:s,vcs_branch:this.params.branchName||""},h=t==="review"?S(i):D(i),p=`Here is the diff: ${e}`,A=`${this.params.config.url||"https://api.perplexity.ai"}/chat/completions`,C={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};I(e,t,"Perplexity",this.params.config.model,A,C,n),k(e,t,"Perplexity",h,p,n);const d=await this.createChatCompletions(h,p,t);return t==="review"?this.parseCodeReview(d):this.parseMessage(d,c,a)}async createChatCompletions(t,e,r){const o=this.params.stagedDiff.diff,{logging:s}=this.params.config,n={model:this.params.config.model,messages:[{role:"system",content:t},{role:"user",content:e}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1};R(o,r,"Perplexity",n,s);const m=Date.now();try{const a=this.params.config.url||"https://api.perplexity.ai",c=await new $({method:"POST",baseURL:`${a}/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(n).execute(),l=Date.now()-m,i=c.data;if(M(o,r,"Perplexity",i,s),!i.choices||i.choices.length===0||!i.choices[0].message?.content)throw v(o,r,"Perplexity",{message:"No Content on response",result:i},s),new Error("No Content on response. Please open a Bug report");const p=i.choices[0].message.content;return E(o,r,"Perplexity",l,p,s),p}catch(a){throw v(o,r,"Perplexity",a,s),a}}}export{O as PerplexityService};