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.
- package/README.md +26 -0
- package/dist/ai.service-7cce5ee0.mjs +17 -0
- package/dist/{anthropic.service-68956862.mjs → anthropic.service-96c06fb4.mjs} +1 -1
- package/dist/{bedrock.service-9933a587.mjs → bedrock.service-c4a4966a.mjs} +1 -1
- package/dist/cli-0dd7e35c.mjs +273 -0
- package/dist/cli.mjs +1 -1
- package/dist/{codestral.service-0390f41e.mjs → codestral.service-87eb83a7.mjs} +1 -1
- package/dist/{cohere.service-7282793a.mjs → cohere.service-57428091.mjs} +1 -1
- package/dist/{deep-seek.service-689940ee.mjs → deep-seek.service-ddd3ae03.mjs} +1 -1
- package/dist/{gemini.service-595d667c.mjs → gemini.service-561a56c3.mjs} +1 -1
- package/dist/{github-models.service-a89f5f34.mjs → github-models.service-181c9920.mjs} +1 -1
- package/dist/{groq.service-41276877.mjs → groq.service-2d3c6f6f.mjs} +1 -1
- package/dist/{hugging-face.service-50193927.mjs → hugging-face.service-73d6cacd.mjs} +1 -1
- package/dist/{mistral.service-14601dd7.mjs → mistral.service-f1a0c8d4.mjs} +1 -1
- package/dist/{ollama.service-f01b8d7a.mjs → ollama.service-c7689836.mjs} +1 -1
- package/dist/{openai-compatible.service-d8949180.mjs → openai-compatible.service-0f3f1008.mjs} +1 -1
- package/dist/{openai-aca766eb.mjs → openai-f7aae8f3.mjs} +11 -10
- package/dist/{openai.service-f4ea1dc7.mjs → openai.service-cac0981d.mjs} +1 -1
- package/dist/openrouter.service-393bb505.mjs +1 -0
- package/dist/perplexity.service-6563c4f1.mjs +1 -0
- package/package.json +1 -1
- package/dist/ai.service-9119469d.mjs +0 -17
- package/dist/cli-c30dd603.mjs +0 -273
- 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};
|