monacopilot 1.1.2 → 1.1.4
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/build/index.global.js +26 -0
- package/package.json +2 -2
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
var monacopilot=(function(exports){'use strict';var ue=`
|
|
2
|
+
|
|
3
|
+
`;var q=["mistral"],Ce={codestral:"codestral-latest"},U={mistral:["codestral"]},ge={mistral:"https://api.mistral.ai/v1/fim/completions"},fe=class{},he=class extends fe{createEndpoint(){return ge.mistral}createRequestBody(t,e,o){return {model:Ce[t],prompt:`${e.context}
|
|
4
|
+
${e.instruction}
|
|
5
|
+
${o.textBeforeCursor}`,suffix:o.textAfterCursor,stream:false,top_p:.1,temperature:.1,max_tokens:256,stop:ue}}createHeaders(t){return {"Content-Type":"application/json",Authorization:`Bearer ${t}`}}parseCompletion(t){let e=t.choices?.[0]?.message.content;return e?Array.isArray(e)?e.filter(o=>"text"in o).map(o=>o.text).join(""):e:null}},T={mistral:new he},Ee=(t,e,o)=>T[o].createEndpoint(t,e),ye=(t,e,o,r)=>T[e].createRequestBody(t,o,r),Re=(t,e)=>T[e].createHeaders(t),xe=(t,e)=>T[e].parseCompletion(t),ve="\x1B[91m",H="\x1B[93m",N="\x1B[0m",F="\x1B[1m",z=t=>t instanceof Error?t.message:typeof t=="string"?t:"An unknown error occurred",be=t=>{let e=z(t),o=`${ve}${F}[MONACOPILOT ERROR] ${e}${N}`;return console.error(o),{message:e}},Te=(t,e)=>{console.warn(`${H}${F}[MONACOPILOT WARN] ${t}${e?`
|
|
6
|
+
${z(e)}`:""}${N}`);},Pe=(t,e,o)=>console.warn(`${H}${F}[MONACOPILOT DEPRECATED] "${t}" is deprecated${o?` in ${o}`:""}. Please use "${e}" instead. It will be removed in a future version.${N}`),g={report:be,warn:Te,warnDeprecated:Pe},Oe=async(t,e={},o=5e3)=>{let r=new AbortController,{signal:n}=r,i=setTimeout(()=>{r.abort();},o);try{return await fetch(t,{...e,signal:n})}catch(s){throw s instanceof DOMException&&s.name==="AbortError"?new Error(`Request timed out after ${o}ms`):s}finally{clearTimeout(i);}},K=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`,Me=(t,e)=>{if(!t)throw new Error("Please provide an API key.");if(!e||typeof e=="object"&&Object.keys(e).length===0)throw new Error("Please provide options.")},Ae=(t,e)=>{if(typeof t=="object"){if(e!==void 0)throw new Error("Provider should not be specified when using a custom model.");if(!("config"in t)||!("transformResponse"in t))throw new Error("Please ensure both config and transformResponse are provided for custom model.");return}if(!e||!q.includes(e))throw new Error(`Provider must be specified and supported when using built-in models. Please choose from: ${K(q)}`);if(typeof t=="string"&&!U[e].includes(t))throw new Error(`Model "${t}" is not supported by the "${e}" provider. Supported models: ${K(U[e])}`)},V={params:Me,inputs:Ae},G=class{constructor(t,e){V.params(t,e),this.apiKey=t??"",this.provider=e.provider,this.model=e.model,V.inputs(this.model,this.provider);}generatePrompt(t,e){let o=this.getDefaultPrompt(t);return e?{...o,...e(t)}:o}async makeAIRequest(t,e={}){try{let{customHeaders:o={}}=e,r=this.generatePrompt(t,e.customPrompt),n=await this.prepareRequest(r,t),i=await this.sendRequest(n.endpoint,n.requestBody,{...n.headers,...o});return this.processResponse(i)}catch(o){return this.handleError(o)}}async prepareRequest(t,e){if(this.isCustomModel()){let o=this.model.config(this.apiKey,t);return {endpoint:o.endpoint,requestBody:o.body,headers:o.headers??{}}}if(!this.provider)throw new Error("Provider is required for non-custom models");return {endpoint:Ee(this.model,this.apiKey,this.provider),headers:Re(this.apiKey,this.provider),requestBody:ye(this.model,this.provider,t,e)}}processResponse(t){if(this.isCustomModel())return {text:this.model.transformResponse(t).text??null,raw:t};if(!this.provider)throw new Error("Provider is required for non-custom models");return {text:xe(t,this.provider),raw:t}}isCustomModel(){return typeof this.model=="object"&&"config"in this.model}async sendRequest(t,e,o){let r=await Oe(t,{method:"POST",headers:{"Content-Type":"application/json",...o},body:JSON.stringify(e)});if(!r.ok)throw new Error(await r.text());return r.json()}handleError(t){return {text:null,error:g.report(t).message}}};var W=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`;var B=(t,e,o={})=>{if(e<=0)return "";let r=t.split(`
|
|
7
|
+
`),n=r.length;if(e>=n)return t;if(o.truncateDirection==="keepEnd"){let s=r.slice(-e);return s.every(a=>a==="")?`
|
|
8
|
+
`.repeat(e):s.join(`
|
|
9
|
+
`)}let i=r.slice(0,e);return i.every(s=>s==="")?`
|
|
10
|
+
`.repeat(e):i.join(`
|
|
11
|
+
`)};var Le="<|developer_cursor_is_here|>",X=t=>({instruction:we(),context:Ie(t),fileContent:De(t)}),we=()=>"You are an expert code assistant completing code in an editor. Provide concise, accurate code that seamlessly integrates with the existing context.",Ie=t=>{let{technologies:e=[],filename:o,relatedFiles:r=[],language:n}=t,i=W([n,...e].filter(l=>!!l)),s=r.length===0?"":r.map(({path:l,content:p})=>`### ${l}
|
|
12
|
+
${p}`).join(`
|
|
13
|
+
|
|
14
|
+
`),a=[i?`Technology stack: ${i}`:"",`File: ${o||"unknown"}`].filter(Boolean).join(`
|
|
15
|
+
`);return `${s?`${s}
|
|
16
|
+
|
|
17
|
+
`:""}${a}`},De=t=>{let{textBeforeCursor:e,textAfterCursor:o}=t;return `**Current code:**
|
|
18
|
+
\`\`\`
|
|
19
|
+
${e}${Le}${o}
|
|
20
|
+
\`\`\``};var P=class extends G{async complete(e){let{body:o,options:r}=e,{customPrompt:n,headers:i}=r??{},{completionMetadata:s}=o,{text:a,raw:l,error:p}=await this.makeAIRequest(s,{customPrompt:n,customHeaders:i});return {completion:a,raw:l,error:p}}getDefaultPrompt(e){return X(e)}};var J=100,Q=true,O="onIdle",Z=120,ee=400,te=0;var h=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),oe=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),re=t=>t.getValue();var M=class{constructor(e){this.capacity=e;this.head=0;this.tail=0;this.size=0;this.buffer=new Array(e);}enqueue(e){let o;return this.size===this.capacity&&(o=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,o}dequeue(){if(this.size===0)return;let e=this.buffer[this.head];return this.buffer[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.size--,e}getAll(){return this.buffer.filter(e=>e!==void 0)}clear(){this.buffer=new Array(this.capacity),this.head=0,this.tail=0,this.size=0;}getSize(){return this.size}isEmpty(){return this.size===0}isFull(){return this.size===this.capacity}};var L=class L{constructor(){this.cache=new M(L.MAX_CACHE_SIZE);}get(e,o){return this.cache.getAll().filter(r=>this.isValidCacheItem(r,e,o))}add(e){e.completion.trim()&&this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,o,r){let n=e.textBeforeCursor.trim(),i=h(o,r),s=i,a=r.getLineContent(o.lineNumber);if(o.column===a.length+1&&o.lineNumber<r.getLineCount()){let p=r.getLineContent(o.lineNumber+1);s=i+`
|
|
21
|
+
`+p;}if(!(s.trim().includes(n)||n.includes(s.trim())))return false;let l=r.getValueInRange(e.range);return this.isPartialMatch(l,e.completion)?this.isPositionValid(e,o):false}isPartialMatch(e,o){let r=e.trim(),n=o.trim();return n.startsWith(r)||r.startsWith(n)}isPositionValid(e,o){let{range:r}=e,{startLineNumber:n,startColumn:i,endLineNumber:s,endColumn:a}=r,{lineNumber:l,column:p}=o;return l<n||l>s?false:n===s?p>=i-1&&p<=a+1:l===n?p>=i-1:l===s?p<=a+1:true}};L.MAX_CACHE_SIZE=20;var A=L;var w=class{constructor(e){this.formattedCompletion="";this.formattedCompletion=e;}setCompletion(e){return this.formattedCompletion=e,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}removeMarkdownCodeBlocks(e){let o=e.split(`
|
|
22
|
+
`),r=[],n=false;for(let i=0;i<o.length;i++){let s=o[i],a=s.trim().startsWith("```");if(a&&!n){n=true;continue}if(a&&n){n=false;continue}r.push(s);}return r.join(`
|
|
23
|
+
`)}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
|
|
24
|
+
|
|
25
|
+
`),this}build(){return this.formattedCompletion}};var I=class{findOverlaps(e,o,r){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let n=e.length,i=o.length,s=r.length,a=0,l=0,p=0,d=Math.min(n,i);for(let c=1;c<=d;c++){let C=e.substring(0,c),f=o.slice(-c);C===f&&(p=c);}let m=Math.min(n,s);for(let c=0;c<m&&e[c]===r[c];c++)a++;for(let c=1;c<=m;c++)e.slice(-c)===r.slice(0,c)&&(l=c);let u=Math.max(a,l);if(u===0){for(let c=1;c<n;c++)if(r.startsWith(e.substring(c))){u=n-c;break}}return {startOverlapLength:p,maxOverlapLength:u}}};var D=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new I;}computeInsertionRange(e,o,r){if(!o)return this.createEmptyRange(e);let n=r.getOffsetAt(e),i=r.getValue().substring(0,n),s=r.getValue().substring(n);if(n>=r.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:a,maxOverlapLength:l}=this.textOverlapCalculator.findOverlaps(o,i,s),p=a>0?r.getPositionAt(n-a):e,d=n+l,m=r.getPositionAt(d);return new this.monaco.Range(p.lineNumber,p.column,m.lineNumber,m.column)}computeCacheRange(e,o){let r=e.lineNumber,n=e.column,i=o.split(`
|
|
26
|
+
`),s=i.length-1,a=r+s,l=s===0?n+i[0].length:i[s].length+1;return new this.monaco.Range(r,n,a,l)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var ne=async t=>{let{endpoint:e,body:o}=t,r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});if(!r.ok)throw new Error(`Error while fetching completion item: ${r.statusText}`);let{completion:n,error:i}=await r.json();if(i)throw new Error(i);return {completion:n}},ie=({pos:t,mdl:e,options:o})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:a=J}=o,p=s&&s.length>0?3:2,d=a?Math.floor(a/p):void 0,m=(y,R,_)=>{let b=y(t,e);return R?B(b,R,_):b},u=(y,R)=>!y||!R?y:y.map(({content:_,...b})=>({...b,content:B(_,R)})),c=m(h,d,{truncateDirection:"keepEnd"}),C=m(oe,d,{truncateDirection:"keepStart"}),f=u(s,d);return {filename:r,language:n,technologies:i,relatedFiles:f,textBeforeCursor:c,textAfterCursor:C,cursorPosition:t}};var se=(t,e=300)=>{let o=null,r=null,n=(...i)=>{if(r)return r.args=i,r.promise;let s,a,l=new Promise((p,d)=>{s=p,a=d;});return r={args:i,promise:l,resolve:s,reject:a},o&&(clearTimeout(o),o=null),o=setTimeout(async()=>{let p=r;if(p){r=null,o=null;try{let d=await t(...p.args);p.resolve(d);}catch(d){p.reject(d);}}},e),l};return n.cancel=()=>{o&&(clearTimeout(o),o=null),r&&(r.reject(new Error("Cancelled")),r=null);},n};var ae=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":false;var E=t=>({items:t,enableForwardStability:true});var S=new A,le=async({monaco:t,mdl:e,pos:o,token:r,isCompletionAccepted:n,options:i})=>{let{trigger:s=O,endpoint:a,enableCaching:l=Q,onError:p,requestHandler:d}=i;if(l&&!n){let m=S.get(o,e).map(u=>({insertText:u.completion,range:u.range}));if(m.length>0)return E(m)}if(r.isCancellationRequested)return E([]);try{let m=se(d??ne,{onTyping:Z,onIdle:ee,onDemand:te}[s]);r.onCancellationRequested(()=>{m.cancel();});let u=ie({pos:o,mdl:e,options:i}),{completion:c}=await m({endpoint:a,body:{completionMetadata:u}});if(c){let C=new w(c).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),f=new D(t);return l&&S.add({completion:C,range:f.computeCacheRange(o,C),textBeforeCursor:h(o,e)}),E([{insertText:C,range:f.computeInsertionRange(o,C,e)}])}}catch(m){if(ae(m))return E([]);p?p(m):g.warn("Cannot provide completion",m);}return E([])};var k=new WeakMap,x=t=>k.get(t),pe=(t,e)=>{k.set(t,e);},$=t=>{k.delete(t);},ce=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var me=(t,e,o)=>{let r=x(e);return r?t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(n,i,s,a)=>{if(!(o.trigger==="onDemand"&&!r.isExplicitlyTriggered||o.triggerIf&&!o.triggerIf({text:re(e),position:i,triggerType:o.trigger??O})))return le({monaco:t,mdl:n,pos:i,token:a,isCompletionAccepted:r.isCompletionAccepted,options:o})},handleItemDidShow:(n,i,s)=>{r.isExplicitlyTriggered=false,r.hasRejectedCurrentCompletion=false,!r.isCompletionAccepted&&(r.isCompletionVisible=true,o.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null};var Se={TAB:(t,e)=>e.keyCode===t.KeyCode.Tab,CMD_RIGHT_ARROW:(t,e)=>e.keyCode===t.KeyCode.RightArrow&&e.metaKey},j=class{constructor(e,o,r){this.monaco=e;this.state=o;this.options=r;}handleKeyEvent(e){let o={monaco:this.monaco,event:e,state:this.state,options:this.options};this.handleCompletionAcceptance(o),this.handleCompletionRejection(o);}handleCompletionAcceptance(e){return e.state.isCompletionVisible&&this.isAcceptanceKey(e.event)?(e.options.onCompletionAccepted?.(),e.state.isCompletionAccepted=true,e.state.isCompletionVisible=false,true):(e.state.isCompletionAccepted=false,false)}handleCompletionRejection(e){return this.shouldRejectCompletion(e)?(e.options.onCompletionRejected?.(),e.state.hasRejectedCurrentCompletion=true,true):false}shouldRejectCompletion(e){return e.state.isCompletionVisible&&!e.state.hasRejectedCurrentCompletion&&!e.state.isCompletionAccepted&&!this.isAcceptanceKey(e.event)}isAcceptanceKey(e){return Object.values(Se).some(o=>o(this.monaco,e))}},de=(t,e,o,r)=>{let n=new j(t,o,r);return e.onKeyDown(i=>n.handleKeyEvent(i))};var v=null,_e=(t,e,o)=>{v&&v.deregister();let r=[];pe(e,ce()),e.updateOptions({inlineSuggest:{enabled:true}});try{let n=x(e);if(!n)return g.warn("Completion is not registered properly. State not found."),Fe();let i=me(t,e,o);i&&r.push(i);let s=de(t,e,n,o);r.push(s);let a={deregister:()=>{r.forEach(l=>l.dispose()),S.clear(),$(e),v=null;},trigger:()=>Ne(e)};return v=a,a}catch(n){return o.onError?o.onError(n):g.report(n),{deregister:()=>{r.forEach(i=>i.dispose()),$(e),v=null;},trigger:()=>{}}}},Ne=t=>{let e=x(t);if(!e){g.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{});},Fe=()=>({deregister:()=>{},trigger:()=>{}});var Vt=P;exports.CompletionCopilot=P;exports.Copilot=Vt;exports.registerCompletion=_e;return exports;})({});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "monacopilot",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"description": "AI auto-completion plugin for Monaco Editor",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"module": "./build/index.mjs",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"license": "MIT",
|
|
38
38
|
"author": "Arshad Yaseen <m@arshadyaseen.com> (https://arshadyaseen.com)",
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@monacopilot/core": "1.1.
|
|
40
|
+
"@monacopilot/core": "1.1.4"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"monaco-editor": ">=0.41.0"
|