aicommit2 2.4.14 → 2.4.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.mjs +15 -15
  2. package/package.json +2 -2
package/dist/cli.mjs CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import{command as oe,cli as Xo}from"cleye";import{createRequire as Qo}from"module";import U from"fs";import xe from"os";import S from"path";import{Buffer as Zo}from"node:buffer";import ce from"node:path";import dr,{ChildProcess as es,exec as ts}from"node:child_process";import se from"node:process";import rs,{execSync as _e,exec as os}from"child_process";import{fileURLToPath as mr}from"node:url";import ss,{constants as fr}from"node:os";import pr from"assert";import hr from"events";import{createWriteStream as ns,createReadStream as is}from"node:fs";import as from"buffer";import mt from"stream";import gr,{promisify as cs}from"util";import{debuglog as ls,promisify as us}from"node:util";import Be from"inquirer";import C from"chalk";import{of as ft,concatMap as D,from as M,map as I,catchError as R,mergeMap as yr,BehaviorSubject as wr,ReplaySubject as ds,Subscription as pt,lastValueFrom as vr,filter as br,toArray as Cr,Subject as ht}from"rxjs";import ms from"@anthropic-ai/sdk";import{fromPromise as F}from"rxjs/internal/observable/innerFrom";import{xxh64 as Pr}from"@pacote/xxhash";import B from"winston";import O from"fs/promises";import"winston-daily-rotate-file";import fs from"axios";import{CohereClient as ps}from"cohere-ai";import $r from"openai";import{GoogleGenerativeAI as hs,HarmCategory as He,HarmBlockThreshold as Ue}from"@google/generative-ai";import gs from"http";import ys from"https";import ws from"net";import vs from"tls";import bs,{fileURLToPath as Cs,pathToFileURL as Ps}from"url";import Er from"tty";import $s from"groq-sdk";import{Ollama as Es}from"ollama";import{fetch as xs,Agent as As}from"undici";import ze from"readline";import xr from"figlet";import ks from"gradient-string";import Ar from"ora";import Ss from"inquirer-reactive-list-prompt";import{readdir as kr,stat as Ms,rm as Is}from"node:fs/promises";import Rs from"chokidar";import{takeUntil as Sr,finalize as Mr}from"rxjs/operators";var Os="aicommit2",Ir="2.4.14",Ds="A Reactive CLI that generates commit messages for Git and Jujutsu with various AI",Fs=["cli","ai","git","jujutsu","jj","vcs","version-control","commit","git-commit","jujutsu-commit","command-line","commandline","aipick","aicommit","aicommits","aicommit2","openai","huggingface","anthropic","claude","claude3","gemini","gemini-pro","generative-ai","mistral","ollama","llama3","llama3.2","llama3.3","gemma","llm","chatgpt","cohere","groq","codestral","perplexity","deepseek","deepseek-r1","pre-commit"],Ls="MIT",Ts="tak-bro/aicommit2",js="Hyungtak Jin(@tak-bro)",Ns="module",Gs=["dist"],_s={aicommit2:"./dist/cli.mjs",aic2:"./dist/cli.mjs"},Bs={prepare:"simple-git-hooks",build:"pkgroll --minify",lint:"eslint --cache .","type-check":"tsc",test:"tsx tests",prepack:"pnpm build && clean-pkg-json",prettier:"prettier"},Hs={"@anthropic-ai/sdk":"^0.39.0","@dqbd/tiktoken":"^1.0.21","@google/generative-ai":"^0.24.1","@inquirer/prompts":"^3.3.2","@pacote/xxhash":"^0.3.2","@types/winston":"^2.4.4",axios:"^1.9.0",chalk:"^5.4.1",chokidar:"^4.0.3",cleye:"^1.3.4","cohere-ai":"^7.17.1","copy-paste":"^1.5.3",figlet:"^1.8.1","formdata-node":"^6.0.3","gradient-string":"^3.0.0","groq-sdk":"^0.7.0",inquirer:"9.2.8","inquirer-reactive-list-prompt":"^1.0.16",ollama:"^0.5.15",openai:"^6.3.0",ora:"^8.2.0",readline:"^1.3.0",rxjs:"^7.8.2",undici:"^7.10.0",uuid:"^9.0.1",winston:"^3.17.0","winston-daily-rotate-file":"^5.0.0"},Us={"@pvtnbr/eslint-config":"^0.33.0","@semantic-release/changelog":"^6.0.3","@semantic-release/commit-analyzer":"^12.0.0","@semantic-release/git":"^10.0.1","@semantic-release/github":"^10.3.5","@semantic-release/npm":"^12.0.1","@semantic-release/release-notes-generator":"^13.0.0","@types/figlet":"^1.7.0","@types/ini":"^1.3.34","@types/inquirer":"^9.0.8","@types/node":"^18.19.103","@types/uuid":"^9.0.8","@typescript-eslint/eslint-plugin":"^6.21.0","@typescript-eslint/parser":"^6.21.0","clean-pkg-json":"^1.3.0","conventional-changelog-conventionalcommits":"^7.0.2","conventional-commits-parser":"^5.0.0",eslint:"^8.57.1","eslint-config-prettier":"^8.10.0","eslint-plugin-eslint-comments":"^3.2.0","eslint-plugin-import":"^2.31.0","eslint-plugin-jsonc":"^2.20.1","eslint-plugin-no-use-extend-native":"^0.5.0","eslint-plugin-promise":"^6.6.0","eslint-plugin-unicorn":"^49.0.0","eslint-plugin-unused-imports":"^3.2.0",execa:"^7.2.0","fs-fixture":"^1.2.0","https-proxy-agent":"^5.0.1",ini:"^3.0.1","lint-staged":"^13.3.0",manten:"^0.7.0",pkgroll:"^1.11.1",prettier:"^3.5.3","semantic-release":"^23.1.1","simple-git-hooks":"^2.13.0",tsx:"^3.14.0",typescript:"^4.9.5","undici-types":"^7.10.0"},zs={extends:["@pvtnbr","prettier"],rules:{"unicorn/no-process-exit":"off"},overrides:[{files:"./src/commands/prepare-commit-msg-hook.ts",rules:{"unicorn/prevent-abbreviations":"off"}}]},Ws={branches:["main"],plugins:[["@semantic-release/commit-analyzer",{preset:"conventionalcommits",releaseRules:[{type:"refactor",release:"patch"},{type:"chore",release:"patch"},{type:"feat",release:"patch"},{scope:"major",release:"major"},{scope:"minor",release:"minor"},{scope:"patch",release:"patch"}]}],"@semantic-release/release-notes-generator",["@semantic-release/changelog",{changelogFile:"CHANGELOG.md"}],"@semantic-release/github",["@semantic-release/git",{assets:["CHANGELOG.md"],message:"chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}],"@semantic-release/npm"]},Ks={name:Os,version:Ir,description:Ds,keywords:Fs,license:Ls,repository:Ts,author:js,type:Ns,files:Gs,bin:_s,scripts:Bs,"simple-git-hooks":{"pre-commit":"pnpm lint-staged"},"lint-staged":{"*.ts":["prettier --config ./.prettierrc --write","eslint --fix"]},dependencies:Hs,devDependencies:Us,eslintConfig:zs,release:Ws},Js=Qo(import.meta.url),_=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function me(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var fe={exports:{}},gt,Rr;function Ys(){if(Rr)return gt;Rr=1,gt=o,o.sync=s;var r=U;function e(n,i){var c=i.pathExt!==void 0?i.pathExt:process.env.PATHEXT;if(!c||(c=c.split(";"),c.indexOf("")!==-1))return!0;for(var a=0;a<c.length;a++){var m=c[a].toLowerCase();if(m&&n.substr(-m.length).toLowerCase()===m)return!0}return!1}function t(n,i,c){return!n.isSymbolicLink()&&!n.isFile()?!1:e(i,c)}function o(n,i,c){r.stat(n,function(a,m){c(a,a?!1:t(m,n,i))})}function s(n,i){return t(r.statSync(n),n,i)}return gt}var yt,Or;function Vs(){if(Or)return yt;Or=1,yt=e,e.sync=t;var r=U;function e(n,i,c){r.stat(n,function(a,m){c(a,a?!1:o(m,i))})}function t(n,i){return o(r.statSync(n),i)}function o(n,i){return n.isFile()&&s(n,i)}function s(n,i){var c=n.mode,a=n.uid,m=n.gid,u=i.uid!==void 0?i.uid:process.getuid&&process.getuid(),l=i.gid!==void 0?i.gid:process.getgid&&process.getgid(),d=parseInt("100",8),p=parseInt("010",8),g=parseInt("001",8),h=d|p,y=c&g||c&p&&m===l||c&d&&a===u||c&h&&u===0;return y}return yt}var We;process.platform==="win32"||_.TESTING_WINDOWS?We=Ys():We=Vs();var qs=wt;wt.sync=Xs;function wt(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(o,s){wt(r,e||{},function(n,i){n?s(n):o(i)})})}We(r,e||{},function(o,s){o&&(o.code==="EACCES"||e&&e.ignoreErrors)&&(o=null,s=!1),t(o,s)})}function Xs(r,e){try{return We.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}const pe=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",Dr=S,Qs=pe?";":":",Fr=qs,Lr=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),Tr=(r,e)=>{const t=e.colon||Qs,o=r.match(/\//)||pe&&r.match(/\\/)?[""]:[...pe?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],s=pe?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",n=pe?s.split(t):[""];return pe&&r.indexOf(".")!==-1&&n[0]!==""&&n.unshift(""),{pathEnv:o,pathExt:n,pathExtExe:s}},jr=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});const{pathEnv:o,pathExt:s,pathExtExe:n}=Tr(r,e),i=[],c=m=>new Promise((u,l)=>{if(m===o.length)return e.all&&i.length?u(i):l(Lr(r));const d=o[m],p=/^".*"$/.test(d)?d.slice(1,-1):d,g=Dr.join(p,r),h=!p&&/^\.[\\\/]/.test(r)?r.slice(0,2)+g:g;u(a(h,m,0))}),a=(m,u,l)=>new Promise((d,p)=>{if(l===s.length)return d(c(u+1));const g=s[l];Fr(m+g,{pathExt:n},(h,y)=>{if(!h&&y)if(e.all)i.push(m+g);else return d(m+g);return d(a(m,u,l+1))})});return t?c(0).then(m=>t(null,m),t):c(0)},Zs=(r,e)=>{e=e||{};const{pathEnv:t,pathExt:o,pathExtExe:s}=Tr(r,e),n=[];for(let i=0;i<t.length;i++){const c=t[i],a=/^".*"$/.test(c)?c.slice(1,-1):c,m=Dr.join(a,r),u=!a&&/^\.[\\\/]/.test(r)?r.slice(0,2)+m:m;for(let l=0;l<o.length;l++){const d=u+o[l];try{if(Fr.sync(d,{pathExt:s}))if(e.all)n.push(d);else return d}catch{}}}if(e.all&&n.length)return n;if(e.nothrow)return null;throw Lr(r)};var en=jr;jr.sync=Zs;var vt={exports:{}};const Nr=(r={})=>{const e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(o=>o.toUpperCase()==="PATH")||"Path"};vt.exports=Nr,vt.exports.default=Nr;var tn=vt.exports;const Gr=S,rn=en,on=tn;function _r(r,e){const t=r.options.env||process.env,o=process.cwd(),s=r.options.cwd!=null,n=s&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(r.options.cwd)}catch{}let i;try{i=rn.sync(r.command,{path:t[on({env:t})],pathExt:e?Gr.delimiter:void 0})}catch{}finally{n&&process.chdir(o)}return i&&(i=Gr.resolve(s?r.options.cwd:"",i)),i}function sn(r){return _r(r)||_r(r,!0)}var nn=sn,bt={};const Ct=/([()\][%!^"`<>&|;, *?])/g;function an(r){return r=r.replace(Ct,"^$1"),r}function cn(r,e){return r=`${r}`,r=r.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),r=r.replace(/(?=(\\+?)?)\1$/,"$1$1"),r=`"${r}"`,r=r.replace(Ct,"^$1"),e&&(r=r.replace(Ct,"^$1")),r}bt.command=an,bt.argument=cn;var ln=/^#!(.*)/;const un=ln;var dn=(r="")=>{const e=r.match(un);if(!e)return null;const[t,o]=e[0].replace(/#! ?/,"").split(" "),s=t.split("/").pop();return s==="env"?o:o?`${s} ${o}`:s};const Pt=U,mn=dn;function fn(r){const t=Buffer.alloc(150);let o;try{o=Pt.openSync(r,"r"),Pt.readSync(o,t,0,150,0),Pt.closeSync(o)}catch{}return mn(t.toString())}var pn=fn;const hn=S,Br=nn,Hr=bt,gn=pn,yn=process.platform==="win32",wn=/\.(?:com|exe)$/i,vn=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function bn(r){r.file=Br(r);const e=r.file&&gn(r.file);return e?(r.args.unshift(r.file),r.command=e,Br(r)):r.file}function Cn(r){if(!yn)return r;const e=bn(r),t=!wn.test(e);if(r.options.forceShell||t){const o=vn.test(e);r.command=hn.normalize(r.command),r.command=Hr.command(r.command),r.args=r.args.map(n=>Hr.argument(n,o));const s=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${s}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function Pn(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);const o={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?o:Cn(o)}var $n=Pn;const $t=process.platform==="win32";function Et(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function En(r,e){if(!$t)return;const t=r.emit;r.emit=function(o,s){if(o==="exit"){const n=Ur(s,e);if(n)return t.call(r,"error",n)}return t.apply(r,arguments)}}function Ur(r,e){return $t&&r===1&&!e.file?Et(e.original,"spawn"):null}function xn(r,e){return $t&&r===1&&!e.file?Et(e.original,"spawnSync"):null}var An={hookChildProcess:En,verifyENOENT:Ur,verifyENOENTSync:xn,notFoundError:Et};const zr=rs,xt=$n,At=An;function Wr(r,e,t){const o=xt(r,e,t),s=zr.spawn(o.command,o.args,o.options);return At.hookChildProcess(s,o),s}function kn(r,e,t){const o=xt(r,e,t),s=zr.spawnSync(o.command,o.args,o.options);return s.error=s.error||At.verifyENOENTSync(s.status,o),s}fe.exports=Wr,fe.exports.spawn=Wr,fe.exports.sync=kn,fe.exports._parse=xt,fe.exports._enoent=At;var Sn=fe.exports,Mn=me(Sn);function In(r){const e=typeof r=="string"?`
2
+ import{command as oe,cli as Xo}from"cleye";import{createRequire as Qo}from"module";import U from"fs";import xe from"os";import S from"path";import{Buffer as Zo}from"node:buffer";import ce from"node:path";import dr,{ChildProcess as es,exec as ts}from"node:child_process";import se from"node:process";import rs,{execSync as _e,exec as os}from"child_process";import{fileURLToPath as mr}from"node:url";import ss,{constants as fr}from"node:os";import pr from"assert";import hr from"events";import{createWriteStream as ns,createReadStream as is}from"node:fs";import as from"buffer";import mt from"stream";import gr,{promisify as cs}from"util";import{debuglog as ls,promisify as us}from"node:util";import Be from"inquirer";import C from"chalk";import{of as ft,concatMap as F,from as M,map as I,catchError as R,mergeMap as yr,BehaviorSubject as wr,ReplaySubject as ds,Subscription as pt,lastValueFrom as vr,filter as br,toArray as Cr,Subject as ht}from"rxjs";import ms from"@anthropic-ai/sdk";import{fromPromise as L}from"rxjs/internal/observable/innerFrom";import{xxh64 as Pr}from"@pacote/xxhash";import B from"winston";import O from"fs/promises";import"winston-daily-rotate-file";import fs from"axios";import{CohereClientV2 as ps}from"cohere-ai";import $r from"openai";import{GoogleGenerativeAI as hs,HarmCategory as He,HarmBlockThreshold as Ue}from"@google/generative-ai";import gs from"http";import ys from"https";import ws from"net";import vs from"tls";import bs,{fileURLToPath as Cs,pathToFileURL as Ps}from"url";import Er from"tty";import $s from"groq-sdk";import{Ollama as Es}from"ollama";import{fetch as xs,Agent as As}from"undici";import ze from"readline";import xr from"figlet";import ks from"gradient-string";import Ar from"ora";import Ss from"inquirer-reactive-list-prompt";import{readdir as kr,stat as Ms,rm as Is}from"node:fs/promises";import Rs from"chokidar";import{takeUntil as Sr,finalize as Mr}from"rxjs/operators";var Os="aicommit2",Ir="2.4.16",Ds="A Reactive CLI that generates commit messages for Git and Jujutsu with various AI",Fs=["cli","ai","git","jujutsu","jj","vcs","version-control","commit","git-commit","jujutsu-commit","command-line","commandline","aipick","aicommit","aicommits","aicommit2","openai","huggingface","anthropic","claude","claude3","gemini","gemini-pro","generative-ai","mistral","ollama","llama3","llama3.2","llama3.3","gemma","llm","chatgpt","cohere","groq","codestral","perplexity","deepseek","deepseek-r1","pre-commit"],Ls="MIT",Ts="tak-bro/aicommit2",js="Hyungtak Jin(@tak-bro)",Ns="module",Gs=["dist"],_s={aicommit2:"./dist/cli.mjs",aic2:"./dist/cli.mjs"},Bs={prepare:"simple-git-hooks",build:"pkgroll --minify",lint:"eslint --cache .","type-check":"tsc",test:"tsx tests",prepack:"pnpm build && clean-pkg-json",prettier:"prettier"},Hs={"@anthropic-ai/sdk":"^0.39.0","@dqbd/tiktoken":"^1.0.21","@google/generative-ai":"^0.24.1","@inquirer/prompts":"^3.3.2","@pacote/xxhash":"^0.3.2","@types/winston":"^2.4.4",axios:"^1.9.0",chalk:"^5.4.1",chokidar:"^4.0.3",cleye:"^1.3.4","cohere-ai":"^7.19.0","copy-paste":"^1.5.3",figlet:"^1.8.1","formdata-node":"^6.0.3","gradient-string":"^3.0.0","groq-sdk":"^0.7.0",inquirer:"9.2.8","inquirer-reactive-list-prompt":"^1.0.16",ollama:"^0.5.15",openai:"^6.3.0",ora:"^8.2.0",readline:"^1.3.0",rxjs:"^7.8.2",undici:"^7.10.0",uuid:"^9.0.1",winston:"^3.17.0","winston-daily-rotate-file":"^5.0.0"},Us={"@pvtnbr/eslint-config":"^0.33.0","@semantic-release/changelog":"^6.0.3","@semantic-release/commit-analyzer":"^12.0.0","@semantic-release/git":"^10.0.1","@semantic-release/github":"^10.3.5","@semantic-release/npm":"^12.0.1","@semantic-release/release-notes-generator":"^13.0.0","@types/figlet":"^1.7.0","@types/ini":"^1.3.34","@types/inquirer":"^9.0.8","@types/node":"^18.19.103","@types/uuid":"^9.0.8","@typescript-eslint/eslint-plugin":"^6.21.0","@typescript-eslint/parser":"^6.21.0","clean-pkg-json":"^1.3.0","conventional-changelog-conventionalcommits":"^7.0.2","conventional-commits-parser":"^5.0.0",eslint:"^8.57.1","eslint-config-prettier":"^8.10.0","eslint-plugin-eslint-comments":"^3.2.0","eslint-plugin-import":"^2.31.0","eslint-plugin-jsonc":"^2.20.1","eslint-plugin-no-use-extend-native":"^0.5.0","eslint-plugin-promise":"^6.6.0","eslint-plugin-unicorn":"^49.0.0","eslint-plugin-unused-imports":"^3.2.0",execa:"^7.2.0","fs-fixture":"^1.2.0","https-proxy-agent":"^5.0.1",ini:"^3.0.1","lint-staged":"^13.3.0",manten:"^0.7.0",pkgroll:"^1.11.1",prettier:"^3.5.3","semantic-release":"^23.1.1","simple-git-hooks":"^2.13.0",tsx:"^3.14.0",typescript:"^4.9.5","undici-types":"^7.10.0"},zs={extends:["@pvtnbr","prettier"],rules:{"unicorn/no-process-exit":"off"},overrides:[{files:"./src/commands/prepare-commit-msg-hook.ts",rules:{"unicorn/prevent-abbreviations":"off"}}]},Ws={branches:["main"],plugins:[["@semantic-release/commit-analyzer",{preset:"conventionalcommits",releaseRules:[{type:"refactor",release:"patch"},{type:"chore",release:"patch"},{type:"feat",release:"patch"},{scope:"major",release:"major"},{scope:"minor",release:"minor"},{scope:"patch",release:"patch"}]}],"@semantic-release/release-notes-generator",["@semantic-release/changelog",{changelogFile:"CHANGELOG.md"}],"@semantic-release/github",["@semantic-release/git",{assets:["CHANGELOG.md"],message:"chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}],"@semantic-release/npm"]},Ks={name:Os,version:Ir,description:Ds,keywords:Fs,license:Ls,repository:Ts,author:js,type:Ns,files:Gs,bin:_s,scripts:Bs,"simple-git-hooks":{"pre-commit":"pnpm lint-staged"},"lint-staged":{"*.ts":["prettier --config ./.prettierrc --write","eslint --fix"]},dependencies:Hs,devDependencies:Us,eslintConfig:zs,release:Ws},Js=Qo(import.meta.url),_=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function me(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var fe={exports:{}},gt,Rr;function Vs(){if(Rr)return gt;Rr=1,gt=o,o.sync=s;var r=U;function e(n,i){var c=i.pathExt!==void 0?i.pathExt:process.env.PATHEXT;if(!c||(c=c.split(";"),c.indexOf("")!==-1))return!0;for(var a=0;a<c.length;a++){var m=c[a].toLowerCase();if(m&&n.substr(-m.length).toLowerCase()===m)return!0}return!1}function t(n,i,c){return!n.isSymbolicLink()&&!n.isFile()?!1:e(i,c)}function o(n,i,c){r.stat(n,function(a,m){c(a,a?!1:t(m,n,i))})}function s(n,i){return t(r.statSync(n),n,i)}return gt}var yt,Or;function Ys(){if(Or)return yt;Or=1,yt=e,e.sync=t;var r=U;function e(n,i,c){r.stat(n,function(a,m){c(a,a?!1:o(m,i))})}function t(n,i){return o(r.statSync(n),i)}function o(n,i){return n.isFile()&&s(n,i)}function s(n,i){var c=n.mode,a=n.uid,m=n.gid,u=i.uid!==void 0?i.uid:process.getuid&&process.getuid(),l=i.gid!==void 0?i.gid:process.getgid&&process.getgid(),d=parseInt("100",8),p=parseInt("010",8),g=parseInt("001",8),h=d|p,y=c&g||c&p&&m===l||c&d&&a===u||c&h&&u===0;return y}return yt}var We;process.platform==="win32"||_.TESTING_WINDOWS?We=Vs():We=Ys();var qs=wt;wt.sync=Xs;function wt(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(o,s){wt(r,e||{},function(n,i){n?s(n):o(i)})})}We(r,e||{},function(o,s){o&&(o.code==="EACCES"||e&&e.ignoreErrors)&&(o=null,s=!1),t(o,s)})}function Xs(r,e){try{return We.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}const pe=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",Dr=S,Qs=pe?";":":",Fr=qs,Lr=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),Tr=(r,e)=>{const t=e.colon||Qs,o=r.match(/\//)||pe&&r.match(/\\/)?[""]:[...pe?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],s=pe?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",n=pe?s.split(t):[""];return pe&&r.indexOf(".")!==-1&&n[0]!==""&&n.unshift(""),{pathEnv:o,pathExt:n,pathExtExe:s}},jr=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});const{pathEnv:o,pathExt:s,pathExtExe:n}=Tr(r,e),i=[],c=m=>new Promise((u,l)=>{if(m===o.length)return e.all&&i.length?u(i):l(Lr(r));const d=o[m],p=/^".*"$/.test(d)?d.slice(1,-1):d,g=Dr.join(p,r),h=!p&&/^\.[\\\/]/.test(r)?r.slice(0,2)+g:g;u(a(h,m,0))}),a=(m,u,l)=>new Promise((d,p)=>{if(l===s.length)return d(c(u+1));const g=s[l];Fr(m+g,{pathExt:n},(h,y)=>{if(!h&&y)if(e.all)i.push(m+g);else return d(m+g);return d(a(m,u,l+1))})});return t?c(0).then(m=>t(null,m),t):c(0)},Zs=(r,e)=>{e=e||{};const{pathEnv:t,pathExt:o,pathExtExe:s}=Tr(r,e),n=[];for(let i=0;i<t.length;i++){const c=t[i],a=/^".*"$/.test(c)?c.slice(1,-1):c,m=Dr.join(a,r),u=!a&&/^\.[\\\/]/.test(r)?r.slice(0,2)+m:m;for(let l=0;l<o.length;l++){const d=u+o[l];try{if(Fr.sync(d,{pathExt:s}))if(e.all)n.push(d);else return d}catch{}}}if(e.all&&n.length)return n;if(e.nothrow)return null;throw Lr(r)};var en=jr;jr.sync=Zs;var vt={exports:{}};const Nr=(r={})=>{const e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(o=>o.toUpperCase()==="PATH")||"Path"};vt.exports=Nr,vt.exports.default=Nr;var tn=vt.exports;const Gr=S,rn=en,on=tn;function _r(r,e){const t=r.options.env||process.env,o=process.cwd(),s=r.options.cwd!=null,n=s&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(r.options.cwd)}catch{}let i;try{i=rn.sync(r.command,{path:t[on({env:t})],pathExt:e?Gr.delimiter:void 0})}catch{}finally{n&&process.chdir(o)}return i&&(i=Gr.resolve(s?r.options.cwd:"",i)),i}function sn(r){return _r(r)||_r(r,!0)}var nn=sn,bt={};const Ct=/([()\][%!^"`<>&|;, *?])/g;function an(r){return r=r.replace(Ct,"^$1"),r}function cn(r,e){return r=`${r}`,r=r.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),r=r.replace(/(?=(\\+?)?)\1$/,"$1$1"),r=`"${r}"`,r=r.replace(Ct,"^$1"),e&&(r=r.replace(Ct,"^$1")),r}bt.command=an,bt.argument=cn;var ln=/^#!(.*)/;const un=ln;var dn=(r="")=>{const e=r.match(un);if(!e)return null;const[t,o]=e[0].replace(/#! ?/,"").split(" "),s=t.split("/").pop();return s==="env"?o:o?`${s} ${o}`:s};const Pt=U,mn=dn;function fn(r){const t=Buffer.alloc(150);let o;try{o=Pt.openSync(r,"r"),Pt.readSync(o,t,0,150,0),Pt.closeSync(o)}catch{}return mn(t.toString())}var pn=fn;const hn=S,Br=nn,Hr=bt,gn=pn,yn=process.platform==="win32",wn=/\.(?:com|exe)$/i,vn=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function bn(r){r.file=Br(r);const e=r.file&&gn(r.file);return e?(r.args.unshift(r.file),r.command=e,Br(r)):r.file}function Cn(r){if(!yn)return r;const e=bn(r),t=!wn.test(e);if(r.options.forceShell||t){const o=vn.test(e);r.command=hn.normalize(r.command),r.command=Hr.command(r.command),r.args=r.args.map(n=>Hr.argument(n,o));const s=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${s}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function Pn(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);const o={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?o:Cn(o)}var $n=Pn;const $t=process.platform==="win32";function Et(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function En(r,e){if(!$t)return;const t=r.emit;r.emit=function(o,s){if(o==="exit"){const n=Ur(s,e);if(n)return t.call(r,"error",n)}return t.apply(r,arguments)}}function Ur(r,e){return $t&&r===1&&!e.file?Et(e.original,"spawn"):null}function xn(r,e){return $t&&r===1&&!e.file?Et(e.original,"spawnSync"):null}var An={hookChildProcess:En,verifyENOENT:Ur,verifyENOENTSync:xn,notFoundError:Et};const zr=rs,xt=$n,At=An;function Wr(r,e,t){const o=xt(r,e,t),s=zr.spawn(o.command,o.args,o.options);return At.hookChildProcess(s,o),s}function kn(r,e,t){const o=xt(r,e,t),s=zr.spawnSync(o.command,o.args,o.options);return s.error=s.error||At.verifyENOENTSync(s.status,o),s}fe.exports=Wr,fe.exports.spawn=Wr,fe.exports.sync=kn,fe.exports._parse=xt,fe.exports._enoent=At;var Sn=fe.exports,Mn=me(Sn);function In(r){const e=typeof r=="string"?`
3
3
  `:`
4
4
  `.charCodeAt(),t=typeof r=="string"?"\r":"\r".charCodeAt();return r[r.length-1]===e&&(r=r.slice(0,-1)),r[r.length-1]===t&&(r=r.slice(0,-1)),r}function Kr(r={}){const{env:e=process.env,platform:t=process.platform}=r;return t!=="win32"?"PATH":Object.keys(e).reverse().find(o=>o.toUpperCase()==="PATH")||"Path"}const Rn=({cwd:r=se.cwd(),path:e=se.env[Kr()],preferLocal:t=!0,execPath:o=se.execPath,addExecPath:s=!0}={})=>{const n=r instanceof URL?mr(r):r,i=ce.resolve(n),c=[];return t&&On(c,i),s&&Dn(c,o,i),[...c,e].join(ce.delimiter)},On=(r,e)=>{let t;for(;t!==e;)r.push(ce.join(e,"node_modules/.bin")),t=e,e=ce.resolve(e,"..")},Dn=(r,e,t)=>{const o=e instanceof URL?mr(e):e;r.push(ce.resolve(t,o,".."))},Fn=({env:r=se.env,...e}={})=>{r={...r};const t=Kr({env:r});return e.path=r[t],r[t]=Rn(e),r},Ln=(r,e,t,o)=>{if(t==="length"||t==="prototype"||t==="arguments"||t==="caller")return;const s=Object.getOwnPropertyDescriptor(r,t),n=Object.getOwnPropertyDescriptor(e,t);!Tn(s,n)&&o||Object.defineProperty(r,t,n)},Tn=function(r,e){return r===void 0||r.configurable||r.writable===e.writable&&r.enumerable===e.enumerable&&r.configurable===e.configurable&&(r.writable||r.value===e.value)},jn=(r,e)=>{const t=Object.getPrototypeOf(e);t!==Object.getPrototypeOf(r)&&Object.setPrototypeOf(r,t)},Nn=(r,e)=>`/* Wrapped ${r}*/
5
- ${e}`,Gn=Object.getOwnPropertyDescriptor(Function.prototype,"toString"),_n=Object.getOwnPropertyDescriptor(Function.prototype.toString,"name"),Bn=(r,e,t)=>{const o=t===""?"":`with ${t.trim()}() `,s=Nn.bind(null,o,e.toString());Object.defineProperty(s,"name",_n),Object.defineProperty(r,"toString",{...Gn,value:s})};function Hn(r,e,{ignoreNonConfigurable:t=!1}={}){const{name:o}=r;for(const s of Reflect.ownKeys(e))Ln(r,e,s,t);return jn(r,e),Bn(r,e,o),r}const Ke=new WeakMap,Jr=(r,e={})=>{if(typeof r!="function")throw new TypeError("Expected a function");let t,o=0;const s=r.displayName||r.name||"<anonymous>",n=function(...i){if(Ke.set(n,++o),o===1)t=r.apply(this,i),r=null;else if(e.throw===!0)throw new Error(`Function \`${s}\` can only be called once`);return t};return Hn(n,r),Ke.set(n,o),n};Jr.callCount=r=>{if(!Ke.has(r))throw new Error(`The given function \`${r.name}\` is not wrapped by the \`onetime\` package`);return Ke.get(r)};const Un=()=>{const r=Vr-Yr+1;return Array.from({length:r},zn)},zn=(r,e)=>({name:`SIGRT${e+1}`,number:Yr+e,action:"terminate",description:"Application-specific signal (realtime)",standard:"posix"}),Yr=34,Vr=64,Wn=[{name:"SIGHUP",number:1,action:"terminate",description:"Terminal closed",standard:"posix"},{name:"SIGINT",number:2,action:"terminate",description:"User interruption with CTRL-C",standard:"ansi"},{name:"SIGQUIT",number:3,action:"core",description:"User interruption with CTRL-\\",standard:"posix"},{name:"SIGILL",number:4,action:"core",description:"Invalid machine instruction",standard:"ansi"},{name:"SIGTRAP",number:5,action:"core",description:"Debugger breakpoint",standard:"posix"},{name:"SIGABRT",number:6,action:"core",description:"Aborted",standard:"ansi"},{name:"SIGIOT",number:6,action:"core",description:"Aborted",standard:"bsd"},{name:"SIGBUS",number:7,action:"core",description:"Bus error due to misaligned, non-existing address or paging error",standard:"bsd"},{name:"SIGEMT",number:7,action:"terminate",description:"Command should be emulated but is not implemented",standard:"other"},{name:"SIGFPE",number:8,action:"core",description:"Floating point arithmetic error",standard:"ansi"},{name:"SIGKILL",number:9,action:"terminate",description:"Forced termination",standard:"posix",forced:!0},{name:"SIGUSR1",number:10,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGSEGV",number:11,action:"core",description:"Segmentation fault",standard:"ansi"},{name:"SIGUSR2",number:12,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGPIPE",number:13,action:"terminate",description:"Broken pipe or socket",standard:"posix"},{name:"SIGALRM",number:14,action:"terminate",description:"Timeout or timer",standard:"posix"},{name:"SIGTERM",number:15,action:"terminate",description:"Termination",standard:"ansi"},{name:"SIGSTKFLT",number:16,action:"terminate",description:"Stack is empty or overflowed",standard:"other"},{name:"SIGCHLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"posix"},{name:"SIGCLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"other"},{name:"SIGCONT",number:18,action:"unpause",description:"Unpaused",standard:"posix",forced:!0},{name:"SIGSTOP",number:19,action:"pause",description:"Paused",standard:"posix",forced:!0},{name:"SIGTSTP",number:20,action:"pause",description:'Paused using CTRL-Z or "suspend"',standard:"posix"},{name:"SIGTTIN",number:21,action:"pause",description:"Background process cannot read terminal input",standard:"posix"},{name:"SIGBREAK",number:21,action:"terminate",description:"User interruption with CTRL-BREAK",standard:"other"},{name:"SIGTTOU",number:22,action:"pause",description:"Background process cannot write to terminal output",standard:"posix"},{name:"SIGURG",number:23,action:"ignore",description:"Socket received out-of-band data",standard:"bsd"},{name:"SIGXCPU",number:24,action:"core",description:"Process timed out",standard:"bsd"},{name:"SIGXFSZ",number:25,action:"core",description:"File too big",standard:"bsd"},{name:"SIGVTALRM",number:26,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGPROF",number:27,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGWINCH",number:28,action:"ignore",description:"Terminal window size changed",standard:"bsd"},{name:"SIGIO",number:29,action:"terminate",description:"I/O is available",standard:"other"},{name:"SIGPOLL",number:29,action:"terminate",description:"Watched event",standard:"other"},{name:"SIGINFO",number:29,action:"ignore",description:"Request for process information",standard:"other"},{name:"SIGPWR",number:30,action:"terminate",description:"Device running out of power",standard:"systemv"},{name:"SIGSYS",number:31,action:"core",description:"Invalid system call",standard:"other"},{name:"SIGUNUSED",number:31,action:"terminate",description:"Invalid system call",standard:"other"}],qr=()=>{const r=Un();return[...Wn,...r].map(Kn)},Kn=({name:r,number:e,description:t,action:o,forced:s=!1,standard:n})=>{const{signals:{[r]:i}}=fr,c=i!==void 0;return{name:r,number:c?i:e,description:t,supported:c,action:o,forced:s,standard:n}},Jn=()=>{const r=qr();return Object.fromEntries(r.map(Yn))},Yn=({name:r,number:e,description:t,supported:o,action:s,forced:n,standard:i})=>[r,{name:r,number:e,description:t,supported:o,action:s,forced:n,standard:i}],Vn=Jn(),qn=()=>{const r=qr(),e=Vr+1,t=Array.from({length:e},(o,s)=>Xn(s,r));return Object.assign({},...t)},Xn=(r,e)=>{const t=Qn(r,e);if(t===void 0)return{};const{name:o,description:s,supported:n,action:i,forced:c,standard:a}=t;return{[r]:{name:o,number:r,description:s,supported:n,action:i,forced:c,standard:a}}},Qn=(r,e)=>{const t=e.find(({name:o})=>fr.signals[o]===r);return t!==void 0?t:e.find(o=>o.number===r)};qn();const Zn=({timedOut:r,timeout:e,errorCode:t,signal:o,signalDescription:s,exitCode:n,isCanceled:i})=>r?`timed out after ${e} milliseconds`:i?"was canceled":t!==void 0?`failed with ${t}`:o!==void 0?`was killed with ${o} (${s})`:n!==void 0?`failed with exit code ${n}`:"failed",Xr=({stdout:r,stderr:e,all:t,error:o,signal:s,exitCode:n,command:i,escapedCommand:c,timedOut:a,isCanceled:m,killed:u,parsed:{options:{timeout:l,cwd:d=se.cwd()}}})=>{n=n===null?void 0:n,s=s===null?void 0:s;const p=s===void 0?void 0:Vn[s].description,g=o&&o.code,y=`Command ${Zn({timedOut:a,timeout:l,errorCode:g,signal:s,signalDescription:p,exitCode:n,isCanceled:m})}: ${i}`,w=Object.prototype.toString.call(o)==="[object Error]",b=w?`${y}
5
+ ${e}`,Gn=Object.getOwnPropertyDescriptor(Function.prototype,"toString"),_n=Object.getOwnPropertyDescriptor(Function.prototype.toString,"name"),Bn=(r,e,t)=>{const o=t===""?"":`with ${t.trim()}() `,s=Nn.bind(null,o,e.toString());Object.defineProperty(s,"name",_n),Object.defineProperty(r,"toString",{...Gn,value:s})};function Hn(r,e,{ignoreNonConfigurable:t=!1}={}){const{name:o}=r;for(const s of Reflect.ownKeys(e))Ln(r,e,s,t);return jn(r,e),Bn(r,e,o),r}const Ke=new WeakMap,Jr=(r,e={})=>{if(typeof r!="function")throw new TypeError("Expected a function");let t,o=0;const s=r.displayName||r.name||"<anonymous>",n=function(...i){if(Ke.set(n,++o),o===1)t=r.apply(this,i),r=null;else if(e.throw===!0)throw new Error(`Function \`${s}\` can only be called once`);return t};return Hn(n,r),Ke.set(n,o),n};Jr.callCount=r=>{if(!Ke.has(r))throw new Error(`The given function \`${r.name}\` is not wrapped by the \`onetime\` package`);return Ke.get(r)};const Un=()=>{const r=Yr-Vr+1;return Array.from({length:r},zn)},zn=(r,e)=>({name:`SIGRT${e+1}`,number:Vr+e,action:"terminate",description:"Application-specific signal (realtime)",standard:"posix"}),Vr=34,Yr=64,Wn=[{name:"SIGHUP",number:1,action:"terminate",description:"Terminal closed",standard:"posix"},{name:"SIGINT",number:2,action:"terminate",description:"User interruption with CTRL-C",standard:"ansi"},{name:"SIGQUIT",number:3,action:"core",description:"User interruption with CTRL-\\",standard:"posix"},{name:"SIGILL",number:4,action:"core",description:"Invalid machine instruction",standard:"ansi"},{name:"SIGTRAP",number:5,action:"core",description:"Debugger breakpoint",standard:"posix"},{name:"SIGABRT",number:6,action:"core",description:"Aborted",standard:"ansi"},{name:"SIGIOT",number:6,action:"core",description:"Aborted",standard:"bsd"},{name:"SIGBUS",number:7,action:"core",description:"Bus error due to misaligned, non-existing address or paging error",standard:"bsd"},{name:"SIGEMT",number:7,action:"terminate",description:"Command should be emulated but is not implemented",standard:"other"},{name:"SIGFPE",number:8,action:"core",description:"Floating point arithmetic error",standard:"ansi"},{name:"SIGKILL",number:9,action:"terminate",description:"Forced termination",standard:"posix",forced:!0},{name:"SIGUSR1",number:10,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGSEGV",number:11,action:"core",description:"Segmentation fault",standard:"ansi"},{name:"SIGUSR2",number:12,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGPIPE",number:13,action:"terminate",description:"Broken pipe or socket",standard:"posix"},{name:"SIGALRM",number:14,action:"terminate",description:"Timeout or timer",standard:"posix"},{name:"SIGTERM",number:15,action:"terminate",description:"Termination",standard:"ansi"},{name:"SIGSTKFLT",number:16,action:"terminate",description:"Stack is empty or overflowed",standard:"other"},{name:"SIGCHLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"posix"},{name:"SIGCLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"other"},{name:"SIGCONT",number:18,action:"unpause",description:"Unpaused",standard:"posix",forced:!0},{name:"SIGSTOP",number:19,action:"pause",description:"Paused",standard:"posix",forced:!0},{name:"SIGTSTP",number:20,action:"pause",description:'Paused using CTRL-Z or "suspend"',standard:"posix"},{name:"SIGTTIN",number:21,action:"pause",description:"Background process cannot read terminal input",standard:"posix"},{name:"SIGBREAK",number:21,action:"terminate",description:"User interruption with CTRL-BREAK",standard:"other"},{name:"SIGTTOU",number:22,action:"pause",description:"Background process cannot write to terminal output",standard:"posix"},{name:"SIGURG",number:23,action:"ignore",description:"Socket received out-of-band data",standard:"bsd"},{name:"SIGXCPU",number:24,action:"core",description:"Process timed out",standard:"bsd"},{name:"SIGXFSZ",number:25,action:"core",description:"File too big",standard:"bsd"},{name:"SIGVTALRM",number:26,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGPROF",number:27,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGWINCH",number:28,action:"ignore",description:"Terminal window size changed",standard:"bsd"},{name:"SIGIO",number:29,action:"terminate",description:"I/O is available",standard:"other"},{name:"SIGPOLL",number:29,action:"terminate",description:"Watched event",standard:"other"},{name:"SIGINFO",number:29,action:"ignore",description:"Request for process information",standard:"other"},{name:"SIGPWR",number:30,action:"terminate",description:"Device running out of power",standard:"systemv"},{name:"SIGSYS",number:31,action:"core",description:"Invalid system call",standard:"other"},{name:"SIGUNUSED",number:31,action:"terminate",description:"Invalid system call",standard:"other"}],qr=()=>{const r=Un();return[...Wn,...r].map(Kn)},Kn=({name:r,number:e,description:t,action:o,forced:s=!1,standard:n})=>{const{signals:{[r]:i}}=fr,c=i!==void 0;return{name:r,number:c?i:e,description:t,supported:c,action:o,forced:s,standard:n}},Jn=()=>{const r=qr();return Object.fromEntries(r.map(Vn))},Vn=({name:r,number:e,description:t,supported:o,action:s,forced:n,standard:i})=>[r,{name:r,number:e,description:t,supported:o,action:s,forced:n,standard:i}],Yn=Jn(),qn=()=>{const r=qr(),e=Yr+1,t=Array.from({length:e},(o,s)=>Xn(s,r));return Object.assign({},...t)},Xn=(r,e)=>{const t=Qn(r,e);if(t===void 0)return{};const{name:o,description:s,supported:n,action:i,forced:c,standard:a}=t;return{[r]:{name:o,number:r,description:s,supported:n,action:i,forced:c,standard:a}}},Qn=(r,e)=>{const t=e.find(({name:o})=>fr.signals[o]===r);return t!==void 0?t:e.find(o=>o.number===r)};qn();const Zn=({timedOut:r,timeout:e,errorCode:t,signal:o,signalDescription:s,exitCode:n,isCanceled:i})=>r?`timed out after ${e} milliseconds`:i?"was canceled":t!==void 0?`failed with ${t}`:o!==void 0?`was killed with ${o} (${s})`:n!==void 0?`failed with exit code ${n}`:"failed",Xr=({stdout:r,stderr:e,all:t,error:o,signal:s,exitCode:n,command:i,escapedCommand:c,timedOut:a,isCanceled:m,killed:u,parsed:{options:{timeout:l,cwd:d=se.cwd()}}})=>{n=n===null?void 0:n,s=s===null?void 0:s;const p=s===void 0?void 0:Yn[s].description,g=o&&o.code,y=`Command ${Zn({timedOut:a,timeout:l,errorCode:g,signal:s,signalDescription:p,exitCode:n,isCanceled:m})}: ${i}`,w=Object.prototype.toString.call(o)==="[object Error]",b=w?`${y}
6
6
  ${o.message}`:y,P=[b,e,r].filter(Boolean).join(`
7
- `);return w?(o.originalMessage=o.message,o.message=P):o=new Error(P),o.shortMessage=b,o.command=i,o.escapedCommand=c,o.exitCode=n,o.signal=s,o.signalDescription=p,o.stdout=r,o.stderr=e,o.cwd=d,t!==void 0&&(o.all=t),"bufferedData"in o&&delete o.bufferedData,o.failed=!0,o.timedOut=!!a,o.isCanceled=m,o.killed=u&&!a,o},Je=["stdin","stdout","stderr"],ei=r=>Je.some(e=>r[e]!==void 0),ti=r=>{if(!r)return;const{stdio:e}=r;if(e===void 0)return Je.map(o=>r[o]);if(ei(r))throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${Je.map(o=>`\`${o}\``).join(", ")}`);if(typeof e=="string")return e;if(!Array.isArray(e))throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof e}\``);const t=Math.max(e.length,Je.length);return Array.from({length:t},(o,s)=>e[s])};var he={exports:{}},Ye={exports:{}};Ye.exports;var Qr;function ri(){return Qr||(Qr=1,function(r){r.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"],process.platform!=="win32"&&r.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT"),process.platform==="linux"&&r.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")}(Ye)),Ye.exports}var T=_.process;const le=function(r){return r&&typeof r=="object"&&typeof r.removeListener=="function"&&typeof r.emit=="function"&&typeof r.reallyExit=="function"&&typeof r.listeners=="function"&&typeof r.kill=="function"&&typeof r.pid=="number"&&typeof r.on=="function"};if(!le(T))he.exports=function(){return function(){}};else{var oi=pr,Ae=ri(),si=/^win/i.test(T.platform),Ve=hr;typeof Ve!="function"&&(Ve=Ve.EventEmitter);var H;T.__signal_exit_emitter__?H=T.__signal_exit_emitter__:(H=T.__signal_exit_emitter__=new Ve,H.count=0,H.emitted={}),H.infinite||(H.setMaxListeners(1/0),H.infinite=!0),he.exports=function(r,e){if(!le(_.process))return function(){};oi.equal(typeof r,"function","a callback must be provided for exit handler"),ke===!1&&Zr();var t="exit";e&&e.alwaysLast&&(t="afterexit");var o=function(){H.removeListener(t,r),H.listeners("exit").length===0&&H.listeners("afterexit").length===0&&kt()};return H.on(t,r),o};var kt=function(){!ke||!le(_.process)||(ke=!1,Ae.forEach(function(e){try{T.removeListener(e,St[e])}catch{}}),T.emit=Mt,T.reallyExit=eo,H.count-=1)};he.exports.unload=kt;var ge=function(e,t,o){H.emitted[e]||(H.emitted[e]=!0,H.emit(e,t,o))},St={};Ae.forEach(function(r){St[r]=function(){if(le(_.process)){var t=T.listeners(r);t.length===H.count&&(kt(),ge("exit",null,r),ge("afterexit",null,r),si&&r==="SIGHUP"&&(r="SIGINT"),T.kill(T.pid,r))}}}),he.exports.signals=function(){return Ae};var ke=!1,Zr=function(){ke||!le(_.process)||(ke=!0,H.count+=1,Ae=Ae.filter(function(e){try{return T.on(e,St[e]),!0}catch{return!1}}),T.emit=ii,T.reallyExit=ni)};he.exports.load=Zr;var eo=T.reallyExit,ni=function(e){le(_.process)&&(T.exitCode=e||0,ge("exit",T.exitCode,null),ge("afterexit",T.exitCode,null),eo.call(T,T.exitCode))},Mt=T.emit,ii=function(e,t){if(e==="exit"&&le(_.process)){t!==void 0&&(T.exitCode=t);var o=Mt.apply(this,arguments);return ge("exit",T.exitCode,null),ge("afterexit",T.exitCode,null),o}else return Mt.apply(this,arguments)}}var ai=he.exports,ci=me(ai);const li=1e3*5,ui=(r,e="SIGTERM",t={})=>{const o=r(e);return di(r,e,t,o),o},di=(r,e,t,o)=>{if(!mi(e,t,o))return;const s=pi(t),n=setTimeout(()=>{r("SIGKILL")},s);n.unref&&n.unref()},mi=(r,{forceKillAfterTimeout:e},t)=>fi(r)&&e!==!1&&t,fi=r=>r===ss.constants.signals.SIGTERM||typeof r=="string"&&r.toUpperCase()==="SIGTERM",pi=({forceKillAfterTimeout:r=!0})=>{if(r===!0)return li;if(!Number.isFinite(r)||r<0)throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${r}\` (${typeof r})`);return r},hi=(r,e)=>{r.kill()&&(e.isCanceled=!0)},gi=(r,e,t)=>{r.kill(e),t(Object.assign(new Error("Timed out"),{timedOut:!0,signal:e}))},yi=(r,{timeout:e,killSignal:t="SIGTERM"},o)=>{if(e===0||e===void 0)return o;let s;const n=new Promise((c,a)=>{s=setTimeout(()=>{gi(r,t,a)},e)}),i=o.finally(()=>{clearTimeout(s)});return Promise.race([n,i])},wi=({timeout:r})=>{if(r!==void 0&&(!Number.isFinite(r)||r<0))throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${r}\` (${typeof r})`)},vi=async(r,{cleanup:e,detached:t},o)=>{if(!e||t)return o;const s=ci(()=>{r.kill()});return o.finally(()=>{s()})};function to(r){return r!==null&&typeof r=="object"&&typeof r.pipe=="function"}function ro(r){return to(r)&&r.writable!==!1&&typeof r._write=="function"&&typeof r._writableState=="object"}const bi=r=>r instanceof es&&typeof r.then=="function",It=(r,e,t)=>{if(typeof t=="string")return r[e].pipe(ns(t)),r;if(ro(t))return r[e].pipe(t),r;if(!bi(t))throw new TypeError("The second argument must be a string, a stream or an Execa child process.");if(!ro(t.stdin))throw new TypeError("The target child process's stdin must be available.");return r[e].pipe(t.stdin),t},Ci=r=>{r.stdout!==null&&(r.pipeStdout=It.bind(void 0,r,"stdout")),r.stderr!==null&&(r.pipeStderr=It.bind(void 0,r,"stderr")),r.all!==void 0&&(r.pipeAll=It.bind(void 0,r,"all"))};var Se={exports:{}};const{PassThrough:Pi}=mt;var $i=r=>{r={...r};const{array:e}=r;let{encoding:t}=r;const o=t==="buffer";let s=!1;e?s=!(t||o):t=t||"utf8",o&&(t=null);const n=new Pi({objectMode:s});t&&n.setEncoding(t);let i=0;const c=[];return n.on("data",a=>{c.push(a),s?i=c.length:i+=a.length}),n.getBufferedValue=()=>e?c:o?Buffer.concat(c,i):c.join(""),n.getBufferedLength=()=>i,n};const{constants:Ei}=as,xi=mt,{promisify:Ai}=gr,ki=$i,Si=Ai(xi.pipeline);class oo extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}}async function Rt(r,e){if(!r)throw new Error("Expected a stream");e={maxBuffer:1/0,...e};const{maxBuffer:t}=e,o=ki(e);return await new Promise((s,n)=>{const i=c=>{c&&o.getBufferedLength()<=Ei.MAX_LENGTH&&(c.bufferedData=o.getBufferedValue()),n(c)};(async()=>{try{await Si(r,o),s()}catch(c){i(c)}})(),o.on("data",()=>{o.getBufferedLength()>t&&i(new oo)})}),o.getBufferedValue()}Se.exports=Rt,Se.exports.buffer=(r,e)=>Rt(r,{...e,encoding:"buffer"}),Se.exports.array=(r,e)=>Rt(r,{...e,array:!0}),Se.exports.MaxBufferError=oo;var Mi=Se.exports,so=me(Mi);const{PassThrough:Ii}=mt;var Ri=function(){var r=[],e=new Ii({objectMode:!0});return e.setMaxListeners(0),e.add=t,e.isEmpty=o,e.on("unpipe",s),Array.prototype.slice.call(arguments).forEach(t),e;function t(n){return Array.isArray(n)?(n.forEach(t),this):(r.push(n),n.once("end",s.bind(null,n)),n.once("error",e.emit.bind(e,"error")),n.pipe(e,{end:!1}),this)}function o(){return r.length==0}function s(n){r=r.filter(function(i){return i!==n}),!r.length&&e.readable&&e.end()}},Oi=me(Ri);const Di=r=>{if(r!==void 0)throw new TypeError("The `input` and `inputFile` options cannot be both set.")},Fi=({input:r,inputFile:e})=>typeof e!="string"?r:(Di(r),is(e)),Li=(r,e)=>{const t=Fi(e);t!==void 0&&(to(t)?t.pipe(r.stdin):r.stdin.end(t))},Ti=(r,{all:e})=>{if(!e||!r.stdout&&!r.stderr)return;const t=Oi();return r.stdout&&t.add(r.stdout),r.stderr&&t.add(r.stderr),t},Ot=async(r,e)=>{if(!(!r||e===void 0)){r.destroy();try{return await e}catch(t){return t.bufferedData}}},Dt=(r,{encoding:e,buffer:t,maxBuffer:o})=>{if(!(!r||!t))return e?so(r,{encoding:e,maxBuffer:o}):so.buffer(r,{maxBuffer:o})},ji=async({stdout:r,stderr:e,all:t},{encoding:o,buffer:s,maxBuffer:n},i)=>{const c=Dt(r,{encoding:o,buffer:s,maxBuffer:n}),a=Dt(e,{encoding:o,buffer:s,maxBuffer:n}),m=Dt(t,{encoding:o,buffer:s,maxBuffer:n*2});try{return await Promise.all([i,c,a,m])}catch(u){return Promise.all([{error:u,signal:u.signal,timedOut:u.timedOut},Ot(r,c),Ot(e,a),Ot(t,m)])}},Ni=(async()=>{})().constructor.prototype,Gi=["then","catch","finally"].map(r=>[r,Reflect.getOwnPropertyDescriptor(Ni,r)]),no=(r,e)=>{for(const[t,o]of Gi){const s=typeof e=="function"?(...n)=>Reflect.apply(o.value,e(),n):o.value.bind(e);Reflect.defineProperty(r,t,{...o,value:s})}},_i=r=>new Promise((e,t)=>{r.on("exit",(o,s)=>{e({exitCode:o,signal:s})}),r.on("error",o=>{t(o)}),r.stdin&&r.stdin.on("error",o=>{t(o)})}),io=(r,e=[])=>Array.isArray(e)?[r,...e]:[r],Bi=/^[\w.-]+$/,Hi=/"/g,Ui=r=>typeof r!="string"||Bi.test(r)?r:`"${r.replace(Hi,'\\"')}"`,zi=(r,e)=>io(r,e).join(" "),Wi=(r,e)=>io(r,e).map(t=>Ui(t)).join(" "),Ki=ls("execa").enabled,qe=(r,e)=>String(r).padStart(e,"0"),Ji=()=>{const r=new Date;return`${qe(r.getHours(),2)}:${qe(r.getMinutes(),2)}:${qe(r.getSeconds(),2)}.${qe(r.getMilliseconds(),3)}`},Yi=(r,{verbose:e})=>{e&&se.stderr.write(`[${Ji()}] ${r}
8
- `)},Vi=1e3*1e3*100,qi=({env:r,extendEnv:e,preferLocal:t,localDir:o,execPath:s})=>{const n=e?{...se.env,...r}:r;return t?Fn({env:n,cwd:o,execPath:s}):n},Xi=(r,e,t={})=>{const o=Mn._parse(r,e,t);return r=o.command,e=o.args,t=o.options,t={maxBuffer:Vi,buffer:!0,stripFinalNewline:!0,extendEnv:!0,preferLocal:!1,localDir:t.cwd||se.cwd(),execPath:se.execPath,encoding:"utf8",reject:!0,cleanup:!0,all:!1,windowsHide:!0,verbose:Ki,...t},t.env=qi(t),t.stdio=ti(t),se.platform==="win32"&&ce.basename(r,".exe")==="cmd"&&e.unshift("/q"),{file:r,args:e,options:t,parsed:o}},Ft=(r,e,t)=>typeof e!="string"&&!Zo.isBuffer(e)?t===void 0?void 0:"":r.stripFinalNewline?In(e):e;function j(r,e,t){const o=Xi(r,e,t),s=zi(r,e),n=Wi(r,e);Yi(n,o.options),wi(o.options);let i;try{i=dr.spawn(o.file,o.args,o.options)}catch(p){const g=new dr.ChildProcess,h=Promise.reject(Xr({error:p,stdout:"",stderr:"",all:"",command:s,escapedCommand:n,parsed:o,timedOut:!1,isCanceled:!1,killed:!1}));return no(g,h),g}const c=_i(i),a=yi(i,o.options,c),m=vi(i,o.options,a),u={isCanceled:!1};i.kill=ui.bind(null,i.kill.bind(i)),i.cancel=hi.bind(null,i,u);const d=Jr(async()=>{const[{error:p,exitCode:g,signal:h,timedOut:y},w,b,P]=await ji(i,o.options,m),k=Ft(o.options,w),A=Ft(o.options,b),$=Ft(o.options,P);if(p||g!==0||h!==null){const x=Xr({error:p,exitCode:g,signal:h,stdout:k,stderr:A,all:$,command:s,escapedCommand:n,parsed:o,timedOut:y,isCanceled:u.isCanceled||(o.options.signal?o.options.signal.aborted:!1),killed:i.killed});if(!o.options.reject)return x;throw x}return{command:s,escapedCommand:n,exitCode:0,stdout:k,stderr:A,all:$,failed:!1,timedOut:!1,isCanceled:!1,killed:!1}});return Li(i,o.options),i.all=Ti(i,o.options),Ci(i),no(i,d),i}class J{static create(e,t){return new e(t)}}const{hasOwnProperty:Lt}=Object.prototype,Xe=typeof process<"u"&&process.platform==="win32"?`\r
7
+ `);return w?(o.originalMessage=o.message,o.message=P):o=new Error(P),o.shortMessage=b,o.command=i,o.escapedCommand=c,o.exitCode=n,o.signal=s,o.signalDescription=p,o.stdout=r,o.stderr=e,o.cwd=d,t!==void 0&&(o.all=t),"bufferedData"in o&&delete o.bufferedData,o.failed=!0,o.timedOut=!!a,o.isCanceled=m,o.killed=u&&!a,o},Je=["stdin","stdout","stderr"],ei=r=>Je.some(e=>r[e]!==void 0),ti=r=>{if(!r)return;const{stdio:e}=r;if(e===void 0)return Je.map(o=>r[o]);if(ei(r))throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${Je.map(o=>`\`${o}\``).join(", ")}`);if(typeof e=="string")return e;if(!Array.isArray(e))throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof e}\``);const t=Math.max(e.length,Je.length);return Array.from({length:t},(o,s)=>e[s])};var he={exports:{}},Ve={exports:{}};Ve.exports;var Qr;function ri(){return Qr||(Qr=1,function(r){r.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"],process.platform!=="win32"&&r.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT"),process.platform==="linux"&&r.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")}(Ve)),Ve.exports}var T=_.process;const le=function(r){return r&&typeof r=="object"&&typeof r.removeListener=="function"&&typeof r.emit=="function"&&typeof r.reallyExit=="function"&&typeof r.listeners=="function"&&typeof r.kill=="function"&&typeof r.pid=="number"&&typeof r.on=="function"};if(!le(T))he.exports=function(){return function(){}};else{var oi=pr,Ae=ri(),si=/^win/i.test(T.platform),Ye=hr;typeof Ye!="function"&&(Ye=Ye.EventEmitter);var H;T.__signal_exit_emitter__?H=T.__signal_exit_emitter__:(H=T.__signal_exit_emitter__=new Ye,H.count=0,H.emitted={}),H.infinite||(H.setMaxListeners(1/0),H.infinite=!0),he.exports=function(r,e){if(!le(_.process))return function(){};oi.equal(typeof r,"function","a callback must be provided for exit handler"),ke===!1&&Zr();var t="exit";e&&e.alwaysLast&&(t="afterexit");var o=function(){H.removeListener(t,r),H.listeners("exit").length===0&&H.listeners("afterexit").length===0&&kt()};return H.on(t,r),o};var kt=function(){!ke||!le(_.process)||(ke=!1,Ae.forEach(function(e){try{T.removeListener(e,St[e])}catch{}}),T.emit=Mt,T.reallyExit=eo,H.count-=1)};he.exports.unload=kt;var ge=function(e,t,o){H.emitted[e]||(H.emitted[e]=!0,H.emit(e,t,o))},St={};Ae.forEach(function(r){St[r]=function(){if(le(_.process)){var t=T.listeners(r);t.length===H.count&&(kt(),ge("exit",null,r),ge("afterexit",null,r),si&&r==="SIGHUP"&&(r="SIGINT"),T.kill(T.pid,r))}}}),he.exports.signals=function(){return Ae};var ke=!1,Zr=function(){ke||!le(_.process)||(ke=!0,H.count+=1,Ae=Ae.filter(function(e){try{return T.on(e,St[e]),!0}catch{return!1}}),T.emit=ii,T.reallyExit=ni)};he.exports.load=Zr;var eo=T.reallyExit,ni=function(e){le(_.process)&&(T.exitCode=e||0,ge("exit",T.exitCode,null),ge("afterexit",T.exitCode,null),eo.call(T,T.exitCode))},Mt=T.emit,ii=function(e,t){if(e==="exit"&&le(_.process)){t!==void 0&&(T.exitCode=t);var o=Mt.apply(this,arguments);return ge("exit",T.exitCode,null),ge("afterexit",T.exitCode,null),o}else return Mt.apply(this,arguments)}}var ai=he.exports,ci=me(ai);const li=1e3*5,ui=(r,e="SIGTERM",t={})=>{const o=r(e);return di(r,e,t,o),o},di=(r,e,t,o)=>{if(!mi(e,t,o))return;const s=pi(t),n=setTimeout(()=>{r("SIGKILL")},s);n.unref&&n.unref()},mi=(r,{forceKillAfterTimeout:e},t)=>fi(r)&&e!==!1&&t,fi=r=>r===ss.constants.signals.SIGTERM||typeof r=="string"&&r.toUpperCase()==="SIGTERM",pi=({forceKillAfterTimeout:r=!0})=>{if(r===!0)return li;if(!Number.isFinite(r)||r<0)throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${r}\` (${typeof r})`);return r},hi=(r,e)=>{r.kill()&&(e.isCanceled=!0)},gi=(r,e,t)=>{r.kill(e),t(Object.assign(new Error("Timed out"),{timedOut:!0,signal:e}))},yi=(r,{timeout:e,killSignal:t="SIGTERM"},o)=>{if(e===0||e===void 0)return o;let s;const n=new Promise((c,a)=>{s=setTimeout(()=>{gi(r,t,a)},e)}),i=o.finally(()=>{clearTimeout(s)});return Promise.race([n,i])},wi=({timeout:r})=>{if(r!==void 0&&(!Number.isFinite(r)||r<0))throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${r}\` (${typeof r})`)},vi=async(r,{cleanup:e,detached:t},o)=>{if(!e||t)return o;const s=ci(()=>{r.kill()});return o.finally(()=>{s()})};function to(r){return r!==null&&typeof r=="object"&&typeof r.pipe=="function"}function ro(r){return to(r)&&r.writable!==!1&&typeof r._write=="function"&&typeof r._writableState=="object"}const bi=r=>r instanceof es&&typeof r.then=="function",It=(r,e,t)=>{if(typeof t=="string")return r[e].pipe(ns(t)),r;if(ro(t))return r[e].pipe(t),r;if(!bi(t))throw new TypeError("The second argument must be a string, a stream or an Execa child process.");if(!ro(t.stdin))throw new TypeError("The target child process's stdin must be available.");return r[e].pipe(t.stdin),t},Ci=r=>{r.stdout!==null&&(r.pipeStdout=It.bind(void 0,r,"stdout")),r.stderr!==null&&(r.pipeStderr=It.bind(void 0,r,"stderr")),r.all!==void 0&&(r.pipeAll=It.bind(void 0,r,"all"))};var Se={exports:{}};const{PassThrough:Pi}=mt;var $i=r=>{r={...r};const{array:e}=r;let{encoding:t}=r;const o=t==="buffer";let s=!1;e?s=!(t||o):t=t||"utf8",o&&(t=null);const n=new Pi({objectMode:s});t&&n.setEncoding(t);let i=0;const c=[];return n.on("data",a=>{c.push(a),s?i=c.length:i+=a.length}),n.getBufferedValue=()=>e?c:o?Buffer.concat(c,i):c.join(""),n.getBufferedLength=()=>i,n};const{constants:Ei}=as,xi=mt,{promisify:Ai}=gr,ki=$i,Si=Ai(xi.pipeline);class oo extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}}async function Rt(r,e){if(!r)throw new Error("Expected a stream");e={maxBuffer:1/0,...e};const{maxBuffer:t}=e,o=ki(e);return await new Promise((s,n)=>{const i=c=>{c&&o.getBufferedLength()<=Ei.MAX_LENGTH&&(c.bufferedData=o.getBufferedValue()),n(c)};(async()=>{try{await Si(r,o),s()}catch(c){i(c)}})(),o.on("data",()=>{o.getBufferedLength()>t&&i(new oo)})}),o.getBufferedValue()}Se.exports=Rt,Se.exports.buffer=(r,e)=>Rt(r,{...e,encoding:"buffer"}),Se.exports.array=(r,e)=>Rt(r,{...e,array:!0}),Se.exports.MaxBufferError=oo;var Mi=Se.exports,so=me(Mi);const{PassThrough:Ii}=mt;var Ri=function(){var r=[],e=new Ii({objectMode:!0});return e.setMaxListeners(0),e.add=t,e.isEmpty=o,e.on("unpipe",s),Array.prototype.slice.call(arguments).forEach(t),e;function t(n){return Array.isArray(n)?(n.forEach(t),this):(r.push(n),n.once("end",s.bind(null,n)),n.once("error",e.emit.bind(e,"error")),n.pipe(e,{end:!1}),this)}function o(){return r.length==0}function s(n){r=r.filter(function(i){return i!==n}),!r.length&&e.readable&&e.end()}},Oi=me(Ri);const Di=r=>{if(r!==void 0)throw new TypeError("The `input` and `inputFile` options cannot be both set.")},Fi=({input:r,inputFile:e})=>typeof e!="string"?r:(Di(r),is(e)),Li=(r,e)=>{const t=Fi(e);t!==void 0&&(to(t)?t.pipe(r.stdin):r.stdin.end(t))},Ti=(r,{all:e})=>{if(!e||!r.stdout&&!r.stderr)return;const t=Oi();return r.stdout&&t.add(r.stdout),r.stderr&&t.add(r.stderr),t},Ot=async(r,e)=>{if(!(!r||e===void 0)){r.destroy();try{return await e}catch(t){return t.bufferedData}}},Dt=(r,{encoding:e,buffer:t,maxBuffer:o})=>{if(!(!r||!t))return e?so(r,{encoding:e,maxBuffer:o}):so.buffer(r,{maxBuffer:o})},ji=async({stdout:r,stderr:e,all:t},{encoding:o,buffer:s,maxBuffer:n},i)=>{const c=Dt(r,{encoding:o,buffer:s,maxBuffer:n}),a=Dt(e,{encoding:o,buffer:s,maxBuffer:n}),m=Dt(t,{encoding:o,buffer:s,maxBuffer:n*2});try{return await Promise.all([i,c,a,m])}catch(u){return Promise.all([{error:u,signal:u.signal,timedOut:u.timedOut},Ot(r,c),Ot(e,a),Ot(t,m)])}},Ni=(async()=>{})().constructor.prototype,Gi=["then","catch","finally"].map(r=>[r,Reflect.getOwnPropertyDescriptor(Ni,r)]),no=(r,e)=>{for(const[t,o]of Gi){const s=typeof e=="function"?(...n)=>Reflect.apply(o.value,e(),n):o.value.bind(e);Reflect.defineProperty(r,t,{...o,value:s})}},_i=r=>new Promise((e,t)=>{r.on("exit",(o,s)=>{e({exitCode:o,signal:s})}),r.on("error",o=>{t(o)}),r.stdin&&r.stdin.on("error",o=>{t(o)})}),io=(r,e=[])=>Array.isArray(e)?[r,...e]:[r],Bi=/^[\w.-]+$/,Hi=/"/g,Ui=r=>typeof r!="string"||Bi.test(r)?r:`"${r.replace(Hi,'\\"')}"`,zi=(r,e)=>io(r,e).join(" "),Wi=(r,e)=>io(r,e).map(t=>Ui(t)).join(" "),Ki=ls("execa").enabled,qe=(r,e)=>String(r).padStart(e,"0"),Ji=()=>{const r=new Date;return`${qe(r.getHours(),2)}:${qe(r.getMinutes(),2)}:${qe(r.getSeconds(),2)}.${qe(r.getMilliseconds(),3)}`},Vi=(r,{verbose:e})=>{e&&se.stderr.write(`[${Ji()}] ${r}
8
+ `)},Yi=1e3*1e3*100,qi=({env:r,extendEnv:e,preferLocal:t,localDir:o,execPath:s})=>{const n=e?{...se.env,...r}:r;return t?Fn({env:n,cwd:o,execPath:s}):n},Xi=(r,e,t={})=>{const o=Mn._parse(r,e,t);return r=o.command,e=o.args,t=o.options,t={maxBuffer:Yi,buffer:!0,stripFinalNewline:!0,extendEnv:!0,preferLocal:!1,localDir:t.cwd||se.cwd(),execPath:se.execPath,encoding:"utf8",reject:!0,cleanup:!0,all:!1,windowsHide:!0,verbose:Ki,...t},t.env=qi(t),t.stdio=ti(t),se.platform==="win32"&&ce.basename(r,".exe")==="cmd"&&e.unshift("/q"),{file:r,args:e,options:t,parsed:o}},Ft=(r,e,t)=>typeof e!="string"&&!Zo.isBuffer(e)?t===void 0?void 0:"":r.stripFinalNewline?In(e):e;function j(r,e,t){const o=Xi(r,e,t),s=zi(r,e),n=Wi(r,e);Vi(n,o.options),wi(o.options);let i;try{i=dr.spawn(o.file,o.args,o.options)}catch(p){const g=new dr.ChildProcess,h=Promise.reject(Xr({error:p,stdout:"",stderr:"",all:"",command:s,escapedCommand:n,parsed:o,timedOut:!1,isCanceled:!1,killed:!1}));return no(g,h),g}const c=_i(i),a=yi(i,o.options,c),m=vi(i,o.options,a),u={isCanceled:!1};i.kill=ui.bind(null,i.kill.bind(i)),i.cancel=hi.bind(null,i,u);const d=Jr(async()=>{const[{error:p,exitCode:g,signal:h,timedOut:y},w,b,P]=await ji(i,o.options,m),k=Ft(o.options,w),A=Ft(o.options,b),$=Ft(o.options,P);if(p||g!==0||h!==null){const x=Xr({error:p,exitCode:g,signal:h,stdout:k,stderr:A,all:$,command:s,escapedCommand:n,parsed:o,timedOut:y,isCanceled:u.isCanceled||(o.options.signal?o.options.signal.aborted:!1),killed:i.killed});if(!o.options.reject)return x;throw x}return{command:s,escapedCommand:n,exitCode:0,stdout:k,stderr:A,all:$,failed:!1,timedOut:!1,isCanceled:!1,killed:!1}});return Li(i,o.options),i.all=Ti(i,o.options),Ci(i),no(i,d),i}class J{static create(e,t){return new e(t)}}const{hasOwnProperty:Lt}=Object.prototype,Xe=typeof process<"u"&&process.platform==="win32"?`\r
9
9
  `:`
10
10
  `,Tt=(r,e)=>{const t=[];let o="";typeof e=="string"?e={section:e,whitespace:!1}:(e=e||Object.create(null),e.whitespace=e.whitespace===!0);const s=e.whitespace?" = ":"=";for(const n of Object.keys(r)){const i=r[n];if(i&&Array.isArray(i))for(const c of i)o+=ye(n+"[]")+s+ye(c)+Xe;else i&&typeof i=="object"?t.push(n):o+=ye(n)+s+ye(i)+Xe}e.section&&o.length&&(o="["+ye(e.section)+"]"+Xe+o);for(const n of t){const i=ao(n).join("\\."),c=(e.section?e.section+".":"")+i,{whitespace:a}=e,m=Tt(r[n],{section:c,whitespace:a});o.length&&m.length&&(o+=Xe),o+=m}return o},ao=r=>r.replace(/\1/g,"LITERAL\\1LITERAL").replace(/\\\./g,"").split(/\./).map(e=>e.replace(/\1/g,"\\.").replace(/\2LITERAL\\1LITERAL\2/g,"")),co=r=>{const e=Object.create(null);let t=e,o=null;const s=/^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i,n=r.split(/[\r\n]+/g);for(const c of n){if(!c||c.match(/^\s*[;#]/))continue;const a=c.match(s);if(!a)continue;if(a[1]!==void 0){if(o=Qe(a[1]),o==="__proto__"){t=Object.create(null);continue}t=e[o]=e[o]||Object.create(null);continue}const m=Qe(a[2]),u=m.length>2&&m.slice(-2)==="[]",l=u?m.slice(0,-2):m;if(l==="__proto__")continue;const d=a[3]?Qe(a[4]):!0,p=d==="true"||d==="false"||d==="null"?JSON.parse(d):d;u&&(Lt.call(t,l)?Array.isArray(t[l])||(t[l]=[t[l]]):t[l]=[]),Array.isArray(t[l])?t[l].push(p):t[l]=p}const i=[];for(const c of Object.keys(e)){if(!Lt.call(e,c)||typeof e[c]!="object"||Array.isArray(e[c]))continue;const a=ao(c);t=e;const m=a.pop(),u=m.replace(/\\\./g,".");for(const l of a)l!=="__proto__"&&((!Lt.call(t,l)||typeof t[l]!="object")&&(t[l]=Object.create(null)),t=t[l]);t===e&&u===m||(t[u]=e[c],i.push(c))}for(const c of i)delete e[c];return e},lo=r=>r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'"),ye=r=>typeof r!="string"||r.match(/[=\r\n]/)||r.match(/^\[/)||r.length>1&&lo(r)||r!==r.trim()?JSON.stringify(r):r.split(";").join("\\;").split("#").join("\\#"),Qe=(r,e)=>{if(r=(r||"").trim(),lo(r)){r.charAt(0)==="'"&&(r=r.slice(1,-1));try{r=JSON.parse(r)}catch{}}else{let t=!1,o="";for(let s=0,n=r.length;s<n;s++){const i=r.charAt(s);if(t)"\\;#".indexOf(i)!==-1?o+=i:o+="\\"+i,t=!1;else{if(";#".indexOf(i)!==-1)break;i==="\\"?t=!0:o+=i}}return t&&(o+="\\"),o.trim()}return r};var Qi={parse:co,decode:co,stringify:Tt,encode:Tt,safe:ye,unsafe:Qe},we=me(Qi);class v extends Error{}const jt=" ",ie=r=>{r instanceof Error&&(r instanceof v||(r.stack&&console.error(C.dim(r.stack.split(`
11
11
  `).slice(1).join(`
12
12
  `))),console.error(`
13
13
  ${jt}${C.dim(`aicommit2 v${Ir}`)}`),console.error(`
14
- ${jt}Please open a Bug report with the information above:`),console.error(`${jt}https://github.com/tak-bro/aicommit2/issues/new/choose`)))},uo=r=>O.lstat(r).then(()=>!0,()=>!1),mo=async r=>{try{await O.mkdir(r,{recursive:!0})}catch(e){if(e.code!=="EEXIST")throw e}},Ze=r=>r&&`${r[0].toUpperCase()}${r.slice(1)}`,et=(r,e)=>{const t=Math.ceil(r),o=Math.floor(e);return Math.floor(Math.random()*(o-t+1))+t},Zi=(r,e)=>r.disabled&&!e.disabled?1:!r.disabled&&e.disabled?-1:0,tt=r=>r.reduce((e,t)=>Array.isArray(t)?e.concat(tt(t)):e.concat(t),[]),fo=(r,e=5)=>r.replace(/[\n\r]/g,"").split(" ").slice(0,e).join(" "),ea=r=>{let e=0;for(let t=0;t<r.length;t++){const o=r.charCodeAt(t);e=(e<<5)-e+o,e=e&e}return Math.abs(e)},ta=r=>{const e=r%360,t=65+r%15,o=45+r%10;return`hsl(${e}, ${t}%, ${o}%)`},ra=r=>{const[e,t,o]=r.match(/\d+/g).map((l,d)=>d===0?Number(l):Number(l)/100),s=(1-Math.abs(2*o-1))*t,n=s*(1-Math.abs(e/60%2-1)),i=o-s/2;let c,a,m;e<60?[c,a,m]=[s,n,0]:e<120?[c,a,m]=[n,s,0]:e<180?[c,a,m]=[0,s,n]:e<240?[c,a,m]=[0,n,s]:e<300?[c,a,m]=[n,0,s]:[c,a,m]=[s,0,n];const u=l=>{const d=Math.round((l+i)*255).toString(16);return d.length===1?"0"+d:d};return`#${u(c)}${u(a)}${u(m)}`},oa=r=>{const e=ea(r),t=ta(e);return{primary:ra(t),secondary:"#FFFFFF"}},sa=r=>{try{return{ok:!0,data:JSON.parse(r)}}catch(e){return{ok:!1,error:e}}},rt=r=>{if(!r||typeof r!="string")return"";if(S.isAbsolute(r))return S.resolve(r);if(Ie){const e=S.dirname(Ie),t=S.join(e,r);return S.resolve(t)}else return""},na=["","conventional","gitmoji"],Nt="http://localhost:11434",{hasOwnProperty:ia}=Object.prototype,Gt=(r,e)=>ia.call(r,e),ve=["OPENAI","OLLAMA","HUGGINGFACE","GEMINI","ANTHROPIC","MISTRAL","CODESTRAL","COHERE","GROQ","PERPLEXITY","DEEPSEEK","GITHUB_MODELS"],po=r=>{const e=xe.platform(),t=xe.homedir();let o,s;switch(r){case"config":o=process.env.XDG_CONFIG_HOME;break;case"data":o=process.env.XDG_DATA_HOME;break;case"cache":o=process.env.XDG_CACHE_HOME;break;case"state":o=process.env.XDG_STATE_HOME;break;default:o=void 0}if(e==="darwin")r==="cache"?s=S.join(t,"Library","Caches"):s=S.join(t,"Library","Application Support");else if(e==="win32")s=process.env.LOCALAPPDATA||t;else switch(r){case"config":s=S.join(t,".config");break;case"data":s=S.join(t,".local","share");break;case"cache":s=S.join(t,".cache");break;case"state":s=S.join(t,".local","state");break;default:s=t}return o||s},aa=S.join(po("config"),"aicommit2"),ee=S.join(po("state"),"aicommit2","logs"),ho=S.join(aa,"config.ini"),go=S.join(ee,"aicommit2-%DATE%.log"),yo=S.join(ee,"exceptions-%DATE%.log"),ca=r=>{const e=Object.keys(r),t=new Set([...ve,...e.filter(o=>/^[A-Z][A-Z0-9_]*$/.test(o))]);return Array.from(t)},L=(r,e,t)=>{if(!e)throw new v(`Invalid config property ${r}: ${t}`)},ne=(r,e=!1)=>t=>typeof t=="boolean"?t:t==null?e:(L(r,/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true"),f={systemPrompt(r){return r||""},systemPromptPath(r){return r||""},codeReviewPromptPath(r){return r||""},timeout(r){if(!r)return 1e4;L("timeout",/^\d+$/.test(r),"Must be an integer");const e=Number(r);return L("timeout",e>=500,"Must be greater than 500ms"),e},temperature(r){if(!r)return .7;L("temperature",/^(2|\d)(\.\d{1,2})?$/.test(r),"Must be decimal between 0 and 2");const e=Number(r);return L("temperature",e>0,"Must be greater than 0"),L("temperature",e<=2,"Must be less than or equal to 2"),e},maxTokens(r){return r?(L("maxTokens",/^\d+$/.test(r),"Must be an integer"),Number(r)):1024},logLevel(r){return r?(L("logLevel",/^(?:error|warn|info|http|verbose|debug|silly)$/.test(r),"Must be a valid log level (error, warn, info, http, verbose, debug, silly)"),r):"info"},logFilePath(r){return r||go},exceptionLogFilePath(r){return r||yo},locale(r){return r?(L("locale",r,"Cannot be empty"),L("locale",/^[a-z-]+$/i.test(r),"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"),r):"en"},generate(r){if(!r)return 1;L("generate",/^\d+$/.test(r),"Must be an integer");const e=Number(r);return L("generate",e>0,"Must be greater than 0"),L("generate",e<=5,"Must be less or equal to 5"),e},type(r){return r?(L("type",na.includes(r),"Invalid commit type"),r):"conventional"},maxLength(r){if(!r)return 50;L("maxLength",/^\d+$/.test(r),"Must be an integer");const e=Number(r);return L("maxLength",e>=20,"Must be greater than 20 characters"),e},exclude:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):[],topP:r=>{if(!r)return .9;L("topP",/^(1|\d)(\.\d{1,2})?$/.test(r),"Must be decimal between 0 and 1");const e=Number(r);return L("topP",e>0,"Must be greater than 0"),L("topP",e<=1,"Must be less than or equal to 1"),e},logging:ne("logging",!0),includeBody:ne("includeBody"),codeReview:ne("codeReview"),disabled:ne("disabled"),watchMode:ne("watchMode"),forceGit:ne("forceGit"),disableLowerCase:ne("disableLowerCase")},Me={OPENAI:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["gpt-4o-mini"],url:r=>r?(L("OPENAI.url",/^https?:\/\//.test(r),"Must be a valid URL"),r):"https://api.openai.com",path:r=>r||"/v1/chat/completions",proxy:r=>r||"",topP:f.topP,systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},HUGGINGFACE:{cookie:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["CohereForAI/c4ai-command-r-plus"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,topP:f.topP,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},GEMINI:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["gemini-2.0-flash"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},ANTHROPIC:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["claude-3-5-haiku-20241022"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},MISTRAL:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["mistral-small-latest"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},CODESTRAL:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["codestral-latest"],topP:f.topP,systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},OLLAMA:{model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):[],host:r=>r?(L("OLLAMA.host",/^https?:\/\//.test(r),"Must be a valid URL"),r):Nt,timeout:r=>{if(!r)return 1e5;L("OLLAMA.timeout",/^\d+$/.test(r),"Must be an integer");const e=Number(r);return L("OLLAMA.timeout",e>=500,"Must be greater than 500ms"),e},auth:r=>r||"",key:r=>r||"",envKey:r=>r||"",numCtx:r=>{if(!r)return 2048;L("OLLAMA.numCtx",/^\d+$/.test(r),"Must be an integer");const e=Number(r);return L("OLLAMA.numCtx",e>=2048,"Must be greater than 2048"),e},systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},COHERE:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["command-r"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},GROQ:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["llama-3.3-70b-versatile"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},PERPLEXITY:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["sonar"],topP:f.topP,systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},DEEPSEEK:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["deepseek-coder"],topP:f.topP,systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},GITHUB_MODELS:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["gpt-4o-mini"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase}};let Ie;const la=(r=[])=>{const e={};for(const t of r)if(t.startsWith("--")){const[o,s]=t.slice(2).split("="),[n,i]=o.split(".");n&&i&&n in Me?(e[n]||(e[n]={}),e[n][i]=s):e[o]=s}return e},ua=()=>{const r=xe.homedir(),e=process.env.AICOMMIT_CONFIG_PATH,t=ho,o=S.join(r,".aicommit2");return[e,t,o].filter(s=>!!s)},be=async()=>{const r=ua();for(const e of r)if(await uo(e))return e;return ho},Re=async()=>{const r=await be();Ie=r;try{const e=await O.readFile(r,"utf8");return we.parse(e)}catch(e){return e.code==="ENOENT"?(Ie=void 0,{}):(console.error(`Error reading config file ${r}:`,e),Ie=void 0,{})}},ue=async(r,e=[])=>{const t=await Re(),o=la(e),s={...r,...o},n={},i=ca(t),c={};for(const m of i){const l=t[m]?.envKey||`${m}_API_KEY`,d=process.env[l];d&&(c[m]={key:d})}const a=(m,u)=>{const l=s[`${m}.${u}`]??s[m]?.[u],d=c[m]?.[u],p=t[m]?.[u],g=s[u]??t[u];return l!==void 0?l:d!==void 0?d:p!==void 0?p:g};for(const[m,u]of Object.entries(f)){const l=s[m]??t[m];n[m]=u(l)}for(const m of i){n[m]={};const u=Me[m]||ot(m);for(const[l,d]of Object.entries(u)){const p=a(m,l);n[m][l]=d(p)}}return n},_t=async r=>{const e=await Re();for(const[s,n]of r){const[i,c]=s.split(".");if(!c){const u=f[s];if(!u)throw new v(`Invalid config property: ${s}`);e[s]=u(n);continue}if(e[i]||(e[i]={}),ve.includes(i)){const u=Me[i][c];if(!u)throw new v(`Invalid config property: ${s}`);e[i][c]=u(n);continue}if(!/^[A-Z][A-Z0-9_]*$/.test(i))throw new v(`Invalid service name: ${i}. Service names must be uppercase letters, numbers, and underscores.`);const m=ot(i);if(!m[c])throw new v(`Invalid config property for custom service: ${s}`);try{e[i][c]=m[c](n)}catch(u){throw u instanceof v?u:new v(`Invalid value for ${s}: ${u.message}`)}}const t=await be(),o=S.dirname(t);await O.mkdir(o,{recursive:!0}),await O.writeFile(t,we.stringify(e),"utf8")},da=async r=>{const e=await Re();for(const[s,n]of r){const[i,c]=s.split("."),a=e[i];if(c==="model"){a||(e[i]={});const u=e[i][c]||[],l=typeof n=="string"?n.split(",").map(d=>d.trim()).filter(d=>!!d):n;e[i][c]=tt([...u,...l]);continue}if(a&&a.compatible===!0){a||(e[i]={});const u=ot(i);if(!u[c])throw new v(`Invalid config property: ${s}`);try{e[i][c]=u[c](n)}catch(l){throw l instanceof v?l:new v(`Invalid value for ${s}: ${l.message}`)}continue}if(i in Me){a||(e[i]={});const u=Me[i][c];if(!u)throw new v(`Invalid config property: ${s}`);e[i][c]=u(n)}else{const u=ot(i);if(!u[c])throw new v(`Invalid config property: ${s}`);e[i]||(e[i]={}),e[i][c]=u[c](n)}}const t=await be(),o=S.dirname(t);await O.mkdir(o,{recursive:!0}),await O.writeFile(t,we.stringify(e),"utf8")},ma=async()=>{const r=await Re();console.log(we.stringify(r))},fa=async()=>{console.log(await be())},ot=r=>({compatible:ne("compatible"),stream:ne("stream"),url:e=>e?(L(`${r}.url`,/^https?:\/\//.test(e),"Must be a valid URL"),e):"",path:e=>e||"",key:e=>e||"",envKey:e=>e||"",model:e=>e?(typeof e=="string"?e?.split(","):e).map(o=>o.trim()).filter(o=>!!o&&o.length>0):[],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase}),Oe=new Map,de=(r,e,t)=>{const o=Pr(0).update(e).digest("hex").substring(0,8),s=`${r}_${o}_${t}`;if(Oe.has(s))return Oe.get(s);const n=new Date,i=ga(n,r,e,t),c=`${ee}/${i}`,a=B.createLogger({level:"info",format:B.format.combine(B.format.timestamp({format:"YYYY-MM-DDTHH:mm:ss.SSSZ"}),B.format.printf(({timestamp:m,level:u,message:l,...d})=>d&&Object.keys(d).length>0?`[${m}] ${u}: ${l} ${JSON.stringify(d,null,2)}`:`[${m}] ${u}: ${l}`)),transports:[new B.transports.File({filename:c})]});return a.info(`=== ${r.toUpperCase()} AI SERVICE LOG ===`),a.info(`Diff Hash: ${o}`),a.info(`Request Type: ${t.toUpperCase()}`),a.info(`Start Time: ${n.toISOString()}`),a.info("=".repeat(50)),a.info(""),Oe.set(s,a),a},pa=r=>{const e={...r},t=["authorization","x-api-key","x-goog-api-key","api-key"];for(const o of t){const s=o.toLowerCase(),n=Object.keys(e).find(i=>i.toLowerCase()===s);n&&e[n]&&typeof e[n]=="string"&&(e[n].startsWith("Bearer ")?e[n]="Bearer [MASKED]":e[n]="[MASKED]")}return e},Y=(r,e,t,o,s,n,i=!0)=>{if(!i)return;const c=de(t,r,e);c.info(`Making request to ${t} API with model: ${o}`),c.info(`Request URL: ${s}`),c.info("Request headers:",pa(n))},te=(r,e,t,o,s=!0)=>{if(!s)return;de(t,r,e).info("Request payload:",o)},V=(r,e,t,o,s,n=!0)=>{if(!n)return;const i=de(t,r,e);i.info("System prompt:",{prompt:o}),i.info("User prompt:",{prompt:s})},q=(r,e,t,o,s=!0)=>{if(!s)return;de(t,r,e).info("Response received:",o)},G=(r,e,t,o,s=!0)=>{if(!s)return;de(t,r,e).error("API request failed:",o)},z=(r,e,t,o,s,n=!0)=>{if(!n)return;const i=de(t,r,e);o?i.info(`Request completed successfully in ${o}ms`):i.info("Request completed successfully"),s&&i.info("Final processed response:",{response:s}),i.info(""),i.info("=".repeat(50)),i.info(`End Time: ${new Date().toISOString()}`),i.info("=== REQUEST COMPLETED ===")},ha=(r,e,t,o,s,n,i,c=!0)=>{if(!c)return;const a=de(t,r,e);i?a.error(`Request failed after ${n}ms:`,{error:i}):(a.info(`Request completed in ${n}ms`),a.info("Response:",{response:s})),z(r,e,t,n,s,c)},ga=(r,e,t,o)=>{const{year:s,month:n,day:i,hours:c,minutes:a,seconds:m}=ya(r),l=Pr(0).update(t).digest("hex").substring(0,8),d=e.toLowerCase().replace(/[^a-z0-9]/g,"").substring(0,20);return o==="review"?`${s}-${n}-${i}_${c}-${a}-${m}_${l}_${d}_review.log`:`${s}-${n}-${i}_${c}-${a}-${m}_${l}_${d}_commit.log`},ya=r=>{const e=r.getFullYear().toString(),t=(r.getMonth()+1).toString().padStart(2,"0"),o=r.getDate().toString().padStart(2,"0"),s=r.getHours().toString().padStart(2,"0"),n=r.getMinutes().toString().padStart(2,"0"),i=r.getSeconds().toString().padStart(2,"0");return{year:e,month:t,day:o,hours:s,minutes:n,seconds:i}},Bt=()=>{for(const[r,e]of Oe.entries())try{e.close()}catch(t){console.error(`Failed to close logger ${r}:`,t)}Oe.clear()};process.on("exit",Bt),process.on("SIGINT",()=>{Bt(),process.exit(0)}),process.on("SIGTERM",()=>{Bt(),process.exit(0)});let st,wo="info";async function wa(r){if(st){console.warn("Logger already initialized. Skipping re-initialization.");return}const e=r?.logLevel||"info";wo=e;const t=r?.logFilePath||go,o=r?.exceptionLogFilePath||yo,s=r?.logging??!0;await mo(S.dirname(t)),await mo(S.dirname(o));const n=[];s?n.push(new B.transports.DailyRotateFile({filename:t,datePattern:"YYYY-MM-DD",zippedArchive:!0,maxSize:"20m",maxFiles:"14d",level:e,format:B.format.combine(B.format.timestamp(),B.format.printf(({level:i,message:c,timestamp:a})=>`[${a}] ${i}: ${c}`))})):n.push(new B.transports.Console({silent:!0})),st=B.createLogger({level:e,format:B.format.json(),transports:n,exceptionHandlers:s?[new B.transports.DailyRotateFile({filename:o,datePattern:"YYYY-MM-DD",zippedArchive:!0,maxSize:"20m",maxFiles:"14d",format:B.format.combine(B.format.timestamp(),B.format.json())})]:[],exitOnError:!1,silent:!s})}const Ce=new Proxy({},{get:(r,e,t)=>{if(!st)throw new Error("Logger not initialized. Call initializeLogger() first.");return Reflect.get(st,e,t)}});function va(){const r=B.config.npm.levels;return(r[wo]??r.info)>=r.verbose}class X{constructor(e){this.handleError$=t=>{const o=this.getDetailedErrorMessage(t),s=t.status?`HTTP ${t.status}: ${o}`:o;if(this.params.config.logging){const n=this.params.stagedDiff.diff,i=this.serviceName.replace(/\[|\]/g,"").trim();ha(n,"commit",i,"Error occurred","",void 0,s)}return Ce.error(`${this.errorPrefix} ${s}`),t.stack&&Ce.error(` ${t.stack}`),t.content&&Ce.error(` Problematic content: ${t.content}`),t.originalError&&Ce.error(` Original error: ${t.originalError}`),ft({name:`${this.errorPrefix} ${s}`,value:s,isError:!0,disabled:!0})},this.serviceName="AI",this.errorPrefix="ERROR",this.colors={primary:""},this.params=e,this.logSessionId=e.logSessionId}getDetailedErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your API key configuration":t.includes("rate_limit")||t.includes("Rate limit")||t.includes("429")||t.includes("Too Many Requests")?"Rate limit exceeded. Wait a moment and try again, or upgrade your plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the model name is correct":t.includes("timeout")||t.includes("Timeout")?"Request timed out. Try again or increase the timeout setting":t.includes("network")||t.includes("connection")||t.includes("ECONNREFUSED")?"Network error. Check your internet connection and try again":t.includes("quota")||t.includes("usage")||t.includes("QUOTA_EXCEEDED")?"API quota exceeded. Check your usage limits":t.includes("401")||t.includes("Unauthorized")?"Authentication failed. Your API key may be invalid or expired":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your model configuration":t.includes("500")||t.includes("Internal Server Error")?"Server error. Try again later":t.includes("overloaded")||t.includes("capacity")||t.includes("SERVICE_UNAVAILABLE")||t.includes("unavailable")?"Service is temporarily unavailable. Try again in a few minutes":this.getServiceSpecificErrorMessage(e)||t||"Unknown error occurred"}getServiceSpecificErrorMessage(e){return null}cleanJsonCodeBlock(e){const t=/```(?:json|JSON)?\s*([\s\S]*?)\s*```/,o=e.match(t);return o?o[1].trim():e}parseMessage(e,t,o){const s=this.cleanJsonCodeBlock(e),n=/(\[\s*\{[\s\S]*?\}\s*\]|\{[\s\S]*?\})/,i=s.match(n);if(!i){const p=new Error("AI response did not contain a valid JSON object or array.");throw p.name="InvalidJsonResponse",p.content=e,p}const c=i[0],a=sa(c);if(!a.ok){const p=new Error("Failed to parse AI response as JSON");throw p.name="JsonParseError",p.content=c,p.originalError=a.error,p}const m=a.data,u=Array.isArray(m)?m:[m];if(!u.length||!u.every(p=>typeof p.subject=="string")){const p=new Error("AI response contained malformed commit message data.");throw p.name="MalformedCommitMessage",p.content=e,p}const d=u.map(p=>this.extractMessageAsType(p,t)).map(p=>({title:`${p.subject}`,value:`${p.subject}${p.body?`
14
+ ${jt}Please open a Bug report with the information above:`),console.error(`${jt}https://github.com/tak-bro/aicommit2/issues/new/choose`)))},uo=r=>O.lstat(r).then(()=>!0,()=>!1),mo=async r=>{try{await O.mkdir(r,{recursive:!0})}catch(e){if(e.code!=="EEXIST")throw e}},Ze=r=>r&&`${r[0].toUpperCase()}${r.slice(1)}`,et=(r,e)=>{const t=Math.ceil(r),o=Math.floor(e);return Math.floor(Math.random()*(o-t+1))+t},Zi=(r,e)=>r.disabled&&!e.disabled?1:!r.disabled&&e.disabled?-1:0,tt=r=>r.reduce((e,t)=>Array.isArray(t)?e.concat(tt(t)):e.concat(t),[]),fo=(r,e=5)=>r.replace(/[\n\r]/g,"").split(" ").slice(0,e).join(" "),ea=r=>{let e=0;for(let t=0;t<r.length;t++){const o=r.charCodeAt(t);e=(e<<5)-e+o,e=e&e}return Math.abs(e)},ta=r=>{const e=r%360,t=65+r%15,o=45+r%10;return`hsl(${e}, ${t}%, ${o}%)`},ra=r=>{const[e,t,o]=r.match(/\d+/g).map((l,d)=>d===0?Number(l):Number(l)/100),s=(1-Math.abs(2*o-1))*t,n=s*(1-Math.abs(e/60%2-1)),i=o-s/2;let c,a,m;e<60?[c,a,m]=[s,n,0]:e<120?[c,a,m]=[n,s,0]:e<180?[c,a,m]=[0,s,n]:e<240?[c,a,m]=[0,n,s]:e<300?[c,a,m]=[n,0,s]:[c,a,m]=[s,0,n];const u=l=>{const d=Math.round((l+i)*255).toString(16);return d.length===1?"0"+d:d};return`#${u(c)}${u(a)}${u(m)}`},oa=r=>{const e=ea(r),t=ta(e);return{primary:ra(t),secondary:"#FFFFFF"}},sa=r=>{try{return{ok:!0,data:JSON.parse(r)}}catch(e){return{ok:!1,error:e}}},rt=r=>{if(!r||typeof r!="string")return"";if(S.isAbsolute(r))return S.resolve(r);if(Ie){const e=S.dirname(Ie),t=S.join(e,r);return S.resolve(t)}else return""},na=["","conventional","gitmoji"],Nt="http://localhost:11434",{hasOwnProperty:ia}=Object.prototype,Gt=(r,e)=>ia.call(r,e),ve=["OPENAI","OLLAMA","HUGGINGFACE","GEMINI","ANTHROPIC","MISTRAL","CODESTRAL","COHERE","GROQ","PERPLEXITY","DEEPSEEK","GITHUB_MODELS"],po=r=>{const e=xe.platform(),t=xe.homedir();let o,s;switch(r){case"config":o=process.env.XDG_CONFIG_HOME;break;case"data":o=process.env.XDG_DATA_HOME;break;case"cache":o=process.env.XDG_CACHE_HOME;break;case"state":o=process.env.XDG_STATE_HOME;break;default:o=void 0}if(e==="darwin")r==="cache"?s=S.join(t,"Library","Caches"):s=S.join(t,"Library","Application Support");else if(e==="win32")s=process.env.LOCALAPPDATA||t;else switch(r){case"config":s=S.join(t,".config");break;case"data":s=S.join(t,".local","share");break;case"cache":s=S.join(t,".cache");break;case"state":s=S.join(t,".local","state");break;default:s=t}return o||s},aa=S.join(po("config"),"aicommit2"),ee=S.join(po("state"),"aicommit2","logs"),ho=S.join(aa,"config.ini"),go=S.join(ee,"aicommit2-%DATE%.log"),yo=S.join(ee,"exceptions-%DATE%.log"),ca=r=>{const e=Object.keys(r),t=new Set([...ve,...e.filter(o=>/^[A-Z][A-Z0-9_]*$/.test(o))]);return Array.from(t)},D=(r,e,t)=>{if(!e)throw new v(`Invalid config property ${r}: ${t}`)},ne=(r,e=!1)=>t=>typeof t=="boolean"?t:t==null?e:(D(r,/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true"),f={systemPrompt(r){return r||""},systemPromptPath(r){return r||""},codeReviewPromptPath(r){return r||""},timeout(r){if(!r)return 6e4;D("timeout",/^\d+$/.test(r),"Must be an integer");const e=Number(r);return D("timeout",e>=500,"Must be greater than 500ms"),e},temperature(r){if(!r)return .7;D("temperature",/^(2|\d)(\.\d{1,2})?$/.test(r),"Must be decimal between 0 and 2");const e=Number(r);return D("temperature",e>0,"Must be greater than 0"),D("temperature",e<=2,"Must be less than or equal to 2"),e},maxTokens(r){return r?(D("maxTokens",/^\d+$/.test(r),"Must be an integer"),Number(r)):1024},logLevel(r){return r?(D("logLevel",/^(?:error|warn|info|http|verbose|debug|silly)$/.test(r),"Must be a valid log level (error, warn, info, http, verbose, debug, silly)"),r):"info"},logFilePath(r){return r||go},exceptionLogFilePath(r){return r||yo},locale(r){return r?(D("locale",r,"Cannot be empty"),D("locale",/^[a-z-]+$/i.test(r),"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"),r):"en"},generate(r){if(!r)return 1;D("generate",/^\d+$/.test(r),"Must be an integer");const e=Number(r);return D("generate",e>0,"Must be greater than 0"),D("generate",e<=5,"Must be less or equal to 5"),e},type(r){return r?(D("type",na.includes(r),"Invalid commit type"),r):"conventional"},maxLength(r){if(!r)return 50;D("maxLength",/^\d+$/.test(r),"Must be an integer");const e=Number(r);return D("maxLength",e>=20,"Must be greater than 20 characters"),e},exclude:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):[],topP:r=>{if(!r)return .9;D("topP",/^(1|\d)(\.\d{1,2})?$/.test(r),"Must be decimal between 0 and 1");const e=Number(r);return D("topP",e>0,"Must be greater than 0"),D("topP",e<=1,"Must be less than or equal to 1"),e},logging:ne("logging",!0),includeBody:ne("includeBody"),codeReview:ne("codeReview"),disabled:ne("disabled"),watchMode:ne("watchMode"),forceGit:ne("forceGit"),disableLowerCase:ne("disableLowerCase")},Me={OPENAI:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["gpt-4o-mini"],url:r=>r?(D("OPENAI.url",/^https?:\/\//.test(r),"Must be a valid URL"),r):"https://api.openai.com",path:r=>r||"/v1/chat/completions",proxy:r=>r||"",topP:f.topP,systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},HUGGINGFACE:{cookie:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["CohereForAI/c4ai-command-r-plus"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,topP:f.topP,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},GEMINI:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["gemini-2.0-flash"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},ANTHROPIC:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["claude-3-5-haiku-20241022"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},MISTRAL:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["mistral-small-latest"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},CODESTRAL:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["codestral-latest"],topP:f.topP,systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},OLLAMA:{model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):[],host:r=>r?(D("OLLAMA.host",/^https?:\/\//.test(r),"Must be a valid URL"),r):Nt,timeout:r=>{if(!r)return 1e5;D("OLLAMA.timeout",/^\d+$/.test(r),"Must be an integer");const e=Number(r);return D("OLLAMA.timeout",e>=500,"Must be greater than 500ms"),e},auth:r=>r||"",key:r=>r||"",envKey:r=>r||"",numCtx:r=>{if(!r)return 2048;D("OLLAMA.numCtx",/^\d+$/.test(r),"Must be an integer");const e=Number(r);return D("OLLAMA.numCtx",e>=2048,"Must be greater than 2048"),e},systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},COHERE:{key:r=>r||"",envKey:r=>r||"",url:r=>r?(D("COHERE.url",/^https?:\/\//.test(r),"Must be a valid URL"),r):"https://api.cohere.ai",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["command-a-03-2025"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,timeout:f.timeout,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},GROQ:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["llama-3.3-70b-versatile"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},PERPLEXITY:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["sonar"],topP:f.topP,systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},DEEPSEEK:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["deepseek-coder"],topP:f.topP,systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase},GITHUB_MODELS:{key:r=>r||"",envKey:r=>r||"",model:r=>r?(typeof r=="string"?r?.split(","):r).map(t=>t.trim()).filter(t=>!!t&&t.length>0):["gpt-4o-mini"],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase}};let Ie;const la=(r=[])=>{const e={};for(const t of r)if(t.startsWith("--")){const[o,s]=t.slice(2).split("="),[n,i]=o.split(".");n&&i&&n in Me?(e[n]||(e[n]={}),e[n][i]=s):e[o]=s}return e},ua=()=>{const r=xe.homedir(),e=process.env.AICOMMIT_CONFIG_PATH,t=ho,o=S.join(r,".aicommit2");return[e,t,o].filter(s=>!!s)},be=async()=>{const r=ua();for(const e of r)if(await uo(e))return e;return ho},Re=async()=>{const r=await be();Ie=r;try{const e=await O.readFile(r,"utf8");return we.parse(e)}catch(e){return e.code==="ENOENT"?(Ie=void 0,{}):(console.error(`Error reading config file ${r}:`,e),Ie=void 0,{})}},ue=async(r,e=[])=>{const t=await Re(),o=la(e),s={...r,...o},n={},i=ca(t),c={};for(const m of i){const l=t[m]?.envKey||`${m}_API_KEY`,d=process.env[l];d&&(c[m]={key:d})}const a=(m,u)=>{const l=s[`${m}.${u}`]??s[m]?.[u],d=c[m]?.[u],p=t[m]?.[u],g=s[u]??t[u];return l!==void 0?l:d!==void 0?d:p!==void 0?p:g};for(const[m,u]of Object.entries(f)){const l=s[m]??t[m];n[m]=u(l)}for(const m of i){n[m]={};const u=Me[m]||ot(m);for(const[l,d]of Object.entries(u)){const p=a(m,l);n[m][l]=d(p)}}return n},_t=async r=>{const e=await Re();for(const[s,n]of r){const[i,c]=s.split(".");if(!c){const u=f[s];if(!u)throw new v(`Invalid config property: ${s}`);e[s]=u(n);continue}if(e[i]||(e[i]={}),ve.includes(i)){const u=Me[i][c];if(!u)throw new v(`Invalid config property: ${s}`);e[i][c]=u(n);continue}if(!/^[A-Z][A-Z0-9_]*$/.test(i))throw new v(`Invalid service name: ${i}. Service names must be uppercase letters, numbers, and underscores.`);const m=ot(i);if(!m[c])throw new v(`Invalid config property for custom service: ${s}`);try{e[i][c]=m[c](n)}catch(u){throw u instanceof v?u:new v(`Invalid value for ${s}: ${u.message}`)}}const t=await be(),o=S.dirname(t);await O.mkdir(o,{recursive:!0}),await O.writeFile(t,we.stringify(e),"utf8")},da=async r=>{const e=await Re();for(const[s,n]of r){const[i,c]=s.split("."),a=e[i];if(c==="model"){a||(e[i]={});const u=e[i][c]||[],l=typeof n=="string"?n.split(",").map(d=>d.trim()).filter(d=>!!d):n;e[i][c]=tt([...u,...l]);continue}if(a&&a.compatible===!0){a||(e[i]={});const u=ot(i);if(!u[c])throw new v(`Invalid config property: ${s}`);try{e[i][c]=u[c](n)}catch(l){throw l instanceof v?l:new v(`Invalid value for ${s}: ${l.message}`)}continue}if(i in Me){a||(e[i]={});const u=Me[i][c];if(!u)throw new v(`Invalid config property: ${s}`);e[i][c]=u(n)}else{const u=ot(i);if(!u[c])throw new v(`Invalid config property: ${s}`);e[i]||(e[i]={}),e[i][c]=u[c](n)}}const t=await be(),o=S.dirname(t);await O.mkdir(o,{recursive:!0}),await O.writeFile(t,we.stringify(e),"utf8")},ma=async()=>{const r=await Re();console.log(we.stringify(r))},fa=async()=>{console.log(await be())},ot=r=>({compatible:ne("compatible"),stream:ne("stream"),url:e=>e?(D(`${r}.url`,/^https?:\/\//.test(e),"Must be a valid URL"),e):"",path:e=>e||"",key:e=>e||"",envKey:e=>e||"",model:e=>e?(typeof e=="string"?e?.split(","):e).map(o=>o.trim()).filter(o=>!!o&&o.length>0):[],systemPrompt:f.systemPrompt,systemPromptPath:f.systemPromptPath,codeReviewPromptPath:f.codeReviewPromptPath,timeout:f.timeout,temperature:f.temperature,maxTokens:f.maxTokens,logging:f.logging,locale:f.locale,generate:f.generate,type:f.type,maxLength:f.maxLength,includeBody:f.includeBody,topP:f.topP,codeReview:f.codeReview,disabled:f.disabled,watchMode:f.watchMode,disableLowerCase:f.disableLowerCase}),Oe=new Map,de=(r,e,t)=>{const o=Pr(0).update(e).digest("hex").substring(0,8),s=`${r}_${o}_${t}`;if(Oe.has(s))return Oe.get(s);const n=new Date,i=ga(n,r,e,t),c=`${ee}/${i}`,a=B.createLogger({level:"info",format:B.format.combine(B.format.timestamp({format:"YYYY-MM-DDTHH:mm:ss.SSSZ"}),B.format.printf(({timestamp:m,level:u,message:l,...d})=>d&&Object.keys(d).length>0?`[${m}] ${u}: ${l} ${JSON.stringify(d,null,2)}`:`[${m}] ${u}: ${l}`)),transports:[new B.transports.File({filename:c})]});return a.info(`=== ${r.toUpperCase()} AI SERVICE LOG ===`),a.info(`Diff Hash: ${o}`),a.info(`Request Type: ${t.toUpperCase()}`),a.info(`Start Time: ${n.toISOString()}`),a.info("=".repeat(50)),a.info(""),Oe.set(s,a),a},pa=r=>{const e={...r},t=["authorization","x-api-key","x-goog-api-key","api-key"];for(const o of t){const s=o.toLowerCase(),n=Object.keys(e).find(i=>i.toLowerCase()===s);n&&e[n]&&typeof e[n]=="string"&&(e[n].startsWith("Bearer ")?e[n]="Bearer [MASKED]":e[n]="[MASKED]")}return e},V=(r,e,t,o,s,n,i=!0)=>{if(!i)return;const c=de(t,r,e);c.info(`Making request to ${t} API with model: ${o}`),c.info(`Request URL: ${s}`),c.info("Request headers:",pa(n))},te=(r,e,t,o,s=!0)=>{if(!s)return;de(t,r,e).info("Request payload:",o)},Y=(r,e,t,o,s,n=!0)=>{if(!n)return;const i=de(t,r,e);i.info("System prompt:",{prompt:o}),i.info("User prompt:",{prompt:s})},q=(r,e,t,o,s=!0)=>{if(!s)return;de(t,r,e).info("Response received:",o)},G=(r,e,t,o,s=!0)=>{if(!s)return;de(t,r,e).error("API request failed:",o)},z=(r,e,t,o,s,n=!0)=>{if(!n)return;const i=de(t,r,e);o?i.info(`Request completed successfully in ${o}ms`):i.info("Request completed successfully"),s&&i.info("Final processed response:",{response:s}),i.info(""),i.info("=".repeat(50)),i.info(`End Time: ${new Date().toISOString()}`),i.info("=== REQUEST COMPLETED ===")},ha=(r,e,t,o,s,n,i,c=!0)=>{if(!c)return;const a=de(t,r,e);i?a.error(`Request failed after ${n}ms:`,{error:i}):(a.info(`Request completed in ${n}ms`),a.info("Response:",{response:s})),z(r,e,t,n,s,c)},ga=(r,e,t,o)=>{const{year:s,month:n,day:i,hours:c,minutes:a,seconds:m}=ya(r),l=Pr(0).update(t).digest("hex").substring(0,8),d=e.toLowerCase().replace(/[^a-z0-9]/g,"").substring(0,20);return o==="review"?`${s}-${n}-${i}_${c}-${a}-${m}_${l}_${d}_review.log`:`${s}-${n}-${i}_${c}-${a}-${m}_${l}_${d}_commit.log`},ya=r=>{const e=r.getFullYear().toString(),t=(r.getMonth()+1).toString().padStart(2,"0"),o=r.getDate().toString().padStart(2,"0"),s=r.getHours().toString().padStart(2,"0"),n=r.getMinutes().toString().padStart(2,"0"),i=r.getSeconds().toString().padStart(2,"0");return{year:e,month:t,day:o,hours:s,minutes:n,seconds:i}},Bt=()=>{for(const[r,e]of Oe.entries())try{e.close()}catch(t){console.error(`Failed to close logger ${r}:`,t)}Oe.clear()};process.on("exit",Bt),process.on("SIGINT",()=>{Bt(),process.exit(0)}),process.on("SIGTERM",()=>{Bt(),process.exit(0)});let st,wo="info";async function wa(r){if(st){console.warn("Logger already initialized. Skipping re-initialization.");return}const e=r?.logLevel||"info";wo=e;const t=r?.logFilePath||go,o=r?.exceptionLogFilePath||yo,s=r?.logging??!0;await mo(S.dirname(t)),await mo(S.dirname(o));const n=[];s?n.push(new B.transports.DailyRotateFile({filename:t,datePattern:"YYYY-MM-DD",zippedArchive:!0,maxSize:"20m",maxFiles:"14d",level:e,format:B.format.combine(B.format.timestamp(),B.format.printf(({level:i,message:c,timestamp:a})=>`[${a}] ${i}: ${c}`))})):n.push(new B.transports.Console({silent:!0})),st=B.createLogger({level:e,format:B.format.json(),transports:n,exceptionHandlers:s?[new B.transports.DailyRotateFile({filename:o,datePattern:"YYYY-MM-DD",zippedArchive:!0,maxSize:"20m",maxFiles:"14d",format:B.format.combine(B.format.timestamp(),B.format.json())})]:[],exitOnError:!1,silent:!s})}const Ce=new Proxy({},{get:(r,e,t)=>{if(!st)throw new Error("Logger not initialized. Call initializeLogger() first.");return Reflect.get(st,e,t)}});function va(){const r=B.config.npm.levels;return(r[wo]??r.info)>=r.verbose}class X{constructor(e){this.handleError$=t=>{const o=this.getDetailedErrorMessage(t),s=t.status?`HTTP ${t.status}: ${o}`:o;if(this.params.config.logging){const n=this.params.stagedDiff.diff,i=this.serviceName.replace(/\[|\]/g,"").trim();ha(n,"commit",i,"Error occurred","",void 0,s)}return Ce.error(`${this.errorPrefix} ${s}`),t.stack&&Ce.error(` ${t.stack}`),t.content&&Ce.error(` Problematic content: ${t.content}`),t.originalError&&Ce.error(` Original error: ${t.originalError}`),ft({name:`${this.errorPrefix} ${s}`,value:s,isError:!0,disabled:!0})},this.serviceName="AI",this.errorPrefix="ERROR",this.colors={primary:""},this.params=e,this.logSessionId=e.logSessionId}getDetailedErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your API key configuration":t.includes("rate_limit")||t.includes("Rate limit")||t.includes("429")||t.includes("Too Many Requests")?"Rate limit exceeded. Wait a moment and try again, or upgrade your plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the model name is correct":t.includes("timeout")||t.includes("Timeout")?"Request timed out. Try again or increase the timeout setting":t.includes("network")||t.includes("connection")||t.includes("ECONNREFUSED")?"Network error. Check your internet connection and try again":t.includes("quota")||t.includes("usage")||t.includes("QUOTA_EXCEEDED")?"API quota exceeded. Check your usage limits":t.includes("401")||t.includes("Unauthorized")?"Authentication failed. Your API key may be invalid or expired":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your model configuration":t.includes("500")||t.includes("Internal Server Error")?"Server error. Try again later":t.includes("overloaded")||t.includes("capacity")||t.includes("SERVICE_UNAVAILABLE")||t.includes("unavailable")?"Service is temporarily unavailable. Try again in a few minutes":this.getServiceSpecificErrorMessage(e)||t||"Unknown error occurred"}getServiceSpecificErrorMessage(e){return null}cleanJsonCodeBlock(e){const t=/```(?:json|JSON)?\s*([\s\S]*?)\s*```/,o=e.match(t);return o?o[1].trim():e}parseMessage(e,t,o){const s=this.cleanJsonCodeBlock(e),n=/(\[\s*\{[\s\S]*?\}\s*\]|\{[\s\S]*?\})/,i=s.match(n);if(!i){const p=new Error("AI response did not contain a valid JSON object or array.");throw p.name="InvalidJsonResponse",p.content=e,p}const c=i[0],a=sa(c);if(!a.ok){const p=new Error("Failed to parse AI response as JSON");throw p.name="JsonParseError",p.content=c,p.originalError=a.error,p}const m=a.data,u=Array.isArray(m)?m:[m];if(!u.length||!u.every(p=>typeof p.subject=="string")){const p=new Error("AI response contained malformed commit message data.");throw p.name="MalformedCommitMessage",p.content=e,p}const d=u.map(p=>this.extractMessageAsType(p,t)).map(p=>({title:`${p.subject}`,value:`${p.subject}${p.body?`
15
15
 
16
16
  ${p.body}`:""}${p.footer?`
17
17
 
@@ -62,27 +62,27 @@ Focus on code quality, potential issues, and improvement suggestions.`:`Please a
62
62
  ${r}
63
63
  \`\`\`
64
64
 
65
- Focus on understanding the purpose and impact of these changes to create meaningful commit message(s).`,$a=10*60*1e3;class Ea extends X{constructor(e){super(e),this.params=e,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 ms({apiKey:this.params.config.key,...this.params.config.timeout>$a&&{timeout:this.params.config.timeout}})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Anthropic API key in configuration":t.includes("quota")||t.includes("usage")?"API quota exceeded. Check your Anthropic usage limits":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Claude model name is correct":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Claude model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Claude model configuration":t.includes("500")||t.includes("Internal Server Error")?"Anthropic server error. Try again later":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,temperature:c,locale:a,generate:m,type:u,maxLength:l,maxTokens:d,topP:p,model:g}=this.params.config,h={...W,locale:a,maxLength:l,type:u,generate:m,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},y=e==="review"?Z(h):Q(h),w=Pe(t,e),P=`${this.params.config.url||"https://api.anthropic.com"}/v1/messages`,k={"Content-Type":"application/json","x-api-key":this.params.config.key,"anthropic-version":"2023-06-01"};Y(t,e,"Anthropic",g,P,k,i),V(t,e,"Anthropic",y,w,i);const A={max_tokens:d,temperature:c,system:y,messages:[{role:"user",content:w}],top_p:p,model:g};te(t,e,"Anthropic",A,i);const $=Date.now();try{const x=await this.anthropic.messages.create(A),E=Date.now()-$;q(t,e,"Anthropic",x,i);const N=x.content.map(({text:ae})=>ae).join("");return z(t,e,"Anthropic",E,N,i),e==="review"?this.sanitizeResponse(N):this.parseMessage(N,u,m)}catch(x){throw G(t,e,"Anthropic",x,i),x}}}class De{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=fs.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 xa extends X{constructor(e){super(e),this.params=e,this.apiKey="",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}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Codestral API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Codestral plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Codestral model name is correct":t.includes("Invalid model type")?"Invalid model type. Use supported models: codestral-latest, codestral-2501":t.includes("overloaded")||t.includes("capacity")?"Codestral service is overloaded. Try again in a few minutes":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Codestral model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Codestral model configuration":t.includes("500")||t.includes("Internal Server Error")?"Codestral server error. Try again later":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,generate:a,type:m,maxLength:u}=this.params.config,l={...W,locale:c,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},d=e==="review"?Z(l):Q(l);this.checkAvailableModels();const p=Pe(t,e),h=`${this.params.config.url||"https://codestral.mistral.ai"}/v1/chat/completions`,y={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};Y(t,e,"Codestral",this.params.config.model,h,y,i),V(t,e,"Codestral",d,p,i);const w=await this.createChatCompletions(d,e);return e==="review"?this.sanitizeResponse(w):this.parseMessage(w,m,a)}checkAvailableModels(){if(["codestral-latest","codestral-2501"].includes(this.params.config.model))return!0;throw new Error("Invalid model type of Codestral AI")}async createChatCompletions(e,t){const o=this.params.stagedDiff.diff,{logging:s}=this.params.config,n=this.params.config.url||"https://codestral.mistral.ai",i={model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:Pe(this.params.stagedDiff.diff,t)}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1,safe_prompt:!1,random_seed:et(10,1e3)};t==="commit"&&(i.response_format={type:"json_object"}),te(o,t,"Codestral",i,s);const c=Date.now();try{const m=await new De({method:"POST",baseURL:`${n}/v1/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(i).execute(),u=Date.now()-c,l=m.data;if(q(o,t,"Codestral",l,s),!l.choices||l.choices.length===0||!l.choices[0].message?.content)throw G(o,t,"Codestral",{message:"No Content on response",result:l},s),new Error("No Content on response. Please open a Bug report");const p=l.choices[0].message.content;return z(o,t,"Codestral",u,p,s),p}catch(a){throw G(o,t,"Codestral",a,s),a}}}class Aa extends X{constructor(e){super(e),this.params=e,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 ps({token:this.params.config.key})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Cohere API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Cohere plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Cohere model name is correct":t.includes("overloaded")||t.includes("capacity")?"Cohere service is overloaded. Try again in a few minutes":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Cohere model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Cohere model configuration":t.includes("500")||t.includes("Internal Server Error")?"Cohere server error. Try again later":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,temperature:c,locale:a,generate:m,type:u,maxLength:l,maxTokens:d}=this.params.config,p={...W,locale:a,maxLength:l,type:u,generate:m,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},g=e==="review"?Z(p):Q(p),h=`Here is the diff: ${t}`,w=`${this.params.config.url||"https://api.cohere.ai"}/v1/chat`,b={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};Y(t,e,"Cohere",this.params.config.model,w,b,i),V(t,e,"Cohere",g,h,i);const P={chatHistory:g?[{role:"SYSTEM",message:g}]:[],message:h,connectors:[{id:"web-search"}],maxTokens:d,temperature:c,model:this.params.config.model,seed:et(10,1e3),p:this.params.config.topP};te(t,e,"Cohere",P,i);const k=Date.now();try{const A=await this.cohere.chat(P,{timeoutInSeconds:Math.floor(this.params.config.timeout/1e3)}),$=Date.now()-k,x=A.text;return q(t,e,"Cohere",A,i),z(t,e,"Cohere",$,x,i),e==="review"?this.sanitizeResponse(x):this.parseMessage(x,u,m)}catch(A){throw G(t,e,"Cohere",A,i),A}}}class ka extends X{constructor(e){super(e),this.params=e,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]");const t=this.params.config.url||"https://api.deepseek.com";this.deepSeek=new $r({baseURL:t,apiKey:this.params.config.key})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your DeepSeek API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your DeepSeek plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the DeepSeek model name is correct":t.includes("Invalid model type")?"Invalid model type. Use supported models: deepseek-reasoner, deepseek-chat":t.includes("overloaded")||t.includes("capacity")?"DeepSeek service is overloaded. Try again in a few minutes":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this DeepSeek model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your DeepSeek model configuration":t.includes("500")||t.includes("Internal Server Error")?"DeepSeek server error. Try again later":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,generate:a,type:m,maxLength:u}=this.params.config,l={...W,locale:c,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},d=e==="review"?Z(l):Q(l);this.checkAvailableModels();const p=Pe(t,e),h=`${this.params.config.url||"https://api.deepseek.com"}/chat/completions`,y={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};Y(t,e,"DeepSeek",this.params.config.model,h,y,i),V(t,e,"DeepSeek",d,p,i);const w=await this.createChatCompletions(d,p,e);return e==="review"?this.sanitizeResponse(w):this.parseMessage(w,m,a)}checkAvailableModels(){if(["deepseek-reasoner","deepseek-chat"].includes(this.params.config.model))return!0;throw new Error("Invalid model type of DeepSeek")}async createChatCompletions(e,t,o){const s=this.params.stagedDiff.diff,{logging:n}=this.params.config,i={messages:[{role:"system",content:e},{role:"user",content:t}],model:this.params.config.model,max_tokens:this.params.config.maxTokens,top_p:this.params.config.topP,temperature:this.params.config.temperature};te(s,o,"DeepSeek",i,n);const c=Date.now();try{const a=await this.deepSeek.chat.completions.create(i,{timeout:this.params.config.timeout}),m=Date.now()-c,u=a.choices?.[0];if(!u?.message)throw new Error("DeepSeek API returned invalid response structure");const l=u.message.content||u.message.reasoning_content||"";if(!l)throw new Error("DeepSeek API returned empty response");return q(s,o,"DeepSeek",a,n),z(s,o,"DeepSeek",m,l,n),l}catch(a){throw G(s,o,"DeepSeek",a,n),a}}}class Sa extends X{constructor(e){super(e),this.params=e,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 hs(this.params.config.key)}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Google AI Studio API key in configuration":t.includes("quota")||t.includes("QUOTA_EXCEEDED")?"API quota exceeded. Check your Google AI Studio usage limits":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Gemini model name is correct":t.includes("SAFETY")||t.includes("safety")?"Content blocked by safety filters. Try rephrasing your request":t.includes("RECITATION")||t.includes("recitation")?"Content blocked due to recitation concerns. Try a different approach":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Gemini model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Gemini model configuration":t.includes("500")||t.includes("Internal Server Error")?"Google AI service error. Try again later":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,logging:n,locale:i,codeReviewPromptPath:c,generate:a,type:m,maxLength:u}=this.params.config,l=this.params.config.maxTokens,d={...W,locale:i,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:c},p=e==="review"?Z(d):Q(d),g={maxOutputTokens:l,temperature:this.params.config.temperature,topP:this.params.config.topP},h=this.genAI.getGenerativeModel({model:this.params.config.model,systemInstruction:p,generationConfig:g,safetySettings:[{category:He.HARM_CATEGORY_HATE_SPEECH,threshold:Ue.BLOCK_LOW_AND_ABOVE},{category:He.HARM_CATEGORY_SEXUALLY_EXPLICIT,threshold:Ue.BLOCK_LOW_AND_ABOVE},{category:He.HARM_CATEGORY_HARASSMENT,threshold:Ue.BLOCK_LOW_AND_ABOVE},{category:He.HARM_CATEGORY_DANGEROUS_CONTENT,threshold:Ue.BLOCK_LOW_AND_ABOVE}]}),y=Pe(t,e),b=`${this.params.config.url||"https://generativelanguage.googleapis.com"}/v1beta/models/${this.params.config.model}:generateContent`,P={"Content-Type":"application/json","x-goog-api-key":this.params.config.key};Y(t,e,"Gemini",this.params.config.model,b,P,n),V(t,e,"Gemini",p,y,n),te(t,e,"Gemini",{systemInstruction:{parts:[{text:p}]},contents:[{parts:[{text:y}]}],generationConfig:g},n);const A=Date.now();try{const $=this.params.config.timeout>1e4?{request:{timeout:this.params.config.timeout}}:void 0,x=await h.generateContent(y,$),N=x.response.text(),ae=Date.now()-A;return q(t,e,"Gemini",{response:N,candidates:x.response.candidates,usageMetadata:x.response.usageMetadata},n),z(t,e,"Gemini",ae,N,n),e==="review"?this.sanitizeResponse(N):this.parseMessage(N,m,a)}catch($){throw G(t,e,"Gemini",$,n),$}}}var Ht={},Ut={exports:{}},Fe={exports:{}},zt,Po;function Ma(){if(Po)return zt;Po=1;var r=1e3,e=r*60,t=e*60,o=t*24,s=o*7,n=o*365.25;zt=function(u,l){l=l||{};var d=typeof u;if(d==="string"&&u.length>0)return i(u);if(d==="number"&&isFinite(u))return l.long?a(u):c(u);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(u))};function i(u){if(u=String(u),!(u.length>100)){var l=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(u);if(l){var d=parseFloat(l[1]),p=(l[2]||"ms").toLowerCase();switch(p){case"years":case"year":case"yrs":case"yr":case"y":return d*n;case"weeks":case"week":case"w":return d*s;case"days":case"day":case"d":return d*o;case"hours":case"hour":case"hrs":case"hr":case"h":return d*t;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*r;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return d;default:return}}}}function c(u){var l=Math.abs(u);return l>=o?Math.round(u/o)+"d":l>=t?Math.round(u/t)+"h":l>=e?Math.round(u/e)+"m":l>=r?Math.round(u/r)+"s":u+"ms"}function a(u){var l=Math.abs(u);return l>=o?m(u,l,o,"day"):l>=t?m(u,l,t,"hour"):l>=e?m(u,l,e,"minute"):l>=r?m(u,l,r,"second"):u+" ms"}function m(u,l,d,p){var g=l>=d*1.5;return Math.round(u/d)+" "+p+(g?"s":"")}return zt}var Wt,$o;function Eo(){if($o)return Wt;$o=1;function r(e){o.debug=o,o.default=o,o.coerce=m,o.disable=c,o.enable=n,o.enabled=a,o.humanize=Ma(),o.destroy=u,Object.keys(e).forEach(l=>{o[l]=e[l]}),o.names=[],o.skips=[],o.formatters={};function t(l){let d=0;for(let p=0;p<l.length;p++)d=(d<<5)-d+l.charCodeAt(p),d|=0;return o.colors[Math.abs(d)%o.colors.length]}o.selectColor=t;function o(l){let d,p=null,g,h;function y(...w){if(!y.enabled)return;const b=y,P=Number(new Date),k=P-(d||P);b.diff=k,b.prev=d,b.curr=P,d=P,w[0]=o.coerce(w[0]),typeof w[0]!="string"&&w.unshift("%O");let A=0;w[0]=w[0].replace(/%([a-zA-Z%])/g,(x,E)=>{if(x==="%%")return"%";A++;const N=o.formatters[E];if(typeof N=="function"){const ae=w[A];x=N.call(b,ae),w.splice(A,1),A--}return x}),o.formatArgs.call(b,w),(b.log||o.log).apply(b,w)}return y.namespace=l,y.useColors=o.useColors(),y.color=o.selectColor(l),y.extend=s,y.destroy=o.destroy,Object.defineProperty(y,"enabled",{enumerable:!0,configurable:!1,get:()=>p!==null?p:(g!==o.namespaces&&(g=o.namespaces,h=o.enabled(l)),h),set:w=>{p=w}}),typeof o.init=="function"&&o.init(y),y}function s(l,d){const p=o(this.namespace+(typeof d>"u"?":":d)+l);return p.log=this.log,p}function n(l){o.save(l),o.namespaces=l,o.names=[],o.skips=[];const d=(typeof l=="string"?l:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(const p of d)p[0]==="-"?o.skips.push(p.slice(1)):o.names.push(p)}function i(l,d){let p=0,g=0,h=-1,y=0;for(;p<l.length;)if(g<d.length&&(d[g]===l[p]||d[g]==="*"))d[g]==="*"?(h=g,y=p,g++):(p++,g++);else if(h!==-1)g=h+1,y++,p=y;else return!1;for(;g<d.length&&d[g]==="*";)g++;return g===d.length}function c(){const l=[...o.names,...o.skips.map(d=>"-"+d)].join(",");return o.enable(""),l}function a(l){for(const d of o.skips)if(i(l,d))return!1;for(const d of o.names)if(i(l,d))return!0;return!1}function m(l){return l instanceof Error?l.stack||l.message:l}function u(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return o.enable(o.load()),o}return Wt=r,Wt}Fe.exports;var xo;function Ia(){return xo||(xo=1,function(r,e){e.formatArgs=o,e.save=s,e.load=n,e.useColors=t,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 t(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let a;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(a=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(a[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function o(a){if(a[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+a[0]+(this.useColors?"%c ":" ")+"+"+r.exports.humanize(this.diff),!this.useColors)return;const m="color: "+this.color;a.splice(1,0,m,"color: inherit");let u=0,l=0;a[0].replace(/%[a-zA-Z%]/g,d=>{d!=="%%"&&(u++,d==="%c"&&(l=u))}),a.splice(l,0,m)}e.log=console.debug||console.log||(()=>{});function s(a){try{a?e.storage.setItem("debug",a):e.storage.removeItem("debug")}catch{}}function n(){let a;try{a=e.storage.getItem("debug")||e.storage.getItem("DEBUG")}catch{}return!a&&typeof process<"u"&&"env"in process&&(a=process.env.DEBUG),a}function i(){try{return localStorage}catch{}}r.exports=Eo()(e);const{formatters:c}=r.exports;c.j=function(a){try{return JSON.stringify(a)}catch(m){return"[UnexpectedJSONParseError]: "+m.message}}}(Fe,Fe.exports)),Fe.exports}var Le={exports:{}},Kt,Ao;function Ra(){return Ao||(Ao=1,Kt=(r,e=process.argv)=>{const t=r.startsWith("-")?"":r.length===1?"-":"--",o=e.indexOf(t+r),s=e.indexOf("--");return o!==-1&&(s===-1||o<s)}),Kt}var Jt,ko;function Oa(){if(ko)return Jt;ko=1;const r=xe,e=Er,t=Ra(),{env:o}=process;let s;t("no-color")||t("no-colors")||t("color=false")||t("color=never")?s=0:(t("color")||t("colors")||t("color=true")||t("color=always"))&&(s=1),"FORCE_COLOR"in o&&(o.FORCE_COLOR==="true"?s=1:o.FORCE_COLOR==="false"?s=0:s=o.FORCE_COLOR.length===0?1:Math.min(parseInt(o.FORCE_COLOR,10),3));function n(a){return a===0?!1:{level:a,hasBasic:!0,has256:a>=2,has16m:a>=3}}function i(a,m){if(s===0)return 0;if(t("color=16m")||t("color=full")||t("color=truecolor"))return 3;if(t("color=256"))return 2;if(a&&!m&&s===void 0)return 0;const u=s||0;if(o.TERM==="dumb")return u;if(process.platform==="win32"){const l=r.release().split(".");return Number(l[0])>=10&&Number(l[2])>=10586?Number(l[2])>=14931?3:2:1}if("CI"in o)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(l=>l in o)||o.CI_NAME==="codeship"?1:u;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 l=parseInt((o.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(o.TERM_PROGRAM){case"iTerm.app":return l>=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:u}function c(a){const m=i(a,a&&a.isTTY);return n(m)}return Jt={supportsColor:c,stdout:n(i(!0,e.isatty(1))),stderr:n(i(!0,e.isatty(2)))},Jt}Le.exports;var So;function Da(){return So||(So=1,function(r,e){const t=Er,o=gr;e.init=u,e.log=c,e.formatArgs=n,e.save=a,e.load=m,e.useColors=s,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=Oa();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,p)=>{const g=p.substring(6).toLowerCase().replace(/_([a-z])/g,(y,w)=>w.toUpperCase());let h=process.env[p];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[g]=h,d},{});function s(){return"colors"in e.inspectOpts?!!e.inspectOpts.colors:t.isatty(process.stderr.fd)}function n(d){const{namespace:p,useColors:g}=this;if(g){const h=this.color,y="\x1B[3"+(h<8?h:"8;5;"+h),w=` ${y};1m${p} \x1B[0m`;d[0]=w+d[0].split(`
65
+ Focus on understanding the purpose and impact of these changes to create meaningful commit message(s).`,$a=10*60*1e3;class Ea extends X{constructor(e){super(e),this.params=e,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 ms({apiKey:this.params.config.key,...this.params.config.timeout>$a&&{timeout:this.params.config.timeout}})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Anthropic API key in configuration":t.includes("quota")||t.includes("usage")?"API quota exceeded. Check your Anthropic usage limits":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Claude model name is correct":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Claude model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Claude model configuration":t.includes("500")||t.includes("Internal Server Error")?"Anthropic server error. Try again later":null}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,temperature:c,locale:a,generate:m,type:u,maxLength:l,maxTokens:d,topP:p,model:g}=this.params.config,h={...W,locale:a,maxLength:l,type:u,generate:m,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},y=e==="review"?Z(h):Q(h),w=Pe(t,e),P=`${this.params.config.url||"https://api.anthropic.com"}/v1/messages`,k={"Content-Type":"application/json","x-api-key":this.params.config.key,"anthropic-version":"2023-06-01"};V(t,e,"Anthropic",g,P,k,i),Y(t,e,"Anthropic",y,w,i);const A={max_tokens:d,temperature:c,system:y,messages:[{role:"user",content:w}],top_p:p,model:g};te(t,e,"Anthropic",A,i);const $=Date.now();try{const x=await this.anthropic.messages.create(A),E=Date.now()-$;q(t,e,"Anthropic",x,i);const N=x.content.map(({text:ae})=>ae).join("");return z(t,e,"Anthropic",E,N,i),e==="review"?this.sanitizeResponse(N):this.parseMessage(N,u,m)}catch(x){throw G(t,e,"Anthropic",x,i),x}}}class De{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=fs.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 xa extends X{constructor(e){super(e),this.params=e,this.apiKey="",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}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Codestral API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Codestral plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Codestral model name is correct":t.includes("Invalid model type")?"Invalid model type. Use supported models: codestral-latest, codestral-2501":t.includes("overloaded")||t.includes("capacity")?"Codestral service is overloaded. Try again in a few minutes":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Codestral model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Codestral model configuration":t.includes("500")||t.includes("Internal Server Error")?"Codestral server error. Try again later":null}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,generate:a,type:m,maxLength:u}=this.params.config,l={...W,locale:c,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},d=e==="review"?Z(l):Q(l);this.checkAvailableModels();const p=Pe(t,e),h=`${this.params.config.url||"https://codestral.mistral.ai"}/v1/chat/completions`,y={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};V(t,e,"Codestral",this.params.config.model,h,y,i),Y(t,e,"Codestral",d,p,i);const w=await this.createChatCompletions(d,e);return e==="review"?this.sanitizeResponse(w):this.parseMessage(w,m,a)}checkAvailableModels(){if(["codestral-latest","codestral-2501"].includes(this.params.config.model))return!0;throw new Error("Invalid model type of Codestral AI")}async createChatCompletions(e,t){const o=this.params.stagedDiff.diff,{logging:s}=this.params.config,n=this.params.config.url||"https://codestral.mistral.ai",i={model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:Pe(this.params.stagedDiff.diff,t)}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1,safe_prompt:!1,random_seed:et(10,1e3)};t==="commit"&&(i.response_format={type:"json_object"}),te(o,t,"Codestral",i,s);const c=Date.now();try{const m=await new De({method:"POST",baseURL:`${n}/v1/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(i).execute(),u=Date.now()-c,l=m.data;if(q(o,t,"Codestral",l,s),!l.choices||l.choices.length===0||!l.choices[0].message?.content)throw G(o,t,"Codestral",{message:"No Content on response",result:l},s),new Error("No Content on response. Please open a Bug report");const p=l.choices[0].message.content;return z(o,t,"Codestral",u,p,s),p}catch(a){throw G(o,t,"Codestral",a,s),a}}}class Aa extends X{constructor(e){super(e),this.params=e,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 ps({token:this.params.config.key})}isValidCohereV2Response(e){const t=e;return t?.message?.content!==void 0&&Array.isArray(t.message.content)&&t.message.content.length>0&&typeof t.message.content[0]?.text=="string"}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Cohere API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Cohere plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Cohere model name is correct":t.includes("overloaded")||t.includes("capacity")?"Cohere service is overloaded. Try again in a few minutes":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Cohere model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Cohere model configuration":t.includes("500")||t.includes("Internal Server Error")?"Cohere server error. Try again later":null}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,temperature:c,locale:a,generate:m,type:u,maxLength:l,maxTokens:d}=this.params.config,p={...W,locale:a,maxLength:l,type:u,generate:m,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},g=e==="review"?Z(p):Q(p),h=`Here is the diff: ${t}`,y=[...g?[{role:"system",content:g}]:[],{role:"user",content:h}],b=`${this.params.config.url}/v2/chat`;V(t,e,"Cohere",this.params.config.model,b,{},i),Y(t,e,"Cohere",g,h,i);const P={model:this.params.config.model,messages:y,max_tokens:d,temperature:c,seed:et(10,1e3),p:this.params.config.topP};te(t,e,"Cohere",P,i);const k=Date.now();try{const A=await this.cohere.chat(P,{timeoutInSeconds:Math.floor(this.params.config.timeout/1e3)}),$=Date.now()-k;if(!this.isValidCohereV2Response(A))throw new Error("Invalid response structure from Cohere v2 API");const x=A.message.content[0].text;return q(t,e,"Cohere",A,i),z(t,e,"Cohere",$,x,i),e==="review"?this.sanitizeResponse(x):this.parseMessage(x,u,m)}catch(A){throw G(t,e,"Cohere",A,i),A}}}class ka extends X{constructor(e){super(e),this.params=e,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]");const t=this.params.config.url||"https://api.deepseek.com";this.deepSeek=new $r({baseURL:t,apiKey:this.params.config.key})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your DeepSeek API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your DeepSeek plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the DeepSeek model name is correct":t.includes("Invalid model type")?"Invalid model type. Use supported models: deepseek-reasoner, deepseek-chat":t.includes("overloaded")||t.includes("capacity")?"DeepSeek service is overloaded. Try again in a few minutes":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this DeepSeek model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your DeepSeek model configuration":t.includes("500")||t.includes("Internal Server Error")?"DeepSeek server error. Try again later":null}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,generate:a,type:m,maxLength:u}=this.params.config,l={...W,locale:c,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},d=e==="review"?Z(l):Q(l);this.checkAvailableModels();const p=Pe(t,e),h=`${this.params.config.url||"https://api.deepseek.com"}/chat/completions`,y={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};V(t,e,"DeepSeek",this.params.config.model,h,y,i),Y(t,e,"DeepSeek",d,p,i);const w=await this.createChatCompletions(d,p,e);return e==="review"?this.sanitizeResponse(w):this.parseMessage(w,m,a)}checkAvailableModels(){if(["deepseek-reasoner","deepseek-chat"].includes(this.params.config.model))return!0;throw new Error("Invalid model type of DeepSeek")}async createChatCompletions(e,t,o){const s=this.params.stagedDiff.diff,{logging:n}=this.params.config,i={messages:[{role:"system",content:e},{role:"user",content:t}],model:this.params.config.model,max_tokens:this.params.config.maxTokens,top_p:this.params.config.topP,temperature:this.params.config.temperature};te(s,o,"DeepSeek",i,n);const c=Date.now();try{const a=await this.deepSeek.chat.completions.create(i,{timeout:this.params.config.timeout}),m=Date.now()-c,u=a.choices?.[0];if(!u?.message)throw new Error("DeepSeek API returned invalid response structure");const l=u.message.content||u.message.reasoning_content||"";if(!l)throw new Error("DeepSeek API returned empty response");return q(s,o,"DeepSeek",a,n),z(s,o,"DeepSeek",m,l,n),l}catch(a){throw G(s,o,"DeepSeek",a,n),a}}}class Sa extends X{constructor(e){super(e),this.params=e,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 hs(this.params.config.key)}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Google AI Studio API key in configuration":t.includes("quota")||t.includes("QUOTA_EXCEEDED")?"API quota exceeded. Check your Google AI Studio usage limits":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Gemini model name is correct":t.includes("SAFETY")||t.includes("safety")?"Content blocked by safety filters. Try rephrasing your request":t.includes("RECITATION")||t.includes("recitation")?"Content blocked due to recitation concerns. Try a different approach":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Gemini model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Gemini model configuration":t.includes("500")||t.includes("Internal Server Error")?"Google AI service error. Try again later":null}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,logging:n,locale:i,codeReviewPromptPath:c,generate:a,type:m,maxLength:u}=this.params.config,l=this.params.config.maxTokens,d={...W,locale:i,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:c},p=e==="review"?Z(d):Q(d),g={maxOutputTokens:l,temperature:this.params.config.temperature,topP:this.params.config.topP},h=this.genAI.getGenerativeModel({model:this.params.config.model,systemInstruction:p,generationConfig:g,safetySettings:[{category:He.HARM_CATEGORY_HATE_SPEECH,threshold:Ue.BLOCK_LOW_AND_ABOVE},{category:He.HARM_CATEGORY_SEXUALLY_EXPLICIT,threshold:Ue.BLOCK_LOW_AND_ABOVE},{category:He.HARM_CATEGORY_HARASSMENT,threshold:Ue.BLOCK_LOW_AND_ABOVE},{category:He.HARM_CATEGORY_DANGEROUS_CONTENT,threshold:Ue.BLOCK_LOW_AND_ABOVE}]}),y=Pe(t,e),b=`${this.params.config.url||"https://generativelanguage.googleapis.com"}/v1beta/models/${this.params.config.model}:generateContent`,P={"Content-Type":"application/json","x-goog-api-key":this.params.config.key};V(t,e,"Gemini",this.params.config.model,b,P,n),Y(t,e,"Gemini",p,y,n),te(t,e,"Gemini",{systemInstruction:{parts:[{text:p}]},contents:[{parts:[{text:y}]}],generationConfig:g},n);const A=Date.now();try{const $=this.params.config.timeout>1e4?{request:{timeout:this.params.config.timeout}}:void 0,x=await h.generateContent(y,$),N=x.response.text(),ae=Date.now()-A;return q(t,e,"Gemini",{response:N,candidates:x.response.candidates,usageMetadata:x.response.usageMetadata},n),z(t,e,"Gemini",ae,N,n),e==="review"?this.sanitizeResponse(N):this.parseMessage(N,m,a)}catch($){throw G(t,e,"Gemini",$,n),$}}}var Ht={},Ut={exports:{}},Fe={exports:{}},zt,Po;function Ma(){if(Po)return zt;Po=1;var r=1e3,e=r*60,t=e*60,o=t*24,s=o*7,n=o*365.25;zt=function(u,l){l=l||{};var d=typeof u;if(d==="string"&&u.length>0)return i(u);if(d==="number"&&isFinite(u))return l.long?a(u):c(u);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(u))};function i(u){if(u=String(u),!(u.length>100)){var l=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(u);if(l){var d=parseFloat(l[1]),p=(l[2]||"ms").toLowerCase();switch(p){case"years":case"year":case"yrs":case"yr":case"y":return d*n;case"weeks":case"week":case"w":return d*s;case"days":case"day":case"d":return d*o;case"hours":case"hour":case"hrs":case"hr":case"h":return d*t;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*r;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return d;default:return}}}}function c(u){var l=Math.abs(u);return l>=o?Math.round(u/o)+"d":l>=t?Math.round(u/t)+"h":l>=e?Math.round(u/e)+"m":l>=r?Math.round(u/r)+"s":u+"ms"}function a(u){var l=Math.abs(u);return l>=o?m(u,l,o,"day"):l>=t?m(u,l,t,"hour"):l>=e?m(u,l,e,"minute"):l>=r?m(u,l,r,"second"):u+" ms"}function m(u,l,d,p){var g=l>=d*1.5;return Math.round(u/d)+" "+p+(g?"s":"")}return zt}var Wt,$o;function Eo(){if($o)return Wt;$o=1;function r(e){o.debug=o,o.default=o,o.coerce=m,o.disable=c,o.enable=n,o.enabled=a,o.humanize=Ma(),o.destroy=u,Object.keys(e).forEach(l=>{o[l]=e[l]}),o.names=[],o.skips=[],o.formatters={};function t(l){let d=0;for(let p=0;p<l.length;p++)d=(d<<5)-d+l.charCodeAt(p),d|=0;return o.colors[Math.abs(d)%o.colors.length]}o.selectColor=t;function o(l){let d,p=null,g,h;function y(...w){if(!y.enabled)return;const b=y,P=Number(new Date),k=P-(d||P);b.diff=k,b.prev=d,b.curr=P,d=P,w[0]=o.coerce(w[0]),typeof w[0]!="string"&&w.unshift("%O");let A=0;w[0]=w[0].replace(/%([a-zA-Z%])/g,(x,E)=>{if(x==="%%")return"%";A++;const N=o.formatters[E];if(typeof N=="function"){const ae=w[A];x=N.call(b,ae),w.splice(A,1),A--}return x}),o.formatArgs.call(b,w),(b.log||o.log).apply(b,w)}return y.namespace=l,y.useColors=o.useColors(),y.color=o.selectColor(l),y.extend=s,y.destroy=o.destroy,Object.defineProperty(y,"enabled",{enumerable:!0,configurable:!1,get:()=>p!==null?p:(g!==o.namespaces&&(g=o.namespaces,h=o.enabled(l)),h),set:w=>{p=w}}),typeof o.init=="function"&&o.init(y),y}function s(l,d){const p=o(this.namespace+(typeof d>"u"?":":d)+l);return p.log=this.log,p}function n(l){o.save(l),o.namespaces=l,o.names=[],o.skips=[];const d=(typeof l=="string"?l:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(const p of d)p[0]==="-"?o.skips.push(p.slice(1)):o.names.push(p)}function i(l,d){let p=0,g=0,h=-1,y=0;for(;p<l.length;)if(g<d.length&&(d[g]===l[p]||d[g]==="*"))d[g]==="*"?(h=g,y=p,g++):(p++,g++);else if(h!==-1)g=h+1,y++,p=y;else return!1;for(;g<d.length&&d[g]==="*";)g++;return g===d.length}function c(){const l=[...o.names,...o.skips.map(d=>"-"+d)].join(",");return o.enable(""),l}function a(l){for(const d of o.skips)if(i(l,d))return!1;for(const d of o.names)if(i(l,d))return!0;return!1}function m(l){return l instanceof Error?l.stack||l.message:l}function u(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return o.enable(o.load()),o}return Wt=r,Wt}Fe.exports;var xo;function Ia(){return xo||(xo=1,function(r,e){e.formatArgs=o,e.save=s,e.load=n,e.useColors=t,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 t(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let a;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(a=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(a[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function o(a){if(a[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+a[0]+(this.useColors?"%c ":" ")+"+"+r.exports.humanize(this.diff),!this.useColors)return;const m="color: "+this.color;a.splice(1,0,m,"color: inherit");let u=0,l=0;a[0].replace(/%[a-zA-Z%]/g,d=>{d!=="%%"&&(u++,d==="%c"&&(l=u))}),a.splice(l,0,m)}e.log=console.debug||console.log||(()=>{});function s(a){try{a?e.storage.setItem("debug",a):e.storage.removeItem("debug")}catch{}}function n(){let a;try{a=e.storage.getItem("debug")||e.storage.getItem("DEBUG")}catch{}return!a&&typeof process<"u"&&"env"in process&&(a=process.env.DEBUG),a}function i(){try{return localStorage}catch{}}r.exports=Eo()(e);const{formatters:c}=r.exports;c.j=function(a){try{return JSON.stringify(a)}catch(m){return"[UnexpectedJSONParseError]: "+m.message}}}(Fe,Fe.exports)),Fe.exports}var Le={exports:{}},Kt,Ao;function Ra(){return Ao||(Ao=1,Kt=(r,e=process.argv)=>{const t=r.startsWith("-")?"":r.length===1?"-":"--",o=e.indexOf(t+r),s=e.indexOf("--");return o!==-1&&(s===-1||o<s)}),Kt}var Jt,ko;function Oa(){if(ko)return Jt;ko=1;const r=xe,e=Er,t=Ra(),{env:o}=process;let s;t("no-color")||t("no-colors")||t("color=false")||t("color=never")?s=0:(t("color")||t("colors")||t("color=true")||t("color=always"))&&(s=1),"FORCE_COLOR"in o&&(o.FORCE_COLOR==="true"?s=1:o.FORCE_COLOR==="false"?s=0:s=o.FORCE_COLOR.length===0?1:Math.min(parseInt(o.FORCE_COLOR,10),3));function n(a){return a===0?!1:{level:a,hasBasic:!0,has256:a>=2,has16m:a>=3}}function i(a,m){if(s===0)return 0;if(t("color=16m")||t("color=full")||t("color=truecolor"))return 3;if(t("color=256"))return 2;if(a&&!m&&s===void 0)return 0;const u=s||0;if(o.TERM==="dumb")return u;if(process.platform==="win32"){const l=r.release().split(".");return Number(l[0])>=10&&Number(l[2])>=10586?Number(l[2])>=14931?3:2:1}if("CI"in o)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(l=>l in o)||o.CI_NAME==="codeship"?1:u;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 l=parseInt((o.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(o.TERM_PROGRAM){case"iTerm.app":return l>=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:u}function c(a){const m=i(a,a&&a.isTTY);return n(m)}return Jt={supportsColor:c,stdout:n(i(!0,e.isatty(1))),stderr:n(i(!0,e.isatty(2)))},Jt}Le.exports;var So;function Da(){return So||(So=1,function(r,e){const t=Er,o=gr;e.init=u,e.log=c,e.formatArgs=n,e.save=a,e.load=m,e.useColors=s,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=Oa();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,p)=>{const g=p.substring(6).toLowerCase().replace(/_([a-z])/g,(y,w)=>w.toUpperCase());let h=process.env[p];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[g]=h,d},{});function s(){return"colors"in e.inspectOpts?!!e.inspectOpts.colors:t.isatty(process.stderr.fd)}function n(d){const{namespace:p,useColors:g}=this;if(g){const h=this.color,y="\x1B[3"+(h<8?h:"8;5;"+h),w=` ${y};1m${p} \x1B[0m`;d[0]=w+d[0].split(`
66
66
  `).join(`
67
67
  `+w),d.push(y+"m+"+r.exports.humanize(this.diff)+"\x1B[0m")}else d[0]=i()+p+" "+d[0]}function i(){return e.inspectOpts.hideDate?"":new Date().toISOString()+" "}function c(...d){return process.stderr.write(o.formatWithOptions(e.inspectOpts,...d)+`
68
68
  `)}function a(d){d?process.env.DEBUG=d:delete process.env.DEBUG}function m(){return process.env.DEBUG}function u(d){d.inspectOpts={};const p=Object.keys(e.inspectOpts);for(let g=0;g<p.length;g++)d.inspectOpts[p[g]]=e.inspectOpts[p[g]]}r.exports=Eo()(e);const{formatters:l}=r.exports;l.o=function(d){return this.inspectOpts.colors=this.useColors,o.inspect(d,this.inspectOpts).split(`
69
- `).map(p=>p.trim()).join(" ")},l.O=function(d){return this.inspectOpts.colors=this.useColors,o.inspect(d,this.inspectOpts)}}(Le,Le.exports)),Le.exports}typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?Ut.exports=Ia():Ut.exports=Da();var Yt=Ut.exports,Vt={};Object.defineProperty(Vt,"__esModule",{value:!0});function Fa(r){return function(e,t){return new Promise((o,s)=>{r.call(this,e,t,(n,i)=>{n?s(n):o(i)})})}}Vt.default=Fa;var Mo=_&&_.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};const La=hr,Ta=Mo(Yt),ja=Mo(Vt),Te=Ta.default("agent-base");function Na(r){return!!r&&typeof r.addRequest=="function"}function qt(){const{stack:r}=new Error;return typeof r!="string"?!1:r.split(`
70
- `).some(e=>e.indexOf("(https.js:")!==-1||e.indexOf("node:https:")!==-1)}function it(r,e){return new it.Agent(r,e)}(function(r){class e extends La.EventEmitter{constructor(o,s){super();let n=s;typeof o=="function"?this.callback=o:o&&(n=o),this.timeout=null,n&&typeof n.timeout=="number"&&(this.timeout=n.timeout),this.maxFreeSockets=1,this.maxSockets=1,this.maxTotalSockets=1/0,this.sockets={},this.freeSockets={},this.requests={},this.options={}}get defaultPort(){return typeof this.explicitDefaultPort=="number"?this.explicitDefaultPort:qt()?443:80}set defaultPort(o){this.explicitDefaultPort=o}get protocol(){return typeof this.explicitProtocol=="string"?this.explicitProtocol:qt()?"https:":"http:"}set protocol(o){this.explicitProtocol=o}callback(o,s,n){throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`')}addRequest(o,s){const n=Object.assign({},s);typeof n.secureEndpoint!="boolean"&&(n.secureEndpoint=qt()),n.host==null&&(n.host="localhost"),n.port==null&&(n.port=n.secureEndpoint?443:80),n.protocol==null&&(n.protocol=n.secureEndpoint?"https:":"http:"),n.host&&n.path&&delete n.path,delete n.agent,delete n.hostname,delete n._defaultAgent,delete n.defaultPort,delete n.createConnection,o._last=!0,o.shouldKeepAlive=!1;let i=!1,c=null;const a=n.timeout||this.timeout,m=p=>{o._hadError||(o.emit("error",p),o._hadError=!0)},u=()=>{c=null,i=!0;const p=new Error(`A "socket" was not created for HTTP request before ${a}ms`);p.code="ETIMEOUT",m(p)},l=p=>{i||(c!==null&&(clearTimeout(c),c=null),m(p))},d=p=>{if(i)return;if(c!=null&&(clearTimeout(c),c=null),Na(p)){Te("Callback returned another Agent instance %o",p.constructor.name),p.addRequest(o,n);return}if(p){p.once("free",()=>{this.freeSocket(p,n)}),o.onSocket(p);return}const g=new Error(`no Duplex stream was returned to agent-base for \`${o.method} ${o.path}\``);m(g)};if(typeof this.callback!="function"){m(new Error("`callback` is not defined"));return}this.promisifiedCallback||(this.callback.length>=3?(Te("Converting legacy callback function to promise"),this.promisifiedCallback=ja.default(this.callback)):this.promisifiedCallback=this.callback),typeof a=="number"&&a>0&&(c=setTimeout(u,a)),"port"in n&&typeof n.port!="number"&&(n.port=Number(n.port));try{Te("Resolving socket for %o request: %o",n.protocol,`${o.method} ${o.path}`),Promise.resolve(this.promisifiedCallback(o,n)).then(d,l)}catch(p){Promise.reject(p).catch(l)}}freeSocket(o,s){Te("Freeing socket %o %o",o.constructor.name,s),o.destroy()}destroy(){Te("Destroying agent %o",this.constructor.name)}}r.Agent=e,r.prototype=r.Agent.prototype})(it||(it={}));var Ga=it,Xt={},_a=_&&_.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Xt,"__esModule",{value:!0});const Ba=_a(Yt),je=Ba.default("https-proxy-agent:parse-proxy-response");function Ha(r){return new Promise((e,t)=>{let o=0;const s=[];function n(){const l=r.read();l?u(l):r.once("readable",n)}function i(){r.removeListener("end",a),r.removeListener("error",m),r.removeListener("close",c),r.removeListener("readable",n)}function c(l){je("onclose had error %o",l)}function a(){je("onend")}function m(l){i(),je("onerror %o",l),t(l)}function u(l){s.push(l),o+=l.length;const d=Buffer.concat(s,o);if(d.indexOf(`\r
69
+ `).map(p=>p.trim()).join(" ")},l.O=function(d){return this.inspectOpts.colors=this.useColors,o.inspect(d,this.inspectOpts)}}(Le,Le.exports)),Le.exports}typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?Ut.exports=Ia():Ut.exports=Da();var Vt=Ut.exports,Yt={};Object.defineProperty(Yt,"__esModule",{value:!0});function Fa(r){return function(e,t){return new Promise((o,s)=>{r.call(this,e,t,(n,i)=>{n?s(n):o(i)})})}}Yt.default=Fa;var Mo=_&&_.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};const La=hr,Ta=Mo(Vt),ja=Mo(Yt),Te=Ta.default("agent-base");function Na(r){return!!r&&typeof r.addRequest=="function"}function qt(){const{stack:r}=new Error;return typeof r!="string"?!1:r.split(`
70
+ `).some(e=>e.indexOf("(https.js:")!==-1||e.indexOf("node:https:")!==-1)}function it(r,e){return new it.Agent(r,e)}(function(r){class e extends La.EventEmitter{constructor(o,s){super();let n=s;typeof o=="function"?this.callback=o:o&&(n=o),this.timeout=null,n&&typeof n.timeout=="number"&&(this.timeout=n.timeout),this.maxFreeSockets=1,this.maxSockets=1,this.maxTotalSockets=1/0,this.sockets={},this.freeSockets={},this.requests={},this.options={}}get defaultPort(){return typeof this.explicitDefaultPort=="number"?this.explicitDefaultPort:qt()?443:80}set defaultPort(o){this.explicitDefaultPort=o}get protocol(){return typeof this.explicitProtocol=="string"?this.explicitProtocol:qt()?"https:":"http:"}set protocol(o){this.explicitProtocol=o}callback(o,s,n){throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`')}addRequest(o,s){const n=Object.assign({},s);typeof n.secureEndpoint!="boolean"&&(n.secureEndpoint=qt()),n.host==null&&(n.host="localhost"),n.port==null&&(n.port=n.secureEndpoint?443:80),n.protocol==null&&(n.protocol=n.secureEndpoint?"https:":"http:"),n.host&&n.path&&delete n.path,delete n.agent,delete n.hostname,delete n._defaultAgent,delete n.defaultPort,delete n.createConnection,o._last=!0,o.shouldKeepAlive=!1;let i=!1,c=null;const a=n.timeout||this.timeout,m=p=>{o._hadError||(o.emit("error",p),o._hadError=!0)},u=()=>{c=null,i=!0;const p=new Error(`A "socket" was not created for HTTP request before ${a}ms`);p.code="ETIMEOUT",m(p)},l=p=>{i||(c!==null&&(clearTimeout(c),c=null),m(p))},d=p=>{if(i)return;if(c!=null&&(clearTimeout(c),c=null),Na(p)){Te("Callback returned another Agent instance %o",p.constructor.name),p.addRequest(o,n);return}if(p){p.once("free",()=>{this.freeSocket(p,n)}),o.onSocket(p);return}const g=new Error(`no Duplex stream was returned to agent-base for \`${o.method} ${o.path}\``);m(g)};if(typeof this.callback!="function"){m(new Error("`callback` is not defined"));return}this.promisifiedCallback||(this.callback.length>=3?(Te("Converting legacy callback function to promise"),this.promisifiedCallback=ja.default(this.callback)):this.promisifiedCallback=this.callback),typeof a=="number"&&a>0&&(c=setTimeout(u,a)),"port"in n&&typeof n.port!="number"&&(n.port=Number(n.port));try{Te("Resolving socket for %o request: %o",n.protocol,`${o.method} ${o.path}`),Promise.resolve(this.promisifiedCallback(o,n)).then(d,l)}catch(p){Promise.reject(p).catch(l)}}freeSocket(o,s){Te("Freeing socket %o %o",o.constructor.name,s),o.destroy()}destroy(){Te("Destroying agent %o",this.constructor.name)}}r.Agent=e,r.prototype=r.Agent.prototype})(it||(it={}));var Ga=it,Xt={},_a=_&&_.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Xt,"__esModule",{value:!0});const Ba=_a(Vt),je=Ba.default("https-proxy-agent:parse-proxy-response");function Ha(r){return new Promise((e,t)=>{let o=0;const s=[];function n(){const l=r.read();l?u(l):r.once("readable",n)}function i(){r.removeListener("end",a),r.removeListener("error",m),r.removeListener("close",c),r.removeListener("readable",n)}function c(l){je("onclose had error %o",l)}function a(){je("onend")}function m(l){i(),je("onerror %o",l),t(l)}function u(l){s.push(l),o+=l.length;const d=Buffer.concat(s,o);if(d.indexOf(`\r
71
71
  \r
72
72
  `)===-1){je("have not received end of HTTP headers yet..."),n();return}const g=d.toString("ascii",0,d.indexOf(`\r
73
- `)),h=+g.split(" ")[1];je("got proxy server response: %o",g),e({statusCode:h,buffered:d})}r.on("error",m),r.on("close",c),r.on("end",a),n()})}Xt.default=Ha;var Ua=_&&_.__awaiter||function(r,e,t,o){function s(n){return n instanceof t?n:new t(function(i){i(n)})}return new(t||(t=Promise))(function(n,i){function c(u){try{m(o.next(u))}catch(l){i(l)}}function a(u){try{m(o.throw(u))}catch(l){i(l)}}function m(u){u.done?n(u.value):s(u.value).then(c,a)}m((o=o.apply(r,e||[])).next())})},$e=_&&_.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ht,"__esModule",{value:!0});const Io=$e(ws),Ro=$e(vs),za=$e(bs),Wa=$e(pr),Ka=$e(Yt),Ja=Ga,Ya=$e(Xt),Ne=Ka.default("https-proxy-agent:agent");class Va extends Ja.Agent{constructor(e){let t;if(typeof e=="string"?t=za.default.parse(e):t=e,!t)throw new Error("an HTTP(S) proxy server `host` and `port` must be specified!");Ne("creating new HttpsProxyAgent instance: %o",t),super(t);const o=Object.assign({},t);this.secureProxy=t.secureProxy||Qa(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,t){return Ua(this,void 0,void 0,function*(){const{proxy:o,secureProxy:s}=this;let n;s?(Ne("Creating `tls.Socket`: %o",o),n=Ro.default.connect(o)):(Ne("Creating `net.Socket`: %o",o),n=Io.default.connect(o));const i=Object.assign({},o.headers);let a=`CONNECT ${`${t.host}:${t.port}`} HTTP/1.1\r
73
+ `)),h=+g.split(" ")[1];je("got proxy server response: %o",g),e({statusCode:h,buffered:d})}r.on("error",m),r.on("close",c),r.on("end",a),n()})}Xt.default=Ha;var Ua=_&&_.__awaiter||function(r,e,t,o){function s(n){return n instanceof t?n:new t(function(i){i(n)})}return new(t||(t=Promise))(function(n,i){function c(u){try{m(o.next(u))}catch(l){i(l)}}function a(u){try{m(o.throw(u))}catch(l){i(l)}}function m(u){u.done?n(u.value):s(u.value).then(c,a)}m((o=o.apply(r,e||[])).next())})},$e=_&&_.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ht,"__esModule",{value:!0});const Io=$e(ws),Ro=$e(vs),za=$e(bs),Wa=$e(pr),Ka=$e(Vt),Ja=Ga,Va=$e(Xt),Ne=Ka.default("https-proxy-agent:agent");class Ya extends Ja.Agent{constructor(e){let t;if(typeof e=="string"?t=za.default.parse(e):t=e,!t)throw new Error("an HTTP(S) proxy server `host` and `port` must be specified!");Ne("creating new HttpsProxyAgent instance: %o",t),super(t);const o=Object.assign({},t);this.secureProxy=t.secureProxy||Qa(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,t){return Ua(this,void 0,void 0,function*(){const{proxy:o,secureProxy:s}=this;let n;s?(Ne("Creating `tls.Socket`: %o",o),n=Ro.default.connect(o)):(Ne("Creating `net.Socket`: %o",o),n=Io.default.connect(o));const i=Object.assign({},o.headers);let a=`CONNECT ${`${t.host}:${t.port}`} HTTP/1.1\r
74
74
  `;o.auth&&(i["Proxy-Authorization"]=`Basic ${Buffer.from(o.auth).toString("base64")}`);let{host:m,port:u,secureEndpoint:l}=t;Xa(u,l)||(m+=`:${u}`),i.Host=m,i.Connection="close";for(const y of Object.keys(i))a+=`${y}: ${i[y]}\r
75
- `;const d=Ya.default(n);n.write(`${a}\r
76
- `);const{statusCode:p,buffered:g}=yield d;if(p===200){if(e.once("socket",qa),t.secureEndpoint){Ne("Upgrading socket connection to TLS");const y=t.servername||t.host;return Ro.default.connect(Object.assign(Object.assign({},Za(t,"host","hostname","path","port")),{socket:n,servername:y}))}return n}n.destroy();const h=new Io.default.Socket({writable:!1});return h.readable=!0,e.once("socket",y=>{Ne("replaying proxy buffer for failed request"),Wa.default(y.listenerCount("data")>0),y.push(g),y.push(null)}),h})}}Ht.default=Va;function qa(r){r.resume()}function Xa(r,e){return!!(!e&&r===80||e&&r===443)}function Qa(r){return typeof r=="string"?/^https:?$/i.test(r):!1}function Za(r,...e){const t={};let o;for(o in r)e.includes(o)||(t[o]=r[o]);return t}var ec=_&&_.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};const Qt=ec(Ht);function Zt(r){return new Qt.default(r)}(function(r){r.HttpsProxyAgent=Qt.default,r.prototype=Qt.default.prototype})(Zt||(Zt={}));var tc=Zt,rc=me(tc);const oc=async(r,e,t,o,s,n,i)=>new Promise((c,a)=>{const m=JSON.stringify(o),l=(r.protocol.includes("https")?ys:gs).request({port:i||void 0,hostname:r.hostname,path:e,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(m),...t},timeout:s,agent:n?rc(n):void 0},d=>{const p=[];d.on("data",g=>p.push(g)),d.on("end",()=>{c({request:l,response:d,data:Buffer.concat(p).toString()})})});l.on("error",a),l.on("timeout",()=>{l.destroy(),a(new v(`Time out error: request took over ${s}ms. Try increasing the \`timeout\` config`))}),l.write(m),l.end()}),sc=async(r,e,t,o,s,n)=>{const i=new URL(r),{response:c,data:a}=await oc(i,e,{Authorization:`Bearer ${t}`},o,s,n);if(!c.statusCode||c.statusCode<200||c.statusCode>299){let m=`API Error: ${c.statusCode} - ${c.statusMessage}`;throw a&&(m+=`
75
+ `;const d=Va.default(n);n.write(`${a}\r
76
+ `);const{statusCode:p,buffered:g}=yield d;if(p===200){if(e.once("socket",qa),t.secureEndpoint){Ne("Upgrading socket connection to TLS");const y=t.servername||t.host;return Ro.default.connect(Object.assign(Object.assign({},Za(t,"host","hostname","path","port")),{socket:n,servername:y}))}return n}n.destroy();const h=new Io.default.Socket({writable:!1});return h.readable=!0,e.once("socket",y=>{Ne("replaying proxy buffer for failed request"),Wa.default(y.listenerCount("data")>0),y.push(g),y.push(null)}),h})}}Ht.default=Ya;function qa(r){r.resume()}function Xa(r,e){return!!(!e&&r===80||e&&r===443)}function Qa(r){return typeof r=="string"?/^https:?$/i.test(r):!1}function Za(r,...e){const t={};let o;for(o in r)e.includes(o)||(t[o]=r[o]);return t}var ec=_&&_.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};const Qt=ec(Ht);function Zt(r){return new Qt.default(r)}(function(r){r.HttpsProxyAgent=Qt.default,r.prototype=Qt.default.prototype})(Zt||(Zt={}));var tc=Zt,rc=me(tc);const oc=async(r,e,t,o,s,n,i)=>new Promise((c,a)=>{const m=JSON.stringify(o),l=(r.protocol.includes("https")?ys:gs).request({port:i||void 0,hostname:r.hostname,path:e,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(m),...t},timeout:s,agent:n?rc(n):void 0},d=>{const p=[];d.on("data",g=>p.push(g)),d.on("end",()=>{c({request:l,response:d,data:Buffer.concat(p).toString()})})});l.on("error",a),l.on("timeout",()=>{l.destroy(),a(new v(`Time out error: request took over ${s}ms. Try increasing the \`timeout\` config`))}),l.write(m),l.end()}),sc=async(r,e,t,o,s,n)=>{const i=new URL(r),{response:c,data:a}=await oc(i,e,{Authorization:`Bearer ${t}`},o,s,n);if(!c.statusCode||c.statusCode<200||c.statusCode>299){let m=`API Error: ${c.statusCode} - ${c.statusMessage}`;throw a&&(m+=`
77
77
 
78
78
  ${a}`),c.statusCode===500&&(m+=`
79
79
 
80
- Check the API status: ${r}`),new v(m)}return JSON.parse(a)},Oo=r=>r.trim(),nc=["gpt-5","gpt-5-mini","gpt-5-nano","gpt-5-codex"],er=r=>nc.some(e=>r===e||r.startsWith(`${e}-`)),ic=async(r,e,t,o,s,n,i,c,a,m,u,l,d,p)=>{try{const g=Pe(n,d),h=er(s),y={model:s,messages:[{role:"system",content:u},{role:"user",content:g}],stream:!1,n:1,frequency_penalty:0,presence_penalty:0,...h?{max_completion_tokens:c,temperature:1}:{max_tokens:c,top_p:m,temperature:a}},w=new URL(e),b=`${w.protocol}//${w.host}${t}`,P={Authorization:`Bearer ${o}`,"Content-Type":"application/json"};Y(n,d,r,s,b,P,l),V(n,d,r,u,g,l),te(n,d,r,y,l);const k=Date.now(),A=await sc(e,t,o,y,i,p),$=Date.now()-k;q(n,d,r,A,l);const x=A.choices.filter(E=>E.message?.content).map(E=>Oo(E.message.content)).join();return z(n,d,r,$,x,l),A.choices.filter(E=>E.message?.content).map(E=>Oo(E.message.content))}catch(g){G(n,d,r,g,l);const h=g;throw h.code==="ENOTFOUND"?new v(`Error connecting to ${h.hostname} (${h.syscall})`):h}};class ac extends X{constructor(e){super(e),this.params=e,this.baseURL="https://models.github.ai",this.colors={primary:"#24292e",secondary:"#FFF"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[GitHub Models]"),this.errorPrefix=C.red.bold("[GitHub Models]")}getServiceSpecificErrorMessage(e){switch(e.code){case"MISSING_TOKEN":return"GitHub token is required. Run: aicommit2 github-login";case"AUTHENTICATION_FAILED":return"Authentication failed. Your GitHub token may be expired or invalid. Run: aicommit2 github-login";case"ACCESS_DENIED":return'Access denied. Make sure your GitHub token has "Models" permission in GitHub settings';case"NO_CONTENT":return"No content received from GitHub Models. The model may have failed to generate a response";default:return null}}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){if(!this.params.config.key){const p=new Error("GitHub token is required for GitHub Models. Use: aicommit2 github-login");throw p.code="MISSING_TOKEN",p}const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,locale:i,generate:c,type:a,maxLength:m}=this.params.config,u={...W,locale:i,maxLength:m,type:a,generate:c,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},l=e==="review"?Z(u):Q(u),d=await this.makeRequest(l,t,e);return e==="review"?this.sanitizeResponse(d):this.parseMessage(d,a,c)}async makeRequest(e,t,o){const s=Array.isArray(this.params.config.model)?this.params.config.model[0]:this.params.config.model||"gpt-4o-mini",n=[{role:"system",content:e},{role:"user",content:o==="review"?t:`Here's the diff:
80
+ Check the API status: ${r}`),new v(m)}return JSON.parse(a)},Oo=r=>r.trim(),nc=["gpt-5","gpt-5-mini","gpt-5-nano","gpt-5-codex"],er=r=>nc.some(e=>r===e||r.startsWith(`${e}-`)),ic=async(r,e,t,o,s,n,i,c,a,m,u,l,d,p)=>{try{const g=Pe(n,d),h=er(s),y={model:s,messages:[{role:"system",content:u},{role:"user",content:g}],stream:!1,n:1,frequency_penalty:0,presence_penalty:0,...h?{max_completion_tokens:c,temperature:1}:{max_tokens:c,top_p:m,temperature:a}},w=new URL(e),b=`${w.protocol}//${w.host}${t}`,P={Authorization:`Bearer ${o}`,"Content-Type":"application/json"};V(n,d,r,s,b,P,l),Y(n,d,r,u,g,l),te(n,d,r,y,l);const k=Date.now(),A=await sc(e,t,o,y,i,p),$=Date.now()-k;q(n,d,r,A,l);const x=A.choices.filter(E=>E.message?.content).map(E=>Oo(E.message.content)).join();return z(n,d,r,$,x,l),A.choices.filter(E=>E.message?.content).map(E=>Oo(E.message.content))}catch(g){G(n,d,r,g,l);const h=g;throw h.code==="ENOTFOUND"?new v(`Error connecting to ${h.hostname} (${h.syscall})`):h}};class ac extends X{constructor(e){super(e),this.params=e,this.baseURL="https://models.github.ai",this.colors={primary:"#24292e",secondary:"#FFF"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[GitHub Models]"),this.errorPrefix=C.red.bold("[GitHub Models]")}getServiceSpecificErrorMessage(e){switch(e.code){case"MISSING_TOKEN":return"GitHub token is required. Run: aicommit2 github-login";case"AUTHENTICATION_FAILED":return"Authentication failed. Your GitHub token may be expired or invalid. Run: aicommit2 github-login";case"ACCESS_DENIED":return'Access denied. Make sure your GitHub token has "Models" permission in GitHub settings';case"NO_CONTENT":return"No content received from GitHub Models. The model may have failed to generate a response";default:return null}}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){if(!this.params.config.key){const p=new Error("GitHub token is required for GitHub Models. Use: aicommit2 github-login");throw p.code="MISSING_TOKEN",p}const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,locale:i,generate:c,type:a,maxLength:m}=this.params.config,u={...W,locale:i,maxLength:m,type:a,generate:c,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},l=e==="review"?Z(u):Q(u),d=await this.makeRequest(l,t,e);return e==="review"?this.sanitizeResponse(d):this.parseMessage(d,a,c)}async makeRequest(e,t,o){const s=Array.isArray(this.params.config.model)?this.params.config.model[0]:this.params.config.model||"gpt-4o-mini",n=[{role:"system",content:e},{role:"user",content:o==="review"?t:`Here's the diff:
81
81
 
82
- ${t}`}],i=er(s),c={messages:n,model:s,stream:!1,...i?{max_completion_tokens:this.params.config.maxTokens||1024,temperature:1}:{max_tokens:this.params.config.maxTokens||1024,top_p:this.params.config.topP||.95,temperature:this.params.config.temperature||.7}},a=`${this.baseURL}/inference/chat/completions`,m={"Content-Type":"application/json",Accept:"application/vnd.github+json",Authorization:`Bearer ${this.params.config.key}`},{logging:u}=this.params.config;Y(t,o,"GitHub Models",s,a,m,u),V(t,o,"GitHub Models",e,o==="review"?t:`Here's the diff:
82
+ ${t}`}],i=er(s),c={messages:n,model:s,stream:!1,...i?{max_completion_tokens:this.params.config.maxTokens||1024,temperature:1}:{max_tokens:this.params.config.maxTokens||1024,top_p:this.params.config.topP||.95,temperature:this.params.config.temperature||.7}},a=`${this.baseURL}/inference/chat/completions`,m={"Content-Type":"application/json",Accept:"application/vnd.github+json",Authorization:`Bearer ${this.params.config.key}`},{logging:u}=this.params.config;V(t,o,"GitHub Models",s,a,m,u),Y(t,o,"GitHub Models",e,o==="review"?t:`Here's the diff:
83
83
 
84
- ${t}`,u),te(t,o,"GitHub Models",c,u);const l=new AbortController,d=setTimeout(()=>l.abort(),this.params.config.timeout);try{const p=Date.now(),g=await fetch(a,{method:"POST",headers:m,body:JSON.stringify(c),signal:l.signal});if(clearTimeout(d),!g.ok){const b=await g.text(),P={status:g.status,statusText:g.statusText,url:a,headers:Object.fromEntries(g.headers),body:b};G(t,o,"GitHub Models",P,u);let k=`GitHub API request failed: ${g.status} ${g.statusText}`;try{const $=JSON.parse(b);$.error?.message?k+=` - ${$.error.message}`:$.message&&(k+=` - ${$.message}`)}catch{b&&(k+=` - ${b}`)}if(g.status===401){const $=new Error("GitHub authentication failed. Please run: aicommit2 github-login");throw $.status=g.status,$.code="AUTHENTICATION_FAILED",$.content=b,$}else if(g.status===403){const $=new Error('GitHub Models access denied. Make sure your token has "Models" permission.');throw $.status=g.status,$.code="ACCESS_DENIED",$.content=b,$}else if(g.status===404){const $=new Error(`Model "${s}" not found. Please check the model name.`);throw $.status=g.status,$.code="MODEL_NOT_FOUND",$.content=b,$}else if(g.status===429){const $=new Error("Rate limit exceeded. Please try again later.");throw $.status=g.status,$.code="RATE_LIMIT_EXCEEDED",$.content=b,$}const A=new Error(k);throw A.status=g.status,A.code="API_ERROR",A.content=b,A}const h=await g.json(),y=Date.now()-p;q(t,o,"GitHub Models",h,u);const w=h.choices?.[0]?.message?.content?.trim();if(!w){G(t,o,"GitHub Models",{message:"No content found in GitHub Models response",result:h},u);const P=new Error("No response content received from GitHub Models");throw P.code="NO_CONTENT",P.content=JSON.stringify(h,null,2),P}return z(t,o,"GitHub Models",y,w,u),w}catch(p){if(clearTimeout(d),p instanceof Error&&p.name==="AbortError"){const y={message:`GitHub Models request timeout after ${this.params.config.timeout}ms`,error:p};G(t,o,"GitHub Models",y,u);const w=new Error(`GitHub Models request timed out after ${this.params.config.timeout}ms`);throw w.code="REQUEST_TIMEOUT",w.originalError=p,w}if(p.code)throw p;G(t,o,"GitHub Models",{message:"GitHub Models request failed",error:p},u);const h=new Error(`GitHub Models request failed: ${p instanceof Error?p.message:String(p)}`);throw h.code="REQUEST_FAILED",h.originalError=p,h}}}class cc extends X{constructor(e){super(e),this.params=e,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 $s({apiKey:this.params.config.key})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Groq API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Groq plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Groq model name is correct":t.includes("overloaded")||t.includes("capacity")?"Groq service is overloaded. Try again in a few minutes":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Groq model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Groq model configuration":t.includes("500")||t.includes("Internal Server Error")?"Groq server error. Try again later":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,temperature:a,generate:m,type:u,maxLength:l}=this.params.config,d=this.params.config.maxTokens,p={...W,locale:c,maxLength:l,type:u,generate:m,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},g=e==="review"?Z(p):Q(p),h=`Here is the diff: ${t}`,w=`${this.params.config.url||"https://api.groq.com"}/openai/v1/chat/completions`,b={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};Y(t,e,"Groq",this.params.config.model,w,b,i),V(t,e,"Groq",g,h,i);const P={messages:[{role:"system",content:g},{role:"user",content:h}],model:this.params.config.model,max_tokens:d,top_p:this.params.config.topP,temperature:a};te(t,e,"Groq",P,i);const k=Date.now();try{const A=await this.groq.chat.completions.create(P,{timeout:this.params.config.timeout}),$=Date.now()-k,x=A.choices[0].message.content||"";return q(t,e,"Groq",A,i),z(t,e,"Groq",$,x,i),e==="review"?this.sanitizeResponse(x):this.parseMessage(x,u,m)}catch(A){throw G(t,e,"Groq",A,i),A}}}class lc extends X{constructor(e){super(e),this.params=e,this.headers={},this.models=[],this.currentModelId=null,this.currentConversation=void 0,this.currentConversionID=void 0,this.cookie="",this.colors={primary:"#FED21F",secondary:"#000"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[HuggingFace]"),this.errorPrefix=C.red.bold("[HuggingFace]"),this.cookie=this.params.config.cookie;const t=this.params.config.url||"https://huggingface.co";this.headers={accept:"*/*","accept-language":"en-US,en;q=0.9","sec-ch-ua":'"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',"sec-ch-ua-mobile":"?0","sec-ch-ua-platform":'"Windows"',"sec-fetch-dest":"empty","sec-fetch-mode":"cors","sec-fetch-site":"same-origin",origin:t,"Referrer-Policy":"strict-origin-when-cross-origin"}}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("cookie")||t.includes("Cookie")?"Invalid cookie. Check your Hugging Face session cookie in configuration":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Hugging Face model name is correct":t.includes("conversation")||t.includes("conversion")?"Failed to create conversation. Try again or check your session":t.includes("401")||t.includes("Unauthorized")?"Authentication failed. Your Hugging Face session may have expired":t.includes("403")||t.includes("Forbidden")?"Access denied. You may not have permission to access this model":t.includes("404")||t.includes("Not Found")?"Model not found. Check your Hugging Face model configuration":t.includes("500")||t.includes("Internal Server Error")?"Hugging Face server error. Try again later":t.includes("overloaded")||t.includes("capacity")?"Hugging Face service is overloaded. Try again in a few minutes":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){await this.initialize();const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,generate:a,type:m,maxLength:u,temperature:l,maxTokens:d,topP:p,timeout:g}=this.params.config,h={...W,locale:c,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},y=e==="review"?Z(h):Q(h),w=`Here is the diff: ${t}`,P=`${this.params.config.url||"https://huggingface.co"}/chat/conversation`,k={...this.headers,cookie:this.cookie};Y(t,e,"HuggingFace",this.params.config.model,P,k,i),V(t,e,"HuggingFace",y,w,i);const A=Date.now();try{const $=await this.getNewChat(y),E=await(await this.sendMessage(w,$.id)).completeResponsePromise();await this.deleteConversation($.id);const N=Date.now()-A;return q(t,e,"HuggingFace",{response:E},i),z(t,e,"HuggingFace",N,E,i),e==="review"?this.sanitizeResponse(E):this.parseMessage(E,m,a)}catch($){throw G(t,e,"HuggingFace",$,i),$}}async initialize(){const e=await this.getRemoteLlms(),t=e.find(o=>o.name?.toLowerCase()===this.params.config.model.toLowerCase());if(t){this.currentModel=t,this.currentModelId=t.id;return}this.currentModel=e[0],this.currentModelId=e[0].id}async getRemoteLlms(){const e=this.params.config.url||"https://huggingface.co",t=await fetch(`${e}/chat/__data.json`,{headers:{...this.headers,cookie:this.cookie},body:null,method:"GET"});if(t.status!==200)throw new Error(`Failed to get remote LLMs with status code: ${t.status}`);const s=(await t.json()).nodes[0].data,n=s[s[0].models],i=[],c=a=>a===-1?null:s[a];for(const a of n){const m=s[a];if(s[m.unlisted])continue;const u={id:c(m.id),name:c(m.name),displayName:c(m.displayName),preprompt:c(m.preprompt),promptExamples:[],websiteUrl:c(m.websiteUrl),description:c(m.description),datasetName:c(m.datasetName),datasetUrl:c(m.datasetUrl),modelUrl:c(m.modelUrl),parameters:{}},l=c(m.promptExamples);if(l!==null){const g=l.map(h=>c(h));u.promptExamples=g.map(h=>({title:s[h.title],prompt:s[h.prompt]}))}const d=c(m.parameters),p={};for(const[g,h]of Object.entries(d)){if(h===-1){p[g]=null;continue}if(Array.isArray(s[h])){p[g]=s[h].map(y=>s[y]);continue}p[g]=s[h]}u.parameters=p,i.push(u)}return this.models=i,i}async getNewChat(e){const t={model:this.currentModelId,preprompt:e};let o=0;const s=this.params.config.url||"https://huggingface.co";for(;o<5;){const n=await fetch(`${s}/chat/conversation`,{headers:{...this.headers,"content-type":"application/json",cookie:this.cookie,Referer:`${s}/chat/`},body:JSON.stringify(t),method:"POST"}),{conversationId:i}=await n.json();if(i){this.currentConversionID=i;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 t=this.params.config.url||"https://huggingface.co",o=await fetch(`${t}/chat/conversation/${e}/__data.json`,{headers:{...this.headers,cookie:this.cookie,Referer:`${t}/chat/`},body:null,method:"GET"});if(o.status!=200)throw new Error("Unable get conversation details "+o);{const s=await o.json();return this.metadataParser(s,e)}}metadataParser(e,t){const o={id:"",model:"",systemPrompt:"",title:"",history:[]},s=e.nodes[1].data,n=s[s[0].model],i=s[s[0].preprompt],c=s[s[0].title],a=s[s[0].messages],m=[];for(const u of a){const l=s[u],d=new Date(s[l.createdAt][1]).getTime()/1e3,p=new Date(s[l.updatedAt][1]).getTime()/1e3;m.push({id:s[l.id],role:s[l.from],content:s[l.content],createdAt:d,updatedAt:p})}return o.id=t,o.model=n,o.systemPrompt=i,o.title=c,o.history=m,this.currentConversation=o,o}async sendMessage(e,t){if(e==="")throw new Error("the prompt can not be empty.");if(!t&&!this.currentConversionID?await this.getNewChat():t?(this.currentConversionID=t,await this.getConversationHistory(t)):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:[]},s=new FormData;s.append("data",JSON.stringify(o));const n=this.params.config.url||"https://huggingface.co",i=new AbortController,c=setTimeout(()=>i.abort(),this.params.config.timeout),a=await fetch(`${n}/chat/conversation/${this.currentConversionID}`,{headers:{...this.headers,cookie:this.cookie,Referer:`${n}/chat/conversation/${this.currentConversionID}`},body:s,method:"POST",signal:i.signal});clearTimeout(c);function m(h){try{const y=h.split(`
85
- `),w=[];for(const b of y)b.trim()&&w.push(JSON.parse(b));return w}catch{return[{}]}}const u=new TextDecoder;let l="";const d=new TransformStream({async transform(h,y){const w=u.decode(h);try{const b=m(w);for(const P of b)P.type==="finalAnswer"?(l=P?.text||"",y.terminate()):P.type==="stream"&&y.enqueue(P?.token||"")}catch{throw new Error("Error during parsing response")}}}),p=a.body?.pipeThrough(d);async function g(){return new Promise(async(h,y)=>{try{if(!p)y("ModifiedStream undefined");else{const w=p.getReader();for(;;){const{done:b,value:P}=await w.read();if(b){h(l);break}}}}catch(w){y(w)}})}return{id:this.currentConversionID,stream:p,completeResponsePromise:g}}async deleteConversation(e){const t=this.params.config.url||"https://huggingface.co";return(await fetch(`${t}/chat/conversation/${e}`,{headers:{...this.headers,cookie:this.cookie,Referer:`${t}/chat/`},body:null,method:"DELETE"})).json()}}class uc extends X{constructor(e){super(e),this.params=e,this.apiKey="",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}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Mistral AI API key in configuration":t.includes("quota")||t.includes("usage")?"API quota exceeded. Check your Mistral AI usage limits":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Mistral model name is correct":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Mistral model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Mistral model configuration":t.includes("500")||t.includes("Internal Server Error")?"Mistral AI server error. Try again later":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,generate:a,type:m,maxLength:u}=this.params.config,l={...W,locale:c,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},d=e==="review"?Z(l):Q(l);await this.checkAvailableModels();const p=`Here is the diff: ${t}`,h=`${this.params.config.url||"https://api.mistral.ai"}/v1/chat/completions`,y={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};Y(t,e,"MistralAI",this.params.config.model,h,y,i),V(t,e,"MistralAI",d,p,i);const w=await this.createChatCompletions(d,p,e);return e==="review"?this.sanitizeResponse(w):this.parseMessage(w,m,a)}async checkAvailableModels(){if((await this.getAvailableModels()).includes(this.params.config.model))return!0;throw new Error(`Invalid model type of Mistral AI: ${this.params.config.model}`)}async getAvailableModels(){const e=this.params.config.url||"https://api.mistral.ai";return(await new De({method:"GET",baseURL:`${e}/v1/models`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).execute()).data.data.filter(o=>o.object==="model").map(o=>o.id)}async createChatCompletions(e,t,o){const s=this.params.stagedDiff.diff,{logging:n}=this.params.config,i={model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:t}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1,safe_prompt:!1,random_seed:et(10,1e3)};te(s,o,"MistralAI",i,n);const c=Date.now();try{const a=this.params.config.url||"https://api.mistral.ai",m=await new De({method:"POST",baseURL:`${a}/v1/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(i).execute(),u=Date.now()-c,l=m.data;if(q(s,o,"MistralAI",l,n),!l.choices||l.choices.length===0||!l.choices[0].message?.content)throw G(s,o,"MistralAI",{message:"No Content on response",result:l},n),new Error("No Content on response. Please open a Bug report");const p=l.choices[0].message.content;return z(s,o,"MistralAI",u,p,n),p}catch(a){throw G(s,o,"MistralAI",a,n),a}}}class dc extends X{constructor(e){super(e),this.params=e,this.host=Nt,this.model="",this.key="",this.auth="",this.setupFetch=(t,o={})=>xs(t,{...o,dispatcher:new As({headersTimeout:this.params.config.timeout})}),this.colors={primary:"#FFF",secondary:"#000"},this.model=this.params.keyName,this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[${Ze(this.model)}]`),this.errorPrefix=C.red.bold(`[${Ze(this.model)}]`),this.host=this.params.config.host||Nt,this.auth=this.params.config.auth||"Bearer",this.key=this.params.config.key||"",this.ollama=new Es({host:this.host,fetch:this.setupFetch,...this.key&&{headers:{Authorization:`${this.auth} ${this.key}`}}})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("ECONNREFUSED")||t.includes("connection")?`Cannot connect to Ollama server at ${this.host}. Make sure Ollama is running`:t.includes("model")||t.includes("Model")?`Model '${this.model}' not found. Pull the model with: ollama pull ${this.model}`:t.includes("401")||t.includes("Unauthorized")?"Authentication failed. Check your Ollama API key if authentication is enabled":t.includes("403")||t.includes("Forbidden")?"Access denied. Check your Ollama server permissions":t.includes("404")||t.includes("Not Found")?`Model '${this.model}' not found on Ollama server. Pull it first with: ollama pull ${this.model}`:t.includes("500")||t.includes("Internal Server Error")?"Ollama server error. Check server logs and try again":t.includes("overloaded")||t.includes("capacity")?"Ollama server is overloaded. Try again in a few minutes":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,generate:a,type:m,maxLength:u}=this.params.config,l={...W,locale:c,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},d=e==="review"?Z(l):Q(l);await this.checkIsAvailableOllama();const p=`Here is the diff: ${t}`,g=`Ollama_${this.model}`,h=`${this.host}/api/chat`,y=this.key?{Authorization:`${this.auth} ${this.key}`}:{};Y(t,e,g,this.model,h,y,i),V(t,e,g,d,p,i);const w=await this.createChatCompletions(d,p,e);return e==="review"?this.sanitizeResponse(w):this.parseMessage(w,m,a)}async checkIsAvailableOllama(){const e=new De({method:"GET",baseURL:`${this.host}`,timeout:this.params.config.timeout});return this.key&&e.setHeaders({Authorization:`${this.auth} ${this.key}`}),(await e.execute()).data}async createChatCompletions(e,t,o){const{stream:s,numCtx:n,temperature:i,topP:c,timeout:a,maxTokens:m,logging:u}=this.params.config,l=s||!1,d=this.params.stagedDiff.diff,p=`Ollama_${this.model}`,g={model:this.model,messages:[{role:"system",content:e},{role:"user",content:t}],stream:l,keep_alive:a,options:{num_ctx:n,temperature:i,top_p:c,seed:et(10,1e3),num_predict:m??-1}};te(d,o,p,g,u);const h=Date.now();try{const y=await this.ollama.chat(g),w=Date.now()-h;let b="";if(l){if(y)for await(const P of y)b+=P.message.content}else b=y.message.content;return q(d,o,p,{response:b,fullResponse:y},u),z(d,o,p,w,b,u),b}catch(y){throw G(d,o,p,y,u),y}}}class mc extends X{constructor(e){super(e),this.params=e;const t=this.params.keyName||"OPENAI_COMPATIBLE";this.colors=oa(t),this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[${Ze(t)}]`),this.errorPrefix=C.red.bold(`[${Ze(t)}]`),this.openAI=new $r({apiKey:this.params.config.key,baseURL:`${this.params.config.url}${this.params.config.path}`})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your OpenAI-compatible API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or check your service limits":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the model name is correct":t.includes("network")||t.includes("connection")?"Network error. Check your internet connection and API endpoint":t.includes("quota")||t.includes("usage")?"API quota exceeded. Check your usage limits":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your API configuration":t.includes("500")||t.includes("Internal Server Error")?"Server error. Try again later":t.includes("overloaded")||t.includes("capacity")?"Service is overloaded. Try again in a few minutes":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,temperature:a,generate:m,type:u,maxLength:l,timeout:d,stream:p=!1}=this.params.config,g=this.params.config.maxTokens,h={...W,locale:c,maxLength:l,type:u,generate:m,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},y=e==="review"?Z(h):Q(h),w=`Here is the diff: ${t}`,b=this.params.keyName||"OpenAI-Compatible",P=`${this.params.config.url}${this.params.config.path}`,k={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};Y(t,e,b,this.params.config.model,P,k,i),V(t,e,b,y,w,i);const A=er(this.params.config.model),$={messages:[{role:"system",content:y},{role:"user",content:w}],model:this.params.config.model,stream:p,...A?{max_completion_tokens:g,temperature:1}:{max_tokens:g,top_p:this.params.config.topP,temperature:a}};te(t,e,b,$,i);const x=Date.now();try{const E=await this.openAI.chat.completions.create($,{timeout:d});let N="";if(p&&E){const Jo=E;for await(const ur of Jo){const Yo=ur.choices?.[0]?.delta?.content||"",Vo=ur.choices?.[0]?.delta?.reasoning_content||"",qo=`${Yo}${Vo}`;N+=qo}}else N=E.choices?.[0]?.message.content||"";const ae=Date.now()-x;return q(t,e,b,E,i),z(t,e,b,ae,N,i),e==="review"?this.sanitizeResponse(N):this.parseMessage(N,u,m)}catch(E){throw G(t,e,b,E,i),E}}}class fc extends X{constructor(e){super(e),this.params=e,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]")}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")?"Invalid API key. Check your OpenAI API key in configuration":t.includes("quota")?"API quota exceeded. Check your OpenAI usage limits":t.includes("500")?"OpenAI server error. Try again later":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}extractJSONFromError(e){const t=/[{[]{1}([,:{}[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/gis,o=e.match(t);return o?Object.assign({},...o.map(s=>JSON.parse(s))):{error:{message:"Unknown error"}}}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,temperature:i,logging:c,locale:a,generate:m,type:u,maxLength:l,proxy:d,maxTokens:p,timeout:g}=this.params.config,h={...W,locale:a,maxLength:l,type:u,generate:m,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},y=e==="review"?Z(h):Q(h),w=await ic("ChatGPT",this.params.config.url,this.params.config.path,this.params.config.key,this.params.config.model,t,g,p,i,this.params.config.topP,y,c,e,d);return tt(e==="review"?w.map(b=>this.sanitizeResponse(b)):w.map(b=>this.parseMessage(b,u,m)))}}class pc extends X{constructor(e){super(e),this.params=e,this.apiKey="",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}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Perplexity API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Perplexity plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Perplexity model name is correct":t.includes("overloaded")||t.includes("capacity")?"Perplexity service is overloaded. Try again in a few minutes":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Perplexity model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Perplexity model configuration":t.includes("500")||t.includes("Internal Server Error")?"Perplexity server error. Try again later":null}generateCommitMessage$(){return F(this.generateMessage("commit")).pipe(D(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return F(this.generateMessage("review")).pipe(D(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}extractJSONFromError(e){const t=/[{[]{1}([,:{}[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/gis,o=e.match(t);return o?Object.assign({},...o.map(s=>JSON.parse(s))):{error:{message:"Unknown error"}}}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,generate:a,type:m,maxLength:u}=this.params.config,l={...W,locale:c,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},d=e==="review"?Z(l):Q(l),p=`Here is the diff: ${t}`,h=`${this.params.config.url||"https://api.perplexity.ai"}/chat/completions`,y={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};Y(t,e,"Perplexity",this.params.config.model,h,y,i),V(t,e,"Perplexity",d,p,i);const w=await this.createChatCompletions(d,p,e);return this.parseMessage(w,m,a)}async createChatCompletions(e,t,o){const s=this.params.stagedDiff.diff,{logging:n}=this.params.config,i={model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:t}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1};te(s,o,"Perplexity",i,n);const c=Date.now();try{const a=this.params.config.url||"https://api.perplexity.ai",m=await new De({method:"POST",baseURL:`${a}/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(i).execute(),u=Date.now()-c,l=m.data;if(q(s,o,"Perplexity",l,n),!l.choices||l.choices.length===0||!l.choices[0].message?.content)throw G(s,o,"Perplexity",{message:"No Content on response",result:l},n),new Error("No Content on response. Please open a Bug report");const p=l.choices[0].message.content;return z(s,o,"Perplexity",u,p,n),p}catch(a){throw G(s,o,"Perplexity",a,n),a}}}class at{constructor(e,t){this.config=e,this.stagedDiff=t}createCommitMsgRequests$(e){return this.createServiceRequests$(e,"commit")}createCodeReviewRequests$(e){return this.createServiceRequests$(e,"review")}createServiceRequests$(e,t){return M(e).pipe(yr(o=>{const s=this.config[o],n=Array.isArray(s.model)?s.model:[s.model];return M(n).pipe(yr(i=>{if(s.compatible){const c=J.create(mc,{config:{...s,url:s.url||"",path:s.path||"",model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?c.generateCommitMessage$():c.generateCodeReview$()}switch(o){case"OPENAI":{const a=J.create(fc,{config:{...this.config.OPENAI,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"GEMINI":{const a=J.create(Sa,{config:{...this.config.GEMINI,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"ANTHROPIC":{const a=J.create(Ea,{config:{...this.config.ANTHROPIC,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"HUGGINGFACE":{const a=J.create(lc,{config:{...this.config.HUGGINGFACE,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"MISTRAL":{const a=J.create(uc,{config:{...this.config.MISTRAL,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"CODESTRAL":{const a=J.create(xa,{config:{...this.config.CODESTRAL,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"OLLAMA":{const a=J.create(dc,{config:{...this.config.OLLAMA,model:i},keyName:i,stagedDiff:this.stagedDiff});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"COHERE":{const a=J.create(Aa,{config:{...this.config.COHERE,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"GROQ":{const a=J.create(cc,{config:{...this.config.GROQ,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"PERPLEXITY":{const a=J.create(pc,{config:{...this.config.PERPLEXITY,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"GITHUB_MODELS":{const a=J.create(ac,{config:{...this.config.GITHUB_MODELS,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"DEEPSEEK":{const a=J.create(ka,{config:{...this.config.DEEPSEEK,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}default:const c=C.red.bold(`[${o}]`);return ft({name:c+" Invalid AI type",value:"Invalid AI type",isError:!0,disabled:!0})}}))}),R(o=>{const s=C.red.bold("[UNKNOWN]");return ft({name:s+` ${o.message||""}`,value:"Unknown error",isError:!0,disabled:!0})}))}}class Do{getDetectedMessage(e){return`Detected ${e.files.length.toLocaleString()} changed file${e.files.length>1?"s":""} (${e.diff.length.toLocaleString()} characters)`}getDetectedFiles(e){return`Detected ${e.length.toLocaleString()} changed file${e.length>1?"s":""}`}}class tr extends Do{constructor(){super(...arguments),this.name="git",this.excludeFromDiff=e=>`:(exclude)${e}`,this.filesToExclude=["package-lock.json","pnpm-lock.yaml","*.lock","*.lockb"].map(this.excludeFromDiff)}async assertRepo(){try{const{stdout:e}=await j("git",["rev-parse","--show-toplevel"],{reject:!0});return e.trim()}catch(e){const t=e;if(t.code==="ENOENT")throw new v(`Git command not found!
84
+ ${t}`,u),te(t,o,"GitHub Models",c,u);const l=new AbortController,d=setTimeout(()=>l.abort(),this.params.config.timeout);try{const p=Date.now(),g=await fetch(a,{method:"POST",headers:m,body:JSON.stringify(c),signal:l.signal});if(clearTimeout(d),!g.ok){const b=await g.text(),P={status:g.status,statusText:g.statusText,url:a,headers:Object.fromEntries(g.headers),body:b};G(t,o,"GitHub Models",P,u);let k=`GitHub API request failed: ${g.status} ${g.statusText}`;try{const $=JSON.parse(b);$.error?.message?k+=` - ${$.error.message}`:$.message&&(k+=` - ${$.message}`)}catch{b&&(k+=` - ${b}`)}if(g.status===401){const $=new Error("GitHub authentication failed. Please run: aicommit2 github-login");throw $.status=g.status,$.code="AUTHENTICATION_FAILED",$.content=b,$}else if(g.status===403){const $=new Error('GitHub Models access denied. Make sure your token has "Models" permission.');throw $.status=g.status,$.code="ACCESS_DENIED",$.content=b,$}else if(g.status===404){const $=new Error(`Model "${s}" not found. Please check the model name.`);throw $.status=g.status,$.code="MODEL_NOT_FOUND",$.content=b,$}else if(g.status===429){const $=new Error("Rate limit exceeded. Please try again later.");throw $.status=g.status,$.code="RATE_LIMIT_EXCEEDED",$.content=b,$}const A=new Error(k);throw A.status=g.status,A.code="API_ERROR",A.content=b,A}const h=await g.json(),y=Date.now()-p;q(t,o,"GitHub Models",h,u);const w=h.choices?.[0]?.message?.content?.trim();if(!w){G(t,o,"GitHub Models",{message:"No content found in GitHub Models response",result:h},u);const P=new Error("No response content received from GitHub Models");throw P.code="NO_CONTENT",P.content=JSON.stringify(h,null,2),P}return z(t,o,"GitHub Models",y,w,u),w}catch(p){if(clearTimeout(d),p instanceof Error&&p.name==="AbortError"){const y={message:`GitHub Models request timeout after ${this.params.config.timeout}ms`,error:p};G(t,o,"GitHub Models",y,u);const w=new Error(`GitHub Models request timed out after ${this.params.config.timeout}ms`);throw w.code="REQUEST_TIMEOUT",w.originalError=p,w}if(p.code)throw p;G(t,o,"GitHub Models",{message:"GitHub Models request failed",error:p},u);const h=new Error(`GitHub Models request failed: ${p instanceof Error?p.message:String(p)}`);throw h.code="REQUEST_FAILED",h.originalError=p,h}}}class cc extends X{constructor(e){super(e),this.params=e,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 $s({apiKey:this.params.config.key})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Groq API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Groq plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Groq model name is correct":t.includes("overloaded")||t.includes("capacity")?"Groq service is overloaded. Try again in a few minutes":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Groq model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Groq model configuration":t.includes("500")||t.includes("Internal Server Error")?"Groq server error. Try again later":null}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,temperature:a,generate:m,type:u,maxLength:l}=this.params.config,d=this.params.config.maxTokens,p={...W,locale:c,maxLength:l,type:u,generate:m,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},g=e==="review"?Z(p):Q(p),h=`Here is the diff: ${t}`,w=`${this.params.config.url||"https://api.groq.com"}/openai/v1/chat/completions`,b={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};V(t,e,"Groq",this.params.config.model,w,b,i),Y(t,e,"Groq",g,h,i);const P={messages:[{role:"system",content:g},{role:"user",content:h}],model:this.params.config.model,max_tokens:d,top_p:this.params.config.topP,temperature:a};te(t,e,"Groq",P,i);const k=Date.now();try{const A=await this.groq.chat.completions.create(P,{timeout:this.params.config.timeout}),$=Date.now()-k,x=A.choices[0].message.content||"";return q(t,e,"Groq",A,i),z(t,e,"Groq",$,x,i),e==="review"?this.sanitizeResponse(x):this.parseMessage(x,u,m)}catch(A){throw G(t,e,"Groq",A,i),A}}}class lc extends X{constructor(e){super(e),this.params=e,this.headers={},this.models=[],this.currentModelId=null,this.currentConversation=void 0,this.currentConversionID=void 0,this.cookie="",this.colors={primary:"#FED21F",secondary:"#000"},this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold("[HuggingFace]"),this.errorPrefix=C.red.bold("[HuggingFace]"),this.cookie=this.params.config.cookie;const t=this.params.config.url||"https://huggingface.co";this.headers={accept:"*/*","accept-language":"en-US,en;q=0.9","sec-ch-ua":'"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',"sec-ch-ua-mobile":"?0","sec-ch-ua-platform":'"Windows"',"sec-fetch-dest":"empty","sec-fetch-mode":"cors","sec-fetch-site":"same-origin",origin:t,"Referrer-Policy":"strict-origin-when-cross-origin"}}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("cookie")||t.includes("Cookie")?"Invalid cookie. Check your Hugging Face session cookie in configuration":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Hugging Face model name is correct":t.includes("conversation")||t.includes("conversion")?"Failed to create conversation. Try again or check your session":t.includes("401")||t.includes("Unauthorized")?"Authentication failed. Your Hugging Face session may have expired":t.includes("403")||t.includes("Forbidden")?"Access denied. You may not have permission to access this model":t.includes("404")||t.includes("Not Found")?"Model not found. Check your Hugging Face model configuration":t.includes("500")||t.includes("Internal Server Error")?"Hugging Face server error. Try again later":t.includes("overloaded")||t.includes("capacity")?"Hugging Face service is overloaded. Try again in a few minutes":null}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){await this.initialize();const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,generate:a,type:m,maxLength:u,temperature:l,maxTokens:d,topP:p,timeout:g}=this.params.config,h={...W,locale:c,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},y=e==="review"?Z(h):Q(h),w=`Here is the diff: ${t}`,P=`${this.params.config.url||"https://huggingface.co"}/chat/conversation`,k={...this.headers,cookie:this.cookie};V(t,e,"HuggingFace",this.params.config.model,P,k,i),Y(t,e,"HuggingFace",y,w,i);const A=Date.now();try{const $=await this.getNewChat(y),E=await(await this.sendMessage(w,$.id)).completeResponsePromise();await this.deleteConversation($.id);const N=Date.now()-A;return q(t,e,"HuggingFace",{response:E},i),z(t,e,"HuggingFace",N,E,i),e==="review"?this.sanitizeResponse(E):this.parseMessage(E,m,a)}catch($){throw G(t,e,"HuggingFace",$,i),$}}async initialize(){const e=await this.getRemoteLlms(),t=e.find(o=>o.name?.toLowerCase()===this.params.config.model.toLowerCase());if(t){this.currentModel=t,this.currentModelId=t.id;return}this.currentModel=e[0],this.currentModelId=e[0].id}async getRemoteLlms(){const e=this.params.config.url||"https://huggingface.co",t=await fetch(`${e}/chat/__data.json`,{headers:{...this.headers,cookie:this.cookie},body:null,method:"GET"});if(t.status!==200)throw new Error(`Failed to get remote LLMs with status code: ${t.status}`);const s=(await t.json()).nodes[0].data,n=s[s[0].models],i=[],c=a=>a===-1?null:s[a];for(const a of n){const m=s[a];if(s[m.unlisted])continue;const u={id:c(m.id),name:c(m.name),displayName:c(m.displayName),preprompt:c(m.preprompt),promptExamples:[],websiteUrl:c(m.websiteUrl),description:c(m.description),datasetName:c(m.datasetName),datasetUrl:c(m.datasetUrl),modelUrl:c(m.modelUrl),parameters:{}},l=c(m.promptExamples);if(l!==null){const g=l.map(h=>c(h));u.promptExamples=g.map(h=>({title:s[h.title],prompt:s[h.prompt]}))}const d=c(m.parameters),p={};for(const[g,h]of Object.entries(d)){if(h===-1){p[g]=null;continue}if(Array.isArray(s[h])){p[g]=s[h].map(y=>s[y]);continue}p[g]=s[h]}u.parameters=p,i.push(u)}return this.models=i,i}async getNewChat(e){const t={model:this.currentModelId,preprompt:e};let o=0;const s=this.params.config.url||"https://huggingface.co";for(;o<5;){const n=await fetch(`${s}/chat/conversation`,{headers:{...this.headers,"content-type":"application/json",cookie:this.cookie,Referer:`${s}/chat/`},body:JSON.stringify(t),method:"POST"}),{conversationId:i}=await n.json();if(i){this.currentConversionID=i;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 t=this.params.config.url||"https://huggingface.co",o=await fetch(`${t}/chat/conversation/${e}/__data.json`,{headers:{...this.headers,cookie:this.cookie,Referer:`${t}/chat/`},body:null,method:"GET"});if(o.status!=200)throw new Error("Unable get conversation details "+o);{const s=await o.json();return this.metadataParser(s,e)}}metadataParser(e,t){const o={id:"",model:"",systemPrompt:"",title:"",history:[]},s=e.nodes[1].data,n=s[s[0].model],i=s[s[0].preprompt],c=s[s[0].title],a=s[s[0].messages],m=[];for(const u of a){const l=s[u],d=new Date(s[l.createdAt][1]).getTime()/1e3,p=new Date(s[l.updatedAt][1]).getTime()/1e3;m.push({id:s[l.id],role:s[l.from],content:s[l.content],createdAt:d,updatedAt:p})}return o.id=t,o.model=n,o.systemPrompt=i,o.title=c,o.history=m,this.currentConversation=o,o}async sendMessage(e,t){if(e==="")throw new Error("the prompt can not be empty.");if(!t&&!this.currentConversionID?await this.getNewChat():t?(this.currentConversionID=t,await this.getConversationHistory(t)):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:[]},s=new FormData;s.append("data",JSON.stringify(o));const n=this.params.config.url||"https://huggingface.co",i=new AbortController,c=setTimeout(()=>i.abort(),this.params.config.timeout),a=await fetch(`${n}/chat/conversation/${this.currentConversionID}`,{headers:{...this.headers,cookie:this.cookie,Referer:`${n}/chat/conversation/${this.currentConversionID}`},body:s,method:"POST",signal:i.signal});clearTimeout(c);function m(h){try{const y=h.split(`
85
+ `),w=[];for(const b of y)b.trim()&&w.push(JSON.parse(b));return w}catch{return[{}]}}const u=new TextDecoder;let l="";const d=new TransformStream({async transform(h,y){const w=u.decode(h);try{const b=m(w);for(const P of b)P.type==="finalAnswer"?(l=P?.text||"",y.terminate()):P.type==="stream"&&y.enqueue(P?.token||"")}catch{throw new Error("Error during parsing response")}}}),p=a.body?.pipeThrough(d);async function g(){return new Promise(async(h,y)=>{try{if(!p)y("ModifiedStream undefined");else{const w=p.getReader();for(;;){const{done:b,value:P}=await w.read();if(b){h(l);break}}}}catch(w){y(w)}})}return{id:this.currentConversionID,stream:p,completeResponsePromise:g}}async deleteConversation(e){const t=this.params.config.url||"https://huggingface.co";return(await fetch(`${t}/chat/conversation/${e}`,{headers:{...this.headers,cookie:this.cookie,Referer:`${t}/chat/`},body:null,method:"DELETE"})).json()}}class uc extends X{constructor(e){super(e),this.params=e,this.apiKey="",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}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Mistral AI API key in configuration":t.includes("quota")||t.includes("usage")?"API quota exceeded. Check your Mistral AI usage limits":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Mistral model name is correct":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Mistral model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Mistral model configuration":t.includes("500")||t.includes("Internal Server Error")?"Mistral AI server error. Try again later":null}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,generate:a,type:m,maxLength:u}=this.params.config,l={...W,locale:c,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},d=e==="review"?Z(l):Q(l);await this.checkAvailableModels();const p=`Here is the diff: ${t}`,h=`${this.params.config.url||"https://api.mistral.ai"}/v1/chat/completions`,y={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};V(t,e,"MistralAI",this.params.config.model,h,y,i),Y(t,e,"MistralAI",d,p,i);const w=await this.createChatCompletions(d,p,e);return e==="review"?this.sanitizeResponse(w):this.parseMessage(w,m,a)}async checkAvailableModels(){if((await this.getAvailableModels()).includes(this.params.config.model))return!0;throw new Error(`Invalid model type of Mistral AI: ${this.params.config.model}`)}async getAvailableModels(){const e=this.params.config.url||"https://api.mistral.ai";return(await new De({method:"GET",baseURL:`${e}/v1/models`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).execute()).data.data.filter(o=>o.object==="model").map(o=>o.id)}async createChatCompletions(e,t,o){const s=this.params.stagedDiff.diff,{logging:n}=this.params.config,i={model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:t}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1,safe_prompt:!1,random_seed:et(10,1e3)};te(s,o,"MistralAI",i,n);const c=Date.now();try{const a=this.params.config.url||"https://api.mistral.ai",m=await new De({method:"POST",baseURL:`${a}/v1/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(i).execute(),u=Date.now()-c,l=m.data;if(q(s,o,"MistralAI",l,n),!l.choices||l.choices.length===0||!l.choices[0].message?.content)throw G(s,o,"MistralAI",{message:"No Content on response",result:l},n),new Error("No Content on response. Please open a Bug report");const p=l.choices[0].message.content;return z(s,o,"MistralAI",u,p,n),p}catch(a){throw G(s,o,"MistralAI",a,n),a}}}class dc extends X{constructor(e){super(e),this.params=e,this.host=Nt,this.model="",this.key="",this.auth="",this.setupFetch=(t,o={})=>xs(t,{...o,dispatcher:new As({headersTimeout:this.params.config.timeout})}),this.colors={primary:"#FFF",secondary:"#000"},this.model=this.params.keyName,this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[${Ze(this.model)}]`),this.errorPrefix=C.red.bold(`[${Ze(this.model)}]`),this.host=this.params.config.host||Nt,this.auth=this.params.config.auth||"Bearer",this.key=this.params.config.key||"",this.ollama=new Es({host:this.host,fetch:this.setupFetch,...this.key&&{headers:{Authorization:`${this.auth} ${this.key}`}}})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("ECONNREFUSED")||t.includes("connection")?`Cannot connect to Ollama server at ${this.host}. Make sure Ollama is running`:t.includes("model")||t.includes("Model")?`Model '${this.model}' not found. Pull the model with: ollama pull ${this.model}`:t.includes("401")||t.includes("Unauthorized")?"Authentication failed. Check your Ollama API key if authentication is enabled":t.includes("403")||t.includes("Forbidden")?"Access denied. Check your Ollama server permissions":t.includes("404")||t.includes("Not Found")?`Model '${this.model}' not found on Ollama server. Pull it first with: ollama pull ${this.model}`:t.includes("500")||t.includes("Internal Server Error")?"Ollama server error. Check server logs and try again":t.includes("overloaded")||t.includes("capacity")?"Ollama server is overloaded. Try again in a few minutes":null}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,generate:a,type:m,maxLength:u}=this.params.config,l={...W,locale:c,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},d=e==="review"?Z(l):Q(l);await this.checkIsAvailableOllama();const p=`Here is the diff: ${t}`,g=`Ollama_${this.model}`,h=`${this.host}/api/chat`,y=this.key?{Authorization:`${this.auth} ${this.key}`}:{};V(t,e,g,this.model,h,y,i),Y(t,e,g,d,p,i);const w=await this.createChatCompletions(d,p,e);return e==="review"?this.sanitizeResponse(w):this.parseMessage(w,m,a)}async checkIsAvailableOllama(){const e=new De({method:"GET",baseURL:`${this.host}`,timeout:this.params.config.timeout});return this.key&&e.setHeaders({Authorization:`${this.auth} ${this.key}`}),(await e.execute()).data}async createChatCompletions(e,t,o){const{stream:s,numCtx:n,temperature:i,topP:c,timeout:a,maxTokens:m,logging:u}=this.params.config,l=s||!1,d=this.params.stagedDiff.diff,p=`Ollama_${this.model}`,g={model:this.model,messages:[{role:"system",content:e},{role:"user",content:t}],stream:l,keep_alive:a,options:{num_ctx:n,temperature:i,top_p:c,seed:et(10,1e3),num_predict:m??-1}};te(d,o,p,g,u);const h=Date.now();try{const y=await this.ollama.chat(g),w=Date.now()-h;let b="";if(l){if(y)for await(const P of y)b+=P.message.content}else b=y.message.content;return q(d,o,p,{response:b,fullResponse:y},u),z(d,o,p,w,b,u),b}catch(y){throw G(d,o,p,y,u),y}}}class mc extends X{constructor(e){super(e),this.params=e;const t=this.params.keyName||"OPENAI_COMPATIBLE";this.colors=oa(t),this.serviceName=C.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[${Ze(t)}]`),this.errorPrefix=C.red.bold(`[${Ze(t)}]`),this.openAI=new $r({apiKey:this.params.config.key,baseURL:`${this.params.config.url}${this.params.config.path}`})}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your OpenAI-compatible API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or check your service limits":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the model name is correct":t.includes("network")||t.includes("connection")?"Network error. Check your internet connection and API endpoint":t.includes("quota")||t.includes("usage")?"API quota exceeded. Check your usage limits":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your API configuration":t.includes("500")||t.includes("Internal Server Error")?"Server error. Try again later":t.includes("overloaded")||t.includes("capacity")?"Service is overloaded. Try again in a few minutes":null}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,temperature:a,generate:m,type:u,maxLength:l,timeout:d,stream:p=!1}=this.params.config,g=this.params.config.maxTokens,h={...W,locale:c,maxLength:l,type:u,generate:m,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},y=e==="review"?Z(h):Q(h),w=`Here is the diff: ${t}`,b=this.params.keyName||"OpenAI-Compatible",P=`${this.params.config.url}${this.params.config.path}`,k={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};V(t,e,b,this.params.config.model,P,k,i),Y(t,e,b,y,w,i);const A=er(this.params.config.model),$={messages:[{role:"system",content:y},{role:"user",content:w}],model:this.params.config.model,stream:p,...A?{max_completion_tokens:g,temperature:1}:{max_tokens:g,top_p:this.params.config.topP,temperature:a}};te(t,e,b,$,i);const x=Date.now();try{const E=await this.openAI.chat.completions.create($,{timeout:d});let N="";if(p&&E){const Jo=E;for await(const ur of Jo){const Vo=ur.choices?.[0]?.delta?.content||"",Yo=ur.choices?.[0]?.delta?.reasoning_content||"",qo=`${Vo}${Yo}`;N+=qo}}else N=E.choices?.[0]?.message.content||"";const ae=Date.now()-x;return q(t,e,b,E,i),z(t,e,b,ae,N,i),e==="review"?this.sanitizeResponse(N):this.parseMessage(N,u,m)}catch(E){throw G(t,e,b,E,i),E}}}class fc extends X{constructor(e){super(e),this.params=e,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]")}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")?"Invalid API key. Check your OpenAI API key in configuration":t.includes("quota")?"API quota exceeded. Check your OpenAI usage limits":t.includes("500")?"OpenAI server error. Try again later":null}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}extractJSONFromError(e){const t=/[{[]{1}([,:{}[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/gis,o=e.match(t);return o?Object.assign({},...o.map(s=>JSON.parse(s))):{error:{message:"Unknown error"}}}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,temperature:i,logging:c,locale:a,generate:m,type:u,maxLength:l,proxy:d,maxTokens:p,timeout:g}=this.params.config,h={...W,locale:a,maxLength:l,type:u,generate:m,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},y=e==="review"?Z(h):Q(h),w=await ic("ChatGPT",this.params.config.url,this.params.config.path,this.params.config.key,this.params.config.model,t,g,p,i,this.params.config.topP,y,c,e,d);return tt(e==="review"?w.map(b=>this.sanitizeResponse(b)):w.map(b=>this.parseMessage(b,u,m)))}}class pc extends X{constructor(e){super(e),this.params=e,this.apiKey="",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}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Perplexity API key in configuration":t.includes("rate_limit")||t.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Perplexity plan":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Perplexity model name is correct":t.includes("overloaded")||t.includes("capacity")?"Perplexity service is overloaded. Try again in a few minutes":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Perplexity model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Perplexity model configuration":t.includes("500")||t.includes("Internal Server Error")?"Perplexity server error. Try again later":null}generateCommitMessage$(){return L(this.generateMessage("commit")).pipe(F(e=>M(e)),I(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})),R(this.handleError$))}generateCodeReview$(){return L(this.generateMessage("review")).pipe(F(e=>M(e)),I(e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1})),R(this.handleError$))}extractJSONFromError(e){const t=/[{[]{1}([,:{}[\]0-9.\-+Eaeflnr-u \n\r\t]|".*?")+[}\]]{1}/gis,o=e.match(t);return o?Object.assign({},...o.map(s=>JSON.parse(s))):{error:{message:"Unknown error"}}}async generateMessage(e){const t=this.params.stagedDiff.diff,{systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n,logging:i,locale:c,generate:a,type:m,maxLength:u}=this.params.config,l={...W,locale:c,maxLength:u,type:m,generate:a,systemPrompt:o,systemPromptPath:s,codeReviewPromptPath:n},d=e==="review"?Z(l):Q(l),p=`Here is the diff: ${t}`,h=`${this.params.config.url||"https://api.perplexity.ai"}/chat/completions`,y={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};V(t,e,"Perplexity",this.params.config.model,h,y,i),Y(t,e,"Perplexity",d,p,i);const w=await this.createChatCompletions(d,p,e);return this.parseMessage(w,m,a)}async createChatCompletions(e,t,o){const s=this.params.stagedDiff.diff,{logging:n}=this.params.config,i={model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:t}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1};te(s,o,"Perplexity",i,n);const c=Date.now();try{const a=this.params.config.url||"https://api.perplexity.ai",m=await new De({method:"POST",baseURL:`${a}/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(i).execute(),u=Date.now()-c,l=m.data;if(q(s,o,"Perplexity",l,n),!l.choices||l.choices.length===0||!l.choices[0].message?.content)throw G(s,o,"Perplexity",{message:"No Content on response",result:l},n),new Error("No Content on response. Please open a Bug report");const p=l.choices[0].message.content;return z(s,o,"Perplexity",u,p,n),p}catch(a){throw G(s,o,"Perplexity",a,n),a}}}class at{constructor(e,t){this.config=e,this.stagedDiff=t}createCommitMsgRequests$(e){return this.createServiceRequests$(e,"commit")}createCodeReviewRequests$(e){return this.createServiceRequests$(e,"review")}createServiceRequests$(e,t){return M(e).pipe(yr(o=>{const s=this.config[o],n=Array.isArray(s.model)?s.model:[s.model];return M(n).pipe(yr(i=>{if(s.compatible){const c=J.create(mc,{config:{...s,url:s.url||"",path:s.path||"",model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?c.generateCommitMessage$():c.generateCodeReview$()}switch(o){case"OPENAI":{const a=J.create(fc,{config:{...this.config.OPENAI,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"GEMINI":{const a=J.create(Sa,{config:{...this.config.GEMINI,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"ANTHROPIC":{const a=J.create(Ea,{config:{...this.config.ANTHROPIC,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"HUGGINGFACE":{const a=J.create(lc,{config:{...this.config.HUGGINGFACE,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"MISTRAL":{const a=J.create(uc,{config:{...this.config.MISTRAL,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"CODESTRAL":{const a=J.create(xa,{config:{...this.config.CODESTRAL,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"OLLAMA":{const a=J.create(dc,{config:{...this.config.OLLAMA,model:i},keyName:i,stagedDiff:this.stagedDiff});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"COHERE":{const a=J.create(Aa,{config:{...this.config.COHERE,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"GROQ":{const a=J.create(cc,{config:{...this.config.GROQ,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"PERPLEXITY":{const a=J.create(pc,{config:{...this.config.PERPLEXITY,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"GITHUB_MODELS":{const a=J.create(ac,{config:{...this.config.GITHUB_MODELS,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}case"DEEPSEEK":{const a=J.create(ka,{config:{...this.config.DEEPSEEK,model:i},stagedDiff:this.stagedDiff,keyName:i});return t==="commit"?a.generateCommitMessage$():a.generateCodeReview$()}default:const c=C.red.bold(`[${o}]`);return ft({name:c+" Invalid AI type",value:"Invalid AI type",isError:!0,disabled:!0})}}))}),R(o=>{const s=C.red.bold("[UNKNOWN]");return ft({name:s+` ${o.message||""}`,value:"Unknown error",isError:!0,disabled:!0})}))}}class Do{getDetectedMessage(e){return`Detected ${e.files.length.toLocaleString()} changed file${e.files.length>1?"s":""} (${e.diff.length.toLocaleString()} characters)`}getDetectedFiles(e){return`Detected ${e.length.toLocaleString()} changed file${e.length>1?"s":""}`}}class tr extends Do{constructor(){super(...arguments),this.name="git",this.excludeFromDiff=e=>`:(exclude)${e}`,this.filesToExclude=["package-lock.json","pnpm-lock.yaml","*.lock","*.lockb"].map(this.excludeFromDiff)}async assertRepo(){try{const{stdout:e}=await j("git",["rev-parse","--show-toplevel"],{reject:!0});return e.trim()}catch(e){const t=e;if(t.code==="ENOENT")throw new v(`Git command not found!
86
86
 
87
87
  Please install Git first: https://git-scm.com/downloads`);if(t.stderr){if(t.stderr.includes("not a git repository"))throw new v(`Not in a Git repository!
88
88
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aicommit2",
3
- "version": "2.4.14",
3
+ "version": "2.4.16",
4
4
  "description": "A Reactive CLI that generates commit messages for Git and Jujutsu with various AI",
5
5
  "keywords": [
6
6
  "cli",
@@ -65,7 +65,7 @@
65
65
  "chalk": "^5.4.1",
66
66
  "chokidar": "^4.0.3",
67
67
  "cleye": "^1.3.4",
68
- "cohere-ai": "^7.17.1",
68
+ "cohere-ai": "^7.19.0",
69
69
  "copy-paste": "^1.5.3",
70
70
  "figlet": "^1.8.1",
71
71
  "formdata-node": "^6.0.3",