aicommit2 2.1.2 → 2.1.3
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.
- package/README.md +16 -2
- package/dist/cli.mjs +9 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -232,8 +232,9 @@ Please check the documentation for each specific model to confirm which settings
|
|
|
232
232
|
| `temperature` | Model's creativity (0.0 - 2.0) | 0.7 |
|
|
233
233
|
| `maxTokens` | Maximum number of tokens to generate | 1024 |
|
|
234
234
|
| `topP` | Nucleus sampling | 0.9 |
|
|
235
|
-
| `codeReview` |
|
|
235
|
+
| `codeReview` | Whether to include an automated code review in the process | false |
|
|
236
236
|
| `codeReviewPromptPath` | Path to code review prompt file | - |
|
|
237
|
+
| `disabled` | Whether a specific model is enabled or disabled | false |
|
|
237
238
|
|
|
238
239
|
> 👉 **Tip:** To set the General Settings for each model, use the following command.
|
|
239
240
|
> ```shell
|
|
@@ -389,6 +390,19 @@ Nucleus sampling, where the model considers the results of the tokens with top_p
|
|
|
389
390
|
aicommit2 config set topP=0.2
|
|
390
391
|
```
|
|
391
392
|
|
|
393
|
+
##### disabled
|
|
394
|
+
|
|
395
|
+
Default: `false`
|
|
396
|
+
|
|
397
|
+
This option determines whether a specific model is enabled or disabled. If you want to disable a particular model, you can set this option to `true`.
|
|
398
|
+
|
|
399
|
+
To disable a model, use the following commands:
|
|
400
|
+
|
|
401
|
+
```sh
|
|
402
|
+
aicommit2 config set GEMINI.disabled="true"
|
|
403
|
+
aicommit2 config set GROQ.disabled="true"
|
|
404
|
+
```
|
|
405
|
+
|
|
392
406
|
##### codeReview
|
|
393
407
|
|
|
394
408
|
Default: `false`
|
|
@@ -409,7 +423,7 @@ aicommit2 config set codeReview=true
|
|
|
409
423
|
- This feature performs a code review before generating commit messages.
|
|
410
424
|
- Using this feature will significantly increase the overall processing time.
|
|
411
425
|
- It may significantly impact performance and cost.
|
|
412
|
-
- **The code review process consumes a large number of tokens
|
|
426
|
+
- **The code review process consumes a large number of tokens.**
|
|
413
427
|
|
|
414
428
|
##### codeReviewPromptPath
|
|
415
429
|
- Allow users to specify a custom file path for code review
|
package/dist/cli.mjs
CHANGED
|
@@ -33,7 +33,7 @@ ${i.footer}`:""}`}));return s.length>o?s.slice(0,o):s}catch{const s=/\[[\s\S]*?\
|
|
|
33
33
|
|
|
34
34
|
${m.body}`:""}${m.footer?`
|
|
35
35
|
|
|
36
|
-
${m.footer}`:""}`}));return l.length>o?l.slice(0,o):l}catch{return[]}}}extractMessageAsType(e,r){switch(r){case"conventional":const o=/(\w+)(?:\(.*?\))?:\s*(.*)/,n=e.subject.match(o),s=n?n[0]:e.subject;return{...e,subject:this.normalizeCommitMessage(s)};case"gitmoji":const i=/:\w*:\s*(.*)/,u=e.subject.match(i);return{...e,subject:u?u[0].toLowerCase():e.subject};default:return e}}normalizeCommitMessage(e){const r=/^(\w+)(\(.*?\))?:\s(.*)$/,o=e.match(r);if(o){const[,n,s,i]=o,u=n.toLowerCase(),a=i.charAt(0).toLowerCase()+i.slice(1);e=`${u}${s||""}: ${a}`}return e}sanitizeResponse(e){if(typeof e=="string")try{return[{title:`${Qr(e)}...`,value:e}]}catch{return[]}return e.map(r=>{try{return{title:`${Qr(r)}...`,value:r}}catch{return{title:"",value:""}}})}}var Zr="2.1.
|
|
36
|
+
${m.footer}`:""}`}));return l.length>o?l.slice(0,o):l}catch{return[]}}}extractMessageAsType(e,r){switch(r){case"conventional":const o=/(\w+)(?:\(.*?\))?:\s*(.*)/,n=e.subject.match(o),s=n?n[0]:e.subject;return{...e,subject:this.normalizeCommitMessage(s)};case"gitmoji":const i=/:\w*:\s*(.*)/,u=e.subject.match(i);return{...e,subject:u?u[0].toLowerCase():e.subject};default:return e}}normalizeCommitMessage(e){const r=/^(\w+)(\(.*?\))?:\s(.*)$/,o=e.match(r);if(o){const[,n,s,i]=o,u=n.toLowerCase(),a=i.charAt(0).toLowerCase()+i.slice(1);e=`${u}${s||""}: ${a}`}return e}sanitizeResponse(e){if(typeof e=="string")try{return[{title:`${Qr(e)}...`,value:e}]}catch{return[]}return e.map(r=>{try{return{title:`${Qr(r)}...`,value:r}}catch{return{title:"",value:""}}})}}var Zr="2.1.3",Ku="A Reactive CLI that generates git commit messages with various AI";class y extends Error{}const bt=" ",de=t=>{t instanceof Error&&(t instanceof y||(t.stack&&console.error(C.dim(t.stack.split(`
|
|
37
37
|
`).slice(1).join(`
|
|
38
38
|
`))),console.error(`
|
|
39
39
|
${bt}${C.dim(`aicommit2 v${Zr}`)}`),console.error(`
|
|
@@ -89,10 +89,10 @@ ${Le(o,n)}`}},H=t=>{const{codeReviewPromptPath:e,locale:r}=t,o=`I'll give you th
|
|
|
89
89
|
4. Performance improvements
|
|
90
90
|
5. Readability and maintainability
|
|
91
91
|
|
|
92
|
-
Please structure your response with appropriate Markdown headings, code blocks, and bullet points.`;if(!e)return o;try{const n=T.readFileSync(N.resolve(e),"utf-8");return`${ro(n,t)}`}catch{return o}};class no extends _{constructor(e){super(e),this.params=e,this.handleError$=r=>{const o=r.error?.error?.message?.replace(/(\r\n|\n|\r)/gm,"")||"An error occurred";return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#AE5630",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Anthropic]"),this.errorPrefix=C.red.bold("[Anthropic]"),this.anthropic=new sn({apiKey:this.params.config.key})}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,temperature:u,locale:a,generate:l,type:m,maxLength:c,maxTokens:D,topP:d,model:f}=this.params.config,h={...L,locale:a,maxLength:c,type:m,generate:l,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},g=e==="review"?H(h):G(h),E={max_tokens:D,temperature:u,system:g,messages:[{role:"user",content:`Here is the diff: ${r}`}],top_p:d,model:f},O=(await this.anthropic.messages.create(E)).content.map(({text:J})=>J).join("");return i&&j("Anthropic",r,g,O,e),e==="review"?this.sanitizeResponse(O):this.parseMessage(O,m,l)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new F(`Error connecting to ${o.hostname} (${o.syscall})`):o}}}class oe{constructor(e={}){if(!e.method)throw new Error("method should be defined!");if(!e.baseURL)throw new Error("baseURL should be defined!");this.config={...e},this.axiosInstance=an.create(this.config)}setHeaders(e){return this.config.headers=e,this}setParams(e){return this.config.params=e,this}setBody(e){return this.config.data=e,this}addBody(e){return this.config.data={...this.config.data,...e},this}setMethod(e){return this.config.method=e,this}async execute(){try{return await this.axiosInstance.request(this.config)}catch(e){throw e}}}class so extends _{constructor(e){super(e),this.params=e,this.host="https://codestral.mistral.ai",this.apiKey="",this.handleError$=r=>{const o=r.message?.replace(/(\r\n|\n|\r)/gm,"")||"An error occurred";return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#e28c58",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Codestral]"),this.errorPrefix=C.red.bold("[Codestral]"),this.apiKey=this.params.config.key}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,generate:a,type:l,maxLength:m}=this.params.config,c={...L,locale:u,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},D=e==="review"?H(c):G(c);this.checkAvailableModels();const d=await this.createChatCompletions(D,e);return i&&j("Codestral",r,D,d,e),e==="review"?this.sanitizeResponse(d):this.parseMessage(d,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new F(`Error connecting to ${o.hostname} (${o.syscall})`):o}}checkAvailableModels(){if(["codestral-latest","codestral-2405"].includes(this.params.config.model))return!0;throw new Error("Invalid model type of Codestral AI")}async createChatCompletions(e,r){const o=new oe({method:"POST",baseURL:`${this.host}/v1/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody({model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:`Here is the diff: ${this.params.stagedDiff.diff}`}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1,safe_prompt:!1,random_seed:ke(10,1e3)});r==="commit"&&o.addBody({response_format:{type:"json_object"}});const s=(await o.execute()).data;if(!s.choices||s.choices.length===0||!s.choices[0].message?.content)throw new Error("No Content on response. Please open a Bug report");return s.choices[0].message.content}}class io extends _{constructor(e){super(e),this.params=e,this.handleError$=r=>{const o=/"message":\s*"([^"]*)"/,n=r.message.match(o);let s=r?.body?.message;n&&n[1]&&(s=n[1]);const i=`${r.statusCode} ${s}`;return R({name:`${this.errorPrefix} ${i}`,value:s,isError:!0,disabled:!0})},this.colors={primary:"#D18EE2",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Cohere]"),this.errorPrefix=C.red.bold("[Cohere]"),this.cohere=new cn({token:this.params.config.key})}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,temperature:u,locale:a,generate:l,type:m,maxLength:c,maxTokens:D,topP:d,model:f}=this.params.config,h={...L,locale:a,maxLength:c,type:m,generate:l,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},g=e==="review"?H(h):G(h),E=await this.cohere.chat({chatHistory:g?[{role:"SYSTEM",message:g}]:[],message:`Here is the diff: ${r}`,connectors:[{id:"web-search"}],maxTokens:D,temperature:u,model:this.params.config.model,seed:ke(10,1e3),p:this.params.config.topP});return i&&j("Cohere",r,g,E.text,e),e==="review"?this.sanitizeResponse(E.text):this.parseMessage(E.text,m,l)}catch(r){const o=r;throw o instanceof ln?new F("Request timed out error!"):o}}}class uo extends _{constructor(e){super(e),this.params=e,this.host="https://api.deepseek.com",this.apiKey="",this.handleError$=r=>{const o=r.message?.replace(/(\r\n|\n|\r)/gm,"")||"An error occurred";return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#53a3f9",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[DeepSeek]"),this.errorPrefix=C.red.bold("[DeepSeek]"),this.apiKey=this.params.config.key}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,generate:a,type:l,maxLength:m}=this.params.config,c={...L,locale:u,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},D=e==="review"?H(c):G(c);this.checkAvailableModels();const d=await this.createChatCompletions(D,e);return i&&j("DeepSeek",r,D,d,e),e==="review"?this.sanitizeResponse(d):this.parseMessage(d,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new F(`Error connecting to ${o.hostname} (${o.syscall})`):o}}checkAvailableModels(){if(["deepseek-coder","deepseek-chat"].includes(this.params.config.model))return!0;throw new Error("Invalid model type of DeepSeek")}async createChatCompletions(e,r){const o=new oe({method:"POST",baseURL:`${this.host}/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody({model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:`Here is the diff: ${this.params.stagedDiff.diff}`}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1});r==="commit"&&o.addBody({response_format:{type:"json_object"}});const s=(await o.execute()).data;if(!s.choices||s.choices.length===0||!s.choices[0].message?.content)throw new Error("No Content on response. Please open a Bug report");return s.choices[0].message.content}}class ao extends _{constructor(e){super(e),this.params=e,this.handleError$=r=>{const o=r.message||r.toString(),n=/(\[.*?\]\s*[^[]*)/g,s=[...o.matchAll(n)],i=[];s.forEach(a=>i.push(a[1]));const u=i[1]||"An error occurred";return R({name:`${this.errorPrefix} ${u}`,value:u,isError:!0,disabled:!0})},this.colors={primary:"#0077FF",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Gemini]"),this.errorPrefix=C.red.bold("[Gemini]"),this.genAI=new Dn(this.params.config.key)}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,logging:s,locale:i,codeReviewPromptPath:u,generate:a,type:l,maxLength:m}=this.params.config,c=this.params.config.maxTokens,D={...L,locale:i,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:u},d=e==="review"?H(D):G(D),f={maxOutputTokens:c,temperature:this.params.config.temperature,topP:this.params.config.topP},w=(await this.genAI.getGenerativeModel({model:this.params.config.model,systemInstruction:d,generationConfig:f,safetySettings:[{category:we.HARM_CATEGORY_HATE_SPEECH,threshold:ve.BLOCK_LOW_AND_ABOVE},{category:we.HARM_CATEGORY_SEXUALLY_EXPLICIT,threshold:ve.BLOCK_LOW_AND_ABOVE},{category:we.HARM_CATEGORY_HARASSMENT,threshold:ve.BLOCK_LOW_AND_ABOVE},{category:we.HARM_CATEGORY_DANGEROUS_CONTENT,threshold:ve.BLOCK_LOW_AND_ABOVE}]}).generateContent(`Here is the diff: ${r}`)).response.text();return s&&j("Gemini",r,d,w,e),e==="review"?this.sanitizeResponse(w):this.parseMessage(w,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new F(`Error connecting to ${o.hostname} (${o.syscall})`):o}}}class co extends _{constructor(e){super(e),this.params=e,this.handleError$=r=>{let o="N/A",n="An error occurred";r instanceof er.APIError&&(o=`${r.status}`,n=r.name);const s=`${o} ${n}`;return R({name:`${this.errorPrefix} ${s}`,value:n,isError:!0,disabled:!0})},this.colors={primary:"#f55036",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Groq]"),this.errorPrefix=C.red.bold("[Groq]"),this.groq=new er({apiKey:this.params.config.key})}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,temperature:a,generate:l,type:m,maxLength:c}=this.params.config,D=this.params.config.maxTokens,d={...L,locale:u,maxLength:c,type:m,generate:l,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},f=e==="review"?H(d):G(d),g=(await this.groq.chat.completions.create({messages:[{role:"system",content:f},{role:"user",content:`Here is the diff: ${r}`}],model:this.params.config.model,max_tokens:D,top_p:this.params.config.topP,temperature:a},{timeout:this.params.config.timeout})).choices[0].message.content||"";return i&&j("Groq",r,f,g,e),e==="review"?this.sanitizeResponse(g):this.parseMessage(g,m,l)}catch(r){throw r}}}class lo extends _{constructor(e){super(e),this.params=e,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:"https://huggingface.co","Referrer-Policy":"strict-origin-when-cross-origin"},this.models=[],this.currentModelId=null,this.currentConversation=void 0,this.currentConversionID=void 0,this.cookie="",this.colors={primary:"#FED21F",secondary:"#000"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[HuggingFace]"),this.errorPrefix=C.red.bold("[HuggingFace]"),this.cookie=this.params.config.cookie}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{await this.intialize();const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,generate:a,type:l,maxLength:m}=this.params.config,c={...L,locale:u,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},D=e==="review"?H(c):G(c),d=await this.getNewChat(D),h=await(await this.sendMessage(`Here is the diff: ${r}`,d.id)).completeResponsePromise();return await this.deleteConversation(d.id),i&&j("HuggingFace",r,D,h,e),e==="review"?this.sanitizeResponse(h):this.parseMessage(h,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new F(`Error connecting to ${o.hostname} (${o.syscall})`):o}}async intialize(){const e=await this.getRemoteLlms(),r=e.find(o=>o.name?.toLowerCase()===this.params.config.model.toLowerCase());if(r){this.currentModel=r,this.currentModelId=r.id;return}this.currentModel=e[0],this.currentModelId=e[0].id}async getRemoteLlms(){const e=await fetch("https://huggingface.co/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 o=(await e.json()).nodes[0].data,n=o[o[0].models],s=[],i=u=>u===-1?null:o[u];for(const u of n){const a=o[u];if(o[a.unlisted])continue;const l={id:i(a.id),name:i(a.name),displayName:i(a.displayName),preprompt:i(a.preprompt),promptExamples:[],websiteUrl:i(a.websiteUrl),description:i(a.description),datasetName:i(a.datasetName),datasetUrl:i(a.datasetUrl),modelUrl:i(a.modelUrl),parameters:{}},m=i(a.promptExamples);if(m!==null){const d=m.map(f=>i(f));l.promptExamples=d.map(f=>({title:o[f.title],prompt:o[f.prompt]}))}const c=i(a.parameters),D={};for(const[d,f]of Object.entries(c)){if(f===-1){D[d]=null;continue}if(Array.isArray(o[f])){D[d]=o[f].map(h=>o[h]);continue}D[d]=o[f]}l.parameters=D,s.push(l)}return this.models=s,s}async getNewChat(e){const r={model:this.currentModelId,preprompt:e};let o=0;for(;o<5;){const n=await fetch("https://huggingface.co/chat/conversation",{headers:{...this.headers,"content-type":"application/json",cookie:this.cookie,Referer:"https://huggingface.co/chat/"},body:JSON.stringify(r),method:"POST"}),{conversationId:s}=await n.json();if(s){this.currentConversionID=s;break}else o++}if(!this.currentConversionID)throw new Error("Failed to create new conversion");return await this.getConversationHistory(this.currentConversionID)}async getConversationHistory(e){if(!e)throw new Error("conversationId is required for getConversationHistory");const r=await fetch("https://huggingface.co/chat/conversation/"+e+"/__data.json",{headers:{...this.headers,cookie:this.cookie,Referer:"https://huggingface.co/chat/"},body:null,method:"GET"});if(r.status!=200)throw new Error("Unable get conversation details "+r);{const o=await r.json();return this.metadataParser(o,e)}}metadataParser(e,r){const o={id:"",model:"",systemPrompt:"",title:"",history:[]},n=e.nodes[1].data,s=n[n[0].model],i=n[n[0].preprompt],u=n[n[0].title],a=n[n[0].messages],l=[];for(const m of a){const c=n[m],D=new Date(n[c.createdAt][1]).getTime()/1e3,d=new Date(n[c.updatedAt][1]).getTime()/1e3;l.push({id:n[c.id],role:n[c.from],content:n[c.content],createdAt:D,updatedAt:d})}return o.id=r,o.model=s,o.systemPrompt=i,o.title=u,o.history=l,this.currentConversation=o,o}async sendMessage(e,r){if(e==="")throw new Error("the prompt can not be empty.");if(!r&&!this.currentConversionID?await this.getNewChat():r?(this.currentConversionID=r,await this.getConversationHistory(r)):this.currentConversionID&&await this.getConversationHistory(this.currentConversionID),!this.currentConversation)throw new Error("Failed to create new conversion");const o={inputs:e,id:this.currentConversation.history[this.currentConversation.history.length-1].id,is_retry:!1,is_continue:!1,web_search:!1,tools:[]},n=new FormData;n.append("data",JSON.stringify(o));const s=await fetch("https://huggingface.co/chat/conversation/"+this.currentConversionID,{headers:{...this.headers,cookie:this.cookie,Referer:"https://huggingface.co/chat/conversation/"+this.currentConversionID},body:n,method:"POST"});function i(D){try{const d=D.split(`
|
|
93
|
-
`),f=[];for(const h of d)h.trim()&&f.push(JSON.parse(h));return f}catch{return[{}]}}const u=new TextDecoder;let a="";const l=new TransformStream({async transform(D,d){const f=u.decode(D);try{const h=i(f);for(const g of h)g.type==="finalAnswer"?(a=g?.text||"",d.terminate()):g.type==="stream"&&d.enqueue(g?.token||"")}catch{throw new Error("Error during parsing response")}}}),m=s.body?.pipeThrough(l);async function c(){return new Promise(async(D,d)=>{try{if(!m)d("ModifiedStream undefined");else{const f=m.getReader();for(;;){const{done:h,value:g}=await f.read();if(h){D(a);break}}}}catch(f){d(f)}})}return{id:this.currentConversionID,stream:m,completeResponsePromise:c}}async deleteConversation(e){return(await fetch(`https://huggingface.co/chat/conversation/${e}`,{headers:{...this.headers,cookie:this.cookie,Referer:"https://huggingface.co/chat/"},body:null,method:"DELETE"})).json()}}class Do extends _{constructor(e){super(e),this.params=e,this.host="https://api.mistral.ai",this.apiKey="",this.handleError$=r=>{const o=r.message?.replace(/(\r\n|\n|\r)/gm,"")||"An error occurred";return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#ff7000",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[MistralAI]"),this.errorPrefix=C.red.bold("[MistralAI]"),this.apiKey=this.params.config.key}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,generate:a,type:l,maxLength:m}=this.params.config,c={...L,locale:u,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},D=e==="review"?H(c):G(c);await this.checkAvailableModels();const d=await this.createChatCompletions(D,`Here is the diff: ${r}`);return i&&j("MistralAI",r,D,d,e),e==="review"?this.sanitizeResponse(d):this.parseMessage(d,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new
|
|
92
|
+
Please structure your response with appropriate Markdown headings, code blocks, and bullet points.`;if(!e)return o;try{const n=T.readFileSync(N.resolve(e),"utf-8");return`${ro(n,t)}`}catch{return o}};class no extends _{constructor(e){super(e),this.params=e,this.handleError$=r=>{const o=r.error?.error?.message?.replace(/(\r\n|\n|\r)/gm,"")||"An error occurred";return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#AE5630",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Anthropic]"),this.errorPrefix=C.red.bold("[Anthropic]"),this.anthropic=new sn({apiKey:this.params.config.key})}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,temperature:u,locale:a,generate:l,type:m,maxLength:c,maxTokens:D,topP:d,model:f}=this.params.config,h={...L,locale:a,maxLength:c,type:m,generate:l,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},g=e==="review"?H(h):G(h),E={max_tokens:D,temperature:u,system:g,messages:[{role:"user",content:`Here is the diff: ${r}`}],top_p:d,model:f},O=(await this.anthropic.messages.create(E)).content.map(({text:J})=>J).join("");return i&&j("Anthropic",r,g,O,e),e==="review"?this.sanitizeResponse(O):this.parseMessage(O,m,l)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new y(`Error connecting to ${o.hostname} (${o.syscall})`):o}}}class oe{constructor(e={}){if(!e.method)throw new Error("method should be defined!");if(!e.baseURL)throw new Error("baseURL should be defined!");this.config={...e},this.axiosInstance=an.create(this.config)}setHeaders(e){return this.config.headers=e,this}setParams(e){return this.config.params=e,this}setBody(e){return this.config.data=e,this}addBody(e){return this.config.data={...this.config.data,...e},this}setMethod(e){return this.config.method=e,this}async execute(){try{return await this.axiosInstance.request(this.config)}catch(e){throw e}}}class so extends _{constructor(e){super(e),this.params=e,this.host="https://codestral.mistral.ai",this.apiKey="",this.handleError$=r=>{const o=r.message?.replace(/(\r\n|\n|\r)/gm,"")||"An error occurred";return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#e28c58",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Codestral]"),this.errorPrefix=C.red.bold("[Codestral]"),this.apiKey=this.params.config.key}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,generate:a,type:l,maxLength:m}=this.params.config,c={...L,locale:u,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},D=e==="review"?H(c):G(c);this.checkAvailableModels();const d=await this.createChatCompletions(D,e);return i&&j("Codestral",r,D,d,e),e==="review"?this.sanitizeResponse(d):this.parseMessage(d,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new y(`Error connecting to ${o.hostname} (${o.syscall})`):o}}checkAvailableModels(){if(["codestral-latest","codestral-2405"].includes(this.params.config.model))return!0;throw new Error("Invalid model type of Codestral AI")}async createChatCompletions(e,r){const o=new oe({method:"POST",baseURL:`${this.host}/v1/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody({model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:`Here is the diff: ${this.params.stagedDiff.diff}`}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1,safe_prompt:!1,random_seed:ke(10,1e3)});r==="commit"&&o.addBody({response_format:{type:"json_object"}});const s=(await o.execute()).data;if(!s.choices||s.choices.length===0||!s.choices[0].message?.content)throw new Error("No Content on response. Please open a Bug report");return s.choices[0].message.content}}class io extends _{constructor(e){super(e),this.params=e,this.handleError$=r=>{const o=/"message":\s*"([^"]*)"/,n=r.message.match(o);let s=r?.body?.message;n&&n[1]&&(s=n[1]);const i=`${r.statusCode} ${s}`;return R({name:`${this.errorPrefix} ${i}`,value:s,isError:!0,disabled:!0})},this.colors={primary:"#D18EE2",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Cohere]"),this.errorPrefix=C.red.bold("[Cohere]"),this.cohere=new cn({token:this.params.config.key})}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,temperature:u,locale:a,generate:l,type:m,maxLength:c,maxTokens:D,topP:d,model:f}=this.params.config,h={...L,locale:a,maxLength:c,type:m,generate:l,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},g=e==="review"?H(h):G(h),E=await this.cohere.chat({chatHistory:g?[{role:"SYSTEM",message:g}]:[],message:`Here is the diff: ${r}`,connectors:[{id:"web-search"}],maxTokens:D,temperature:u,model:this.params.config.model,seed:ke(10,1e3),p:this.params.config.topP});return i&&j("Cohere",r,g,E.text,e),e==="review"?this.sanitizeResponse(E.text):this.parseMessage(E.text,m,l)}catch(r){const o=r;throw o instanceof ln?new y("Request timed out error!"):o}}}class uo extends _{constructor(e){super(e),this.params=e,this.host="https://api.deepseek.com",this.apiKey="",this.handleError$=r=>{const o=r.message?.replace(/(\r\n|\n|\r)/gm,"")||"An error occurred";return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#53a3f9",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[DeepSeek]"),this.errorPrefix=C.red.bold("[DeepSeek]"),this.apiKey=this.params.config.key}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,generate:a,type:l,maxLength:m}=this.params.config,c={...L,locale:u,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},D=e==="review"?H(c):G(c);this.checkAvailableModels();const d=await this.createChatCompletions(D,e);return i&&j("DeepSeek",r,D,d,e),e==="review"?this.sanitizeResponse(d):this.parseMessage(d,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new y(`Error connecting to ${o.hostname} (${o.syscall})`):o}}checkAvailableModels(){if(["deepseek-coder","deepseek-chat"].includes(this.params.config.model))return!0;throw new Error("Invalid model type of DeepSeek")}async createChatCompletions(e,r){const o=new oe({method:"POST",baseURL:`${this.host}/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody({model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:`Here is the diff: ${this.params.stagedDiff.diff}`}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1});r==="commit"&&o.addBody({response_format:{type:"json_object"}});const s=(await o.execute()).data;if(!s.choices||s.choices.length===0||!s.choices[0].message?.content)throw new Error("No Content on response. Please open a Bug report");return s.choices[0].message.content}}class ao extends _{constructor(e){super(e),this.params=e,this.handleError$=r=>{const o=r.message||r.toString(),n=/(\[.*?\]\s*[^[]*)/g,s=[...o.matchAll(n)],i=[];s.forEach(a=>i.push(a[1]));const u=i[1]||"An error occurred";return R({name:`${this.errorPrefix} ${u}`,value:u,isError:!0,disabled:!0})},this.colors={primary:"#0077FF",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Gemini]"),this.errorPrefix=C.red.bold("[Gemini]"),this.genAI=new Dn(this.params.config.key)}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,logging:s,locale:i,codeReviewPromptPath:u,generate:a,type:l,maxLength:m}=this.params.config,c=this.params.config.maxTokens,D={...L,locale:i,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:u},d=e==="review"?H(D):G(D),f={maxOutputTokens:c,temperature:this.params.config.temperature,topP:this.params.config.topP},w=(await this.genAI.getGenerativeModel({model:this.params.config.model,systemInstruction:d,generationConfig:f,safetySettings:[{category:we.HARM_CATEGORY_HATE_SPEECH,threshold:ve.BLOCK_LOW_AND_ABOVE},{category:we.HARM_CATEGORY_SEXUALLY_EXPLICIT,threshold:ve.BLOCK_LOW_AND_ABOVE},{category:we.HARM_CATEGORY_HARASSMENT,threshold:ve.BLOCK_LOW_AND_ABOVE},{category:we.HARM_CATEGORY_DANGEROUS_CONTENT,threshold:ve.BLOCK_LOW_AND_ABOVE}]}).generateContent(`Here is the diff: ${r}`)).response.text();return s&&j("Gemini",r,d,w,e),e==="review"?this.sanitizeResponse(w):this.parseMessage(w,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new y(`Error connecting to ${o.hostname} (${o.syscall})`):o}}}class co extends _{constructor(e){super(e),this.params=e,this.handleError$=r=>{let o="N/A",n="An error occurred";r instanceof er.APIError&&(o=`${r.status}`,n=r.name);const s=`${o} ${n}`;return R({name:`${this.errorPrefix} ${s}`,value:n,isError:!0,disabled:!0})},this.colors={primary:"#f55036",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Groq]"),this.errorPrefix=C.red.bold("[Groq]"),this.groq=new er({apiKey:this.params.config.key})}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,temperature:a,generate:l,type:m,maxLength:c}=this.params.config,D=this.params.config.maxTokens,d={...L,locale:u,maxLength:c,type:m,generate:l,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},f=e==="review"?H(d):G(d),g=(await this.groq.chat.completions.create({messages:[{role:"system",content:f},{role:"user",content:`Here is the diff: ${r}`}],model:this.params.config.model,max_tokens:D,top_p:this.params.config.topP,temperature:a},{timeout:this.params.config.timeout})).choices[0].message.content||"";return i&&j("Groq",r,f,g,e),e==="review"?this.sanitizeResponse(g):this.parseMessage(g,m,l)}catch(r){throw r}}}class lo extends _{constructor(e){super(e),this.params=e,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:"https://huggingface.co","Referrer-Policy":"strict-origin-when-cross-origin"},this.models=[],this.currentModelId=null,this.currentConversation=void 0,this.currentConversionID=void 0,this.cookie="",this.colors={primary:"#FED21F",secondary:"#000"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[HuggingFace]"),this.errorPrefix=C.red.bold("[HuggingFace]"),this.cookie=this.params.config.cookie}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{await this.intialize();const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,generate:a,type:l,maxLength:m}=this.params.config,c={...L,locale:u,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},D=e==="review"?H(c):G(c),d=await this.getNewChat(D),h=await(await this.sendMessage(`Here is the diff: ${r}`,d.id)).completeResponsePromise();return await this.deleteConversation(d.id),i&&j("HuggingFace",r,D,h,e),e==="review"?this.sanitizeResponse(h):this.parseMessage(h,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new y(`Error connecting to ${o.hostname} (${o.syscall})`):o}}async intialize(){const e=await this.getRemoteLlms(),r=e.find(o=>o.name?.toLowerCase()===this.params.config.model.toLowerCase());if(r){this.currentModel=r,this.currentModelId=r.id;return}this.currentModel=e[0],this.currentModelId=e[0].id}async getRemoteLlms(){const e=await fetch("https://huggingface.co/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 o=(await e.json()).nodes[0].data,n=o[o[0].models],s=[],i=u=>u===-1?null:o[u];for(const u of n){const a=o[u];if(o[a.unlisted])continue;const l={id:i(a.id),name:i(a.name),displayName:i(a.displayName),preprompt:i(a.preprompt),promptExamples:[],websiteUrl:i(a.websiteUrl),description:i(a.description),datasetName:i(a.datasetName),datasetUrl:i(a.datasetUrl),modelUrl:i(a.modelUrl),parameters:{}},m=i(a.promptExamples);if(m!==null){const d=m.map(f=>i(f));l.promptExamples=d.map(f=>({title:o[f.title],prompt:o[f.prompt]}))}const c=i(a.parameters),D={};for(const[d,f]of Object.entries(c)){if(f===-1){D[d]=null;continue}if(Array.isArray(o[f])){D[d]=o[f].map(h=>o[h]);continue}D[d]=o[f]}l.parameters=D,s.push(l)}return this.models=s,s}async getNewChat(e){const r={model:this.currentModelId,preprompt:e};let o=0;for(;o<5;){const n=await fetch("https://huggingface.co/chat/conversation",{headers:{...this.headers,"content-type":"application/json",cookie:this.cookie,Referer:"https://huggingface.co/chat/"},body:JSON.stringify(r),method:"POST"}),{conversationId:s}=await n.json();if(s){this.currentConversionID=s;break}else o++}if(!this.currentConversionID)throw new Error("Failed to create new conversion");return await this.getConversationHistory(this.currentConversionID)}async getConversationHistory(e){if(!e)throw new Error("conversationId is required for getConversationHistory");const r=await fetch("https://huggingface.co/chat/conversation/"+e+"/__data.json",{headers:{...this.headers,cookie:this.cookie,Referer:"https://huggingface.co/chat/"},body:null,method:"GET"});if(r.status!=200)throw new Error("Unable get conversation details "+r);{const o=await r.json();return this.metadataParser(o,e)}}metadataParser(e,r){const o={id:"",model:"",systemPrompt:"",title:"",history:[]},n=e.nodes[1].data,s=n[n[0].model],i=n[n[0].preprompt],u=n[n[0].title],a=n[n[0].messages],l=[];for(const m of a){const c=n[m],D=new Date(n[c.createdAt][1]).getTime()/1e3,d=new Date(n[c.updatedAt][1]).getTime()/1e3;l.push({id:n[c.id],role:n[c.from],content:n[c.content],createdAt:D,updatedAt:d})}return o.id=r,o.model=s,o.systemPrompt=i,o.title=u,o.history=l,this.currentConversation=o,o}async sendMessage(e,r){if(e==="")throw new Error("the prompt can not be empty.");if(!r&&!this.currentConversionID?await this.getNewChat():r?(this.currentConversionID=r,await this.getConversationHistory(r)):this.currentConversionID&&await this.getConversationHistory(this.currentConversionID),!this.currentConversation)throw new Error("Failed to create new conversion");const o={inputs:e,id:this.currentConversation.history[this.currentConversation.history.length-1].id,is_retry:!1,is_continue:!1,web_search:!1,tools:[]},n=new FormData;n.append("data",JSON.stringify(o));const s=await fetch("https://huggingface.co/chat/conversation/"+this.currentConversionID,{headers:{...this.headers,cookie:this.cookie,Referer:"https://huggingface.co/chat/conversation/"+this.currentConversionID},body:n,method:"POST"});function i(D){try{const d=D.split(`
|
|
93
|
+
`),f=[];for(const h of d)h.trim()&&f.push(JSON.parse(h));return f}catch{return[{}]}}const u=new TextDecoder;let a="";const l=new TransformStream({async transform(D,d){const f=u.decode(D);try{const h=i(f);for(const g of h)g.type==="finalAnswer"?(a=g?.text||"",d.terminate()):g.type==="stream"&&d.enqueue(g?.token||"")}catch{throw new Error("Error during parsing response")}}}),m=s.body?.pipeThrough(l);async function c(){return new Promise(async(D,d)=>{try{if(!m)d("ModifiedStream undefined");else{const f=m.getReader();for(;;){const{done:h,value:g}=await f.read();if(h){D(a);break}}}}catch(f){d(f)}})}return{id:this.currentConversionID,stream:m,completeResponsePromise:c}}async deleteConversation(e){return(await fetch(`https://huggingface.co/chat/conversation/${e}`,{headers:{...this.headers,cookie:this.cookie,Referer:"https://huggingface.co/chat/"},body:null,method:"DELETE"})).json()}}class Do extends _{constructor(e){super(e),this.params=e,this.host="https://api.mistral.ai",this.apiKey="",this.handleError$=r=>{const o=r.message?.replace(/(\r\n|\n|\r)/gm,"")||"An error occurred";return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#ff7000",secondary:"#fff"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[MistralAI]"),this.errorPrefix=C.red.bold("[MistralAI]"),this.apiKey=this.params.config.key}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,generate:a,type:l,maxLength:m}=this.params.config,c={...L,locale:u,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},D=e==="review"?H(c):G(c);await this.checkAvailableModels();const d=await this.createChatCompletions(D,`Here is the diff: ${r}`);return i&&j("MistralAI",r,D,d,e),e==="review"?this.sanitizeResponse(d):this.parseMessage(d,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new y(`Error connecting to ${o.hostname} (${o.syscall})`):o}}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(){return(await new oe({method:"GET",baseURL:`${this.host}/v1/models`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).execute()).data.data.filter(r=>r.object==="model").map(r=>r.id)}async createChatCompletions(e,r){const n=(await new oe({method:"POST",baseURL:`${this.host}/v1/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody({model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:r}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1,safe_prompt:!1,random_seed:ke(10,1e3)}).execute()).data;if(!n.choices||n.choices.length===0||!n.choices[0].message?.content)throw new Error("No Content on response. Please open a Bug report");return n.choices[0].message.content}}const{hasOwnProperty:$t}=Object.prototype,Te=typeof process<"u"&&process.platform==="win32"?`\r
|
|
94
94
|
`:`
|
|
95
|
-
`,At=(t,e)=>{const r=[];let o="";typeof e=="string"?e={section:e,whitespace:!1}:(e=e||Object.create(null),e.whitespace=e.whitespace===!0);const n=e.whitespace?" = ":"=";for(const s of Object.keys(t)){const i=t[s];if(i&&Array.isArray(i))for(const u of i)o+=ne(s+"[]")+n+ne(u)+Te;else i&&typeof i=="object"?r.push(s):o+=ne(s)+n+ne(i)+Te}e.section&&o.length&&(o="["+ne(e.section)+"]"+Te+o);for(const s of r){const i=mo(s).join("\\."),u=(e.section?e.section+".":"")+i,{whitespace:a}=e,l=At(t[s],{section:u,whitespace:a});o.length&&l.length&&(o+=Te),o+=l}return o},mo=t=>t.replace(/\1/g,"LITERAL\\1LITERAL").replace(/\\\./g,"").split(/\./).map(e=>e.replace(/\1/g,"\\.").replace(/\2LITERAL\\1LITERAL\2/g,"")),po=t=>{const e=Object.create(null);let r=e,o=null;const n=/^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i,s=t.split(/[\r\n]+/g);for(const u of s){if(!u||u.match(/^\s*[;#]/))continue;const a=u.match(n);if(!a)continue;if(a[1]!==void 0){if(o=_e(a[1]),o==="__proto__"){r=Object.create(null);continue}r=e[o]=e[o]||Object.create(null);continue}const l=_e(a[2]),m=l.length>2&&l.slice(-2)==="[]",c=m?l.slice(0,-2):l;if(c==="__proto__")continue;const D=a[3]?_e(a[4]):!0,d=D==="true"||D==="false"||D==="null"?JSON.parse(D):D;m&&($t.call(r,c)?Array.isArray(r[c])||(r[c]=[r[c]]):r[c]=[]),Array.isArray(r[c])?r[c].push(d):r[c]=d}const i=[];for(const u of Object.keys(e)){if(!$t.call(e,u)||typeof e[u]!="object"||Array.isArray(e[u]))continue;const a=mo(u);r=e;const l=a.pop(),m=l.replace(/\\\./g,".");for(const c of a)c!=="__proto__"&&((!$t.call(r,c)||typeof r[c]!="object")&&(r[c]=Object.create(null)),r=r[c]);r===e&&m===l||(r[m]=e[u],i.push(u))}for(const u of i)delete e[u];return e},fo=t=>t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"),ne=t=>typeof t!="string"||t.match(/[=\r\n]/)||t.match(/^\[/)||t.length>1&&fo(t)||t!==t.trim()?JSON.stringify(t):t.split(";").join("\\;").split("#").join("\\#"),_e=(t,e)=>{if(t=(t||"").trim(),fo(t)){t.charAt(0)==="'"&&(t=t.slice(1,-1));try{t=JSON.parse(t)}catch{}}else{let r=!1,o="";for(let n=0,s=t.length;n<s;n++){const i=t.charAt(n);if(r)"\\;#".indexOf(i)!==-1?o+=i:o+="\\"+i,r=!1;else{if(";#".indexOf(i)!==-1)break;i==="\\"?r=!0:o+=i}}return r&&(o+="\\"),o.trim()}return t};var Zu={parse:po,decode:po,stringify:At,encode:At,safe:ne,unsafe:_e},Pt=Q(Zu);const ho=t=>I.lstat(t).then(()=>!0,()=>!1),ea=["","conventional","gitmoji"],Bt="http://localhost:11434",{hasOwnProperty:ta}=Object.prototype,je=(t,e)=>ta.call(t,e),xt=["OPENAI","OLLAMA","HUGGINGFACE","GEMINI","ANTHROPIC","MISTRAL","CODESTRAL","COHERE","GROQ","PERPLEXITY","DEEPSEEK"],y=(t,e,r)=>{if(!e)throw new F(`Invalid config property ${t}: ${r}`)},p={systemPrompt(t){return t||""},systemPromptPath(t){return t||""},codeReviewPromptPath(t){return t||""},timeout(t){if(!t)return 1e4;y("timeout",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return y("timeout",e>=500,"Must be greater than 500ms"),e},temperature(t){if(!t)return .7;y("temperature",/^(2|\d)(\.\d{1,2})?$/.test(t),"Must be decimal between 0 and 2");const e=Number(t);return y("temperature",e>0,"Must be greater than 0"),y("temperature",e<=2,"Must be less than or equal to 2"),e},maxTokens(t){return t?(y("maxTokens",/^\d+$/.test(t),"Must be an integer"),Number(t)):1024},logging(t){return typeof t=="boolean"?t:t==null?!0:(y("logging",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},locale(t){return t?(y("locale",t,"Cannot be empty"),y("locale",/^[a-z-]+$/i.test(t),"Must be a valid locale (letters and dashes/underscores). You can consult the list of codes in: https://wikipedia.org/wiki/List_of_ISO_639-1_codes"),t):"en"},generate(t){if(!t)return 1;y("generate",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return y("generate",e>0,"Must be greater than 0"),y("generate",e<=5,"Must be less or equal to 5"),e},type(t){return t?(y("type",ea.includes(t),"Invalid commit type"),t):"conventional"},maxLength(t){if(!t)return 50;y("maxLength",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return y("maxLength",e>=20,"Must be greater than 20 characters"),e},includeBody(t){return typeof t=="boolean"?t:t==null?!1:(y("includeBody",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},exclude:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.length>0):[],topP:t=>{if(!t)return .9;y("topP",/^(1|\d)(\.\d{1,2})?$/.test(t),"Must be decimal between 0 and 1");const e=Number(t);return y("topP",e>0,"Must be greater than 0"),y("topP",e<=1,"Must be less than or equal to 1"),e},codeReview(t){return typeof t=="boolean"?t:t==null?!1:(y("codeReview",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")}},se={OPENAI:{key:t=>t||"",model:t=>t||"gpt-4o-mini",url:t=>t?(y("OPENAI.url",/^https?:\/\//.test(t),"Must be a valid URL"),t):"https://api.openai.com",path:t=>t||"/v1/chat/completions",proxy:t=>t||"",topP:p.topP,systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,timeout:p.timeout,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,codeReview:p.codeReview},HUGGINGFACE:{cookie:t=>t||"",model:t=>t?(y("HUGGINGFACE.model",["CohereForAI/c4ai-command-r-plus","meta-llama/Meta-Llama-3-70B-Instruct","HuggingFaceH4/zephyr-orpo-141b-A35b-v0.1","mistralai/Mixtral-8x7B-Instruct-v0.1","NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO","01-ai/Yi-1.5-34B-Chat","mistralai/Mistral-7B-Instruct-v0.2","microsoft/Phi-3-mini-4k-instruct"].includes(t),"Invalid model type of HuggingFace chat"),t):"CohereForAI/c4ai-command-r-plus",systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,codeReview:p.codeReview},GEMINI:{key:t=>t||"",model:t=>!t||t.length===0?"gemini-1.5-pro":(y("GEMINI.model",["gemini-1.5-flash","gemini-1.5-pro","gemini-1.5-pro-exp-0801"].includes(t),"Invalid model type of Gemini"),t),systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,topP:p.topP,codeReview:p.codeReview},ANTHROPIC:{key:t=>t||"",model:t=>!t||t.length===0?"claude-3-haiku-20240307":(y("ANTHROPIC.model",["claude-3-haiku-20240307","claude-3-sonnet-20240229","claude-3-opus-20240229","claude-3-5-sonnet-20240620"].includes(t),"Invalid model type of Anthropic"),t),systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,topP:p.topP,codeReview:p.codeReview},MISTRAL:{key:t=>t||"",model:t=>!t||t.length===0?"mistral-tiny":(y("MISTRAL.model",["open-mistral-7b","mistral-tiny-2312","mistral-tiny","open-mixtral-8x7b","mistral-small-2312","mistral-small","mistral-small-2402","mistral-small-latest","mistral-medium-latest","mistral-medium-2312","mistral-medium","mistral-large-latest","mistral-large-2402","mistral-embed"].includes(t),"Invalid model type of Mistral AI"),t),systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,timeout:p.timeout,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,topP:p.topP,codeReview:p.codeReview},CODESTRAL:{key:t=>t||"",model:t=>!t||t.length===0?"codestral-latest":(y("CODESTRAL.model",["codestral-latest","codestral-2405"].includes(t),"Invalid model type of Codestral"),t),topP:p.topP,systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,timeout:p.timeout,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,codeReview:p.codeReview},OLLAMA:{model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.length>0):[],host:t=>t?(y("OLLAMA.host",/^https?:\/\//.test(t),"Must be a valid URL"),t):Bt,timeout:t=>{if(!t)return 1e5;y("OLLAMA.timeout",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return y("OLLAMA.timeout",e>=500,"Must be greater than 500ms"),e},systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,temperature:p.temperature,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,topP:p.topP,codeReview:p.codeReview},COHERE:{key:t=>t||"",model:t=>!t||t.length===0?"command":(y("COHERE.model",["command","command-nightly","command-light","command-light-nightly"].includes(t),"Invalid model type of Cohere"),t),systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,topP:p.topP,codeReview:p.codeReview},GROQ:{key:t=>t||"",model:t=>!t||t.length===0?"gemma2-9b-it":(y("GROQ.model",["gemma2-9b-it","gemma-7b-it","llama-3.1-70b-versatile","llama-3.1-8b-instant","llama3-70b-8192","llama3-8b-8192","llama3-groq-70b-8192-tool-use-preview","llama3-groq-8b-8192-tool-use-preview","llama-guard-3-8b","mixtral-8x7b-32768"].includes(t),"Invalid model type of Groq"),t),systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,timeout:p.timeout,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,topP:p.topP,codeReview:p.codeReview},PERPLEXITY:{key:t=>t||"",model:t=>!t||t.length===0?"llama-3.1-sonar-small-128k-chat":(y("PERPLEXITY.model",["llama-3.1-sonar-small-128k-online","llama-3.1-sonar-small-128k-chat","llama-3.1-sonar-large-128k-online","llama-3.1-sonar-large-128k-chat","llama-3.1-8b-instruct","llama-3.1-70b-instruct"].includes(t),"Invalid model type of Perplexity"),t),topP:p.topP,systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,timeout:p.timeout,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,codeReview:p.codeReview},DEEPSEEK:{key:t=>t||"",model:t=>!t||t.length===0?"deepseek-coder":(y("DEEPSEEK.model",["deepseek-coder","deepseek-chat"].includes(t),"Invalid model type of DeepSeek"),t),topP:p.topP,systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,timeout:p.timeout,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,codeReview:p.codeReview}},Ge=N.join(Je.homedir(),".aicommit2"),ra=(t=[])=>{const e={};for(const r of t)if(r.startsWith("--")){const[o,n]=r.slice(2).split("="),[s,i]=o.split(".");s&&i&&s in se?(e[s]||(e[s]={}),e[s][i]=n):e[o]=n}return e},St=async()=>{if(!await ho(Ge))return Object.create(null);const e=await I.readFile(Ge,"utf8");let r=Pt.parse(e);return je(r,"OLLAMA")&&je(r.OLLAMA,"model")&&(r={...r,OLLAMA:{...r.OLLAMA,model:typeof r.OLLAMA.model=="string"?[r.OLLAMA.model]:r.OLLAMA.model}}),je(r,"exclude")&&(r={...r,exclude:typeof r.exclude=="string"?[r.exclude]:r.exclude}),r},Mt=async(t,e=[])=>{const r=await St(),o=ra(e),n={...t,...o},s={},i=(u,a)=>{const l=n[`${u}.${a}`]??n[u]?.[a],m=r[u]?.[a],c=n[a]??r[a];return l!==void 0?l:m!==void 0?m:c};for(const[u,a]of Object.entries(p)){const l=n[u]??r[u];s[u]=a(l)}for(const[u,a]of Object.entries(se)){s[u]={};for(const[l,m]of Object.entries(a)){const c=i(u,l);s[u][l]=m(c)}}return s},oa=async t=>{const e=await St();for(const[r,o]of t){const[n,s]=r.split(".");if(n in se){e[n]||(e[n]={});const i=se[n][s];if(!i)throw new F(`Invalid config property: ${r}`);e[n][s]=i(o)}else{const i=p[r];if(!i)throw new F(`Invalid config property: ${r}`);e[r]=i(o)}}await I.writeFile(Ge,Pt.stringify(e),"utf8")},na=async t=>{const e=await St();for(const[r,o]of t){const[n,s]=r.split(".");if(n in se){e[n]||(e[n]={});const i=n==="OLLAMA"&&s==="model",u=se[n][s];if(!u||!i)throw new F(`Invalid config property: ${r}. Only supports OLLAMA.model`);const a=e[n][s]||[];e[n][s]=Ne([...a,u(o)])}else throw new F(`Invalid config property: ${r}. Only supports OLLAMA.model`)}await I.writeFile(Ge,Pt.stringify(e),"utf8")};class go extends _{constructor(e){super(e),this.params=e,this.host=Bt,this.model="",this.handleError$=r=>{if(r.response&&r.response.data?.error)return R({name:`${this.errorPrefix} ${r.response.data?.error}`,value:r.response.data?.error,isError:!0,disabled:!0});const o=r.message?.replace(/(\r\n|\n|\r)/gm,"")||"An error occurred";return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#FFF",secondary:"#000"},this.model=this.params.keyName,this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[${Xr(this.model)}]`),this.errorPrefix=C.red.bold(`[${Xr(this.model)}]`),this.host=this.params.config.host||Bt,this.ollama=new mn({host:this.host})}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,generate:a,type:l,maxLength:m}=this.params.config,c={...L,locale:u,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},D=e==="review"?H(c):G(c);await this.checkIsAvailableOllama();const d=await this.createChatCompletions(D,`Here is the diff: ${r}`);return i&&j(`Ollama_${this.model}`,r,D,d,e),e==="review"?this.sanitizeResponse(d):this.parseMessage(d,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new F(`Error connecting to ${o.hostname} (${o.syscall})`):o}}async checkIsAvailableOllama(){try{return(await new oe({method:"GET",baseURL:`${this.host}`,timeout:this.params.config.timeout}).execute()).data}catch(e){throw e.code==="ECONNREFUSED"?new F(`Error connecting to ${this.host}. Please run Ollama or check host`):e}}async createChatCompletions(e,r){return(await this.ollama.chat({model:this.model,messages:[{role:"system",content:e},{role:"user",content:r}],stream:!1,options:{temperature:this.params.config.temperature,top_p:this.params.config.topP,seed:ke(10,1e3)}})).message.content}}var Ot={},Rt={exports:{}},pe={exports:{}},It,Co;function sa(){if(Co)return It;Co=1;var t=1e3,e=t*60,r=e*60,o=r*24,n=o*7,s=o*365.25;It=function(m,c){c=c||{};var D=typeof m;if(D==="string"&&m.length>0)return i(m);if(D==="number"&&isFinite(m))return c.long?a(m):u(m);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(m))};function i(m){if(m=String(m),!(m.length>100)){var c=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(m);if(c){var D=parseFloat(c[1]),d=(c[2]||"ms").toLowerCase();switch(d){case"years":case"year":case"yrs":case"yr":case"y":return D*s;case"weeks":case"week":case"w":return D*n;case"days":case"day":case"d":return D*o;case"hours":case"hour":case"hrs":case"hr":case"h":return D*r;case"minutes":case"minute":case"mins":case"min":case"m":return D*e;case"seconds":case"second":case"secs":case"sec":case"s":return D*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return D;default:return}}}}function u(m){var c=Math.abs(m);return c>=o?Math.round(m/o)+"d":c>=r?Math.round(m/r)+"h":c>=e?Math.round(m/e)+"m":c>=t?Math.round(m/t)+"s":m+"ms"}function a(m){var c=Math.abs(m);return c>=o?l(m,c,o,"day"):c>=r?l(m,c,r,"hour"):c>=e?l(m,c,e,"minute"):c>=t?l(m,c,t,"second"):m+" ms"}function l(m,c,D,d){var f=c>=D*1.5;return Math.round(m/D)+" "+d+(f?"s":"")}return It}var kt,Eo;function Fo(){if(Eo)return kt;Eo=1;function t(e){o.debug=o,o.default=o,o.coerce=l,o.disable=i,o.enable=s,o.enabled=u,o.humanize=sa(),o.destroy=m,Object.keys(e).forEach(c=>{o[c]=e[c]}),o.names=[],o.skips=[],o.formatters={};function r(c){let D=0;for(let d=0;d<c.length;d++)D=(D<<5)-D+c.charCodeAt(d),D|=0;return o.colors[Math.abs(D)%o.colors.length]}o.selectColor=r;function o(c){let D,d=null,f,h;function g(...E){if(!g.enabled)return;const w=g,O=Number(new Date),J=O-(D||O);w.diff=J,w.prev=D,w.curr=O,D=O,E[0]=o.coerce(E[0]),typeof E[0]!="string"&&E.unshift("%O");let W=0;E[0]=E[0].replace(/%([a-zA-Z%])/g,(Y,zo)=>{if(Y==="%%")return"%";W++;const qt=o.formatters[zo];if(typeof qt=="function"){const qo=E[W];Y=qt.call(w,qo),E.splice(W,1),W--}return Y}),o.formatArgs.call(w,E),(w.log||o.log).apply(w,E)}return g.namespace=c,g.useColors=o.useColors(),g.color=o.selectColor(c),g.extend=n,g.destroy=o.destroy,Object.defineProperty(g,"enabled",{enumerable:!0,configurable:!1,get:()=>d!==null?d:(f!==o.namespaces&&(f=o.namespaces,h=o.enabled(c)),h),set:E=>{d=E}}),typeof o.init=="function"&&o.init(g),g}function n(c,D){const d=o(this.namespace+(typeof D>"u"?":":D)+c);return d.log=this.log,d}function s(c){o.save(c),o.namespaces=c,o.names=[],o.skips=[];let D;const d=(typeof c=="string"?c:"").split(/[\s,]+/),f=d.length;for(D=0;D<f;D++)d[D]&&(c=d[D].replace(/\*/g,".*?"),c[0]==="-"?o.skips.push(new RegExp("^"+c.slice(1)+"$")):o.names.push(new RegExp("^"+c+"$")))}function i(){const c=[...o.names.map(a),...o.skips.map(a).map(D=>"-"+D)].join(",");return o.enable(""),c}function u(c){if(c[c.length-1]==="*")return!0;let D,d;for(D=0,d=o.skips.length;D<d;D++)if(o.skips[D].test(c))return!1;for(D=0,d=o.names.length;D<d;D++)if(o.names[D].test(c))return!0;return!1}function a(c){return c.toString().substring(2,c.toString().length-2).replace(/\.\*\?$/,"*")}function l(c){return c instanceof Error?c.stack||c.message:c}function m(){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 o.enable(o.load()),o}return kt=t,kt}pe.exports;var yo;function ia(){return yo||(yo=1,function(t,e){e.formatArgs=o,e.save=n,e.load=s,e.useColors=r,e.storage=i(),e.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`."))}})(),e.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 r(){return typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1: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&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function o(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 m=0,c=0;a[0].replace(/%[a-zA-Z%]/g,D=>{D!=="%%"&&(m++,D==="%c"&&(c=m))}),a.splice(c,0,l)}e.log=console.debug||console.log||(()=>{});function n(a){try{a?e.storage.setItem("debug",a):e.storage.removeItem("debug")}catch{}}function s(){let a;try{a=e.storage.getItem("debug")}catch{}return!a&&typeof process<"u"&&"env"in process&&(a=process.env.DEBUG),a}function i(){try{return localStorage}catch{}}t.exports=Fo()(e);const{formatters:u}=t.exports;u.j=function(a){try{return JSON.stringify(a)}catch(l){return"[UnexpectedJSONParseError]: "+l.message}}}(pe,pe.exports)),pe.exports}var fe={exports:{}},Nt,wo;function ua(){return wo||(wo=1,Nt=(t,e=process.argv)=>{const r=t.startsWith("-")?"":t.length===1?"-":"--",o=e.indexOf(r+t),n=e.indexOf("--");return o!==-1&&(n===-1||o<n)}),Nt}var Lt,vo;function aa(){if(vo)return Lt;vo=1;const t=Je,e=Ke,r=ua(),{env:o}=process;let n;r("no-color")||r("no-colors")||r("color=false")||r("color=never")?n=0:(r("color")||r("colors")||r("color=true")||r("color=always"))&&(n=1),"FORCE_COLOR"in o&&(o.FORCE_COLOR==="true"?n=1:o.FORCE_COLOR==="false"?n=0:n=o.FORCE_COLOR.length===0?1:Math.min(parseInt(o.FORCE_COLOR,10),3));function s(a){return a===0?!1:{level:a,hasBasic:!0,has256:a>=2,has16m:a>=3}}function i(a,l){if(n===0)return 0;if(r("color=16m")||r("color=full")||r("color=truecolor"))return 3;if(r("color=256"))return 2;if(a&&!l&&n===void 0)return 0;const m=n||0;if(o.TERM==="dumb")return m;if(process.platform==="win32"){const c=t.release().split(".");return Number(c[0])>=10&&Number(c[2])>=10586?Number(c[2])>=14931?3:2:1}if("CI"in o)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(c=>c in o)||o.CI_NAME==="codeship"?1:m;if("TEAMCITY_VERSION"in o)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(o.TEAMCITY_VERSION)?1:0;if(o.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in o){const c=parseInt((o.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(o.TERM_PROGRAM){case"iTerm.app":return c>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(o.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(o.TERM)||"COLORTERM"in o?1:m}function u(a){const l=i(a,a&&a.isTTY);return s(l)}return Lt={supportsColor:u,stdout:s(i(!0,e.isatty(1))),stderr:s(i(!0,e.isatty(2)))},Lt}fe.exports;var bo;function ca(){return bo||(bo=1,function(t,e){const r=Ke,o=Xt;e.init=m,e.log=u,e.formatArgs=s,e.save=a,e.load=l,e.useColors=n,e.destroy=o.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."),e.colors=[6,2,3,4,5,1];try{const D=aa();D&&(D.stderr||D).level>=2&&(e.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{}e.inspectOpts=Object.keys(process.env).filter(D=>/^debug_/i.test(D)).reduce((D,d)=>{const f=d.substring(6).toLowerCase().replace(/_([a-z])/g,(g,E)=>E.toUpperCase());let h=process.env[d];return/^(yes|on|true|enabled)$/i.test(h)?h=!0:/^(no|off|false|disabled)$/i.test(h)?h=!1:h==="null"?h=null:h=Number(h),D[f]=h,D},{});function n(){return"colors"in e.inspectOpts?!!e.inspectOpts.colors:r.isatty(process.stderr.fd)}function s(D){const{namespace:d,useColors:f}=this;if(f){const h=this.color,g="\x1B[3"+(h<8?h:"8;5;"+h),E=` ${g};1m${d} \x1B[0m`;D[0]=E+D[0].split(`
|
|
95
|
+
`,At=(t,e)=>{const r=[];let o="";typeof e=="string"?e={section:e,whitespace:!1}:(e=e||Object.create(null),e.whitespace=e.whitespace===!0);const n=e.whitespace?" = ":"=";for(const s of Object.keys(t)){const i=t[s];if(i&&Array.isArray(i))for(const u of i)o+=ne(s+"[]")+n+ne(u)+Te;else i&&typeof i=="object"?r.push(s):o+=ne(s)+n+ne(i)+Te}e.section&&o.length&&(o="["+ne(e.section)+"]"+Te+o);for(const s of r){const i=mo(s).join("\\."),u=(e.section?e.section+".":"")+i,{whitespace:a}=e,l=At(t[s],{section:u,whitespace:a});o.length&&l.length&&(o+=Te),o+=l}return o},mo=t=>t.replace(/\1/g,"LITERAL\\1LITERAL").replace(/\\\./g,"").split(/\./).map(e=>e.replace(/\1/g,"\\.").replace(/\2LITERAL\\1LITERAL\2/g,"")),po=t=>{const e=Object.create(null);let r=e,o=null;const n=/^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i,s=t.split(/[\r\n]+/g);for(const u of s){if(!u||u.match(/^\s*[;#]/))continue;const a=u.match(n);if(!a)continue;if(a[1]!==void 0){if(o=_e(a[1]),o==="__proto__"){r=Object.create(null);continue}r=e[o]=e[o]||Object.create(null);continue}const l=_e(a[2]),m=l.length>2&&l.slice(-2)==="[]",c=m?l.slice(0,-2):l;if(c==="__proto__")continue;const D=a[3]?_e(a[4]):!0,d=D==="true"||D==="false"||D==="null"?JSON.parse(D):D;m&&($t.call(r,c)?Array.isArray(r[c])||(r[c]=[r[c]]):r[c]=[]),Array.isArray(r[c])?r[c].push(d):r[c]=d}const i=[];for(const u of Object.keys(e)){if(!$t.call(e,u)||typeof e[u]!="object"||Array.isArray(e[u]))continue;const a=mo(u);r=e;const l=a.pop(),m=l.replace(/\\\./g,".");for(const c of a)c!=="__proto__"&&((!$t.call(r,c)||typeof r[c]!="object")&&(r[c]=Object.create(null)),r=r[c]);r===e&&m===l||(r[m]=e[u],i.push(u))}for(const u of i)delete e[u];return e},fo=t=>t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"),ne=t=>typeof t!="string"||t.match(/[=\r\n]/)||t.match(/^\[/)||t.length>1&&fo(t)||t!==t.trim()?JSON.stringify(t):t.split(";").join("\\;").split("#").join("\\#"),_e=(t,e)=>{if(t=(t||"").trim(),fo(t)){t.charAt(0)==="'"&&(t=t.slice(1,-1));try{t=JSON.parse(t)}catch{}}else{let r=!1,o="";for(let n=0,s=t.length;n<s;n++){const i=t.charAt(n);if(r)"\\;#".indexOf(i)!==-1?o+=i:o+="\\"+i,r=!1;else{if(";#".indexOf(i)!==-1)break;i==="\\"?r=!0:o+=i}}return r&&(o+="\\"),o.trim()}return t};var Zu={parse:po,decode:po,stringify:At,encode:At,safe:ne,unsafe:_e},Pt=Q(Zu);const ho=t=>I.lstat(t).then(()=>!0,()=>!1),ea=["","conventional","gitmoji"],Bt="http://localhost:11434",{hasOwnProperty:ta}=Object.prototype,je=(t,e)=>ta.call(t,e),xt=["OPENAI","OLLAMA","HUGGINGFACE","GEMINI","ANTHROPIC","MISTRAL","CODESTRAL","COHERE","GROQ","PERPLEXITY","DEEPSEEK"],F=(t,e,r)=>{if(!e)throw new y(`Invalid config property ${t}: ${r}`)},p={systemPrompt(t){return t||""},systemPromptPath(t){return t||""},codeReviewPromptPath(t){return t||""},timeout(t){if(!t)return 1e4;F("timeout",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return F("timeout",e>=500,"Must be greater than 500ms"),e},temperature(t){if(!t)return .7;F("temperature",/^(2|\d)(\.\d{1,2})?$/.test(t),"Must be decimal between 0 and 2");const e=Number(t);return F("temperature",e>0,"Must be greater than 0"),F("temperature",e<=2,"Must be less than or equal to 2"),e},maxTokens(t){return t?(F("maxTokens",/^\d+$/.test(t),"Must be an integer"),Number(t)):1024},logging(t){return typeof t=="boolean"?t:t==null?!0:(F("logging",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},locale(t){return t?(F("locale",t,"Cannot be empty"),F("locale",/^[a-z-]+$/i.test(t),"Must be a valid locale (letters and dashes/underscores). You can consult the list of codes in: https://wikipedia.org/wiki/List_of_ISO_639-1_codes"),t):"en"},generate(t){if(!t)return 1;F("generate",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return F("generate",e>0,"Must be greater than 0"),F("generate",e<=5,"Must be less or equal to 5"),e},type(t){return t?(F("type",ea.includes(t),"Invalid commit type"),t):"conventional"},maxLength(t){if(!t)return 50;F("maxLength",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return F("maxLength",e>=20,"Must be greater than 20 characters"),e},includeBody(t){return typeof t=="boolean"?t:t==null?!1:(F("includeBody",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},exclude:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.length>0):[],topP:t=>{if(!t)return .9;F("topP",/^(1|\d)(\.\d{1,2})?$/.test(t),"Must be decimal between 0 and 1");const e=Number(t);return F("topP",e>0,"Must be greater than 0"),F("topP",e<=1,"Must be less than or equal to 1"),e},codeReview(t){return typeof t=="boolean"?t:t==null?!1:(F("codeReview",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},disabled(t){return typeof t=="boolean"?t:t==null?!1:(F("disabled",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")}},se={OPENAI:{key:t=>t||"",model:t=>t||"gpt-4o-mini",url:t=>t?(F("OPENAI.url",/^https?:\/\//.test(t),"Must be a valid URL"),t):"https://api.openai.com",path:t=>t||"/v1/chat/completions",proxy:t=>t||"",topP:p.topP,systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,timeout:p.timeout,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,codeReview:p.codeReview,disabled:p.disabled},HUGGINGFACE:{cookie:t=>t||"",model:t=>t?(F("HUGGINGFACE.model",["CohereForAI/c4ai-command-r-plus","meta-llama/Meta-Llama-3-70B-Instruct","HuggingFaceH4/zephyr-orpo-141b-A35b-v0.1","mistralai/Mixtral-8x7B-Instruct-v0.1","NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO","01-ai/Yi-1.5-34B-Chat","mistralai/Mistral-7B-Instruct-v0.2","microsoft/Phi-3-mini-4k-instruct"].includes(t),"Invalid model type of HuggingFace chat"),t):"CohereForAI/c4ai-command-r-plus",systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,codeReview:p.codeReview,disabled:p.disabled},GEMINI:{key:t=>t||"",model:t=>!t||t.length===0?"gemini-1.5-pro":(F("GEMINI.model",["gemini-1.5-flash","gemini-1.5-pro","gemini-1.5-pro-exp-0801"].includes(t),"Invalid model type of Gemini"),t),systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,topP:p.topP,codeReview:p.codeReview,disabled:p.disabled},ANTHROPIC:{key:t=>t||"",model:t=>!t||t.length===0?"claude-3-haiku-20240307":(F("ANTHROPIC.model",["claude-3-haiku-20240307","claude-3-sonnet-20240229","claude-3-opus-20240229","claude-3-5-sonnet-20240620"].includes(t),"Invalid model type of Anthropic"),t),systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,topP:p.topP,codeReview:p.codeReview,disabled:p.disabled},MISTRAL:{key:t=>t||"",model:t=>!t||t.length===0?"mistral-tiny":(F("MISTRAL.model",["open-mistral-7b","mistral-tiny-2312","mistral-tiny","open-mixtral-8x7b","mistral-small-2312","mistral-small","mistral-small-2402","mistral-small-latest","mistral-medium-latest","mistral-medium-2312","mistral-medium","mistral-large-latest","mistral-large-2402","mistral-embed"].includes(t),"Invalid model type of Mistral AI"),t),systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,timeout:p.timeout,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,topP:p.topP,codeReview:p.codeReview,disabled:p.disabled},CODESTRAL:{key:t=>t||"",model:t=>!t||t.length===0?"codestral-latest":(F("CODESTRAL.model",["codestral-latest","codestral-2405"].includes(t),"Invalid model type of Codestral"),t),topP:p.topP,systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,timeout:p.timeout,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,codeReview:p.codeReview,disabled:p.disabled},OLLAMA:{model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.length>0):[],host:t=>t?(F("OLLAMA.host",/^https?:\/\//.test(t),"Must be a valid URL"),t):Bt,timeout:t=>{if(!t)return 1e5;F("OLLAMA.timeout",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return F("OLLAMA.timeout",e>=500,"Must be greater than 500ms"),e},systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,temperature:p.temperature,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,topP:p.topP,codeReview:p.codeReview,disabled:p.disabled},COHERE:{key:t=>t||"",model:t=>!t||t.length===0?"command":(F("COHERE.model",["command","command-nightly","command-light","command-light-nightly"].includes(t),"Invalid model type of Cohere"),t),systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,topP:p.topP,codeReview:p.codeReview,disabled:p.disabled},GROQ:{key:t=>t||"",model:t=>!t||t.length===0?"gemma2-9b-it":(F("GROQ.model",["gemma2-9b-it","gemma-7b-it","llama-3.1-70b-versatile","llama-3.1-8b-instant","llama3-70b-8192","llama3-8b-8192","llama3-groq-70b-8192-tool-use-preview","llama3-groq-8b-8192-tool-use-preview","llama-guard-3-8b","mixtral-8x7b-32768"].includes(t),"Invalid model type of Groq"),t),systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,timeout:p.timeout,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,topP:p.topP,codeReview:p.codeReview,disabled:p.disabled},PERPLEXITY:{key:t=>t||"",model:t=>!t||t.length===0?"llama-3.1-sonar-small-128k-chat":(F("PERPLEXITY.model",["llama-3.1-sonar-small-128k-online","llama-3.1-sonar-small-128k-chat","llama-3.1-sonar-large-128k-online","llama-3.1-sonar-large-128k-chat","llama-3.1-8b-instruct","llama-3.1-70b-instruct"].includes(t),"Invalid model type of Perplexity"),t),topP:p.topP,systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,timeout:p.timeout,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,codeReview:p.codeReview,disabled:p.disabled},DEEPSEEK:{key:t=>t||"",model:t=>!t||t.length===0?"deepseek-coder":(F("DEEPSEEK.model",["deepseek-coder","deepseek-chat"].includes(t),"Invalid model type of DeepSeek"),t),topP:p.topP,systemPrompt:p.systemPrompt,systemPromptPath:p.systemPromptPath,codeReviewPromptPath:p.codeReviewPromptPath,timeout:p.timeout,temperature:p.temperature,maxTokens:p.maxTokens,logging:p.logging,locale:p.locale,generate:p.generate,type:p.type,maxLength:p.maxLength,includeBody:p.includeBody,codeReview:p.codeReview,disabled:p.disabled}},Ge=N.join(Je.homedir(),".aicommit2"),ra=(t=[])=>{const e={};for(const r of t)if(r.startsWith("--")){const[o,n]=r.slice(2).split("="),[s,i]=o.split(".");s&&i&&s in se?(e[s]||(e[s]={}),e[s][i]=n):e[o]=n}return e},St=async()=>{if(!await ho(Ge))return Object.create(null);const e=await I.readFile(Ge,"utf8");let r=Pt.parse(e);return je(r,"OLLAMA")&&je(r.OLLAMA,"model")&&(r={...r,OLLAMA:{...r.OLLAMA,model:typeof r.OLLAMA.model=="string"?[r.OLLAMA.model]:r.OLLAMA.model}}),je(r,"exclude")&&(r={...r,exclude:typeof r.exclude=="string"?[r.exclude]:r.exclude}),r},Mt=async(t,e=[])=>{const r=await St(),o=ra(e),n={...t,...o},s={},i=(u,a)=>{const l=n[`${u}.${a}`]??n[u]?.[a],m=r[u]?.[a],c=n[a]??r[a];return l!==void 0?l:m!==void 0?m:c};for(const[u,a]of Object.entries(p)){const l=n[u]??r[u];s[u]=a(l)}for(const[u,a]of Object.entries(se)){s[u]={};for(const[l,m]of Object.entries(a)){const c=i(u,l);s[u][l]=m(c)}}return s},oa=async t=>{const e=await St();for(const[r,o]of t){const[n,s]=r.split(".");if(n in se){e[n]||(e[n]={});const i=se[n][s];if(!i)throw new y(`Invalid config property: ${r}`);e[n][s]=i(o)}else{const i=p[r];if(!i)throw new y(`Invalid config property: ${r}`);e[r]=i(o)}}await I.writeFile(Ge,Pt.stringify(e),"utf8")},na=async t=>{const e=await St();for(const[r,o]of t){const[n,s]=r.split(".");if(n in se){e[n]||(e[n]={});const i=n==="OLLAMA"&&s==="model",u=se[n][s];if(!u||!i)throw new y(`Invalid config property: ${r}. Only supports OLLAMA.model`);const a=e[n][s]||[];e[n][s]=Ne([...a,u(o)])}else throw new y(`Invalid config property: ${r}. Only supports OLLAMA.model`)}await I.writeFile(Ge,Pt.stringify(e),"utf8")};class go extends _{constructor(e){super(e),this.params=e,this.host=Bt,this.model="",this.handleError$=r=>{if(r.response&&r.response.data?.error)return R({name:`${this.errorPrefix} ${r.response.data?.error}`,value:r.response.data?.error,isError:!0,disabled:!0});const o=r.message?.replace(/(\r\n|\n|\r)/gm,"")||"An error occurred";return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#FFF",secondary:"#000"},this.model=this.params.keyName,this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[${Xr(this.model)}]`),this.errorPrefix=C.red.bold(`[${Xr(this.model)}]`),this.host=this.params.config.host||Bt,this.ollama=new mn({host:this.host})}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,generate:a,type:l,maxLength:m}=this.params.config,c={...L,locale:u,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},D=e==="review"?H(c):G(c);await this.checkIsAvailableOllama();const d=await this.createChatCompletions(D,`Here is the diff: ${r}`);return i&&j(`Ollama_${this.model}`,r,D,d,e),e==="review"?this.sanitizeResponse(d):this.parseMessage(d,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new y(`Error connecting to ${o.hostname} (${o.syscall})`):o}}async checkIsAvailableOllama(){try{return(await new oe({method:"GET",baseURL:`${this.host}`,timeout:this.params.config.timeout}).execute()).data}catch(e){throw e.code==="ECONNREFUSED"?new y(`Error connecting to ${this.host}. Please run Ollama or check host`):e}}async createChatCompletions(e,r){return(await this.ollama.chat({model:this.model,messages:[{role:"system",content:e},{role:"user",content:r}],stream:!1,options:{temperature:this.params.config.temperature,top_p:this.params.config.topP,seed:ke(10,1e3)}})).message.content}}var Ot={},Rt={exports:{}},pe={exports:{}},It,Co;function sa(){if(Co)return It;Co=1;var t=1e3,e=t*60,r=e*60,o=r*24,n=o*7,s=o*365.25;It=function(m,c){c=c||{};var D=typeof m;if(D==="string"&&m.length>0)return i(m);if(D==="number"&&isFinite(m))return c.long?a(m):u(m);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(m))};function i(m){if(m=String(m),!(m.length>100)){var c=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(m);if(c){var D=parseFloat(c[1]),d=(c[2]||"ms").toLowerCase();switch(d){case"years":case"year":case"yrs":case"yr":case"y":return D*s;case"weeks":case"week":case"w":return D*n;case"days":case"day":case"d":return D*o;case"hours":case"hour":case"hrs":case"hr":case"h":return D*r;case"minutes":case"minute":case"mins":case"min":case"m":return D*e;case"seconds":case"second":case"secs":case"sec":case"s":return D*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return D;default:return}}}}function u(m){var c=Math.abs(m);return c>=o?Math.round(m/o)+"d":c>=r?Math.round(m/r)+"h":c>=e?Math.round(m/e)+"m":c>=t?Math.round(m/t)+"s":m+"ms"}function a(m){var c=Math.abs(m);return c>=o?l(m,c,o,"day"):c>=r?l(m,c,r,"hour"):c>=e?l(m,c,e,"minute"):c>=t?l(m,c,t,"second"):m+" ms"}function l(m,c,D,d){var f=c>=D*1.5;return Math.round(m/D)+" "+d+(f?"s":"")}return It}var kt,Eo;function Fo(){if(Eo)return kt;Eo=1;function t(e){o.debug=o,o.default=o,o.coerce=l,o.disable=i,o.enable=s,o.enabled=u,o.humanize=sa(),o.destroy=m,Object.keys(e).forEach(c=>{o[c]=e[c]}),o.names=[],o.skips=[],o.formatters={};function r(c){let D=0;for(let d=0;d<c.length;d++)D=(D<<5)-D+c.charCodeAt(d),D|=0;return o.colors[Math.abs(D)%o.colors.length]}o.selectColor=r;function o(c){let D,d=null,f,h;function g(...E){if(!g.enabled)return;const w=g,O=Number(new Date),J=O-(D||O);w.diff=J,w.prev=D,w.curr=O,D=O,E[0]=o.coerce(E[0]),typeof E[0]!="string"&&E.unshift("%O");let W=0;E[0]=E[0].replace(/%([a-zA-Z%])/g,(Y,zo)=>{if(Y==="%%")return"%";W++;const qt=o.formatters[zo];if(typeof qt=="function"){const qo=E[W];Y=qt.call(w,qo),E.splice(W,1),W--}return Y}),o.formatArgs.call(w,E),(w.log||o.log).apply(w,E)}return g.namespace=c,g.useColors=o.useColors(),g.color=o.selectColor(c),g.extend=n,g.destroy=o.destroy,Object.defineProperty(g,"enabled",{enumerable:!0,configurable:!1,get:()=>d!==null?d:(f!==o.namespaces&&(f=o.namespaces,h=o.enabled(c)),h),set:E=>{d=E}}),typeof o.init=="function"&&o.init(g),g}function n(c,D){const d=o(this.namespace+(typeof D>"u"?":":D)+c);return d.log=this.log,d}function s(c){o.save(c),o.namespaces=c,o.names=[],o.skips=[];let D;const d=(typeof c=="string"?c:"").split(/[\s,]+/),f=d.length;for(D=0;D<f;D++)d[D]&&(c=d[D].replace(/\*/g,".*?"),c[0]==="-"?o.skips.push(new RegExp("^"+c.slice(1)+"$")):o.names.push(new RegExp("^"+c+"$")))}function i(){const c=[...o.names.map(a),...o.skips.map(a).map(D=>"-"+D)].join(",");return o.enable(""),c}function u(c){if(c[c.length-1]==="*")return!0;let D,d;for(D=0,d=o.skips.length;D<d;D++)if(o.skips[D].test(c))return!1;for(D=0,d=o.names.length;D<d;D++)if(o.names[D].test(c))return!0;return!1}function a(c){return c.toString().substring(2,c.toString().length-2).replace(/\.\*\?$/,"*")}function l(c){return c instanceof Error?c.stack||c.message:c}function m(){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 o.enable(o.load()),o}return kt=t,kt}pe.exports;var yo;function ia(){return yo||(yo=1,function(t,e){e.formatArgs=o,e.save=n,e.load=s,e.useColors=r,e.storage=i(),e.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`."))}})(),e.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 r(){return typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1: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&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function o(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 m=0,c=0;a[0].replace(/%[a-zA-Z%]/g,D=>{D!=="%%"&&(m++,D==="%c"&&(c=m))}),a.splice(c,0,l)}e.log=console.debug||console.log||(()=>{});function n(a){try{a?e.storage.setItem("debug",a):e.storage.removeItem("debug")}catch{}}function s(){let a;try{a=e.storage.getItem("debug")}catch{}return!a&&typeof process<"u"&&"env"in process&&(a=process.env.DEBUG),a}function i(){try{return localStorage}catch{}}t.exports=Fo()(e);const{formatters:u}=t.exports;u.j=function(a){try{return JSON.stringify(a)}catch(l){return"[UnexpectedJSONParseError]: "+l.message}}}(pe,pe.exports)),pe.exports}var fe={exports:{}},Nt,wo;function ua(){return wo||(wo=1,Nt=(t,e=process.argv)=>{const r=t.startsWith("-")?"":t.length===1?"-":"--",o=e.indexOf(r+t),n=e.indexOf("--");return o!==-1&&(n===-1||o<n)}),Nt}var Lt,vo;function aa(){if(vo)return Lt;vo=1;const t=Je,e=Ke,r=ua(),{env:o}=process;let n;r("no-color")||r("no-colors")||r("color=false")||r("color=never")?n=0:(r("color")||r("colors")||r("color=true")||r("color=always"))&&(n=1),"FORCE_COLOR"in o&&(o.FORCE_COLOR==="true"?n=1:o.FORCE_COLOR==="false"?n=0:n=o.FORCE_COLOR.length===0?1:Math.min(parseInt(o.FORCE_COLOR,10),3));function s(a){return a===0?!1:{level:a,hasBasic:!0,has256:a>=2,has16m:a>=3}}function i(a,l){if(n===0)return 0;if(r("color=16m")||r("color=full")||r("color=truecolor"))return 3;if(r("color=256"))return 2;if(a&&!l&&n===void 0)return 0;const m=n||0;if(o.TERM==="dumb")return m;if(process.platform==="win32"){const c=t.release().split(".");return Number(c[0])>=10&&Number(c[2])>=10586?Number(c[2])>=14931?3:2:1}if("CI"in o)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(c=>c in o)||o.CI_NAME==="codeship"?1:m;if("TEAMCITY_VERSION"in o)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(o.TEAMCITY_VERSION)?1:0;if(o.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in o){const c=parseInt((o.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(o.TERM_PROGRAM){case"iTerm.app":return c>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(o.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(o.TERM)||"COLORTERM"in o?1:m}function u(a){const l=i(a,a&&a.isTTY);return s(l)}return Lt={supportsColor:u,stdout:s(i(!0,e.isatty(1))),stderr:s(i(!0,e.isatty(2)))},Lt}fe.exports;var bo;function ca(){return bo||(bo=1,function(t,e){const r=Ke,o=Xt;e.init=m,e.log=u,e.formatArgs=s,e.save=a,e.load=l,e.useColors=n,e.destroy=o.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."),e.colors=[6,2,3,4,5,1];try{const D=aa();D&&(D.stderr||D).level>=2&&(e.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{}e.inspectOpts=Object.keys(process.env).filter(D=>/^debug_/i.test(D)).reduce((D,d)=>{const f=d.substring(6).toLowerCase().replace(/_([a-z])/g,(g,E)=>E.toUpperCase());let h=process.env[d];return/^(yes|on|true|enabled)$/i.test(h)?h=!0:/^(no|off|false|disabled)$/i.test(h)?h=!1:h==="null"?h=null:h=Number(h),D[f]=h,D},{});function n(){return"colors"in e.inspectOpts?!!e.inspectOpts.colors:r.isatty(process.stderr.fd)}function s(D){const{namespace:d,useColors:f}=this;if(f){const h=this.color,g="\x1B[3"+(h<8?h:"8;5;"+h),E=` ${g};1m${d} \x1B[0m`;D[0]=E+D[0].split(`
|
|
96
96
|
`).join(`
|
|
97
97
|
`+E),D.push(g+"m+"+t.exports.humanize(this.diff)+"\x1B[0m")}else D[0]=i()+d+" "+D[0]}function i(){return e.inspectOpts.hideDate?"":new Date().toISOString()+" "}function u(...D){return process.stderr.write(o.formatWithOptions(e.inspectOpts,...D)+`
|
|
98
98
|
`)}function a(D){D?process.env.DEBUG=D:delete process.env.DEBUG}function l(){return process.env.DEBUG}function m(D){D.inspectOpts={};const d=Object.keys(e.inspectOpts);for(let f=0;f<d.length;f++)D.inspectOpts[d[f]]=e.inspectOpts[d[f]]}t.exports=Fo()(e);const{formatters:c}=t.exports;c.o=function(D){return this.inspectOpts.colors=this.useColors,o.inspect(D,this.inspectOpts).split(`
|
|
@@ -103,13 +103,13 @@ Please structure your response with appropriate Markdown headings, code blocks,
|
|
|
103
103
|
`)),h=+f.split(" ")[1];ge("got proxy server response: %o",f),e({statusCode:h,buffered:D})}t.on("error",l),t.on("close",u),t.on("end",a),s()})}Gt.default=Ca;var Ea=S&&S.__awaiter||function(t,e,r,o){function n(s){return s instanceof r?s:new r(function(i){i(s)})}return new(r||(r=Promise))(function(s,i){function u(m){try{l(o.next(m))}catch(c){i(c)}}function a(m){try{l(o.throw(m))}catch(c){i(c)}}function l(m){m.done?s(m.value):n(m.value).then(u,a)}l((o=o.apply(t,e||[])).next())})},ie=S&&S.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Ot,"__esModule",{value:!0});const Ao=ie(fn),Po=ie(hn),Fa=ie(gn),ya=ie(Jt),wa=ie(Tt),va=fa,ba=ie(Gt),Ce=wa.default("https-proxy-agent:agent");class $a extends va.Agent{constructor(e){let r;if(typeof e=="string"?r=Fa.default.parse(e):r=e,!r)throw new Error("an HTTP(S) proxy server `host` and `port` must be specified!");Ce("creating new HttpsProxyAgent instance: %o",r),super(r);const o=Object.assign({},r);this.secureProxy=r.secureProxy||Ba(o.protocol),o.host=o.hostname||o.host,typeof o.port=="string"&&(o.port=parseInt(o.port,10)),!o.port&&o.host&&(o.port=this.secureProxy?443:80),this.secureProxy&&!("ALPNProtocols"in o)&&(o.ALPNProtocols=["http 1.1"]),o.host&&o.path&&(delete o.path,delete o.pathname),this.proxy=o}callback(e,r){return Ea(this,void 0,void 0,function*(){const{proxy:o,secureProxy:n}=this;let s;n?(Ce("Creating `tls.Socket`: %o",o),s=Po.default.connect(o)):(Ce("Creating `net.Socket`: %o",o),s=Ao.default.connect(o));const i=Object.assign({},o.headers);let a=`CONNECT ${`${r.host}:${r.port}`} HTTP/1.1\r
|
|
104
104
|
`;o.auth&&(i["Proxy-Authorization"]=`Basic ${Buffer.from(o.auth).toString("base64")}`);let{host:l,port:m,secureEndpoint:c}=r;Pa(m,c)||(l+=`:${m}`),i.Host=l,i.Connection="close";for(const g of Object.keys(i))a+=`${g}: ${i[g]}\r
|
|
105
105
|
`;const D=ba.default(s);s.write(`${a}\r
|
|
106
|
-
`);const{statusCode:d,buffered:f}=yield D;if(d===200){if(e.once("socket",Aa),r.secureEndpoint){Ce("Upgrading socket connection to TLS");const g=r.servername||r.host;return Po.default.connect(Object.assign(Object.assign({},xa(r,"host","hostname","path","port")),{socket:s,servername:g}))}return s}s.destroy();const h=new Ao.default.Socket({writable:!1});return h.readable=!0,e.once("socket",g=>{Ce("replaying proxy buffer for failed request"),ya.default(g.listenerCount("data")>0),g.push(f),g.push(null)}),h})}}Ot.default=$a;function Aa(t){t.resume()}function Pa(t,e){return!!(!e&&t===80||e&&t===443)}function Ba(t){return typeof t=="string"?/^https:?$/i.test(t):!1}function xa(t,...e){const r={};let o;for(o in t)e.includes(o)||(r[o]=t[o]);return r}var Sa=S&&S.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};const Ht=Sa(Ot);function Ut(t){return new Ht.default(t)}(function(t){t.HttpsProxyAgent=Ht.default,t.prototype=Ht.default.prototype})(Ut||(Ut={}));var Ma=Ut,Oa=Q(Ma);const Ra=async(t,e,r,o,n,s,i)=>new Promise((u,a)=>{const l=JSON.stringify(o),c=(t.protocol.includes("https")?pn:dn).request({port:i||void 0,hostname:t.hostname,path:e,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(l),...r},timeout:n,agent:s?Oa(s):void 0},D=>{const d=[];D.on("data",f=>d.push(f)),D.on("end",()=>{u({request:c,response:D,data:Buffer.concat(d).toString()})})});c.on("error",a),c.on("timeout",()=>{c.destroy(),a(new
|
|
106
|
+
`);const{statusCode:d,buffered:f}=yield D;if(d===200){if(e.once("socket",Aa),r.secureEndpoint){Ce("Upgrading socket connection to TLS");const g=r.servername||r.host;return Po.default.connect(Object.assign(Object.assign({},xa(r,"host","hostname","path","port")),{socket:s,servername:g}))}return s}s.destroy();const h=new Ao.default.Socket({writable:!1});return h.readable=!0,e.once("socket",g=>{Ce("replaying proxy buffer for failed request"),ya.default(g.listenerCount("data")>0),g.push(f),g.push(null)}),h})}}Ot.default=$a;function Aa(t){t.resume()}function Pa(t,e){return!!(!e&&t===80||e&&t===443)}function Ba(t){return typeof t=="string"?/^https:?$/i.test(t):!1}function xa(t,...e){const r={};let o;for(o in t)e.includes(o)||(r[o]=t[o]);return r}var Sa=S&&S.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};const Ht=Sa(Ot);function Ut(t){return new Ht.default(t)}(function(t){t.HttpsProxyAgent=Ht.default,t.prototype=Ht.default.prototype})(Ut||(Ut={}));var Ma=Ut,Oa=Q(Ma);const Ra=async(t,e,r,o,n,s,i)=>new Promise((u,a)=>{const l=JSON.stringify(o),c=(t.protocol.includes("https")?pn:dn).request({port:i||void 0,hostname:t.hostname,path:e,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(l),...r},timeout:n,agent:s?Oa(s):void 0},D=>{const d=[];D.on("data",f=>d.push(f)),D.on("end",()=>{u({request:c,response:D,data:Buffer.concat(d).toString()})})});c.on("error",a),c.on("timeout",()=>{c.destroy(),a(new y(`Time out error: request took over ${n}ms. Try increasing the \`timeout\` config`))}),c.write(l),c.end()}),Ia=async(t,e,r,o,n,s)=>{const i=new URL(t),{response:u,data:a}=await Ra(i,e,{Authorization:`Bearer ${r}`},o,n,s);if(!u.statusCode||u.statusCode<200||u.statusCode>299){let l=`OpenAI API Error: ${u.statusCode} - ${u.statusMessage}`;throw a&&(l+=`
|
|
107
107
|
|
|
108
108
|
${a}`),u.statusCode===500&&(l+=`
|
|
109
109
|
|
|
110
|
-
Check the API status: https://status.openai.com`),new
|
|
110
|
+
Check the API status: https://status.openai.com`),new y(l)}return JSON.parse(a)},Bo=t=>t.trim(),ka=async(t,e,r,o,n,s,i,u,a,l,m,c,D)=>{try{const d={model:o,messages:[{role:"system",content:l},{role:"user",content:`Here is the diff: ${n}`}],temperature:u,max_tokens:i,stream:!1,n:1,top_p:a,frequency_penalty:0,presence_penalty:0},f=await Ia(t,e,r,d,s,D),h=f.choices.filter(g=>g.message?.content).map(g=>Bo(g.message.content)).join();return m&&j("OPENAI",n,l,h,c),f.choices.filter(g=>g.message?.content).map(g=>Bo(g.message.content))}catch(d){const f=d;throw f.code==="ENOTFOUND"?new y(`Error connecting to ${f.hostname} (${f.syscall})`):f}};class xo extends _{constructor(e){super(e),this.params=e,this.handleError$=r=>{let o="An error occurred";if(r.message){o=r.message.split(`
|
|
111
111
|
`)[0];const n=this.extractJSONFromError(r.message);o+=`: ${n.error.message}`}return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#74AA9C",secondary:"#FFF"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[ChatGPT]"),this.errorPrefix=C.red.bold("[ChatGPT]")}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}extractJSONFromError(e){const r=/[{[]{1}([,:{}[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/gis,o=e.match(r);return o?Object.assign({},...o.map(n=>JSON.parse(n))):{error:{message:"Unknown error"}}}async generateMessage(e){const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,temperature:i,logging:u,locale:a,generate:l,type:m,maxLength:c,proxy:D,maxTokens:d,timeout:f}=this.params.config,h={...L,locale:a,maxLength:c,type:m,generate:l,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},g=e==="review"?H(h):G(h),E=await ka(this.params.config.url,this.params.config.path,this.params.config.key,this.params.config.model,r,f,d,i,this.params.config.topP,g,u,e,D);return Ne(e==="review"?E.map(w=>this.sanitizeResponse(w)):E.map(w=>this.parseMessage(w,m,l)))}}class So extends _{constructor(e){super(e),this.params=e,this.host="https://api.perplexity.ai",this.apiKey="",this.handleError$=r=>{let o="An error occurred";if(r.message){o=r.message.split(`
|
|
112
|
-
`)[0];const n=this.extractJSONFromError(r.message);o+=`: ${n.error.message}`}return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#20808D",secondary:"#FFF"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Perplexity]"),this.errorPrefix=C.red.bold("[Perplexity]"),this.apiKey=this.params.config.key}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}extractJSONFromError(e){const r=/[{[]{1}([,:{}[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/gis,o=e.match(r);return o?Object.assign({},...o.map(n=>JSON.parse(n))):{error:{message:"Unknown error"}}}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,generate:a,type:l,maxLength:m}=this.params.config,c={...L,locale:u,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},D=e==="review"?H(c):G(c),d=await this.createChatCompletions(D,r);return i&&j("Perplexity",r,D,d,e),this.parseMessage(d,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new
|
|
112
|
+
`)[0];const n=this.extractJSONFromError(r.message);o+=`: ${n.error.message}`}return R({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.colors={primary:"#20808D",secondary:"#FFF"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[Perplexity]"),this.errorPrefix=C.red.bold("[Perplexity]"),this.apiKey=this.params.config.key}generateCommitMessage$(){return B(this.generateMessage("commit")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:this.params.config.includeBody?e.value:e.title,description:this.params.config.includeBody?e.value:"",isError:!1})),b(this.handleError$))}generateCodeReview$(){return B(this.generateMessage("review")).pipe(P(e=>v(e)),A(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),b(this.handleError$))}extractJSONFromError(e){const r=/[{[]{1}([,:{}[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/gis,o=e.match(r);return o?Object.assign({},...o.map(n=>JSON.parse(n))):{error:{message:"Unknown error"}}}async generateMessage(e){try{const r=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s,logging:i,locale:u,generate:a,type:l,maxLength:m}=this.params.config,c={...L,locale:u,maxLength:m,type:l,generate:a,systemPrompt:o,systemPromptPath:n,codeReviewPromptPath:s},D=e==="review"?H(c):G(c),d=await this.createChatCompletions(D,r);return i&&j("Perplexity",r,D,d,e),this.parseMessage(d,l,a)}catch(r){const o=r;throw o.code==="ENOTFOUND"?new y(`Error connecting to ${o.hostname} (${o.syscall})`):o}}async createChatCompletions(e,r){const n=(await new oe({method:"POST",baseURL:`${this.host}/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody({model:this.params.config.model,messages:[{role:"system",content:`${e}`},{role:"user",content:`Here is the diff: ${r}`}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1}).execute()).data;if(!n.choices||n.choices.length===0||!n.choices[0].message?.content)throw new Error("No Content on response. Please open a Bug report");return n.choices[0].message.content}}class Mo{constructor(e,r){this.config=e,this.stagedDiff=r}createCommitMsgRequests$(e){return v(e).pipe(ye(r=>{switch(r){case"OPENAI":return x.create(xo,{config:this.config.OPENAI,stagedDiff:this.stagedDiff,keyName:r}).generateCommitMessage$();case"GEMINI":return x.create(ao,{config:this.config.GEMINI,stagedDiff:this.stagedDiff,keyName:r}).generateCommitMessage$();case"ANTHROPIC":return x.create(no,{config:this.config.ANTHROPIC,stagedDiff:this.stagedDiff,keyName:r}).generateCommitMessage$();case"HUGGINGFACE":return x.create(lo,{config:this.config.HUGGINGFACE,stagedDiff:this.stagedDiff,keyName:r}).generateCommitMessage$();case"MISTRAL":return x.create(Do,{config:this.config.MISTRAL,stagedDiff:this.stagedDiff,keyName:r}).generateCommitMessage$();case"CODESTRAL":return x.create(so,{config:this.config.CODESTRAL,stagedDiff:this.stagedDiff,keyName:r}).generateCommitMessage$();case"OLLAMA":return v(this.config.OLLAMA.model).pipe(ye(n=>x.create(go,{config:this.config.OLLAMA,keyName:n,stagedDiff:this.stagedDiff}).generateCommitMessage$()));case"COHERE":return x.create(io,{config:this.config.COHERE,stagedDiff:this.stagedDiff,keyName:r}).generateCommitMessage$();case"GROQ":return x.create(co,{config:this.config.GROQ,stagedDiff:this.stagedDiff,keyName:r}).generateCommitMessage$();case"PERPLEXITY":return x.create(So,{config:this.config.PERPLEXITY,stagedDiff:this.stagedDiff,keyName:r}).generateCommitMessage$();case"DEEPSEEK":return x.create(uo,{config:this.config.DEEPSEEK,stagedDiff:this.stagedDiff,keyName:r}).generateCommitMessage$();default:const o=C.red.bold(`[${r}]`);return R({name:o+" Invalid AI type",value:"Invalid AI type",isError:!0,disabled:!0})}}),b(r=>{const o=C.red.bold("[UNKNOWN]");return R({name:o+` ${r.message||""}`,value:"Unknown error",isError:!0,disabled:!0})}))}createCodeReviewRequests$(e){return v(e).pipe(ye(r=>{switch(r){case"OPENAI":return x.create(xo,{config:this.config.OPENAI,stagedDiff:this.stagedDiff,keyName:r}).generateCodeReview$();case"GEMINI":return x.create(ao,{config:this.config.GEMINI,stagedDiff:this.stagedDiff,keyName:r}).generateCodeReview$();case"ANTHROPIC":return x.create(no,{config:this.config.ANTHROPIC,stagedDiff:this.stagedDiff,keyName:r}).generateCodeReview$();case"HUGGINGFACE":return x.create(lo,{config:this.config.HUGGINGFACE,stagedDiff:this.stagedDiff,keyName:r}).generateCodeReview$();case"MISTRAL":return x.create(Do,{config:this.config.MISTRAL,stagedDiff:this.stagedDiff,keyName:r}).generateCodeReview$();case"CODESTRAL":return x.create(so,{config:this.config.CODESTRAL,stagedDiff:this.stagedDiff,keyName:r}).generateCodeReview$();case"OLLAMA":return v(this.config.OLLAMA.model).pipe(ye(n=>x.create(go,{config:this.config.OLLAMA,keyName:n,stagedDiff:this.stagedDiff}).generateCodeReview$()));case"COHERE":return x.create(io,{config:this.config.COHERE,stagedDiff:this.stagedDiff,keyName:r}).generateCodeReview$();case"GROQ":return x.create(co,{config:this.config.GROQ,stagedDiff:this.stagedDiff,keyName:r}).generateCodeReview$();case"PERPLEXITY":return x.create(So,{config:this.config.PERPLEXITY,stagedDiff:this.stagedDiff,keyName:r}).generateCodeReview$();case"DEEPSEEK":return x.create(uo,{config:this.config.DEEPSEEK,stagedDiff:this.stagedDiff,keyName:r}).generateCodeReview$();default:const o=C.red.bold(`[${r}]`);return R({name:o+" Invalid AI type",value:"Invalid AI type",isError:!0,disabled:!0})}}),b(r=>{const o=C.red.bold("[UNKNOWN]");return R({name:o+` ${r.message||""}`,value:"Unknown error",isError:!0,disabled:!0})}))}}const Oo=async()=>{const{stdout:t,failed:e}=await me("git",["rev-parse","--show-toplevel"],{reject:!1});if(e)throw new y("The current directory must be a Git repository!");return t},Ue=t=>`:(exclude)${t}`,Ro=["package-lock.json","pnpm-lock.yaml","*.lock","*.lockb","*.gif","*.png"].map(Ue),Io=async(t,e)=>{const r=["diff","--cached","--diff-algorithm=minimal"],{stdout:o}=await me("git",[...r,"--name-only",...Ro,...t?t.map(Ue):[],...e?e.map(Ue):[]]);if(!o)return null;const{stdout:n}=await me("git",[...r,...Ro,...t?t.map(Ue):[]]);return{files:o.split(`
|
|
113
113
|
`),diff:n}},Na=t=>`Detected ${t.length.toLocaleString()} staged file${t.length>1?"s":""}`;class Ee{constructor(){this.title="aicommit2"}printTitle(){console.log(Fn.textSync(this.title,{font:"Small"}))}displaySpinner(e){return Qt(e).start()}stopSpinner(e){e.stop(),e.clear()}printStagedFiles(e){console.log(C.bold.green("\u2714 ")+C.bold(`${Na(e.files)}:`)),console.log(`${e.files.map(r=>` ${r}`).join(`
|
|
114
114
|
`)}
|
|
115
115
|
`)}printAnalyzed(){console.log(`
|
|
@@ -118,10 +118,10 @@ ${C.bold.green("\u2714")} ${C.bold("Successfully committed!")}`)}printCopied(){c
|
|
|
118
118
|
${C.bold.green("\u2714")} ${C.bold("Successfully copied! Press 'Ctrl + V' to paste")}`)}printSavedCommitMessage(){console.log(`
|
|
119
119
|
${C.bold.green("\u2714")} ${C.bold("Saved commit message")}`)}printCancelledCommit(){console.log(`
|
|
120
120
|
${C.bold.yellow("\u26A0")} ${C.yellow("Commit cancelled")}`)}printErrorMessage(e){console.log(`
|
|
121
|
-
${C.bold.red("\u2716")} ${C.red(`${e}`)}`)}moveCursorUp(){const e=be.createInterface({input:process.stdin,output:process.stdout});be.moveCursor(process.stdout,0,-1),e.close()}moveCursorDown(){const e=be.createInterface({input:process.stdin,output:process.stdout});be.moveCursor(process.stdout,0,1),e.close()}}const La={isLoading:!1,startOption:{text:"AI is analyzing your changes"}},Ta={isLoading:!1,startOption:{text:"AI is performing a code review"}},zt="No commit messages were generated",_a="No code reviews were generated",ko={type:"reactiveListPrompt",name:"aicommit2Prompt",message:"Pick a commit message to use: ",emptyMessage:`\u26A0 ${zt}`,loop:!1,descPageSize:15,showDescription:!0,pickKey:"short",isDescriptionDim:!0,stopMessage:"Changes analyzed"};class No{constructor(e){this.choices$=new Zt([]),this.destroyed$=new tn(1),this.stopMessage="Changes analyzed",this.loader$=new Zt(e)}initPrompt(e=ko){return this.stopMessage=e.stopMessage,Fe.registerPrompt("reactiveListPrompt",yn),Fe.prompt({...e,choices$:this.choices$,loader$:this.loader$})}startLoader(){this.loader$.next({isLoading:!0})}refreshChoices(e){const{value:r,isError:o}=e;!e||!r||this.choices$.next([...this.currentChoices,e].sort(Wu))}checkErrorOnChoices(){if(this.choices$.getValue().map(r=>r).every(r=>r?.isError||r?.disabled)){this.alertNoGeneratedMessage(),this.logEmptyCommitMessage(),process.exit(1);return}this.stopLoaderOnSuccess()}completeSubject(){this.choices$.complete(),this.loader$.complete(),this.destroyed$.next(!0),this.destroyed$.complete()}alertNoGeneratedMessage(){this.loader$.next({isLoading:!1,message:zt,stopOption:{doneFrame:"\u26A0",color:"yellow"}})}stopLoaderOnSuccess(){this.loader$.next({isLoading:!1,message:this.stopMessage})}logEmptyCommitMessage(){console.log(`${C.bold.yellow("\u26A0")} ${C.yellow(`${zt}`)}`)}get currentChoices(){return this.choices$.getValue().map(e=>e)}}const q=new Ee;var ja=async(t,e,r,o,n,s,i,u,a)=>(async()=>{q.printTitle(),await Oo(),o&&await me("git",["add","--update"]);const l=await Mt({locale:t?.toString(),generate:e?.toString(),commitType:n?.toString(),systemPrompt:u?.toString()},a);await Ga(l);const m=q.displaySpinner("Detecting staged files"),c=await Io(r,l.exclude);if(m.stop(),!c)throw new
|
|
121
|
+
${C.bold.red("\u2716")} ${C.red(`${e}`)}`)}moveCursorUp(){const e=be.createInterface({input:process.stdin,output:process.stdout});be.moveCursor(process.stdout,0,-1),e.close()}moveCursorDown(){const e=be.createInterface({input:process.stdin,output:process.stdout});be.moveCursor(process.stdout,0,1),e.close()}}const La={isLoading:!1,startOption:{text:"AI is analyzing your changes"}},Ta={isLoading:!1,startOption:{text:"AI is performing a code review"}},zt="No commit messages were generated",_a="No code reviews were generated",ko={type:"reactiveListPrompt",name:"aicommit2Prompt",message:"Pick a commit message to use: ",emptyMessage:`\u26A0 ${zt}`,loop:!1,descPageSize:15,showDescription:!0,pickKey:"short",isDescriptionDim:!0,stopMessage:"Changes analyzed"};class No{constructor(e){this.choices$=new Zt([]),this.destroyed$=new tn(1),this.stopMessage="Changes analyzed",this.loader$=new Zt(e)}initPrompt(e=ko){return this.stopMessage=e.stopMessage,Fe.registerPrompt("reactiveListPrompt",yn),Fe.prompt({...e,choices$:this.choices$,loader$:this.loader$})}startLoader(){this.loader$.next({isLoading:!0})}refreshChoices(e){const{value:r,isError:o}=e;!e||!r||this.choices$.next([...this.currentChoices,e].sort(Wu))}checkErrorOnChoices(){if(this.choices$.getValue().map(r=>r).every(r=>r?.isError||r?.disabled)){this.alertNoGeneratedMessage(),this.logEmptyCommitMessage(),process.exit(1);return}this.stopLoaderOnSuccess()}completeSubject(){this.choices$.complete(),this.loader$.complete(),this.destroyed$.next(!0),this.destroyed$.complete()}alertNoGeneratedMessage(){this.loader$.next({isLoading:!1,message:zt,stopOption:{doneFrame:"\u26A0",color:"yellow"}})}stopLoaderOnSuccess(){this.loader$.next({isLoading:!1,message:this.stopMessage})}logEmptyCommitMessage(){console.log(`${C.bold.yellow("\u26A0")} ${C.yellow(`${zt}`)}`)}get currentChoices(){return this.choices$.getValue().map(e=>e)}}const q=new Ee;var ja=async(t,e,r,o,n,s,i,u,a)=>(async()=>{q.printTitle(),await Oo(),o&&await me("git",["add","--update"]);const l=await Mt({locale:t?.toString(),generate:e?.toString(),commitType:n?.toString(),systemPrompt:u?.toString()},a);await Ga(l);const m=q.displaySpinner("Detecting staged files"),c=await Io(r,l.exclude);if(m.stop(),!c)throw new y("No staged changes found. Stage your changes manually, or automatically stage all changes with the `--all` flag.");q.printStagedFiles(c);const D=Lo(l,"commit");if(D.length===0)throw new y("Please set at least one API key via the `aicommit2 config set` command");const d=new Mo(l,c),f=Lo(l,"review");f.length>0&&await Ha(d,f);const h=await Ua(d,D);i&&(Hs("copy-paste").copy(h),q.printCopied(),process.exit()),s&&(await To(h,a),process.exit());const{confirmationPrompt:g}=await Fe.prompt([{type:"confirm",name:"confirmationPrompt",message:"Use selected message?",default:!0}]);g?await To(h,a):q.printCancelledCommit(),process.exit()})().catch(l=>{q.printErrorMessage(l.message),de(l),process.exit(1)});async function Ga(t){if(t.systemPromptPath)try{T.readFileSync(N.resolve(t.systemPromptPath),"utf-8")}catch{throw new y(`Error reading system prompt file: ${t.systemPromptPath}`)}if(t.codeReview&&t.codeReviewPromptPath)try{T.readFileSync(N.resolve(t.codeReviewPromptPath),"utf-8")}catch{throw new y(`Error reading code review prompt file: ${t.codeReviewPromptPath}`)}}function Lo(t,e){return Object.entries(t).filter(([r])=>xt.includes(r)).map(([r,o])=>[r,o]).filter(([r,o])=>!o.disabled).filter(([r,o])=>{switch(e){case"commit":return r==="OLLAMA"?!!o&&!!o.model&&o.model.length>0:r==="HUGGINGFACE"?!!o&&!!o.cookie:!!o.key&&o.key.length>0;case"review":const n=t.codeReview||o.codeReview;return r==="OLLAMA"?!!o&&!!o.model&&o.model.length>0&&n:r==="HUGGINGFACE"?!!o&&!!o.cookie&&n:!!o.key&&o.key.length>0&&n}return!1}).map(([r])=>r)}async function Ha(t,e){const r=new No(Ta),o=r.initPrompt({...ko,name:"codeReviewPrompt",message:"Please check code reviews: ",emptyMessage:`\u26A0 ${_a}`,isDescriptionDim:!1,stopMessage:"Code review completed",descPageSize:20});r.startLoader();const n=t.createCodeReviewRequests$(e).subscribe(a=>r.refreshChoices(a),()=>{},()=>r.checkErrorOnChoices());if(!(await o).codeReviewPrompt?.value)throw new y("An error occurred! No selected code review");n.unsubscribe(),r.completeSubject(),q.moveCursorUp();const{continuePrompt:u}=await Fe.prompt([{type:"confirm",name:"continuePrompt",message:"Will you continue without changing the code?",default:!0}]);u||(q.printCancelledCommit(),process.exit())}async function Ua(t,e){const r=new No(La),o=r.initPrompt();r.startLoader();const n=t.createCommitMsgRequests$(e).subscribe(u=>r.refreshChoices(u),()=>{},()=>r.checkErrorOnChoices()),s=await o;n.unsubscribe(),r.completeSubject(),q.moveCursorUp();const i=s.aicommit2Prompt?.value;if(!i)throw new y("An error occurred! No selected message");return i}async function To(t,e){const r=Qt("Committing with the generated message").start();await me("git",["commit","-m",t,...e]),r.stop(),r.clear(),q.printCommitted()}var za=nt({name:"config",parameters:["<mode>","<key=value...>"]},t=>{(async()=>{const{mode:e,keyValue:r}=t._;if(e==="get"){const o=await Mt({},[]);for(const n of r)if(je(o,n)){if(xt.includes(n)){console.log(n,o[n]);return}console.log(`${n}=${o[n]}`)}return}if(e==="set"){await oa(r.map(o=>o.split("=")));return}if(e==="add"){await na(r.map(o=>o.split("=")));return}throw new y(`Invalid mode: ${e}`)})().catch(e=>{new Ee().printErrorMessage(e.message),de(e),process.exit(1)})});const _o="prepare-commit-msg",jo=`.git/hooks/${_o}`,ze=Cn(new URL("cli.mjs",import.meta.url)),qa=process.argv[1].replace(/\\/g,"/").endsWith(`/${jo}`),Go=process.platform==="win32",Ho=`
|
|
122
122
|
#!/usr/bin/env node
|
|
123
123
|
import(${JSON.stringify(En(ze))})
|
|
124
|
-
`.trim();var Wa=nt({name:"hook",parameters:["<install/uninstall>"]},t=>{(async()=>{const e=await Oo(),{installUninstall:r}=t._,o=N.join(e,jo),n=await ho(o);if(r==="install"){if(n){if(await I.realpath(o).catch(()=>{})===ze){console.warn("The hook is already installed");return}throw new
|
|
124
|
+
`.trim();var Wa=nt({name:"hook",parameters:["<install/uninstall>"]},t=>{(async()=>{const e=await Oo(),{installUninstall:r}=t._,o=N.join(e,jo),n=await ho(o);if(r==="install"){if(n){if(await I.realpath(o).catch(()=>{})===ze){console.warn("The hook is already installed");return}throw new y(`A different ${_o} hook seems to be installed. Please remove it before installing aicommit2.`)}await I.mkdir(N.dirname(o),{recursive:!0}),Go?await I.writeFile(o,Ho):(await I.symlink(ze,o,"file"),await I.chmod(o,493)),console.log(`${C.green("\u2714")} Hook installed`);return}if(r==="uninstall"){if(!n){console.warn("Hook is not installed");return}if(Go){if(await I.readFile(o,"utf8")!==Ho){console.warn("Hook is not installed");return}}else if(await I.realpath(o)!==ze){console.warn("Hook is not installed");return}await I.rm(o),console.log(`${C.green("\u2714")} Hook uninstalled`);return}throw new y(`Invalid mode: ${r}`)})().catch(e=>{console.error(`${C.red("\u2716")} ${e.message}`),de(e),process.exit(1)})}),Ka=nt({name:"log",parameters:["<removeAll>"]},t=>{(async()=>{const{removeAll:e}=t._;if(e==="removeAll"){await wn(eo,{recursive:!0,force:!0}),console.log(`${C.green("\u2714")} All Log files are removed!`);return}throw new y(`Invalid mode: ${e}`)})().catch(e=>{new Ee().printErrorMessage(e.message),de(e),process.exit(1)})});const[qe,Va]=process.argv.slice(2);var Ja=()=>(async()=>{if(!qe)throw new y('Commit message file path is missing. This file should be called from the "prepare-commit-msg" git hook');if(Va)return;const t=await Io();if(!t)return;const e=new Ee;e.printTitle();const r=await Mt({});if(r.systemPromptPath)try{await I.readFile(N.resolve(r.systemPromptPath),"utf-8")}catch{throw new y(`Error reading system prompt file: ${r.systemPromptPath}`)}const o=Object.entries(r).filter(([f])=>xt.includes(f)).map(([f,h])=>[f,h]).filter(([f,h])=>f==="OLLAMA"?!!h&&!!h.model&&h.model.length>0:f==="HUGGINGFACE"?!!h&&!!h.cookie:!!h.key&&h.key.length>0).map(([f])=>f);if(o.length===0)throw new y("Please set at least one API key via the `aicommit2 config set` command");const s=new Mo(r,t),i=e.displaySpinner("The AI is analyzing your changes");let u;try{u=await rn(s.createCommitMsgRequests$(o).pipe(on(f=>!f.isError),A(f=>f.value),nn()))}finally{i.stop(),i.clear(),e.printAnalyzed()}const l=await I.readFile(qe,"utf8")!=="",m=u.length>1;let c="";l&&(c=`# \u{1F916} AI generated commit${m?"s":""}
|
|
125
125
|
`),m?(l&&(c+=`# Select one of the following messages by uncommenting:
|
|
126
126
|
`),c+=`
|
|
127
127
|
${u.map(f=>`# ${f}`).join(`
|