aicommit2 2.5.6 → 2.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/README.md +26 -0
  2. package/dist/ai.service-7cce5ee0.mjs +17 -0
  3. package/dist/{anthropic.service-68956862.mjs → anthropic.service-96c06fb4.mjs} +1 -1
  4. package/dist/{bedrock.service-9933a587.mjs → bedrock.service-c4a4966a.mjs} +1 -1
  5. package/dist/cli-0dd7e35c.mjs +273 -0
  6. package/dist/cli.mjs +1 -1
  7. package/dist/{codestral.service-0390f41e.mjs → codestral.service-87eb83a7.mjs} +1 -1
  8. package/dist/{cohere.service-7282793a.mjs → cohere.service-57428091.mjs} +1 -1
  9. package/dist/{deep-seek.service-689940ee.mjs → deep-seek.service-ddd3ae03.mjs} +1 -1
  10. package/dist/{gemini.service-595d667c.mjs → gemini.service-561a56c3.mjs} +1 -1
  11. package/dist/{github-models.service-a89f5f34.mjs → github-models.service-181c9920.mjs} +1 -1
  12. package/dist/{groq.service-41276877.mjs → groq.service-2d3c6f6f.mjs} +1 -1
  13. package/dist/{hugging-face.service-50193927.mjs → hugging-face.service-73d6cacd.mjs} +1 -1
  14. package/dist/{mistral.service-14601dd7.mjs → mistral.service-f1a0c8d4.mjs} +1 -1
  15. package/dist/{ollama.service-f01b8d7a.mjs → ollama.service-c7689836.mjs} +1 -1
  16. package/dist/{openai-compatible.service-d8949180.mjs → openai-compatible.service-0f3f1008.mjs} +1 -1
  17. package/dist/{openai-aca766eb.mjs → openai-f7aae8f3.mjs} +11 -10
  18. package/dist/{openai.service-f4ea1dc7.mjs → openai.service-cac0981d.mjs} +1 -1
  19. package/dist/openrouter.service-393bb505.mjs +1 -0
  20. package/dist/perplexity.service-6563c4f1.mjs +1 -0
  21. package/package.json +1 -1
  22. package/dist/ai.service-9119469d.mjs +0 -17
  23. package/dist/cli-c30dd603.mjs +0 -273
  24. package/dist/perplexity.service-c2894100.mjs +0 -1
