aicommit2 2.4.4 → 2.4.5

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 +2 -2
  2. package/package.json +1 -1
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{command as se,cli as fn}from"cleye";import{createRequire as pn}from"module";import H from"fs";import xe from"os";import A from"path";import{Buffer as hn}from"node:buffer";import le from"node:path";import fr,{ChildProcess as gn,exec as yn}from"node:child_process";import ie from"node:process";import wn,{execSync as He}from"child_process";import{fileURLToPath as pr}from"node:url";import vn,{constants as hr}from"node:os";import gr from"assert";import yr from"events";import{createWriteStream as bn,createReadStream as Cn}from"node:fs";import Pn from"buffer";import ht from"stream";import wr from"util";import{debuglog as $n,promisify as En}from"node:util";import Ue from"inquirer";import P from"chalk";import{of as Ae,concatMap as L,from as S,map as M,catchError as R,mergeMap as ze,BehaviorSubject as vr,ReplaySubject as kn,lastValueFrom as br,filter as Cr,toArray as Pr,Subject as $r}from"rxjs";import xn from"@anthropic-ai/sdk";import{fromPromise as D}from"rxjs/internal/observable/innerFrom";import{xxh64 as Er}from"@pacote/xxhash";import z from"winston";import O from"fs/promises";import"winston-daily-rotate-file";import An from"axios";import{CohereClient as Sn}from"cohere-ai";import kr from"openai";import{GoogleGenerativeAI as In,HarmCategory as Ke,HarmBlockThreshold as Je}from"@google/generative-ai";import Mn from"http";import Rn from"https";import On from"net";import Ln from"tls";import Dn,{fileURLToPath as jn,pathToFileURL as Nn}from"url";import xr from"tty";import Tn from"groq-sdk";import{Ollama as Fn}from"ollama";import{fetch as _n,Agent as Gn}from"undici";import We from"readline";import Bn from"figlet";import Ar from"ora";import Hn from"inquirer-reactive-list-prompt";import{readdir as Sr,stat as Un,rm as zn}from"node:fs/promises";import Kn from"chokidar";import{takeUntil as Jn}from"rxjs/operators";var Wn="aicommit2",Ir="2.4.4",Yn="A Reactive CLI that generates commit messages for Git and Jujutsu with various AI",Vn=["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"],qn="MIT",Xn="tak-bro/aicommit2",Qn="Hyungtak Jin(@tak-bro)",Zn="module",es=["dist"],ts={aicommit2:"./dist/cli.mjs",aic2:"./dist/cli.mjs"},rs={prepare:"simple-git-hooks",build:"pkgroll --minify",lint:"eslint --cache .","type-check":"tsc",test:"tsx tests",prepack:"pnpm build && clean-pkg-json",prettier:"prettier"},os={"@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","groq-sdk":"^0.7.0",inquirer:"9.2.8","inquirer-reactive-list-prompt":"^1.0.15",ollama:"^0.5.15",openai:"^5.0.1",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"},ns={"@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"},ss={extends:["@pvtnbr","prettier"],rules:{"unicorn/no-process-exit":"off"},overrides:[{files:"./src/commands/prepare-commit-msg-hook.ts",rules:{"unicorn/prevent-abbreviations":"off"}}]},is={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"]},as={name:Wn,version:Ir,description:Yn,keywords:Vn,license:qn,repository:Xn,author:Qn,type:Zn,files:es,bin:ts,scripts:rs,"simple-git-hooks":{"pre-commit":"pnpm lint-staged"},"lint-staged":{"*.ts":["prettier --config ./.prettierrc --write","eslint --fix"]},dependencies:os,devDependencies:ns,eslintConfig:ss,release:is},cs=pn(import.meta.url),B=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function fe(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var pe={exports:{}},gt,Mr;function ls(){if(Mr)return gt;Mr=1,gt=o,o.sync=n;var t=H;function e(s,i){var c=i.pathExt!==void 0?i.pathExt:process.env.PATHEXT;if(!c||(c=c.split(";"),c.indexOf("")!==-1))return!0;for(var a=0;a<c.length;a++){var m=c[a].toLowerCase();if(m&&s.substr(-m.length).toLowerCase()===m)return!0}return!1}function r(s,i,c){return!s.isSymbolicLink()&&!s.isFile()?!1:e(i,c)}function o(s,i,c){t.stat(s,function(a,m){c(a,a?!1:r(m,s,i))})}function n(s,i){return r(t.statSync(s),s,i)}return gt}var yt,Rr;function us(){if(Rr)return yt;Rr=1,yt=e,e.sync=r;var t=H;function e(s,i,c){t.stat(s,function(a,m){c(a,a?!1:o(m,i))})}function r(s,i){return o(t.statSync(s),i)}function o(s,i){return s.isFile()&&n(s,i)}function n(s,i){var c=s.mode,a=s.uid,m=s.gid,d=i.uid!==void 0?i.uid:process.getuid&&process.getuid(),l=i.gid!==void 0?i.gid:process.getgid&&process.getgid(),p=parseInt("100",8),u=parseInt("010",8),h=parseInt("001",8),g=p|u,y=c&h||c&u&&m===l||c&p&&a===d||c&g&&d===0;return y}return yt}var Ye;process.platform==="win32"||B.TESTING_WINDOWS?Ye=ls():Ye=us();var ds=wt;wt.sync=ms;function wt(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(o,n){wt(t,e||{},function(s,i){s?n(s):o(i)})})}Ye(t,e||{},function(o,n){o&&(o.code==="EACCES"||e&&e.ignoreErrors)&&(o=null,n=!1),r(o,n)})}function ms(t,e){try{return Ye.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}const he=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",Or=A,fs=he?";":":",Lr=ds,Dr=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),jr=(t,e)=>{const r=e.colon||fs,o=t.match(/\//)||he&&t.match(/\\/)?[""]:[...he?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],n=he?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=he?n.split(r):[""];return he&&t.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:o,pathExt:s,pathExtExe:n}},Nr=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});const{pathEnv:o,pathExt:n,pathExtExe:s}=jr(t,e),i=[],c=m=>new Promise((d,l)=>{if(m===o.length)return e.all&&i.length?d(i):l(Dr(t));const p=o[m],u=/^".*"$/.test(p)?p.slice(1,-1):p,h=Or.join(u,t),g=!u&&/^\.[\\\/]/.test(t)?t.slice(0,2)+h:h;d(a(g,m,0))}),a=(m,d,l)=>new Promise((p,u)=>{if(l===n.length)return p(c(d+1));const h=n[l];Lr(m+h,{pathExt:s},(g,y)=>{if(!g&&y)if(e.all)i.push(m+h);else return p(m+h);return p(a(m,d,l+1))})});return r?c(0).then(m=>r(null,m),r):c(0)},ps=(t,e)=>{e=e||{};const{pathEnv:r,pathExt:o,pathExtExe:n}=jr(t,e),s=[];for(let i=0;i<r.length;i++){const c=r[i],a=/^".*"$/.test(c)?c.slice(1,-1):c,m=Or.join(a,t),d=!a&&/^\.[\\\/]/.test(t)?t.slice(0,2)+m:m;for(let l=0;l<o.length;l++){const p=d+o[l];try{if(Lr.sync(p,{pathExt:n}))if(e.all)s.push(p);else return p}catch{}}}if(e.all&&s.length)return s;if(e.nothrow)return null;throw Dr(t)};var hs=Nr;Nr.sync=ps;var vt={exports:{}};const Tr=(t={})=>{const e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(o=>o.toUpperCase()==="PATH")||"Path"};vt.exports=Tr,vt.exports.default=Tr;var gs=vt.exports;const Fr=A,ys=hs,ws=gs;function _r(t,e){const r=t.options.env||process.env,o=process.cwd(),n=t.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(t.options.cwd)}catch{}let i;try{i=ys.sync(t.command,{path:r[ws({env:r})],pathExt:e?Fr.delimiter:void 0})}catch{}finally{s&&process.chdir(o)}return i&&(i=Fr.resolve(n?t.options.cwd:"",i)),i}function vs(t){return _r(t)||_r(t,!0)}var bs=vs,bt={};const Ct=/([()\][%!^"`<>&|;, *?])/g;function Cs(t){return t=t.replace(Ct,"^$1"),t}function Ps(t,e){return t=`${t}`,t=t.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),t=t.replace(/(?=(\\+?)?)\1$/,"$1$1"),t=`"${t}"`,t=t.replace(Ct,"^$1"),e&&(t=t.replace(Ct,"^$1")),t}bt.command=Cs,bt.argument=Ps;var $s=/^#!(.*)/;const Es=$s;var ks=(t="")=>{const e=t.match(Es);if(!e)return null;const[r,o]=e[0].replace(/#! ?/,"").split(" "),n=r.split("/").pop();return n==="env"?o:o?`${n} ${o}`:n};const Pt=H,xs=ks;function As(t){const r=Buffer.alloc(150);let o;try{o=Pt.openSync(t,"r"),Pt.readSync(o,r,0,150,0),Pt.closeSync(o)}catch{}return xs(r.toString())}var Ss=As;const Is=A,Gr=bs,Br=bt,Ms=Ss,Rs=process.platform==="win32",Os=/\.(?:com|exe)$/i,Ls=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function Ds(t){t.file=Gr(t);const e=t.file&&Ms(t.file);return e?(t.args.unshift(t.file),t.command=e,Gr(t)):t.file}function js(t){if(!Rs)return t;const e=Ds(t),r=!Os.test(e);if(t.options.forceShell||r){const o=Ls.test(e);t.command=Is.normalize(t.command),t.command=Br.command(t.command),t.args=t.args.map(s=>Br.argument(s,o));const n=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${n}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function Ns(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);const o={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?o:js(o)}var Ts=Ns;const $t=process.platform==="win32";function Et(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function Fs(t,e){if(!$t)return;const r=t.emit;t.emit=function(o,n){if(o==="exit"){const s=Hr(n,e);if(s)return r.call(t,"error",s)}return r.apply(t,arguments)}}function Hr(t,e){return $t&&t===1&&!e.file?Et(e.original,"spawn"):null}function _s(t,e){return $t&&t===1&&!e.file?Et(e.original,"spawnSync"):null}var Gs={hookChildProcess:Fs,verifyENOENT:Hr,verifyENOENTSync:_s,notFoundError:Et};const Ur=wn,kt=Ts,xt=Gs;function zr(t,e,r){const o=kt(t,e,r),n=Ur.spawn(o.command,o.args,o.options);return xt.hookChildProcess(n,o),n}function Bs(t,e,r){const o=kt(t,e,r),n=Ur.spawnSync(o.command,o.args,o.options);return n.error=n.error||xt.verifyENOENTSync(n.status,o),n}pe.exports=zr,pe.exports.spawn=zr,pe.exports.sync=Bs,pe.exports._parse=kt,pe.exports._enoent=xt;var Hs=pe.exports,Us=fe(Hs);function zs(t){const e=typeof t=="string"?`
2
+ import{command as se,cli as fn}from"cleye";import{createRequire as pn}from"module";import H from"fs";import xe from"os";import A from"path";import{Buffer as hn}from"node:buffer";import le from"node:path";import fr,{ChildProcess as gn,exec as yn}from"node:child_process";import ie from"node:process";import wn,{execSync as He}from"child_process";import{fileURLToPath as pr}from"node:url";import vn,{constants as hr}from"node:os";import gr from"assert";import yr from"events";import{createWriteStream as bn,createReadStream as Cn}from"node:fs";import Pn from"buffer";import ht from"stream";import wr from"util";import{debuglog as $n,promisify as En}from"node:util";import Ue from"inquirer";import P from"chalk";import{of as Ae,concatMap as L,from as S,map as M,catchError as R,mergeMap as ze,BehaviorSubject as vr,ReplaySubject as kn,lastValueFrom as br,filter as Cr,toArray as Pr,Subject as $r}from"rxjs";import xn from"@anthropic-ai/sdk";import{fromPromise as D}from"rxjs/internal/observable/innerFrom";import{xxh64 as Er}from"@pacote/xxhash";import z from"winston";import O from"fs/promises";import"winston-daily-rotate-file";import An from"axios";import{CohereClient as Sn}from"cohere-ai";import kr from"openai";import{GoogleGenerativeAI as In,HarmCategory as Ke,HarmBlockThreshold as Je}from"@google/generative-ai";import Mn from"http";import Rn from"https";import On from"net";import Ln from"tls";import Dn,{fileURLToPath as jn,pathToFileURL as Nn}from"url";import xr from"tty";import Tn from"groq-sdk";import{Ollama as Fn}from"ollama";import{fetch as _n,Agent as Gn}from"undici";import We from"readline";import Bn from"figlet";import Ar from"ora";import Hn from"inquirer-reactive-list-prompt";import{readdir as Sr,stat as Un,rm as zn}from"node:fs/promises";import Kn from"chokidar";import{takeUntil as Jn}from"rxjs/operators";var Wn="aicommit2",Ir="2.4.5",Yn="A Reactive CLI that generates commit messages for Git and Jujutsu with various AI",Vn=["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"],qn="MIT",Xn="tak-bro/aicommit2",Qn="Hyungtak Jin(@tak-bro)",Zn="module",es=["dist"],ts={aicommit2:"./dist/cli.mjs",aic2:"./dist/cli.mjs"},rs={prepare:"simple-git-hooks",build:"pkgroll --minify",lint:"eslint --cache .","type-check":"tsc",test:"tsx tests",prepack:"pnpm build && clean-pkg-json",prettier:"prettier"},os={"@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","groq-sdk":"^0.7.0",inquirer:"9.2.8","inquirer-reactive-list-prompt":"^1.0.15",ollama:"^0.5.15",openai:"^5.0.1",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"},ns={"@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"},ss={extends:["@pvtnbr","prettier"],rules:{"unicorn/no-process-exit":"off"},overrides:[{files:"./src/commands/prepare-commit-msg-hook.ts",rules:{"unicorn/prevent-abbreviations":"off"}}]},is={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"]},as={name:Wn,version:Ir,description:Yn,keywords:Vn,license:qn,repository:Xn,author:Qn,type:Zn,files:es,bin:ts,scripts:rs,"simple-git-hooks":{"pre-commit":"pnpm lint-staged"},"lint-staged":{"*.ts":["prettier --config ./.prettierrc --write","eslint --fix"]},dependencies:os,devDependencies:ns,eslintConfig:ss,release:is},cs=pn(import.meta.url),B=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function fe(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var pe={exports:{}},gt,Mr;function ls(){if(Mr)return gt;Mr=1,gt=o,o.sync=n;var t=H;function e(s,i){var c=i.pathExt!==void 0?i.pathExt:process.env.PATHEXT;if(!c||(c=c.split(";"),c.indexOf("")!==-1))return!0;for(var a=0;a<c.length;a++){var m=c[a].toLowerCase();if(m&&s.substr(-m.length).toLowerCase()===m)return!0}return!1}function r(s,i,c){return!s.isSymbolicLink()&&!s.isFile()?!1:e(i,c)}function o(s,i,c){t.stat(s,function(a,m){c(a,a?!1:r(m,s,i))})}function n(s,i){return r(t.statSync(s),s,i)}return gt}var yt,Rr;function us(){if(Rr)return yt;Rr=1,yt=e,e.sync=r;var t=H;function e(s,i,c){t.stat(s,function(a,m){c(a,a?!1:o(m,i))})}function r(s,i){return o(t.statSync(s),i)}function o(s,i){return s.isFile()&&n(s,i)}function n(s,i){var c=s.mode,a=s.uid,m=s.gid,d=i.uid!==void 0?i.uid:process.getuid&&process.getuid(),l=i.gid!==void 0?i.gid:process.getgid&&process.getgid(),p=parseInt("100",8),u=parseInt("010",8),h=parseInt("001",8),g=p|u,y=c&h||c&u&&m===l||c&p&&a===d||c&g&&d===0;return y}return yt}var Ye;process.platform==="win32"||B.TESTING_WINDOWS?Ye=ls():Ye=us();var ds=wt;wt.sync=ms;function wt(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(o,n){wt(t,e||{},function(s,i){s?n(s):o(i)})})}Ye(t,e||{},function(o,n){o&&(o.code==="EACCES"||e&&e.ignoreErrors)&&(o=null,n=!1),r(o,n)})}function ms(t,e){try{return Ye.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}const he=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",Or=A,fs=he?";":":",Lr=ds,Dr=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),jr=(t,e)=>{const r=e.colon||fs,o=t.match(/\//)||he&&t.match(/\\/)?[""]:[...he?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],n=he?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=he?n.split(r):[""];return he&&t.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:o,pathExt:s,pathExtExe:n}},Nr=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});const{pathEnv:o,pathExt:n,pathExtExe:s}=jr(t,e),i=[],c=m=>new Promise((d,l)=>{if(m===o.length)return e.all&&i.length?d(i):l(Dr(t));const p=o[m],u=/^".*"$/.test(p)?p.slice(1,-1):p,h=Or.join(u,t),g=!u&&/^\.[\\\/]/.test(t)?t.slice(0,2)+h:h;d(a(g,m,0))}),a=(m,d,l)=>new Promise((p,u)=>{if(l===n.length)return p(c(d+1));const h=n[l];Lr(m+h,{pathExt:s},(g,y)=>{if(!g&&y)if(e.all)i.push(m+h);else return p(m+h);return p(a(m,d,l+1))})});return r?c(0).then(m=>r(null,m),r):c(0)},ps=(t,e)=>{e=e||{};const{pathEnv:r,pathExt:o,pathExtExe:n}=jr(t,e),s=[];for(let i=0;i<r.length;i++){const c=r[i],a=/^".*"$/.test(c)?c.slice(1,-1):c,m=Or.join(a,t),d=!a&&/^\.[\\\/]/.test(t)?t.slice(0,2)+m:m;for(let l=0;l<o.length;l++){const p=d+o[l];try{if(Lr.sync(p,{pathExt:n}))if(e.all)s.push(p);else return p}catch{}}}if(e.all&&s.length)return s;if(e.nothrow)return null;throw Dr(t)};var hs=Nr;Nr.sync=ps;var vt={exports:{}};const Tr=(t={})=>{const e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(o=>o.toUpperCase()==="PATH")||"Path"};vt.exports=Tr,vt.exports.default=Tr;var gs=vt.exports;const Fr=A,ys=hs,ws=gs;function _r(t,e){const r=t.options.env||process.env,o=process.cwd(),n=t.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(t.options.cwd)}catch{}let i;try{i=ys.sync(t.command,{path:r[ws({env:r})],pathExt:e?Fr.delimiter:void 0})}catch{}finally{s&&process.chdir(o)}return i&&(i=Fr.resolve(n?t.options.cwd:"",i)),i}function vs(t){return _r(t)||_r(t,!0)}var bs=vs,bt={};const Ct=/([()\][%!^"`<>&|;, *?])/g;function Cs(t){return t=t.replace(Ct,"^$1"),t}function Ps(t,e){return t=`${t}`,t=t.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),t=t.replace(/(?=(\\+?)?)\1$/,"$1$1"),t=`"${t}"`,t=t.replace(Ct,"^$1"),e&&(t=t.replace(Ct,"^$1")),t}bt.command=Cs,bt.argument=Ps;var $s=/^#!(.*)/;const Es=$s;var ks=(t="")=>{const e=t.match(Es);if(!e)return null;const[r,o]=e[0].replace(/#! ?/,"").split(" "),n=r.split("/").pop();return n==="env"?o:o?`${n} ${o}`:n};const Pt=H,xs=ks;function As(t){const r=Buffer.alloc(150);let o;try{o=Pt.openSync(t,"r"),Pt.readSync(o,r,0,150,0),Pt.closeSync(o)}catch{}return xs(r.toString())}var Ss=As;const Is=A,Gr=bs,Br=bt,Ms=Ss,Rs=process.platform==="win32",Os=/\.(?:com|exe)$/i,Ls=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function Ds(t){t.file=Gr(t);const e=t.file&&Ms(t.file);return e?(t.args.unshift(t.file),t.command=e,Gr(t)):t.file}function js(t){if(!Rs)return t;const e=Ds(t),r=!Os.test(e);if(t.options.forceShell||r){const o=Ls.test(e);t.command=Is.normalize(t.command),t.command=Br.command(t.command),t.args=t.args.map(s=>Br.argument(s,o));const n=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${n}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function Ns(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);const o={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?o:js(o)}var Ts=Ns;const $t=process.platform==="win32";function Et(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function Fs(t,e){if(!$t)return;const r=t.emit;t.emit=function(o,n){if(o==="exit"){const s=Hr(n,e);if(s)return r.call(t,"error",s)}return r.apply(t,arguments)}}function Hr(t,e){return $t&&t===1&&!e.file?Et(e.original,"spawn"):null}function _s(t,e){return $t&&t===1&&!e.file?Et(e.original,"spawnSync"):null}var Gs={hookChildProcess:Fs,verifyENOENT:Hr,verifyENOENTSync:_s,notFoundError:Et};const Ur=wn,kt=Ts,xt=Gs;function zr(t,e,r){const o=kt(t,e,r),n=Ur.spawn(o.command,o.args,o.options);return xt.hookChildProcess(n,o),n}function Bs(t,e,r){const o=kt(t,e,r),n=Ur.spawnSync(o.command,o.args,o.options);return n.error=n.error||xt.verifyENOENTSync(n.status,o),n}pe.exports=zr,pe.exports.spawn=zr,pe.exports.sync=Bs,pe.exports._parse=kt,pe.exports._enoent=xt;var Hs=pe.exports,Us=fe(Hs);function zs(t){const e=typeof t=="string"?`
3
3
  `:`
4
4
  `.charCodeAt(),r=typeof t=="string"?"\r":"\r".charCodeAt();return t[t.length-1]===e&&(t=t.slice(0,-1)),t[t.length-1]===r&&(t=t.slice(0,-1)),t}function Kr(t={}){const{env:e=process.env,platform:r=process.platform}=t;return r!=="win32"?"PATH":Object.keys(e).reverse().find(o=>o.toUpperCase()==="PATH")||"Path"}const Ks=({cwd:t=ie.cwd(),path:e=ie.env[Kr()],preferLocal:r=!0,execPath:o=ie.execPath,addExecPath:n=!0}={})=>{const s=t instanceof URL?pr(t):t,i=le.resolve(s),c=[];return r&&Js(c,i),n&&Ws(c,o,i),[...c,e].join(le.delimiter)},Js=(t,e)=>{let r;for(;r!==e;)t.push(le.join(e,"node_modules/.bin")),r=e,e=le.resolve(e,"..")},Ws=(t,e,r)=>{const o=e instanceof URL?pr(e):e;t.push(le.resolve(r,o,".."))},Ys=({env:t=ie.env,...e}={})=>{t={...t};const r=Kr({env:t});return e.path=t[r],t[r]=Ks(e),t},Vs=(t,e,r,o)=>{if(r==="length"||r==="prototype"||r==="arguments"||r==="caller")return;const n=Object.getOwnPropertyDescriptor(t,r),s=Object.getOwnPropertyDescriptor(e,r);!qs(n,s)&&o||Object.defineProperty(t,r,s)},qs=function(t,e){return t===void 0||t.configurable||t.writable===e.writable&&t.enumerable===e.enumerable&&t.configurable===e.configurable&&(t.writable||t.value===e.value)},Xs=(t,e)=>{const r=Object.getPrototypeOf(e);r!==Object.getPrototypeOf(t)&&Object.setPrototypeOf(t,r)},Qs=(t,e)=>`/* Wrapped ${t}*/
5
5
  ${e}`,Zs=Object.getOwnPropertyDescriptor(Function.prototype,"toString"),ei=Object.getOwnPropertyDescriptor(Function.prototype.toString,"name"),ti=(t,e,r)=>{const o=r===""?"":`with ${r.trim()}() `,n=Qs.bind(null,o,e.toString());Object.defineProperty(n,"name",ei),Object.defineProperty(t,"toString",{...Zs,value:n})};function ri(t,e,{ignoreNonConfigurable:r=!1}={}){const{name:o}=t;for(const n of Reflect.ownKeys(e))Vs(t,e,n,r);return Xs(t,e),ti(t,e,o),t}const Ve=new WeakMap,Jr=(t,e={})=>{if(typeof t!="function")throw new TypeError("Expected a function");let r,o=0;const n=t.displayName||t.name||"<anonymous>",s=function(...i){if(Ve.set(s,++o),o===1)r=t.apply(this,i),t=null;else if(e.throw===!0)throw new Error(`Function \`${n}\` can only be called once`);return r};return ri(s,t),Ve.set(s,o),s};Jr.callCount=t=>{if(!Ve.has(t))throw new Error(`The given function \`${t.name}\` is not wrapped by the \`onetime\` package`);return Ve.get(t)};const oi=()=>{const t=Yr-Wr+1;return Array.from({length:t},ni)},ni=(t,e)=>({name:`SIGRT${e+1}`,number:Wr+e,action:"terminate",description:"Application-specific signal (realtime)",standard:"posix"}),Wr=34,Yr=64,si=[{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"}],Vr=()=>{const t=oi();return[...si,...t].map(ii)},ii=({name:t,number:e,description:r,action:o,forced:n=!1,standard:s})=>{const{signals:{[t]:i}}=hr,c=i!==void 0;return{name:t,number:c?i:e,description:r,supported:c,action:o,forced:n,standard:s}},ai=()=>{const t=Vr();return Object.fromEntries(t.map(ci))},ci=({name:t,number:e,description:r,supported:o,action:n,forced:s,standard:i})=>[t,{name:t,number:e,description:r,supported:o,action:n,forced:s,standard:i}],li=ai(),ui=()=>{const t=Vr(),e=Yr+1,r=Array.from({length:e},(o,n)=>di(n,t));return Object.assign({},...r)},di=(t,e)=>{const r=mi(t,e);if(r===void 0)return{};const{name:o,description:n,supported:s,action:i,forced:c,standard:a}=r;return{[t]:{name:o,number:t,description:n,supported:s,action:i,forced:c,standard:a}}},mi=(t,e)=>{const r=e.find(({name:o})=>hr.signals[o]===t);return r!==void 0?r:e.find(o=>o.number===t)};ui();const fi=({timedOut:t,timeout:e,errorCode:r,signal:o,signalDescription:n,exitCode:s,isCanceled:i})=>t?`timed out after ${e} milliseconds`:i?"was canceled":r!==void 0?`failed with ${r}`:o!==void 0?`was killed with ${o} (${n})`:s!==void 0?`failed with exit code ${s}`:"failed",qr=({stdout:t,stderr:e,all:r,error:o,signal:n,exitCode:s,command:i,escapedCommand:c,timedOut:a,isCanceled:m,killed:d,parsed:{options:{timeout:l,cwd:p=ie.cwd()}}})=>{s=s===null?void 0:s,n=n===null?void 0:n;const u=n===void 0?void 0:li[n].description,h=o&&o.code,y=`Command ${fi({timedOut:a,timeout:l,errorCode:h,signal:n,signalDescription:u,exitCode:s,isCanceled:m})}: ${i}`,w=Object.prototype.toString.call(o)==="[object Error]",v=w?`${y}
@@ -11,7 +11,7 @@ ${o.message}`:y,E=[v,e,t].filter(Boolean).join(`
11
11
  `).slice(1).join(`
12
12
  `))),console.error(`
13
13
  ${Tt}${P.dim(`aicommit2 v${Ir}`)}`),console.error(`
14
- ${Tt}Please open a Bug report with the information above:`),console.error(`${Tt}https://github.com/tak-bro/aicommit2/issues/new/choose`)))},lo=t=>O.lstat(t).then(()=>!0,()=>!1),uo=async t=>{try{await O.mkdir(t,{recursive:!0})}catch(e){if(e.code!=="EEXIST")throw e}},rt=t=>t&&`${t[0].toUpperCase()}${t.slice(1)}`,ot=(t,e)=>{const r=Math.ceil(t),o=Math.floor(e);return Math.floor(Math.random()*(o-r+1))+r},fa=(t,e)=>t.disabled&&!e.disabled?1:!t.disabled&&e.disabled?-1:0,nt=t=>t.reduce((e,r)=>Array.isArray(r)?e.concat(nt(r)):e.concat(r),[]),mo=(t,e=5)=>t.replace(/[\n\r]/g,"").split(" ").slice(0,e).join(" "),pa=t=>{let e=0;for(let r=0;r<t.length;r++){const o=t.charCodeAt(r);e=(e<<5)-e+o,e=e&e}return Math.abs(e)},ha=t=>{const e=t%360,r=65+t%15,o=45+t%10;return`hsl(${e}, ${r}%, ${o}%)`},ga=t=>{const[e,r,o]=t.match(/\d+/g).map((l,p)=>p===0?Number(l):Number(l)/100),n=(1-Math.abs(2*o-1))*r,s=n*(1-Math.abs(e/60%2-1)),i=o-n/2;let c,a,m;e<60?[c,a,m]=[n,s,0]:e<120?[c,a,m]=[s,n,0]:e<180?[c,a,m]=[0,n,s]:e<240?[c,a,m]=[0,s,n]:e<300?[c,a,m]=[s,0,n]:[c,a,m]=[n,0,s];const d=l=>{const p=Math.round((l+i)*255).toString(16);return p.length===1?"0"+p:p};return`#${d(c)}${d(a)}${d(m)}`},ya=t=>{const e=pa(t),r=ha(e);return{primary:ga(r),secondary:"#FFFFFF"}},wa=t=>{try{return{ok:!0,data:JSON.parse(t)}}catch(e){return{ok:!1,error:e}}},st=t=>{if(!t||typeof t!="string")return"";if(A.isAbsolute(t))return A.resolve(t);if(Oe){const e=A.dirname(Oe),r=A.join(e,t);return A.resolve(r)}else return""},va=["","conventional","gitmoji","jujutsu"],Ft="http://localhost:11434",{hasOwnProperty:ba}=Object.prototype,_t=(t,e)=>ba.call(t,e),be=["OPENAI","OLLAMA","HUGGINGFACE","GEMINI","ANTHROPIC","MISTRAL","CODESTRAL","COHERE","GROQ","PERPLEXITY","DEEPSEEK","GITHUB_MODELS"],fo=t=>{const e=xe.platform(),r=xe.homedir();let o,n;switch(t){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")t==="cache"?n=A.join(r,"Library","Caches"):n=A.join(r,"Application Support");else if(e==="win32")n=process.env.LOCALAPPDATA||r;else switch(t){case"config":n=A.join(r,".config");break;case"data":n=A.join(r,".local","share");break;case"cache":n=A.join(r,".cache");break;case"state":n=A.join(r,".local","state");break;default:n=r}return o||n},Ca=A.join(fo("config"),"aicommit2"),re=A.join(fo("state"),"aicommit2","logs"),po=A.join(Ca,"config.ini"),ho=A.join(re,"aicommit2-%DATE%.log"),go=A.join(re,"exceptions-%DATE%.log"),Pa=t=>{const e=Object.keys(t),r=new Set([...be,...e.filter(o=>/^[A-Z][A-Z0-9_]*$/.test(o))]);return Array.from(r)},k=(t,e,r)=>{if(!e)throw new b(`Invalid config property ${t}: ${r}`)},f={systemPrompt(t){return t||""},systemPromptPath(t){return t||""},codeReviewPromptPath(t){return t||""},timeout(t){if(!t)return 1e4;k("timeout",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return k("timeout",e>=500,"Must be greater than 500ms"),e},temperature(t){if(!t)return .7;k("temperature",/^(2|\d)(\.\d{1,2})?$/.test(t),"Must be decimal between 0 and 2");const e=Number(t);return k("temperature",e>0,"Must be greater than 0"),k("temperature",e<=2,"Must be less than or equal to 2"),e},maxTokens(t){return t?(k("maxTokens",/^\d+$/.test(t),"Must be an integer"),Number(t)):1024},logging(t){return typeof t=="boolean"?t:t==null?!0:(k("logging",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},logLevel(t){return t?(k("logLevel",/^(?:error|warn|info|http|verbose|debug|silly)$/.test(t),"Must be a valid log level (error, warn, info, http, verbose, debug, silly)"),t):"info"},logFilePath(t){return t||ho},exceptionLogFilePath(t){return t||go},locale(t){return t?(k("locale",t,"Cannot be empty"),k("locale",/^[a-z-]+$/i.test(t),"Must be a valid locale (letters and dashes/underscores). You can consult the list of codes in: https://wikipedia.org/wiki/List_of_ISO_639-1_codes"),t):"en"},generate(t){if(!t)return 1;k("generate",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return k("generate",e>0,"Must be greater than 0"),k("generate",e<=5,"Must be less or equal to 5"),e},type(t){return t?(k("type",va.includes(t),"Invalid commit type"),t):"conventional"},maxLength(t){if(!t)return 50;k("maxLength",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return k("maxLength",e>=20,"Must be greater than 20 characters"),e},includeBody(t){return typeof t=="boolean"?t:t==null?!1:(k("includeBody",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},exclude:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.length>0):[],topP:t=>{if(!t)return .9;k("topP",/^(1|\d)(\.\d{1,2})?$/.test(t),"Must be decimal between 0 and 1");const e=Number(t);return k("topP",e>0,"Must be greater than 0"),k("topP",e<=1,"Must be less than or equal to 1"),e},codeReview(t){return typeof t=="boolean"?t:t==null?!1:(k("codeReview",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},disabled(t){return typeof t=="boolean"?t:t==null?!1:(k("disabled",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},watchMode(t){return typeof t=="boolean"?t:t==null?!1:(k("watchMode",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},jujutsu(t){return typeof t=="boolean"?t:t==null?!1:(k("jujutsu",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},disableLowerCase(t){return typeof t=="boolean"?t:t==null?!1:(k("disableLowerCase",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")}},Re={OPENAI:{key:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.length>0):["gpt-4o-mini"],url:t=>t?(k("OPENAI.url",/^https?:\/\//.test(t),"Must be a valid URL"),t):"https://api.openai.com",path:t=>t||"/v1/chat/completions",proxy:t=>t||"",topP: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:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.length>0):[],host:t=>t?(k("OLLAMA.host",/^https?:\/\//.test(t),"Must be a valid URL"),t):Ft,timeout:t=>{if(!t)return 1e5;k("OLLAMA.timeout",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return k("OLLAMA.timeout",e>=500,"Must be greater than 500ms"),e},auth:t=>t||"",key:t=>t||"",envKey:t=>t||"",numCtx:t=>{if(!t)return 2048;k("OLLAMA.numCtx",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return k("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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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 Oe;const $a=(t=[])=>{const e={};for(const r of t)if(r.startsWith("--")){const[o,n]=r.slice(2).split("="),[s,i]=o.split(".");s&&i&&s in Re?(e[s]||(e[s]={}),e[s][i]=n):e[o]=n}return e},Ea=()=>{const t=xe.homedir(),e=process.env.AICOMMIT_CONFIG_PATH,r=po,o=A.join(t,".aicommit2");return[e,r,o].filter(n=>!!n)},Ce=async()=>{const t=Ea();for(const e of t)if(await lo(e))return e;return po},Le=async()=>{const t=await Ce();Oe=t;try{const e=await O.readFile(t,"utf8");return ve.parse(e)}catch(e){return e.code==="ENOENT"?(Oe=void 0,{}):(console.error(`Error reading config file ${t}:`,e),Oe=void 0,{})}},de=async(t,e=[])=>{const r=await Le(),o=$a(e),n={...t,...o},s={},i=Pa(r),c={};for(const m of i){const l=r[m]?.envKey||`${m}_API_KEY`,p=process.env[l];p&&(c[m]={key:p})}const a=(m,d)=>{const l=n[`${m}.${d}`]??n[m]?.[d],p=c[m]?.[d],u=r[m]?.[d],h=n[d]??r[d];return l!==void 0?l:p!==void 0?p:u!==void 0?u:h};for(const[m,d]of Object.entries(f)){const l=n[m]??r[m];s[m]=d(l)}for(const m of i){s[m]={};const d=Re[m]||it(m);for(const[l,p]of Object.entries(d)){const u=a(m,l);s[m][l]=p(u)}}return s},Gt=async t=>{const e=await Le();for(const[n,s]of t){const[i,c]=n.split(".");if(!c){const d=f[n];if(!d)throw new b(`Invalid config property: ${n}`);e[n]=d(s);continue}if(e[i]||(e[i]={}),be.includes(i)){const d=Re[i][c];if(!d)throw new b(`Invalid config property: ${n}`);e[i][c]=d(s);continue}if(!/^[A-Z][A-Z0-9_]*$/.test(i))throw new b(`Invalid service name: ${i}. Service names must be uppercase letters, numbers, and underscores.`);const m=it(i);if(!m[c])throw new b(`Invalid config property for custom service: ${n}`);try{e[i][c]=m[c](s)}catch(d){throw d instanceof b?d:new b(`Invalid value for ${n}: ${d.message}`)}}const r=await Ce(),o=A.dirname(r);await O.mkdir(o,{recursive:!0}),await O.writeFile(r,ve.stringify(e),"utf8")},ka=async t=>{const e=await Le();for(const[n,s]of t){const[i,c]=n.split("."),a=e[i];if(c==="model"){a||(e[i]={});const d=e[i][c]||[],l=typeof s=="string"?s.split(",").map(p=>p.trim()).filter(p=>!!p):s;e[i][c]=nt([...d,...l]);continue}if(a&&a.compatible===!0){a||(e[i]={});const d=it(i);if(!d[c])throw new b(`Invalid config property: ${n}`);try{e[i][c]=d[c](s)}catch(l){throw l instanceof b?l:new b(`Invalid value for ${n}: ${l.message}`)}continue}if(i in Re){a||(e[i]={});const d=Re[i][c];if(!d)throw new b(`Invalid config property: ${n}`);e[i][c]=d(s)}else{const d=it(i);if(!d[c])throw new b(`Invalid config property: ${n}`);e[i]||(e[i]={}),e[i][c]=d[c](s)}}const r=await Ce(),o=A.dirname(r);await O.mkdir(o,{recursive:!0}),await O.writeFile(r,ve.stringify(e),"utf8")},xa=async()=>{const t=await Le();console.log(ve.stringify(t))},Aa=async()=>{console.log(await Ce())},it=t=>({compatible:e=>typeof e=="boolean"?e:e==null?!1:(k("compatible",/^(?:true|false)$/.test(e),"Must be a boolean(true or false)"),e==="true"),stream:e=>typeof e=="boolean"?e:e==null?!1:(k("stream",/^(?:true|false)$/.test(e),"Must be a boolean(true or false)"),e==="true"),url:e=>e?(k(`${t}.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}),De=new Map,me=(t,e,r)=>{const o=Er(0).update(e).digest("hex").substring(0,8),n=`${t}_${o}_${r}`;if(De.has(n))return De.get(n);const s=new Date,i=Ma(s,t,e,r),c=`${re}/${i}`,a=z.createLogger({level:"info",format:z.format.combine(z.format.timestamp({format:"YYYY-MM-DDTHH:mm:ss.SSSZ"}),z.format.printf(({timestamp:m,level:d,message:l,...p})=>p&&Object.keys(p).length>0?`[${m}] ${d}: ${l} ${JSON.stringify(p,null,2)}`:`[${m}] ${d}: ${l}`)),transports:[new z.transports.File({filename:c})]});return a.info(`=== ${t.toUpperCase()} AI SERVICE LOG ===`),a.info(`Diff Hash: ${o}`),a.info(`Request Type: ${r.toUpperCase()}`),a.info(`Start Time: ${s.toISOString()}`),a.info("=".repeat(50)),a.info(""),De.set(n,a),a},Sa=t=>{const e={...t},r=["authorization","x-api-key","x-goog-api-key","api-key"];for(const o of r){const n=o.toLowerCase(),s=Object.keys(e).find(i=>i.toLowerCase()===n);s&&e[s]&&typeof e[s]=="string"&&(e[s].startsWith("Bearer ")?e[s]="Bearer [MASKED]":e[s]="[MASKED]")}return e},q=(t,e,r,o,n,s,i=!0)=>{if(!i)return;const c=me(r,t,e);c.info(`Making request to ${r} API with model: ${o}`),c.info(`Request URL: ${n}`),c.info("Request headers:",Sa(s))},oe=(t,e,r,o,n=!0)=>{if(!n)return;me(r,t,e).info("Request payload:",o)},X=(t,e,r,o,n,s=!0)=>{if(!s)return;const i=me(r,t,e);i.info("System prompt:",{prompt:o}),i.info("User prompt:",{prompt:n})},Q=(t,e,r,o,n=!0)=>{if(!n)return;me(r,t,e).info("Response received:",o)},G=(t,e,r,o,n=!0)=>{if(!n)return;me(r,t,e).error("API request failed:",o)},W=(t,e,r,o,n,s=!0)=>{if(!s)return;const i=me(r,t,e);o?i.info(`Request completed successfully in ${o}ms`):i.info("Request completed successfully"),n&&i.info("Final processed response:",{response:n}),i.info(""),i.info("=".repeat(50)),i.info(`End Time: ${new Date().toISOString()}`),i.info("=== REQUEST COMPLETED ===")},Ia=(t,e,r,o,n,s,i,c=!0)=>{if(!c)return;const a=me(r,t,e);i?a.error(`Request failed after ${s}ms:`,{error:i}):(a.info(`Request completed in ${s}ms`),a.info("Response:",{response:n})),W(t,e,r,s,n,c)},Ma=(t,e,r,o)=>{const{year:n,month:s,day:i,hours:c,minutes:a,seconds:m}=Ra(t),l=Er(0).update(r).digest("hex").substring(0,8),p=e.toLowerCase().replace(/[^a-z0-9]/g,"").substring(0,20);return o==="review"?`${n}-${s}-${i}_${c}-${a}-${m}_${l}_${p}_review.log`:`${n}-${s}-${i}_${c}-${a}-${m}_${l}_${p}_commit.log`},Ra=t=>{const e=t.getFullYear().toString(),r=(t.getMonth()+1).toString().padStart(2,"0"),o=t.getDate().toString().padStart(2,"0"),n=t.getHours().toString().padStart(2,"0"),s=t.getMinutes().toString().padStart(2,"0"),i=t.getSeconds().toString().padStart(2,"0");return{year:e,month:r,day:o,hours:n,minutes:s,seconds:i}},Bt=()=>{for(const[t,e]of De.entries())try{e.close()}catch(r){console.error(`Failed to close logger ${t}:`,r)}De.clear()};process.on("exit",Bt),process.on("SIGINT",()=>{Bt(),process.exit(0)}),process.on("SIGTERM",()=>{Bt(),process.exit(0)});let at;async function Oa(t){if(at){console.warn("Logger already initialized. Skipping re-initialization.");return}const e=t?.logLevel||"info",r=t?.logFilePath||ho,o=t?.exceptionLogFilePath||go,n=t?.logging??!0;await uo(A.dirname(r)),await uo(A.dirname(o));const s=[];n?s.push(new z.transports.DailyRotateFile({filename:r,datePattern:"YYYY-MM-DD",zippedArchive:!0,maxSize:"20m",maxFiles:"14d",level:e,format:z.format.combine(z.format.timestamp(),z.format.printf(({level:i,message:c,timestamp:a})=>`[${a}] ${i}: ${c}`))})):s.push(new z.transports.Console({silent:!0})),at=z.createLogger({level:e,format:z.format.json(),transports:s,exceptionHandlers:n?[new z.transports.DailyRotateFile({filename:o,datePattern:"YYYY-MM-DD",zippedArchive:!0,maxSize:"20m",maxFiles:"14d",format:z.format.combine(z.format.timestamp(),z.format.json())})]:[],exitOnError:!1,silent:!n})}const Pe=new Proxy({},{get:(t,e,r)=>{if(!at)throw new Error("Logger not initialized. Call initializeLogger() first.");return Reflect.get(at,e,r)}});class Z{constructor(e){this.handleError$=r=>{const o=this.getDetailedErrorMessage(r),n=r.status?`HTTP ${r.status}: ${o}`:o;if(this.params.config.logging){const s=this.params.stagedDiff.diff,i=this.serviceName.replace(/\[|\]/g,"").trim();Ia(s,"commit",i,"Error occurred","",void 0,n)}return Pe.error(`${this.errorPrefix} ${n}`),r.stack&&Pe.error(` ${r.stack}`),r.content&&Pe.error(` Problematic content: ${r.content}`),r.originalError&&Pe.error(` Original error: ${r.originalError}`),Ae({name:`${this.errorPrefix} ${n}`,value:n,isError:!0,disabled:!0})},this.serviceName="AI",this.errorPrefix="ERROR",this.colors={primary:""},this.params=e,this.logSessionId=e.logSessionId}getDetailedErrorMessage(e){const r=e.message||"";return r.includes("API key")||r.includes("api_key")?"Invalid API key. Check your API key configuration":r.includes("rate_limit")||r.includes("Rate limit")||r.includes("429")||r.includes("Too Many Requests")?"Rate limit exceeded. Wait a moment and try again, or upgrade your plan":r.includes("model")||r.includes("Model")?"Model not found or not accessible. Check if the model name is correct":r.includes("timeout")||r.includes("Timeout")?"Request timed out. Try again or increase the timeout setting":r.includes("network")||r.includes("connection")||r.includes("ECONNREFUSED")?"Network error. Check your internet connection and try again":r.includes("quota")||r.includes("usage")||r.includes("QUOTA_EXCEEDED")?"API quota exceeded. Check your usage limits":r.includes("401")||r.includes("Unauthorized")?"Authentication failed. Your API key may be invalid or expired":r.includes("403")||r.includes("Forbidden")?"Access denied. Your API key may not have permission for this model":r.includes("404")||r.includes("Not Found")?"Model or endpoint not found. Check your model configuration":r.includes("500")||r.includes("Internal Server Error")?"Server error. Try again later":r.includes("overloaded")||r.includes("capacity")||r.includes("SERVICE_UNAVAILABLE")||r.includes("unavailable")?"Service is temporarily unavailable. Try again in a few minutes":this.getServiceSpecificErrorMessage(e)||r||"Unknown error occurred"}getServiceSpecificErrorMessage(e){return null}cleanJsonCodeBlock(e){const r=/```(?:json|JSON)?\s*([\s\S]*?)\s*```/,o=e.match(r);return o?o[1].trim():e}parseMessage(e,r,o){const n=this.cleanJsonCodeBlock(e),s=/(\[\s*\{[\s\S]*?\}\s*\]|\{[\s\S]*?\})/,i=n.match(s);if(!i){const u=new Error("AI response did not contain a valid JSON object or array.");throw u.name="InvalidJsonResponse",u.content=e,u}const c=i[0],a=wa(c);if(!a.ok){const u=new Error("Failed to parse AI response as JSON");throw u.name="JsonParseError",u.content=c,u.originalError=a.error,u}const m=a.data,d=Array.isArray(m)?m:[m];if(!d.length||!d.every(u=>typeof u.subject=="string")){const u=new Error("AI response contained malformed commit message data.");throw u.name="MalformedCommitMessage",u.content=e,u}const p=d.map(u=>this.extractMessageAsType(u,r)).map(u=>({title:`${u.subject}`,value:`${u.subject}${u.body?`
14
+ ${Tt}Please open a Bug report with the information above:`),console.error(`${Tt}https://github.com/tak-bro/aicommit2/issues/new/choose`)))},lo=t=>O.lstat(t).then(()=>!0,()=>!1),uo=async t=>{try{await O.mkdir(t,{recursive:!0})}catch(e){if(e.code!=="EEXIST")throw e}},rt=t=>t&&`${t[0].toUpperCase()}${t.slice(1)}`,ot=(t,e)=>{const r=Math.ceil(t),o=Math.floor(e);return Math.floor(Math.random()*(o-r+1))+r},fa=(t,e)=>t.disabled&&!e.disabled?1:!t.disabled&&e.disabled?-1:0,nt=t=>t.reduce((e,r)=>Array.isArray(r)?e.concat(nt(r)):e.concat(r),[]),mo=(t,e=5)=>t.replace(/[\n\r]/g,"").split(" ").slice(0,e).join(" "),pa=t=>{let e=0;for(let r=0;r<t.length;r++){const o=t.charCodeAt(r);e=(e<<5)-e+o,e=e&e}return Math.abs(e)},ha=t=>{const e=t%360,r=65+t%15,o=45+t%10;return`hsl(${e}, ${r}%, ${o}%)`},ga=t=>{const[e,r,o]=t.match(/\d+/g).map((l,p)=>p===0?Number(l):Number(l)/100),n=(1-Math.abs(2*o-1))*r,s=n*(1-Math.abs(e/60%2-1)),i=o-n/2;let c,a,m;e<60?[c,a,m]=[n,s,0]:e<120?[c,a,m]=[s,n,0]:e<180?[c,a,m]=[0,n,s]:e<240?[c,a,m]=[0,s,n]:e<300?[c,a,m]=[s,0,n]:[c,a,m]=[n,0,s];const d=l=>{const p=Math.round((l+i)*255).toString(16);return p.length===1?"0"+p:p};return`#${d(c)}${d(a)}${d(m)}`},ya=t=>{const e=pa(t),r=ha(e);return{primary:ga(r),secondary:"#FFFFFF"}},wa=t=>{try{return{ok:!0,data:JSON.parse(t)}}catch(e){return{ok:!1,error:e}}},st=t=>{if(!t||typeof t!="string")return"";if(A.isAbsolute(t))return A.resolve(t);if(Oe){const e=A.dirname(Oe),r=A.join(e,t);return A.resolve(r)}else return""},va=["","conventional","gitmoji","jujutsu"],Ft="http://localhost:11434",{hasOwnProperty:ba}=Object.prototype,_t=(t,e)=>ba.call(t,e),be=["OPENAI","OLLAMA","HUGGINGFACE","GEMINI","ANTHROPIC","MISTRAL","CODESTRAL","COHERE","GROQ","PERPLEXITY","DEEPSEEK","GITHUB_MODELS"],fo=t=>{const e=xe.platform(),r=xe.homedir();let o,n;switch(t){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")t==="cache"?n=A.join(r,"Library","Caches"):n=A.join(r,"Library","Application Support");else if(e==="win32")n=process.env.LOCALAPPDATA||r;else switch(t){case"config":n=A.join(r,".config");break;case"data":n=A.join(r,".local","share");break;case"cache":n=A.join(r,".cache");break;case"state":n=A.join(r,".local","state");break;default:n=r}return o||n},Ca=A.join(fo("config"),"aicommit2"),re=A.join(fo("state"),"aicommit2","logs"),po=A.join(Ca,"config.ini"),ho=A.join(re,"aicommit2-%DATE%.log"),go=A.join(re,"exceptions-%DATE%.log"),Pa=t=>{const e=Object.keys(t),r=new Set([...be,...e.filter(o=>/^[A-Z][A-Z0-9_]*$/.test(o))]);return Array.from(r)},k=(t,e,r)=>{if(!e)throw new b(`Invalid config property ${t}: ${r}`)},f={systemPrompt(t){return t||""},systemPromptPath(t){return t||""},codeReviewPromptPath(t){return t||""},timeout(t){if(!t)return 1e4;k("timeout",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return k("timeout",e>=500,"Must be greater than 500ms"),e},temperature(t){if(!t)return .7;k("temperature",/^(2|\d)(\.\d{1,2})?$/.test(t),"Must be decimal between 0 and 2");const e=Number(t);return k("temperature",e>0,"Must be greater than 0"),k("temperature",e<=2,"Must be less than or equal to 2"),e},maxTokens(t){return t?(k("maxTokens",/^\d+$/.test(t),"Must be an integer"),Number(t)):1024},logging(t){return typeof t=="boolean"?t:t==null?!0:(k("logging",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},logLevel(t){return t?(k("logLevel",/^(?:error|warn|info|http|verbose|debug|silly)$/.test(t),"Must be a valid log level (error, warn, info, http, verbose, debug, silly)"),t):"info"},logFilePath(t){return t||ho},exceptionLogFilePath(t){return t||go},locale(t){return t?(k("locale",t,"Cannot be empty"),k("locale",/^[a-z-]+$/i.test(t),"Must be a valid locale (letters and dashes/underscores). You can consult the list of codes in: https://wikipedia.org/wiki/List_of_ISO_639-1_codes"),t):"en"},generate(t){if(!t)return 1;k("generate",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return k("generate",e>0,"Must be greater than 0"),k("generate",e<=5,"Must be less or equal to 5"),e},type(t){return t?(k("type",va.includes(t),"Invalid commit type"),t):"conventional"},maxLength(t){if(!t)return 50;k("maxLength",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return k("maxLength",e>=20,"Must be greater than 20 characters"),e},includeBody(t){return typeof t=="boolean"?t:t==null?!1:(k("includeBody",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},exclude:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.length>0):[],topP:t=>{if(!t)return .9;k("topP",/^(1|\d)(\.\d{1,2})?$/.test(t),"Must be decimal between 0 and 1");const e=Number(t);return k("topP",e>0,"Must be greater than 0"),k("topP",e<=1,"Must be less than or equal to 1"),e},codeReview(t){return typeof t=="boolean"?t:t==null?!1:(k("codeReview",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},disabled(t){return typeof t=="boolean"?t:t==null?!1:(k("disabled",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},watchMode(t){return typeof t=="boolean"?t:t==null?!1:(k("watchMode",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},jujutsu(t){return typeof t=="boolean"?t:t==null?!1:(k("jujutsu",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")},disableLowerCase(t){return typeof t=="boolean"?t:t==null?!1:(k("disableLowerCase",/^(?:true|false)$/.test(t),"Must be a boolean(true or false)"),t==="true")}},Re={OPENAI:{key:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.length>0):["gpt-4o-mini"],url:t=>t?(k("OPENAI.url",/^https?:\/\//.test(t),"Must be a valid URL"),t):"https://api.openai.com",path:t=>t||"/v1/chat/completions",proxy:t=>t||"",topP: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:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.length>0):[],host:t=>t?(k("OLLAMA.host",/^https?:\/\//.test(t),"Must be a valid URL"),t):Ft,timeout:t=>{if(!t)return 1e5;k("OLLAMA.timeout",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return k("OLLAMA.timeout",e>=500,"Must be greater than 500ms"),e},auth:t=>t||"",key:t=>t||"",envKey:t=>t||"",numCtx:t=>{if(!t)return 2048;k("OLLAMA.numCtx",/^\d+$/.test(t),"Must be an integer");const e=Number(t);return k("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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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:t=>t||"",envKey:t=>t||"",model:t=>t?(typeof t=="string"?t?.split(","):t).map(r=>r.trim()).filter(r=>!!r&&r.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 Oe;const $a=(t=[])=>{const e={};for(const r of t)if(r.startsWith("--")){const[o,n]=r.slice(2).split("="),[s,i]=o.split(".");s&&i&&s in Re?(e[s]||(e[s]={}),e[s][i]=n):e[o]=n}return e},Ea=()=>{const t=xe.homedir(),e=process.env.AICOMMIT_CONFIG_PATH,r=po,o=A.join(t,".aicommit2");return[e,r,o].filter(n=>!!n)},Ce=async()=>{const t=Ea();for(const e of t)if(await lo(e))return e;return po},Le=async()=>{const t=await Ce();Oe=t;try{const e=await O.readFile(t,"utf8");return ve.parse(e)}catch(e){return e.code==="ENOENT"?(Oe=void 0,{}):(console.error(`Error reading config file ${t}:`,e),Oe=void 0,{})}},de=async(t,e=[])=>{const r=await Le(),o=$a(e),n={...t,...o},s={},i=Pa(r),c={};for(const m of i){const l=r[m]?.envKey||`${m}_API_KEY`,p=process.env[l];p&&(c[m]={key:p})}const a=(m,d)=>{const l=n[`${m}.${d}`]??n[m]?.[d],p=c[m]?.[d],u=r[m]?.[d],h=n[d]??r[d];return l!==void 0?l:p!==void 0?p:u!==void 0?u:h};for(const[m,d]of Object.entries(f)){const l=n[m]??r[m];s[m]=d(l)}for(const m of i){s[m]={};const d=Re[m]||it(m);for(const[l,p]of Object.entries(d)){const u=a(m,l);s[m][l]=p(u)}}return s},Gt=async t=>{const e=await Le();for(const[n,s]of t){const[i,c]=n.split(".");if(!c){const d=f[n];if(!d)throw new b(`Invalid config property: ${n}`);e[n]=d(s);continue}if(e[i]||(e[i]={}),be.includes(i)){const d=Re[i][c];if(!d)throw new b(`Invalid config property: ${n}`);e[i][c]=d(s);continue}if(!/^[A-Z][A-Z0-9_]*$/.test(i))throw new b(`Invalid service name: ${i}. Service names must be uppercase letters, numbers, and underscores.`);const m=it(i);if(!m[c])throw new b(`Invalid config property for custom service: ${n}`);try{e[i][c]=m[c](s)}catch(d){throw d instanceof b?d:new b(`Invalid value for ${n}: ${d.message}`)}}const r=await Ce(),o=A.dirname(r);await O.mkdir(o,{recursive:!0}),await O.writeFile(r,ve.stringify(e),"utf8")},ka=async t=>{const e=await Le();for(const[n,s]of t){const[i,c]=n.split("."),a=e[i];if(c==="model"){a||(e[i]={});const d=e[i][c]||[],l=typeof s=="string"?s.split(",").map(p=>p.trim()).filter(p=>!!p):s;e[i][c]=nt([...d,...l]);continue}if(a&&a.compatible===!0){a||(e[i]={});const d=it(i);if(!d[c])throw new b(`Invalid config property: ${n}`);try{e[i][c]=d[c](s)}catch(l){throw l instanceof b?l:new b(`Invalid value for ${n}: ${l.message}`)}continue}if(i in Re){a||(e[i]={});const d=Re[i][c];if(!d)throw new b(`Invalid config property: ${n}`);e[i][c]=d(s)}else{const d=it(i);if(!d[c])throw new b(`Invalid config property: ${n}`);e[i]||(e[i]={}),e[i][c]=d[c](s)}}const r=await Ce(),o=A.dirname(r);await O.mkdir(o,{recursive:!0}),await O.writeFile(r,ve.stringify(e),"utf8")},xa=async()=>{const t=await Le();console.log(ve.stringify(t))},Aa=async()=>{console.log(await Ce())},it=t=>({compatible:e=>typeof e=="boolean"?e:e==null?!1:(k("compatible",/^(?:true|false)$/.test(e),"Must be a boolean(true or false)"),e==="true"),stream:e=>typeof e=="boolean"?e:e==null?!1:(k("stream",/^(?:true|false)$/.test(e),"Must be a boolean(true or false)"),e==="true"),url:e=>e?(k(`${t}.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}),De=new Map,me=(t,e,r)=>{const o=Er(0).update(e).digest("hex").substring(0,8),n=`${t}_${o}_${r}`;if(De.has(n))return De.get(n);const s=new Date,i=Ma(s,t,e,r),c=`${re}/${i}`,a=z.createLogger({level:"info",format:z.format.combine(z.format.timestamp({format:"YYYY-MM-DDTHH:mm:ss.SSSZ"}),z.format.printf(({timestamp:m,level:d,message:l,...p})=>p&&Object.keys(p).length>0?`[${m}] ${d}: ${l} ${JSON.stringify(p,null,2)}`:`[${m}] ${d}: ${l}`)),transports:[new z.transports.File({filename:c})]});return a.info(`=== ${t.toUpperCase()} AI SERVICE LOG ===`),a.info(`Diff Hash: ${o}`),a.info(`Request Type: ${r.toUpperCase()}`),a.info(`Start Time: ${s.toISOString()}`),a.info("=".repeat(50)),a.info(""),De.set(n,a),a},Sa=t=>{const e={...t},r=["authorization","x-api-key","x-goog-api-key","api-key"];for(const o of r){const n=o.toLowerCase(),s=Object.keys(e).find(i=>i.toLowerCase()===n);s&&e[s]&&typeof e[s]=="string"&&(e[s].startsWith("Bearer ")?e[s]="Bearer [MASKED]":e[s]="[MASKED]")}return e},q=(t,e,r,o,n,s,i=!0)=>{if(!i)return;const c=me(r,t,e);c.info(`Making request to ${r} API with model: ${o}`),c.info(`Request URL: ${n}`),c.info("Request headers:",Sa(s))},oe=(t,e,r,o,n=!0)=>{if(!n)return;me(r,t,e).info("Request payload:",o)},X=(t,e,r,o,n,s=!0)=>{if(!s)return;const i=me(r,t,e);i.info("System prompt:",{prompt:o}),i.info("User prompt:",{prompt:n})},Q=(t,e,r,o,n=!0)=>{if(!n)return;me(r,t,e).info("Response received:",o)},G=(t,e,r,o,n=!0)=>{if(!n)return;me(r,t,e).error("API request failed:",o)},W=(t,e,r,o,n,s=!0)=>{if(!s)return;const i=me(r,t,e);o?i.info(`Request completed successfully in ${o}ms`):i.info("Request completed successfully"),n&&i.info("Final processed response:",{response:n}),i.info(""),i.info("=".repeat(50)),i.info(`End Time: ${new Date().toISOString()}`),i.info("=== REQUEST COMPLETED ===")},Ia=(t,e,r,o,n,s,i,c=!0)=>{if(!c)return;const a=me(r,t,e);i?a.error(`Request failed after ${s}ms:`,{error:i}):(a.info(`Request completed in ${s}ms`),a.info("Response:",{response:n})),W(t,e,r,s,n,c)},Ma=(t,e,r,o)=>{const{year:n,month:s,day:i,hours:c,minutes:a,seconds:m}=Ra(t),l=Er(0).update(r).digest("hex").substring(0,8),p=e.toLowerCase().replace(/[^a-z0-9]/g,"").substring(0,20);return o==="review"?`${n}-${s}-${i}_${c}-${a}-${m}_${l}_${p}_review.log`:`${n}-${s}-${i}_${c}-${a}-${m}_${l}_${p}_commit.log`},Ra=t=>{const e=t.getFullYear().toString(),r=(t.getMonth()+1).toString().padStart(2,"0"),o=t.getDate().toString().padStart(2,"0"),n=t.getHours().toString().padStart(2,"0"),s=t.getMinutes().toString().padStart(2,"0"),i=t.getSeconds().toString().padStart(2,"0");return{year:e,month:r,day:o,hours:n,minutes:s,seconds:i}},Bt=()=>{for(const[t,e]of De.entries())try{e.close()}catch(r){console.error(`Failed to close logger ${t}:`,r)}De.clear()};process.on("exit",Bt),process.on("SIGINT",()=>{Bt(),process.exit(0)}),process.on("SIGTERM",()=>{Bt(),process.exit(0)});let at;async function Oa(t){if(at){console.warn("Logger already initialized. Skipping re-initialization.");return}const e=t?.logLevel||"info",r=t?.logFilePath||ho,o=t?.exceptionLogFilePath||go,n=t?.logging??!0;await uo(A.dirname(r)),await uo(A.dirname(o));const s=[];n?s.push(new z.transports.DailyRotateFile({filename:r,datePattern:"YYYY-MM-DD",zippedArchive:!0,maxSize:"20m",maxFiles:"14d",level:e,format:z.format.combine(z.format.timestamp(),z.format.printf(({level:i,message:c,timestamp:a})=>`[${a}] ${i}: ${c}`))})):s.push(new z.transports.Console({silent:!0})),at=z.createLogger({level:e,format:z.format.json(),transports:s,exceptionHandlers:n?[new z.transports.DailyRotateFile({filename:o,datePattern:"YYYY-MM-DD",zippedArchive:!0,maxSize:"20m",maxFiles:"14d",format:z.format.combine(z.format.timestamp(),z.format.json())})]:[],exitOnError:!1,silent:!n})}const Pe=new Proxy({},{get:(t,e,r)=>{if(!at)throw new Error("Logger not initialized. Call initializeLogger() first.");return Reflect.get(at,e,r)}});class Z{constructor(e){this.handleError$=r=>{const o=this.getDetailedErrorMessage(r),n=r.status?`HTTP ${r.status}: ${o}`:o;if(this.params.config.logging){const s=this.params.stagedDiff.diff,i=this.serviceName.replace(/\[|\]/g,"").trim();Ia(s,"commit",i,"Error occurred","",void 0,n)}return Pe.error(`${this.errorPrefix} ${n}`),r.stack&&Pe.error(` ${r.stack}`),r.content&&Pe.error(` Problematic content: ${r.content}`),r.originalError&&Pe.error(` Original error: ${r.originalError}`),Ae({name:`${this.errorPrefix} ${n}`,value:n,isError:!0,disabled:!0})},this.serviceName="AI",this.errorPrefix="ERROR",this.colors={primary:""},this.params=e,this.logSessionId=e.logSessionId}getDetailedErrorMessage(e){const r=e.message||"";return r.includes("API key")||r.includes("api_key")?"Invalid API key. Check your API key configuration":r.includes("rate_limit")||r.includes("Rate limit")||r.includes("429")||r.includes("Too Many Requests")?"Rate limit exceeded. Wait a moment and try again, or upgrade your plan":r.includes("model")||r.includes("Model")?"Model not found or not accessible. Check if the model name is correct":r.includes("timeout")||r.includes("Timeout")?"Request timed out. Try again or increase the timeout setting":r.includes("network")||r.includes("connection")||r.includes("ECONNREFUSED")?"Network error. Check your internet connection and try again":r.includes("quota")||r.includes("usage")||r.includes("QUOTA_EXCEEDED")?"API quota exceeded. Check your usage limits":r.includes("401")||r.includes("Unauthorized")?"Authentication failed. Your API key may be invalid or expired":r.includes("403")||r.includes("Forbidden")?"Access denied. Your API key may not have permission for this model":r.includes("404")||r.includes("Not Found")?"Model or endpoint not found. Check your model configuration":r.includes("500")||r.includes("Internal Server Error")?"Server error. Try again later":r.includes("overloaded")||r.includes("capacity")||r.includes("SERVICE_UNAVAILABLE")||r.includes("unavailable")?"Service is temporarily unavailable. Try again in a few minutes":this.getServiceSpecificErrorMessage(e)||r||"Unknown error occurred"}getServiceSpecificErrorMessage(e){return null}cleanJsonCodeBlock(e){const r=/```(?:json|JSON)?\s*([\s\S]*?)\s*```/,o=e.match(r);return o?o[1].trim():e}parseMessage(e,r,o){const n=this.cleanJsonCodeBlock(e),s=/(\[\s*\{[\s\S]*?\}\s*\]|\{[\s\S]*?\})/,i=n.match(s);if(!i){const u=new Error("AI response did not contain a valid JSON object or array.");throw u.name="InvalidJsonResponse",u.content=e,u}const c=i[0],a=wa(c);if(!a.ok){const u=new Error("Failed to parse AI response as JSON");throw u.name="JsonParseError",u.content=c,u.originalError=a.error,u}const m=a.data,d=Array.isArray(m)?m:[m];if(!d.length||!d.every(u=>typeof u.subject=="string")){const u=new Error("AI response contained malformed commit message data.");throw u.name="MalformedCommitMessage",u.content=e,u}const p=d.map(u=>this.extractMessageAsType(u,r)).map(u=>({title:`${u.subject}`,value:`${u.subject}${u.body?`
15
15
 
16
16
  ${u.body}`:""}${u.footer?`
17
17
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aicommit2",
3
- "version": "2.4.4",
3
+ "version": "2.4.5",
4
4
  "description": "A Reactive CLI that generates commit messages for Git and Jujutsu with various AI",
5
5
  "keywords": [
6
6
  "cli",