@@ -1,17 +0,0 @@
1
- import{of as L,Observable as _,Subject as J,catchError as B}from"rxjs";import"fs";import"path";import{xxh64 as C}from"@pacote/xxhash";import $ from"winston";import{A as T,l as p,D as F,g as D,s as M,h as U,d as z,E as H,e as q,f as P}from"./cli-c30dd603.mjs";const y=new Map,d=(f,t,e)=>{const r=C(0).update(t).digest("hex").substring(0,8),o=`${f}_${r}_${e}`;if(y.has(o))return y.get(o);const i=new Date,s=Z(i,f,t,e),c=`${T}/${s}`,n=$.createLogger({level:"info",format:$.format.combine($.format.timestamp({format:"YYYY-MM-DDTHH:mm:ss.SSSZ"}),$.format.printf(({timestamp:u,level:l,message:a,...m})=>m&&Object.keys(m).length>0?`[${u}] ${l}: ${a} ${JSON.stringify(m,null,2)}`:`[${u}] ${l}: ${a}`)),transports:[new $.transports.File({filename:c})]});return n.info(`=== ${f.toUpperCase()} AI SERVICE LOG ===`),n.info(`Diff Hash: ${r}`),n.info(`Request Type: ${e.toUpperCase()}`),n.info(`Start Time: ${i.toISOString()}`),n.info("=".repeat(50)),n.info(""),y.set(o,n),n},K=f=>{const t={...f},e=["authorization","x-api-key","x-goog-api-key","api-key","x-amzn-bedrock-application-key"];for(const r of e){const o=r.toLowerCase(),i=Object.keys(t).find(s=>s.toLowerCase()===o);i&&t[i]&&typeof t[i]=="string"&&(t[i].startsWith("Bearer ")?t[i]="Bearer [MASKED]":t[i]="[MASKED]")}return t},Y=(f,t,e,r,o,i,s=!0)=>{if(!s)return;const c=d(e,f,t);c.info(`Making request to ${e} API with model: ${r}`),c.info(`Request URL: ${o}`),c.info("Request headers:",K(i))},V=(f,t,e,r,o=!0)=>{if(!o)return;d(e,f,t).info("Request payload:",r)},W=(f,t,e,r,o,i=!0)=>{if(!i)return;const s=d(e,f,t);s.info("System prompt:",{prompt:r}),s.info("User prompt:",{prompt:o})},G=(f,t,e,r,o=!0)=>{if(!o)return;d(e,f,t).info("Response received:",r)},Q=(f,t,e,r,o=!0)=>{if(!o)return;d(e,f,t).error("API request failed:",r)},R=(f,t,e,r,o,i=!0)=>{if(!i)return;const s=d(e,f,t);r?s.info(`Request completed successfully in ${r}ms`):s.info("Request completed successfully"),o&&s.info("Final processed response:",{response:o}),s.info(""),s.info("=".repeat(50)),s.info(`End Time: ${new Date().toISOString()}`),s.info("=== REQUEST COMPLETED ===")},X=(f,t,e,r,o,i,s,c=!0)=>{if(!c)return;const n=d(e,f,t);s?n.error(`Request failed after ${i}ms:`,{error:s}):(n.info(`Request completed in ${i}ms`),n.info("Response:",{response:o})),R(f,t,e,i,o,c)},Z=(f,t,e,r)=>{const{year:o,month:i,day:s,hours:c,minutes:n,seconds:u}=ee(f),a=C(0).update(e).digest("hex").substring(0,8),m=t.toLowerCase().replace(/[^a-z0-9]/g,"").substring(0,20);return r==="review"?`${o}-${i}-${s}_${c}-${n}-${u}_${a}_${m}_review.log`:`${o}-${i}-${s}_${c}-${n}-${u}_${a}_${m}_commit.log`},ee=f=>{const t=f.getFullYear().toString(),e=(f.getMonth()+1).toString().padStart(2,"0"),r=f.getDate().toString().padStart(2,"0"),o=f.getHours().toString().padStart(2,"0"),i=f.getMinutes().toString().padStart(2,"0"),s=f.getSeconds().toString().padStart(2,"0");return{year:t,month:e,day:r,hours:o,minutes:i,seconds:s}},b=()=>{for(const[f,t]of y.entries())try{t.close()}catch(e){console.error(`Failed to close logger ${f}:`,e)}y.clear()};process.on("exit",b),process.on("SIGINT",()=>{b(),process.exit(0)}),process.on("SIGTERM",()=>{b(),process.exit(0)});class te{constructor(){this.buffer="",this.arrayStartFound=!1,this.scanPosition=0,this.feed=t=>{this.buffer+=t;const e=[];if(!this.arrayStartFound){const r=this.buffer.indexOf("[");if(r===-1)return e;this.arrayStartFound=!0,this.scanPosition=r+1}for(;;){const r=this.buffer.indexOf("{",this.scanPosition);if(r===-1)break;const o=this.extractBalancedBraces(r);if(!o)break;this.scanPosition=r+o.length;const i=this.tryParseCommitMessage(o);i&&e.push(i)}return e},this.flush=()=>this.feed(""),this.getBuffer=()=>this.buffer,this.getUnparsedBuffer=()=>this.buffer.slice(this.scanPosition),this.extractBalancedBraces=t=>{let e=0,r=!1,o=!1;for(let i=t;i<this.buffer.length;i++){const s=this.buffer[i];if(o){o=!1;continue}if(s==="\\"&&r){o=!0;continue}if(s==='"'){r=!r;continue}if(!r&&(s==="{"&&e++,s==="}"&&e--,e===0))return this.buffer.slice(t,i+1)}return null},this.tryParseCommitMessage=t=>{try{const e=JSON.parse(t);return typeof e.subject!="string"?null:{subject:e.subject,body:typeof e.body=="string"?e.body:void 0,footer:typeof e.footer=="string"?e.footer:void 0}}catch{return null}}}}class se{constructor(t){this.handleError$=e=>{const r=this.getDetailedErrorMessage(e),o=e.status?`HTTP ${e.status}: ${r}`:r;if(this.params.config.logging){const i=this.params.stagedDiff.diff,s=this.serviceName.replace(/\[|\]/g,"").trim();X(i,"commit",s,"Error occurred","",void 0,o)}return p.error(`${this.errorPrefix} ${o}`),e.stack&&p.error(` ${e.stack}`),e.content&&p.error(` Problematic content: ${e.content}`),e.originalError&&p.error(` Original error: ${e.originalError}`),L({name:`${this.errorPrefix} ${o}`,value:o,isError:!0,disabled:!0})},this.extractJsonObjectFromResponse=e=>{const r=e.indexOf("{");return r!==-1?this.extractBalancedJson(e,r,"{","}"):null},this.buildCommitPrompt=()=>{const{systemPrompt:e,systemPromptPath:r,codeReviewPromptPath:o,locale:i,generate:s,type:c,maxLength:n}=this.params.config,u={...F,locale:i,maxLength:n,type:c,generate:s,systemPrompt:e,systemPromptPath:r,codeReviewPromptPath:o,vcs_branch:this.params.branchName||""};return D(u)},this.formatRawCommitMessage=(e,r)=>{const o=this.extractMessageAsType(e,r),i=o.subject,s=`${o.subject}${o.body?`
2
-
3
- ${o.body}`:""}${o.footer?`
4
-
5
- ${o.footer}`:""}`;return{title:i,value:s}},this.formatAsChoice=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}),this.extractStreamPreview=e=>{const r=e.match(/"subject"\s*:\s*"((?:[^"\\]|\\.)*)(?:"|$)/),o=e.match(/"body"\s*:\s*"((?:[^"\\]|\\.)*)(?:"|$)/),i=r?r[1].replace(/\\"/g,'"').replace(/\\n/g,`
6
- `):"",s=o?o[1].replace(/\\"/g,'"').replace(/\\n/g,`
7
- `):"";return{subject:i,body:s}},this.createStreamingCommitMessages$=(e,r,o)=>{const i=`stream-${this.serviceName}-${Date.now()}`;return new _(s=>{const c=new te,n=new J;let u=0,l=!1,a=0;const m=100,A="streaming",w={name:"",value:"",streamKey:i,disabled:!0,isError:!1},j=(g=!1)=>{const h=Date.now();if(!g&&h-a<m)return;a=h;const v=c.getUnparsedBuffer();if(!v.trim())return;const{subject:S,body:I}=this.extractStreamPreview(v),O=S?`${this.serviceName} ${S}`:`${this.serviceName} Generating...`,N=I||S||"",k={name:O,short:S||"Generating...",value:`__streaming__${i}`,description:N,disabled:A,isError:!1,streamKey:i};s.next(k),l=!0},E=g=>{for(const h of g){if(u>=o)break;s.next(this.formatAsChoice(this.formatRawCommitMessage(h,r))),u++}},x=n.subscribe({next:g=>{if(u>=o)return;const h=c.feed(g);E(h),u<o&&j()},error:g=>{l&&s.next(w),s.error(g)},complete:()=>{E(c.flush()),l&&s.next(w);const g=c.getBuffer();if(u===0&&g.trim())try{const h=this.parseMessage(g,r,o);for(const v of h)s.next(this.formatAsChoice(v))}catch(h){s.error(h);return}s.complete()}});return e(n),()=>{x.unsubscribe()}}).pipe(B(this.handleError$))},this.parseCodeReview=e=>{const r=this.cleanJsonCodeBlock(e),o=this.extractJsonObjectFromResponse(r);if(!o)return p.warn(`${this.serviceName} Code review response did not contain JSON, falling back to plain text`),this.sanitizeResponse(e);const i=M(o);if(!i.ok)return p.warn(`${this.serviceName} Failed to parse code review JSON, falling back to plain text`),this.sanitizeResponse(e);const s=i.data;if(!(s&&typeof s.summary=="string"&&Array.isArray(s.items)))return p.warn(`${this.serviceName} Code review JSON missing summary or items, falling back to plain text`),this.sanitizeResponse(e);const n=s.items.filter(m=>typeof m.title=="string"&&typeof m.severity=="string"&&typeof m.description=="string"&&typeof m.category=="string"),u=n.some(m=>m.severity==="critical"),l=this.formatReviewSummaryTitle(s.summary,n),a=this.formatReviewAsMarkdown(s.summary,n,u);return this.isLoggingEnabled()&&p.info(`${this.serviceName} Parsed code review: ${n.length} items`),[{title:l,value:a}]},this.formatCodeReviewAsChoice=e=>({name:`${this.serviceName} ${e.title}`,short:e.title,value:e.value,description:e.value,isError:!1}),this.formatReviewSummaryTitle=(e,r)=>{const o=r.reduce((l,a)=>(l[a.severity]=(l[a.severity]??0)+1,l),{}),s=["critical","warning","suggestion","praise"].filter(l=>o[l]).map(l=>`${o[l]} ${l}`),c=s.length>0?` (${s.join(", ")})`:"",n=60;return`${e.length>n?`${e.slice(0,n-3)}...`:e}${c}`},this.formatReviewAsMarkdown=(e,r,o)=>{const s=[`## Summary
8
- ${e}${o?`
9
- <!-- HAS_CRITICAL_ISSUES -->
10
- `:""}
11
- `],c=["critical","warning","suggestion","praise"];for(const n of c){const u=r.filter(l=>l.severity===n);if(u.length!==0){s.push(`### [${n.toUpperCase()}] ${n.charAt(0).toUpperCase()}${n.slice(1)}
12
- `);for(const l of u){const a=l.file?` (${l.file}${l.line?`:${l.line}`:""})`:"";s.push(`- **[${l.category}]** ${l.title}${a}`),s.push(` ${l.description}`),l.suggestion&&s.push(` > Suggestion: ${l.suggestion}`),s.push("")}}}return s.join(`
13
- `)},this.serviceName="AI",this.errorPrefix="ERROR",this.colors={primary:""},this.params=t,this.logSessionId=t.logSessionId}getProviderName(){const t=String.fromCharCode(27),e=new RegExp(`${t}\\[[0-9;]*m`,"g");return this.serviceName.replace(e,"").replace(/\[|\]/g,"").trim()}getDetailedErrorMessage(t){const e=t.message||"",r=this.getProviderName(),o=this.params.config.model?.[0],i=this.params.config.timeout,s=this.getServiceSpecificErrorMessage(t);if(s)return s;const c=t.code||(t.status?U(t.status):z(e));return c!==H.UNKNOWN?q(c,{provider:r,model:o,timeout:i}):e||"Unknown error occurred"}getServiceSpecificErrorMessage(t){return null}cleanJsonCodeBlock(t){const e=/```(?:json|JSON)?\s*([\s\S]*?)\s*```/,r=t.match(e);return r?r[1].trim():t}extractJsonFromResponse(t){let e=t.indexOf("[");if(e!==-1){const r=this.extractBalancedJson(t,e,"[","]");if(r)return r}if(e=t.indexOf("{"),e!==-1){const r=this.extractBalancedJson(t,e,"{","}");if(r)return r}return null}extractBalancedJson(t,e,r,o){let i=0,s=!1,c=!1;for(let n=e;n<t.length;n++){const u=t[n];if(c){c=!1;continue}if(u==="\\"&&s){c=!0;continue}if(u==='"'){s=!s;continue}if(!s&&(u===r&&i++,u===o&&i--,i===0))return t.slice(e,n+1)}return null}parseMessage(t,e,r){const o=this.cleanJsonCodeBlock(t),i=this.extractJsonFromResponse(o);if(!i){const a=new Error("AI response did not contain a valid JSON object or array.");throw a.name="InvalidJsonResponse",a.content=t,a}const s=M(i);if(!s.ok){const a=new Error("Failed to parse AI response as JSON");throw a.name="JsonParseError",a.content=i,a.originalError=s.error,a}const c=s.data,n=Array.isArray(c)?c:[c];if(!n.length||!n.every(a=>typeof a.subject=="string")){const a=new Error("AI response contained malformed commit message data.");throw a.name="MalformedCommitMessage",a.content=t,a}const l=n.map(a=>this.extractMessageAsType(a,e)).map(a=>({title:`${a.subject}`,value:`${a.subject}${a.body?`
14
-
15
- ${a.body}`:""}${a.footer?`
16
-
17
- ${a.footer}`:""}`})).slice(0,r);if(this.isLoggingEnabled()){const a=l.map(m=>m.title).join(", ");p.info(`${this.serviceName} Parsed ${l.length} commit messages: ${a}`)}return l}extractMessageAsType(t,e){switch(e){case"conventional":const r=/(\w+)(?:\(.*?\))?:\s*(.*)/,o=t.subject.match(r),i=o?o[0]:t.subject;return{...t,subject:this.normalizeCommitMessage(i)};case"gitmoji":const s=/:\w*:\s*(.*)/,c=t.subject.match(s),n=this.params.config.disableLowerCase??!1;return{...t,subject:c&&!n?c[0].toLowerCase():t.subject};default:return t}}normalizeCommitMessage(t){const e=/^(\w+)(\(.*?\))?:\s(.*)$/,r=t.match(e);if(r){const[,o,i,s]=r,c=this.params.config.disableLowerCase??!1,n=o.toLowerCase(),u=c?s:s.charAt(0).toLowerCase()+s.slice(1);t=`${n}${i||""}: ${u}`}return t}sanitizeResponse(t){if(typeof t=="string")try{return[{title:`${P(t)}...`,value:t}]}catch{return[]}return t.map(e=>{try{return{title:`${P(e)}...`,value:e}}catch{return{title:"",value:""}}})}isLoggingEnabled(){return this.params.config.logging&&!!this.logSessionId}}export{se as A,W as a,V as b,G as c,R as d,Q as e,Y as l};