monacopilot 1.1.19 → 1.1.20

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.d.mts CHANGED
@@ -113,12 +113,24 @@ interface RegisterCompletionOptions {
113
113
  onCompletionRejected?: () => void;
114
114
  /**
115
115
  * Callback function triggered when a completion is requested.
116
- * This is called before the completion is fetched, allowing you to track when
117
- * completion requests are initiated and access the request parameters.
118
116
  * @param {FetchCompletionItemParams} params - The parameters being used for the completion request,
119
117
  * including the endpoint and request body with completion metadata.
120
118
  */
121
119
  onCompletionRequested?: (params: FetchCompletionItemParams) => void;
120
+ /**
121
+ * Callback function triggered when a completion request has finished.
122
+ * @param {FetchCompletionItemParams} params - The parameters that were used for the completion request,
123
+ * including the endpoint and request body with completion metadata.
124
+ * @param {FetchCompletionItemReturn} response - The response from the completion request, which includes the completion text.
125
+ * @example
126
+ * ```ts
127
+ * onCompletionRequestFinished: (params, response) => {
128
+ * console.log(params);
129
+ * console.log(`Completion text: ${response.completion}`);
130
+ * }
131
+ * ```
132
+ */
133
+ onCompletionRequestFinished?: (params: FetchCompletionItemParams, response: FetchCompletionItemReturn) => void;
122
134
  /**
123
135
  * Optional function to determine whether a completion should be triggered.
124
136
  * This allows for custom logic to control when completions are shown.
package/build/index.d.ts CHANGED
@@ -113,12 +113,24 @@ interface RegisterCompletionOptions {
113
113
  onCompletionRejected?: () => void;
114
114
  /**
115
115
  * Callback function triggered when a completion is requested.
116
- * This is called before the completion is fetched, allowing you to track when
117
- * completion requests are initiated and access the request parameters.
118
116
  * @param {FetchCompletionItemParams} params - The parameters being used for the completion request,
119
117
  * including the endpoint and request body with completion metadata.
120
118
  */
121
119
  onCompletionRequested?: (params: FetchCompletionItemParams) => void;
120
+ /**
121
+ * Callback function triggered when a completion request has finished.
122
+ * @param {FetchCompletionItemParams} params - The parameters that were used for the completion request,
123
+ * including the endpoint and request body with completion metadata.
124
+ * @param {FetchCompletionItemReturn} response - The response from the completion request, which includes the completion text.
125
+ * @example
126
+ * ```ts
127
+ * onCompletionRequestFinished: (params, response) => {
128
+ * console.log(params);
129
+ * console.log(`Completion text: ${response.completion}`);
130
+ * }
131
+ * ```
132
+ */
133
+ onCompletionRequestFinished?: (params: FetchCompletionItemParams, response: FetchCompletionItemReturn) => void;
122
134
  /**
123
135
  * Optional function to determine whether a completion should be triggered.
124
136
  * This allows for custom logic to control when completions are shown.
@@ -2,13 +2,13 @@ var monacopilot=(function(exports){'use strict';var ue=`
2
2
 
3
3
  `;var U=["mistral"],Ce={codestral:"codestral-latest"},j={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
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}},P={mistral:new he},Ee=(t,e,o)=>P[o].createEndpoint(t,e),ye=(t,e,o,r)=>P[e].createRequestBody(t,o,r),Re=(t,e)=>P[e].createHeaders(t),xe=(t,e)=>P[e].parseCompletion(t),N="\x1B[0m",F="\x1B[1m",H=t=>t instanceof Error?t.message:typeof t=="string"?t:"An unknown error occurred",ve=t=>{let e=H(t),o=`${F}[MONACOPILOT ERROR] ${e}${N}`;return console.error(o),{message:e}},Te=(t,e)=>{console.warn(`${F}[MONACOPILOT WARN] ${t}${e?`
6
- ${H(e)}`:""}${N}`);},Pe=(t,e,o)=>console.warn(`${F}[MONACOPILOT DEPRECATED] "${t}" is deprecated${o?` in ${o}`:""}. Please use "${e}" instead. It will be removed in a future version.${N}`),f={report:ve,warn:Te,warnDeprecated:Pe},be=async(t,e={},o=2e4)=>{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)}`,Oe=(t,e)=>{if(!t&&typeof e.model!="function")throw new Error(e.provider?`Please provide the ${e.provider} API key.`:"Please provide an API key.");if(!e||typeof e=="object"&&Object.keys(e).length===0)throw new Error('Please provide required Copilot options, such as "model" and "provider".')},Le=(t,e)=>{if(typeof t=="function"&&e!==void 0)throw new Error("Provider should not be specified when using a custom model.");if(typeof t!="function"&&(!e||!U.includes(e)))throw new Error(`Provider must be specified and supported when using built-in models. Please choose from: ${K(U)}`);if(typeof t=="string"&&e!==void 0&&!j[e].includes(t))throw new Error(`Model "${t}" is not supported by the "${e}" provider. Supported models: ${K(j[e])}`)},V={params:Oe,inputs:Le},W=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 o=this.generatePrompt(t,e.customPrompt);if(this.isCustomModel())return this.model(o);{let{customHeaders:r={}}=e,n=await this.prepareRequest(o,t),i=await this.sendRequest(n.endpoint,n.requestBody,{...n.headers,...r});return this.processResponse(i)}}catch(o){return this.handleError(o)}}async prepareRequest(t,e){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.provider)throw new Error("Provider is required for non-custom models");return {text:xe(t,this.provider),raw:t}}isCustomModel(){return typeof this.model=="function"}async sendRequest(t,e,o){let r=await be(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:f.report(t).message}}};var z=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(`
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}},P={mistral:new he},Ee=(t,e,o)=>P[o].createEndpoint(t,e),ye=(t,e,o,r)=>P[e].createRequestBody(t,o,r),Re=(t,e)=>P[e].createHeaders(t),xe=(t,e)=>P[e].parseCompletion(t),F="\x1B[0m",N="\x1B[1m",H=t=>t instanceof Error?t.message:typeof t=="string"?t:"An unknown error occurred",ve=t=>{let e=H(t),o=`${N}[MONACOPILOT ERROR] ${e}${F}`;return console.error(o),{message:e}},Te=(t,e)=>{console.warn(`${N}[MONACOPILOT WARN] ${t}${e?`
6
+ ${H(e)}`:""}${F}`);},Pe=(t,e,o)=>console.warn(`${N}[MONACOPILOT DEPRECATED] "${t}" is deprecated${o?` in ${o}`:""}. Please use "${e}" instead. It will be removed in a future version.${F}`),f={report:ve,warn:Te,warnDeprecated:Pe},be=async(t,e={},o=2e4)=>{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)}`,Oe=(t,e)=>{if(!t&&typeof e.model!="function")throw new Error(e.provider?`Please provide the ${e.provider} API key.`:"Please provide an API key.");if(!e||typeof e=="object"&&Object.keys(e).length===0)throw new Error('Please provide required Copilot options, such as "model" and "provider".')},Le=(t,e)=>{if(typeof t=="function"&&e!==void 0)throw new Error("Provider should not be specified when using a custom model.");if(typeof t!="function"&&(!e||!U.includes(e)))throw new Error(`Provider must be specified and supported when using built-in models. Please choose from: ${K(U)}`);if(typeof t=="string"&&e!==void 0&&!j[e].includes(t))throw new Error(`Model "${t}" is not supported by the "${e}" provider. Supported models: ${K(j[e])}`)},V={params:Oe,inputs:Le},W=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 o=this.generatePrompt(t,e.customPrompt);if(this.isCustomModel())return this.model(o);{let{customHeaders:r={}}=e,n=await this.prepareRequest(o,t),i=await this.sendRequest(n.endpoint,n.requestBody,{...n.headers,...r});return this.processResponse(i)}}catch(o){return this.handleError(o)}}async prepareRequest(t,e){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.provider)throw new Error("Provider is required for non-custom models");return {text:xe(t,this.provider),raw:t}}isCustomModel(){return typeof this.model=="function"}async sendRequest(t,e,o){let r=await be(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:f.report(t).message}}};var z=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
7
  `),n=r.length;if(e>=n)return t;if(o.truncateDirection==="keepEnd"){let s=r.slice(-e);return s.every(a=>a==="")?`
8
8
  `.repeat(e):s.join(`
9
9
  `)}let i=r.slice(0,e);return i.every(s=>s==="")?`
10
10
  `.repeat(e):i.join(`
11
- `)};var Me="<|developer_cursor_is_here|>",G=t=>({instruction:Ae(),context:Ie(t),fileContent:we(t)}),Ae=()=>"Provide concise and readable code completions that are syntactically and logically accurate, and seamlessly integrate with the existing context. Output only the raw code to be inserted at the cursor location without any additional text, comments, or text before or after the cursor.",Ie=t=>{let{technologies:e=[],filename:o,relatedFiles:r=[],language:n}=t,i=z([n,...e].filter(l=>!!l)),s=r.length===0?"":r.map(({path:l,content:c})=>`### ${l}
11
+ `)};var Me="<|developer_cursor_is_here|>",G=t=>({instruction:Ie(),context:Ae(t),fileContent:we(t)}),Ie=()=>"Provide concise and readable code completions that are syntactically and logically accurate, and seamlessly integrate with the existing context. Output only the raw code to be inserted at the cursor location without any additional text, comments, or text before or after the cursor.",Ae=t=>{let{technologies:e=[],filename:o,relatedFiles:r=[],language:n}=t,i=z([n,...e].filter(l=>!!l)),s=r.length===0?"":r.map(({path:l,content:c})=>`### ${l}
12
12
  ${c}`).join(`
13
13
 
14
14
  `),a=[i?`Technology stack: ${i}`:"",`File: ${o||"unknown"}`].filter(Boolean).join(`
@@ -17,10 +17,10 @@ ${c}`).join(`
17
17
  `:""}${a}`},we=t=>{let{textBeforeCursor:e,textAfterCursor:o}=t;return `**Current code:**
18
18
  \`\`\`
19
19
  ${e}${Me}${o}
20
- \`\`\``};var b=class extends W{async complete(e){let{body:o,options:r}=e,{customPrompt:n,headers:i}=r??{},{completionMetadata:s}=o,{text:a,raw:l,error:c}=await this.makeAIRequest(s,{customPrompt:n,customHeaders:i});return {completion:a,raw:l,error:c}}getDefaultPrompt(e){return G(e)}};var Y=100,J=true,O="onIdle",Q=true,Z=120,ee=400,te=0;var E=(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 L=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 A=class A{constructor(){this.cache=new L(A.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=E(o,r),s=i,a=r.getLineContent(o.lineNumber);if(o.column===a.length+1&&o.lineNumber<r.getLineCount()){let c=r.getLineContent(o.lineNumber+1);s=`${i}
21
- ${c}`;}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:c}=o;return l<n||l>s?false:n===s?c>=i-1&&c<=a+1:l===n?c>=i-1:l===s?c<=a+1:true}};A.MAX_CACHE_SIZE=20;var M=A;var I=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(`
20
+ \`\`\``};var b=class extends W{async complete(e){let{body:o,options:r}=e,{customPrompt:n,headers:i}=r??{},{completionMetadata:s}=o,{text:a,raw:l,error:c}=await this.makeAIRequest(s,{customPrompt:n,customHeaders:i});return {completion:a,raw:l,error:c}}getDefaultPrompt(e){return G(e)}};var Y=100,J=true,O="onIdle",Q=true,Z=120,ee=400,te=0;var E=(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 L=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 I=class I{constructor(){this.cache=new L(I.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=E(o,r),s=i,a=r.getLineContent(o.lineNumber);if(o.column===a.length+1&&o.lineNumber<r.getLineCount()){let c=r.getLineContent(o.lineNumber+1);s=`${i}
21
+ ${c}`;}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:c}=o;return l<n||l>s?false:n===s?c>=i-1&&c<=a+1:l===n?c>=i-1:l===s?c<=a+1:true}};I.MAX_CACHE_SIZE=20;var M=I;var A=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
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
23
  `)}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
24
24
 
25
- `),this}build(){return this.formattedCompletion}};var w=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,c=0,m=Math.min(n,i);for(let p=1;p<=m;p++){let h=e.substring(0,p),u=o.slice(-p);h===u&&(c=p);}let C=Math.min(n,s);for(let p=0;p<C&&e[p]===r[p];p++)a++;for(let p=1;p<=C;p++)e.slice(-p)===r.slice(0,p)&&(l=p);let d=Math.max(a,l);if(d===0){for(let p=1;p<n;p++)if(r.startsWith(e.substring(p))){d=n-p;break}}return {startOverlapLength:c,maxOverlapLength:d}}};var D=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new w;}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),c=a>0?r.getPositionAt(n-a):e,m=n+l,C=r.getPositionAt(m);return new this.monaco.Range(c.lineNumber,c.column,C.lineNumber,C.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=Y}=o,c=s&&s.length>0?3:2,m=a?Math.floor(a/c):void 0,C=(g,R,S)=>{let T=g(t,e);return R?B(T,R,S):T},d=(g,R)=>!g||!R?g:g.map(({content:S,...T})=>({...T,content:B(S,R)})),p=C(E,m,{truncateDirection:"keepEnd"}),h=C(oe,m,{truncateDirection:"keepStart"}),u=d(s,m);return {filename:r,language:n,technologies:i,relatedFiles:u,textBeforeCursor:p,textAfterCursor:h,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((c,m)=>{s=c,a=m;});return r={args:i,promise:l,resolve:s,reject:a},o&&(clearTimeout(o),o=null),o=setTimeout(async()=>{let c=r;if(c){r=null,o=null;try{let m=await t(...c.args);c.resolve(m);}catch(m){c.reject(m);}}},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 y=t=>({items:t,enableForwardStability:true});var _=new M,le=async({monaco:t,mdl:e,pos:o,token:r,isCompletionAccepted:n,options:i})=>{let{trigger:s=O,endpoint:a,enableCaching:l=J,allowFollowUpCompletions:c=Q,onError:m,requestHandler:C}=i;if(l&&!n){let d=_.get(o,e).map(p=>({insertText:p.completion,range:p.range}));if(d.length>0)return y(d)}if(r.isCancellationRequested||!c&&n)return y([]);try{let d=se(u=>(i.onCompletionRequested?.(u),C?.(u)??ne(u)),{onTyping:Z,onIdle:ee,onDemand:te}[s]);r.onCancellationRequested(()=>{d.cancel();});let p=ie({pos:o,mdl:e,options:i}),{completion:h}=await d({endpoint:a,body:{completionMetadata:p}});if(h){let u=new I(h).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),g=new D(t);return l&&_.add({completion:u,range:g.computeCacheRange(o,u),textBeforeCursor:E(o,e)}),y([{insertText:u,range:g.computeInsertionRange(o,u,e)}])}}catch(d){if(ae(d))return y([]);m?m(d):f.warn("Cannot provide completion",d);}return y([])};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 De={TAB:(t,e)=>e.keyCode===t.KeyCode.Tab,CMD_RIGHT_ARROW:(t,e)=>e.keyCode===t.KeyCode.RightArrow&&e.metaKey},q=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(De).some(o=>o(this.monaco,e))}},de=(t,e,o,r)=>{let n=new q(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 f.warn("Completion is not registered properly. State not found."),Ne();let i=me(t,e,o);i&&r.push(i);let s=de(t,e,n,o);r.push(s);let a={deregister:()=>{for(let l of r)l.dispose();_.clear(),$(e),v=null;},trigger:()=>Se(e)};return v=a,a}catch(n){return o.onError?o.onError(n):f.report(n),{deregister:()=>{for(let i of r)i.dispose();$(e),v=null;},trigger:()=>{}}}},Se=t=>{let e=x(t);if(!e){f.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{});},Ne=()=>({deregister:()=>{},trigger:()=>{}});var $t=b;exports.CompletionCopilot=b;exports.Copilot=$t;exports.registerCompletion=_e;return exports;})({});
25
+ `),this}build(){return this.formattedCompletion}};var w=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,c=0,m=Math.min(n,i);for(let p=1;p<=m;p++){let h=e.substring(0,p),u=o.slice(-p);h===u&&(c=p);}let g=Math.min(n,s);for(let p=0;p<g&&e[p]===r[p];p++)a++;for(let p=1;p<=g;p++)e.slice(-p)===r.slice(0,p)&&(l=p);let d=Math.max(a,l);if(d===0){for(let p=1;p<n;p++)if(r.startsWith(e.substring(p))){d=n-p;break}}return {startOverlapLength:c,maxOverlapLength:d}}};var D=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new w;}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),c=a>0?r.getPositionAt(n-a):e,m=n+l,g=r.getPositionAt(m);return new this.monaco.Range(c.lineNumber,c.column,g.lineNumber,g.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=Y}=o,c=s&&s.length>0?3:2,m=a?Math.floor(a/c):void 0,g=(C,R,S)=>{let T=C(t,e);return R?B(T,R,S):T},d=(C,R)=>!C||!R?C:C.map(({content:S,...T})=>({...T,content:B(S,R)})),p=g(E,m,{truncateDirection:"keepEnd"}),h=g(oe,m,{truncateDirection:"keepStart"}),u=d(s,m);return {filename:r,language:n,technologies:i,relatedFiles:u,textBeforeCursor:p,textAfterCursor:h,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((c,m)=>{s=c,a=m;});return r={args:i,promise:l,resolve:s,reject:a},o&&(clearTimeout(o),o=null),o=setTimeout(async()=>{let c=r;if(c){r=null,o=null;try{let m=await t(...c.args);c.resolve(m);}catch(m){c.reject(m);}}},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 y=t=>({items:t,enableForwardStability:true});var _=new M,le=async({monaco:t,mdl:e,pos:o,token:r,isCompletionAccepted:n,options:i})=>{let{trigger:s=O,endpoint:a,enableCaching:l=J,allowFollowUpCompletions:c=Q,onError:m,requestHandler:g}=i;if(l&&!n){let d=_.get(o,e).map(p=>({insertText:p.completion,range:p.range}));if(d.length>0)return y(d)}if(r.isCancellationRequested||!c&&n)return y([]);try{let d=se(async u=>{i.onCompletionRequested?.(u);let C=await(g?.(u)??ne(u));return i.onCompletionRequestFinished?.(u,C),C},{onTyping:Z,onIdle:ee,onDemand:te}[s]);r.onCancellationRequested(()=>{d.cancel();});let p=ie({pos:o,mdl:e,options:i}),{completion:h}=await d({endpoint:a,body:{completionMetadata:p}});if(h){let u=new A(h).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),C=new D(t);return l&&_.add({completion:u,range:C.computeCacheRange(o,u),textBeforeCursor:E(o,e)}),y([{insertText:u,range:C.computeInsertionRange(o,u,e)}])}}catch(d){if(ae(d))return y([]);m?m(d):f.warn("Cannot provide completion",d);}return y([])};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 De={TAB:(t,e)=>e.keyCode===t.KeyCode.Tab,CMD_RIGHT_ARROW:(t,e)=>e.keyCode===t.KeyCode.RightArrow&&e.metaKey},q=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(De).some(o=>o(this.monaco,e))}},de=(t,e,o,r)=>{let n=new q(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 f.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:()=>{for(let l of r)l.dispose();_.clear(),$(e),v=null;},trigger:()=>Se(e)};return v=a,a}catch(n){return o.onError?o.onError(n):f.report(n),{deregister:()=>{for(let i of r)i.dispose();$(e),v=null;},trigger:()=>{}}}},Se=t=>{let e=x(t);if(!e){f.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 $t=b;exports.CompletionCopilot=b;exports.Copilot=$t;exports.registerCompletion=_e;return exports;})({});
package/build/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var core=require('@monacopilot/core');var B=n=>!n||n.length===0?"":n.length===1?n[0]:`${n.slice(0,-1).join(", ")} and ${n.slice(-1)}`;var D=(n,e,t={})=>{if(e<=0)return "";let o=n.split(`
1
+ 'use strict';var core=require('@monacopilot/core');var B=n=>!n||n.length===0?"":n.length===1?n[0]:`${n.slice(0,-1).join(", ")} and ${n.slice(-1)}`;var w=(n,e,t={})=>{if(e<=0)return "";let o=n.split(`
2
2
  `),r=o.length;if(e>=r)return n;if(t.truncateDirection==="keepEnd"){let s=o.slice(-e);return s.every(a=>a==="")?`
3
3
  `.repeat(e):s.join(`
4
4
  `)}let i=o.slice(0,e);return i.every(s=>s==="")?`
@@ -13,9 +13,9 @@ ${c}`).join(`
13
13
  \`\`\`
14
14
  ${e}${re}${t}
15
15
  \`\`\``};var T=class extends core.Copilot{async complete(e){let{body:t,options:o}=e,{customPrompt:r,headers:i}=o??{},{completionMetadata:s}=t,{text:a,raw:l,error:c}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:a,raw:l,error:c}}getDefaultPrompt(e){return U(e)}};var q=100,K=true,v="onIdle",V=true,H=120,$=400,W=0;var h=(n,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:n.lineNumber,endColumn:n.column}),z=(n,e)=>e.getValueInRange({startLineNumber:n.lineNumber,startColumn:n.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),G=n=>n.getValue();var P=class{constructor(e){this.capacity=e;this.head=0;this.tail=0;this.size=0;this.buffer=new Array(e);}enqueue(e){let t;return this.size===this.capacity&&(t=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,t}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 P(L.MAX_CACHE_SIZE);}get(e,t){return this.cache.getAll().filter(o=>this.isValidCacheItem(o,e,t))}add(e){e.completion.trim()&&this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,t,o){let r=e.textBeforeCursor.trim(),i=h(t,o),s=i,a=o.getLineContent(t.lineNumber);if(t.column===a.length+1&&t.lineNumber<o.getLineCount()){let c=o.getLineContent(t.lineNumber+1);s=`${i}
16
- ${c}`;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let l=o.getValueInRange(e.range);return this.isPartialMatch(l,e.completion)?this.isPositionValid(e,t):false}isPartialMatch(e,t){let o=e.trim(),r=t.trim();return r.startsWith(o)||o.startsWith(r)}isPositionValid(e,t){let{range:o}=e,{startLineNumber:r,startColumn:i,endLineNumber:s,endColumn:a}=o,{lineNumber:l,column:c}=t;return l<r||l>s?false:r===s?c>=i-1&&c<=a+1:l===r?c>=i-1:l===s?c<=a+1:true}};L.MAX_CACHE_SIZE=20;var M=L;var O=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 t=e.split(`
16
+ ${c}`;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let l=o.getValueInRange(e.range);return this.isPartialMatch(l,e.completion)?this.isPositionValid(e,t):false}isPartialMatch(e,t){let o=e.trim(),r=t.trim();return r.startsWith(o)||o.startsWith(r)}isPositionValid(e,t){let{range:o}=e,{startLineNumber:r,startColumn:i,endLineNumber:s,endColumn:a}=o,{lineNumber:l,column:c}=t;return l<r||l>s?false:r===s?c>=i-1&&c<=a+1:l===r?c>=i-1:l===s?c<=a+1:true}};L.MAX_CACHE_SIZE=20;var M=L;var I=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 t=e.split(`
17
17
  `),o=[],r=false;for(let i=0;i<t.length;i++){let s=t[i],a=s.trim().startsWith("```");if(a&&!r){r=true;continue}if(a&&r){r=false;continue}o.push(s);}return o.join(`
18
18
  `)}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
19
19
 
20
- `),this}build(){return this.formattedCompletion}};var I=class{findOverlaps(e,t,o){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=t.length,s=o.length,a=0,l=0,c=0,m=Math.min(r,i);for(let p=1;p<=m;p++){let f=e.substring(0,p),u=t.slice(-p);f===u&&(c=p);}let C=Math.min(r,s);for(let p=0;p<C&&e[p]===o[p];p++)a++;for(let p=1;p<=C;p++)e.slice(-p)===o.slice(0,p)&&(l=p);let d=Math.max(a,l);if(d===0){for(let p=1;p<r;p++)if(o.startsWith(e.substring(p))){d=r-p;break}}return {startOverlapLength:c,maxOverlapLength:d}}};var A=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new I;}computeInsertionRange(e,t,o){if(!t)return this.createEmptyRange(e);let r=o.getOffsetAt(e),i=o.getValue().substring(0,r),s=o.getValue().substring(r);if(r>=o.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:a,maxOverlapLength:l}=this.textOverlapCalculator.findOverlaps(t,i,s),c=a>0?o.getPositionAt(r-a):e,m=r+l,C=o.getPositionAt(m);return new this.monaco.Range(c.lineNumber,c.column,C.lineNumber,C.column)}computeCacheRange(e,t){let o=e.lineNumber,r=e.column,i=t.split(`
21
- `),s=i.length-1,a=o+s,l=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(o,r,a,l)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var X=async n=>{let{endpoint:e,body:t}=n,o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!o.ok)throw new Error(`Error while fetching completion item: ${o.statusText}`);let{completion:r,error:i}=await o.json();if(i)throw new Error(i);return {completion:r}},Y=({pos:n,mdl:e,options:t})=>{let{filename:o,language:r,technologies:i,relatedFiles:s,maxContextLines:a=q}=t,c=s&&s.length>0?3:2,m=a?Math.floor(a/c):void 0,C=(g,y,w)=>{let b=g(n,e);return y?D(b,y,w):b},d=(g,y)=>!g||!y?g:g.map(({content:w,...b})=>({...b,content:D(w,y)})),p=C(h,m,{truncateDirection:"keepEnd"}),f=C(z,m,{truncateDirection:"keepStart"}),u=d(s,m);return {filename:o,language:r,technologies:i,relatedFiles:u,textBeforeCursor:p,textAfterCursor:f,cursorPosition:n}};var Z=(n,e=300)=>{let t=null,o=null,r=(...i)=>{if(o)return o.args=i,o.promise;let s,a,l=new Promise((c,m)=>{s=c,a=m;});return o={args:i,promise:l,resolve:s,reject:a},t&&(clearTimeout(t),t=null),t=setTimeout(async()=>{let c=o;if(c){o=null,t=null;try{let m=await n(...c.args);c.resolve(m);}catch(m){c.reject(m);}}},e),l};return r.cancel=()=>{t&&(clearTimeout(t),t=null),o&&(o.reject(new Error("Cancelled")),o=null);},r};var J=n=>typeof n=="string"?n==="Cancelled"||n==="AbortError":n instanceof Error?n.message==="Cancelled"||n.name==="AbortError":false;var E=n=>({items:n,enableForwardStability:true});var S=new M,Q=async({monaco:n,mdl:e,pos:t,token:o,isCompletionAccepted:r,options:i})=>{let{trigger:s=v,endpoint:a,enableCaching:l=K,allowFollowUpCompletions:c=V,onError:m,requestHandler:C}=i;if(l&&!r){let d=S.get(t,e).map(p=>({insertText:p.completion,range:p.range}));if(d.length>0)return E(d)}if(o.isCancellationRequested||!c&&r)return E([]);try{let d=Z(u=>(i.onCompletionRequested?.(u),C?.(u)??X(u)),{onTyping:H,onIdle:$,onDemand:W}[s]);o.onCancellationRequested(()=>{d.cancel();});let p=Y({pos:t,mdl:e,options:i}),{completion:f}=await d({endpoint:a,body:{completionMetadata:p}});if(f){let u=new O(f).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),g=new A(n);return l&&S.add({completion:u,range:g.computeCacheRange(t,u),textBeforeCursor:h(t,e)}),E([{insertText:u,range:g.computeInsertionRange(t,u,e)}])}}catch(d){if(J(d))return E([]);m?m(d):core.logger.warn("Cannot provide completion",d);}return E([])};var F=new WeakMap,x=n=>F.get(n),ee=(n,e)=>{F.set(n,e);},N=n=>{F.delete(n);},te=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var oe=(n,e,t)=>{let o=x(e);return o?n.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(r,i,s,a)=>{if(!(t.trigger==="onDemand"&&!o.isExplicitlyTriggered||t.triggerIf&&!t.triggerIf({text:G(e),position:i,triggerType:t.trigger??v})))return Q({monaco:n,mdl:r,pos:i,token:a,isCompletionAccepted:o.isCompletionAccepted,options:t})},handleItemDidShow:(r,i,s)=>{o.isExplicitlyTriggered=false,o.hasRejectedCurrentCompletion=false,!o.isCompletionAccepted&&(o.isCompletionVisible=true,t.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null};var ce={TAB:(n,e)=>e.keyCode===n.KeyCode.Tab,CMD_RIGHT_ARROW:(n,e)=>e.keyCode===n.KeyCode.RightArrow&&e.metaKey},_=class{constructor(e,t,o){this.monaco=e;this.state=t;this.options=o;}handleKeyEvent(e){let t={monaco:this.monaco,event:e,state:this.state,options:this.options};this.handleCompletionAcceptance(t),this.handleCompletionRejection(t);}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(ce).some(t=>t(this.monaco,e))}},ne=(n,e,t,o)=>{let r=new _(n,t,o);return e.onKeyDown(i=>r.handleKeyEvent(i))};var R=null,me=(n,e,t)=>{R&&R.deregister();let o=[];ee(e,te()),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=x(e);if(!r)return core.logger.warn("Completion is not registered properly. State not found."),ue();let i=oe(n,e,t);i&&o.push(i);let s=ne(n,e,r,t);o.push(s);let a={deregister:()=>{for(let l of o)l.dispose();S.clear(),N(e),R=null;},trigger:()=>de(e)};return R=a,a}catch(r){return t.onError?t.onError(r):core.logger.report(r),{deregister:()=>{for(let i of o)i.dispose();N(e),R=null;},trigger:()=>{}}}},de=n=>{let e=x(n);if(!e){core.logger.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,n.trigger("keyboard","editor.action.inlineSuggest.trigger",{});},ue=()=>({deregister:()=>{},trigger:()=>{}});var ut=T;exports.CompletionCopilot=T;exports.Copilot=ut;exports.registerCompletion=me;
20
+ `),this}build(){return this.formattedCompletion}};var O=class{findOverlaps(e,t,o){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=t.length,s=o.length,a=0,l=0,c=0,m=Math.min(r,i);for(let p=1;p<=m;p++){let f=e.substring(0,p),u=t.slice(-p);f===u&&(c=p);}let g=Math.min(r,s);for(let p=0;p<g&&e[p]===o[p];p++)a++;for(let p=1;p<=g;p++)e.slice(-p)===o.slice(0,p)&&(l=p);let d=Math.max(a,l);if(d===0){for(let p=1;p<r;p++)if(o.startsWith(e.substring(p))){d=r-p;break}}return {startOverlapLength:c,maxOverlapLength:d}}};var A=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new O;}computeInsertionRange(e,t,o){if(!t)return this.createEmptyRange(e);let r=o.getOffsetAt(e),i=o.getValue().substring(0,r),s=o.getValue().substring(r);if(r>=o.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:a,maxOverlapLength:l}=this.textOverlapCalculator.findOverlaps(t,i,s),c=a>0?o.getPositionAt(r-a):e,m=r+l,g=o.getPositionAt(m);return new this.monaco.Range(c.lineNumber,c.column,g.lineNumber,g.column)}computeCacheRange(e,t){let o=e.lineNumber,r=e.column,i=t.split(`
21
+ `),s=i.length-1,a=o+s,l=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(o,r,a,l)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var X=async n=>{let{endpoint:e,body:t}=n,o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!o.ok)throw new Error(`Error while fetching completion item: ${o.statusText}`);let{completion:r,error:i}=await o.json();if(i)throw new Error(i);return {completion:r}},Y=({pos:n,mdl:e,options:t})=>{let{filename:o,language:r,technologies:i,relatedFiles:s,maxContextLines:a=q}=t,c=s&&s.length>0?3:2,m=a?Math.floor(a/c):void 0,g=(C,E,F)=>{let b=C(n,e);return E?w(b,E,F):b},d=(C,E)=>!C||!E?C:C.map(({content:F,...b})=>({...b,content:w(F,E)})),p=g(h,m,{truncateDirection:"keepEnd"}),f=g(z,m,{truncateDirection:"keepStart"}),u=d(s,m);return {filename:o,language:r,technologies:i,relatedFiles:u,textBeforeCursor:p,textAfterCursor:f,cursorPosition:n}};var Z=(n,e=300)=>{let t=null,o=null,r=(...i)=>{if(o)return o.args=i,o.promise;let s,a,l=new Promise((c,m)=>{s=c,a=m;});return o={args:i,promise:l,resolve:s,reject:a},t&&(clearTimeout(t),t=null),t=setTimeout(async()=>{let c=o;if(c){o=null,t=null;try{let m=await n(...c.args);c.resolve(m);}catch(m){c.reject(m);}}},e),l};return r.cancel=()=>{t&&(clearTimeout(t),t=null),o&&(o.reject(new Error("Cancelled")),o=null);},r};var J=n=>typeof n=="string"?n==="Cancelled"||n==="AbortError":n instanceof Error?n.message==="Cancelled"||n.name==="AbortError":false;var y=n=>({items:n,enableForwardStability:true});var S=new M,Q=async({monaco:n,mdl:e,pos:t,token:o,isCompletionAccepted:r,options:i})=>{let{trigger:s=v,endpoint:a,enableCaching:l=K,allowFollowUpCompletions:c=V,onError:m,requestHandler:g}=i;if(l&&!r){let d=S.get(t,e).map(p=>({insertText:p.completion,range:p.range}));if(d.length>0)return y(d)}if(o.isCancellationRequested||!c&&r)return y([]);try{let d=Z(async u=>{i.onCompletionRequested?.(u);let C=await(g?.(u)??X(u));return i.onCompletionRequestFinished?.(u,C),C},{onTyping:H,onIdle:$,onDemand:W}[s]);o.onCancellationRequested(()=>{d.cancel();});let p=Y({pos:t,mdl:e,options:i}),{completion:f}=await d({endpoint:a,body:{completionMetadata:p}});if(f){let u=new I(f).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),C=new A(n);return l&&S.add({completion:u,range:C.computeCacheRange(t,u),textBeforeCursor:h(t,e)}),y([{insertText:u,range:C.computeInsertionRange(t,u,e)}])}}catch(d){if(J(d))return y([]);m?m(d):core.logger.warn("Cannot provide completion",d);}return y([])};var D=new WeakMap,R=n=>D.get(n),ee=(n,e)=>{D.set(n,e);},N=n=>{D.delete(n);},te=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var oe=(n,e,t)=>{let o=R(e);return o?n.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(r,i,s,a)=>{if(!(t.trigger==="onDemand"&&!o.isExplicitlyTriggered||t.triggerIf&&!t.triggerIf({text:G(e),position:i,triggerType:t.trigger??v})))return Q({monaco:n,mdl:r,pos:i,token:a,isCompletionAccepted:o.isCompletionAccepted,options:t})},handleItemDidShow:(r,i,s)=>{o.isExplicitlyTriggered=false,o.hasRejectedCurrentCompletion=false,!o.isCompletionAccepted&&(o.isCompletionVisible=true,t.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null};var ce={TAB:(n,e)=>e.keyCode===n.KeyCode.Tab,CMD_RIGHT_ARROW:(n,e)=>e.keyCode===n.KeyCode.RightArrow&&e.metaKey},_=class{constructor(e,t,o){this.monaco=e;this.state=t;this.options=o;}handleKeyEvent(e){let t={monaco:this.monaco,event:e,state:this.state,options:this.options};this.handleCompletionAcceptance(t),this.handleCompletionRejection(t);}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(ce).some(t=>t(this.monaco,e))}},ne=(n,e,t,o)=>{let r=new _(n,t,o);return e.onKeyDown(i=>r.handleKeyEvent(i))};var x=null,me=(n,e,t)=>{x&&x.deregister();let o=[];ee(e,te()),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=R(e);if(!r)return core.logger.warn("Completion is not registered properly. State not found."),ue();let i=oe(n,e,t);i&&o.push(i);let s=ne(n,e,r,t);o.push(s);let a={deregister:()=>{for(let l of o)l.dispose();S.clear(),N(e),x=null;},trigger:()=>de(e)};return x=a,a}catch(r){return t.onError?t.onError(r):core.logger.report(r),{deregister:()=>{for(let i of o)i.dispose();N(e),x=null;},trigger:()=>{}}}},de=n=>{let e=R(n);if(!e){core.logger.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,n.trigger("keyboard","editor.action.inlineSuggest.trigger",{});},ue=()=>({deregister:()=>{},trigger:()=>{}});var ut=T;exports.CompletionCopilot=T;exports.Copilot=ut;exports.registerCompletion=me;
package/build/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import {Copilot,logger}from'@monacopilot/core';var B=n=>!n||n.length===0?"":n.length===1?n[0]:`${n.slice(0,-1).join(", ")} and ${n.slice(-1)}`;var D=(n,e,t={})=>{if(e<=0)return "";let o=n.split(`
1
+ import {Copilot,logger}from'@monacopilot/core';var B=n=>!n||n.length===0?"":n.length===1?n[0]:`${n.slice(0,-1).join(", ")} and ${n.slice(-1)}`;var w=(n,e,t={})=>{if(e<=0)return "";let o=n.split(`
2
2
  `),r=o.length;if(e>=r)return n;if(t.truncateDirection==="keepEnd"){let s=o.slice(-e);return s.every(a=>a==="")?`
3
3
  `.repeat(e):s.join(`
4
4
  `)}let i=o.slice(0,e);return i.every(s=>s==="")?`
@@ -13,9 +13,9 @@ ${c}`).join(`
13
13
  \`\`\`
14
14
  ${e}${re}${t}
15
15
  \`\`\``};var T=class extends Copilot{async complete(e){let{body:t,options:o}=e,{customPrompt:r,headers:i}=o??{},{completionMetadata:s}=t,{text:a,raw:l,error:c}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:a,raw:l,error:c}}getDefaultPrompt(e){return U(e)}};var q=100,K=true,v="onIdle",V=true,H=120,$=400,W=0;var h=(n,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:n.lineNumber,endColumn:n.column}),z=(n,e)=>e.getValueInRange({startLineNumber:n.lineNumber,startColumn:n.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),G=n=>n.getValue();var P=class{constructor(e){this.capacity=e;this.head=0;this.tail=0;this.size=0;this.buffer=new Array(e);}enqueue(e){let t;return this.size===this.capacity&&(t=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,t}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 P(L.MAX_CACHE_SIZE);}get(e,t){return this.cache.getAll().filter(o=>this.isValidCacheItem(o,e,t))}add(e){e.completion.trim()&&this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,t,o){let r=e.textBeforeCursor.trim(),i=h(t,o),s=i,a=o.getLineContent(t.lineNumber);if(t.column===a.length+1&&t.lineNumber<o.getLineCount()){let c=o.getLineContent(t.lineNumber+1);s=`${i}
16
- ${c}`;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let l=o.getValueInRange(e.range);return this.isPartialMatch(l,e.completion)?this.isPositionValid(e,t):false}isPartialMatch(e,t){let o=e.trim(),r=t.trim();return r.startsWith(o)||o.startsWith(r)}isPositionValid(e,t){let{range:o}=e,{startLineNumber:r,startColumn:i,endLineNumber:s,endColumn:a}=o,{lineNumber:l,column:c}=t;return l<r||l>s?false:r===s?c>=i-1&&c<=a+1:l===r?c>=i-1:l===s?c<=a+1:true}};L.MAX_CACHE_SIZE=20;var M=L;var O=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 t=e.split(`
16
+ ${c}`;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let l=o.getValueInRange(e.range);return this.isPartialMatch(l,e.completion)?this.isPositionValid(e,t):false}isPartialMatch(e,t){let o=e.trim(),r=t.trim();return r.startsWith(o)||o.startsWith(r)}isPositionValid(e,t){let{range:o}=e,{startLineNumber:r,startColumn:i,endLineNumber:s,endColumn:a}=o,{lineNumber:l,column:c}=t;return l<r||l>s?false:r===s?c>=i-1&&c<=a+1:l===r?c>=i-1:l===s?c<=a+1:true}};L.MAX_CACHE_SIZE=20;var M=L;var I=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 t=e.split(`
17
17
  `),o=[],r=false;for(let i=0;i<t.length;i++){let s=t[i],a=s.trim().startsWith("```");if(a&&!r){r=true;continue}if(a&&r){r=false;continue}o.push(s);}return o.join(`
18
18
  `)}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
19
19
 
20
- `),this}build(){return this.formattedCompletion}};var I=class{findOverlaps(e,t,o){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=t.length,s=o.length,a=0,l=0,c=0,m=Math.min(r,i);for(let p=1;p<=m;p++){let f=e.substring(0,p),u=t.slice(-p);f===u&&(c=p);}let C=Math.min(r,s);for(let p=0;p<C&&e[p]===o[p];p++)a++;for(let p=1;p<=C;p++)e.slice(-p)===o.slice(0,p)&&(l=p);let d=Math.max(a,l);if(d===0){for(let p=1;p<r;p++)if(o.startsWith(e.substring(p))){d=r-p;break}}return {startOverlapLength:c,maxOverlapLength:d}}};var A=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new I;}computeInsertionRange(e,t,o){if(!t)return this.createEmptyRange(e);let r=o.getOffsetAt(e),i=o.getValue().substring(0,r),s=o.getValue().substring(r);if(r>=o.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:a,maxOverlapLength:l}=this.textOverlapCalculator.findOverlaps(t,i,s),c=a>0?o.getPositionAt(r-a):e,m=r+l,C=o.getPositionAt(m);return new this.monaco.Range(c.lineNumber,c.column,C.lineNumber,C.column)}computeCacheRange(e,t){let o=e.lineNumber,r=e.column,i=t.split(`
21
- `),s=i.length-1,a=o+s,l=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(o,r,a,l)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var X=async n=>{let{endpoint:e,body:t}=n,o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!o.ok)throw new Error(`Error while fetching completion item: ${o.statusText}`);let{completion:r,error:i}=await o.json();if(i)throw new Error(i);return {completion:r}},Y=({pos:n,mdl:e,options:t})=>{let{filename:o,language:r,technologies:i,relatedFiles:s,maxContextLines:a=q}=t,c=s&&s.length>0?3:2,m=a?Math.floor(a/c):void 0,C=(g,y,w)=>{let b=g(n,e);return y?D(b,y,w):b},d=(g,y)=>!g||!y?g:g.map(({content:w,...b})=>({...b,content:D(w,y)})),p=C(h,m,{truncateDirection:"keepEnd"}),f=C(z,m,{truncateDirection:"keepStart"}),u=d(s,m);return {filename:o,language:r,technologies:i,relatedFiles:u,textBeforeCursor:p,textAfterCursor:f,cursorPosition:n}};var Z=(n,e=300)=>{let t=null,o=null,r=(...i)=>{if(o)return o.args=i,o.promise;let s,a,l=new Promise((c,m)=>{s=c,a=m;});return o={args:i,promise:l,resolve:s,reject:a},t&&(clearTimeout(t),t=null),t=setTimeout(async()=>{let c=o;if(c){o=null,t=null;try{let m=await n(...c.args);c.resolve(m);}catch(m){c.reject(m);}}},e),l};return r.cancel=()=>{t&&(clearTimeout(t),t=null),o&&(o.reject(new Error("Cancelled")),o=null);},r};var J=n=>typeof n=="string"?n==="Cancelled"||n==="AbortError":n instanceof Error?n.message==="Cancelled"||n.name==="AbortError":false;var E=n=>({items:n,enableForwardStability:true});var S=new M,Q=async({monaco:n,mdl:e,pos:t,token:o,isCompletionAccepted:r,options:i})=>{let{trigger:s=v,endpoint:a,enableCaching:l=K,allowFollowUpCompletions:c=V,onError:m,requestHandler:C}=i;if(l&&!r){let d=S.get(t,e).map(p=>({insertText:p.completion,range:p.range}));if(d.length>0)return E(d)}if(o.isCancellationRequested||!c&&r)return E([]);try{let d=Z(u=>(i.onCompletionRequested?.(u),C?.(u)??X(u)),{onTyping:H,onIdle:$,onDemand:W}[s]);o.onCancellationRequested(()=>{d.cancel();});let p=Y({pos:t,mdl:e,options:i}),{completion:f}=await d({endpoint:a,body:{completionMetadata:p}});if(f){let u=new O(f).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),g=new A(n);return l&&S.add({completion:u,range:g.computeCacheRange(t,u),textBeforeCursor:h(t,e)}),E([{insertText:u,range:g.computeInsertionRange(t,u,e)}])}}catch(d){if(J(d))return E([]);m?m(d):logger.warn("Cannot provide completion",d);}return E([])};var F=new WeakMap,x=n=>F.get(n),ee=(n,e)=>{F.set(n,e);},N=n=>{F.delete(n);},te=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var oe=(n,e,t)=>{let o=x(e);return o?n.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(r,i,s,a)=>{if(!(t.trigger==="onDemand"&&!o.isExplicitlyTriggered||t.triggerIf&&!t.triggerIf({text:G(e),position:i,triggerType:t.trigger??v})))return Q({monaco:n,mdl:r,pos:i,token:a,isCompletionAccepted:o.isCompletionAccepted,options:t})},handleItemDidShow:(r,i,s)=>{o.isExplicitlyTriggered=false,o.hasRejectedCurrentCompletion=false,!o.isCompletionAccepted&&(o.isCompletionVisible=true,t.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null};var ce={TAB:(n,e)=>e.keyCode===n.KeyCode.Tab,CMD_RIGHT_ARROW:(n,e)=>e.keyCode===n.KeyCode.RightArrow&&e.metaKey},_=class{constructor(e,t,o){this.monaco=e;this.state=t;this.options=o;}handleKeyEvent(e){let t={monaco:this.monaco,event:e,state:this.state,options:this.options};this.handleCompletionAcceptance(t),this.handleCompletionRejection(t);}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(ce).some(t=>t(this.monaco,e))}},ne=(n,e,t,o)=>{let r=new _(n,t,o);return e.onKeyDown(i=>r.handleKeyEvent(i))};var R=null,me=(n,e,t)=>{R&&R.deregister();let o=[];ee(e,te()),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=x(e);if(!r)return logger.warn("Completion is not registered properly. State not found."),ue();let i=oe(n,e,t);i&&o.push(i);let s=ne(n,e,r,t);o.push(s);let a={deregister:()=>{for(let l of o)l.dispose();S.clear(),N(e),R=null;},trigger:()=>de(e)};return R=a,a}catch(r){return t.onError?t.onError(r):logger.report(r),{deregister:()=>{for(let i of o)i.dispose();N(e),R=null;},trigger:()=>{}}}},de=n=>{let e=x(n);if(!e){logger.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,n.trigger("keyboard","editor.action.inlineSuggest.trigger",{});},ue=()=>({deregister:()=>{},trigger:()=>{}});var ut=T;export{T as CompletionCopilot,ut as Copilot,me as registerCompletion};
20
+ `),this}build(){return this.formattedCompletion}};var O=class{findOverlaps(e,t,o){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=t.length,s=o.length,a=0,l=0,c=0,m=Math.min(r,i);for(let p=1;p<=m;p++){let f=e.substring(0,p),u=t.slice(-p);f===u&&(c=p);}let g=Math.min(r,s);for(let p=0;p<g&&e[p]===o[p];p++)a++;for(let p=1;p<=g;p++)e.slice(-p)===o.slice(0,p)&&(l=p);let d=Math.max(a,l);if(d===0){for(let p=1;p<r;p++)if(o.startsWith(e.substring(p))){d=r-p;break}}return {startOverlapLength:c,maxOverlapLength:d}}};var A=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new O;}computeInsertionRange(e,t,o){if(!t)return this.createEmptyRange(e);let r=o.getOffsetAt(e),i=o.getValue().substring(0,r),s=o.getValue().substring(r);if(r>=o.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:a,maxOverlapLength:l}=this.textOverlapCalculator.findOverlaps(t,i,s),c=a>0?o.getPositionAt(r-a):e,m=r+l,g=o.getPositionAt(m);return new this.monaco.Range(c.lineNumber,c.column,g.lineNumber,g.column)}computeCacheRange(e,t){let o=e.lineNumber,r=e.column,i=t.split(`
21
+ `),s=i.length-1,a=o+s,l=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(o,r,a,l)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var X=async n=>{let{endpoint:e,body:t}=n,o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!o.ok)throw new Error(`Error while fetching completion item: ${o.statusText}`);let{completion:r,error:i}=await o.json();if(i)throw new Error(i);return {completion:r}},Y=({pos:n,mdl:e,options:t})=>{let{filename:o,language:r,technologies:i,relatedFiles:s,maxContextLines:a=q}=t,c=s&&s.length>0?3:2,m=a?Math.floor(a/c):void 0,g=(C,E,F)=>{let b=C(n,e);return E?w(b,E,F):b},d=(C,E)=>!C||!E?C:C.map(({content:F,...b})=>({...b,content:w(F,E)})),p=g(h,m,{truncateDirection:"keepEnd"}),f=g(z,m,{truncateDirection:"keepStart"}),u=d(s,m);return {filename:o,language:r,technologies:i,relatedFiles:u,textBeforeCursor:p,textAfterCursor:f,cursorPosition:n}};var Z=(n,e=300)=>{let t=null,o=null,r=(...i)=>{if(o)return o.args=i,o.promise;let s,a,l=new Promise((c,m)=>{s=c,a=m;});return o={args:i,promise:l,resolve:s,reject:a},t&&(clearTimeout(t),t=null),t=setTimeout(async()=>{let c=o;if(c){o=null,t=null;try{let m=await n(...c.args);c.resolve(m);}catch(m){c.reject(m);}}},e),l};return r.cancel=()=>{t&&(clearTimeout(t),t=null),o&&(o.reject(new Error("Cancelled")),o=null);},r};var J=n=>typeof n=="string"?n==="Cancelled"||n==="AbortError":n instanceof Error?n.message==="Cancelled"||n.name==="AbortError":false;var y=n=>({items:n,enableForwardStability:true});var S=new M,Q=async({monaco:n,mdl:e,pos:t,token:o,isCompletionAccepted:r,options:i})=>{let{trigger:s=v,endpoint:a,enableCaching:l=K,allowFollowUpCompletions:c=V,onError:m,requestHandler:g}=i;if(l&&!r){let d=S.get(t,e).map(p=>({insertText:p.completion,range:p.range}));if(d.length>0)return y(d)}if(o.isCancellationRequested||!c&&r)return y([]);try{let d=Z(async u=>{i.onCompletionRequested?.(u);let C=await(g?.(u)??X(u));return i.onCompletionRequestFinished?.(u,C),C},{onTyping:H,onIdle:$,onDemand:W}[s]);o.onCancellationRequested(()=>{d.cancel();});let p=Y({pos:t,mdl:e,options:i}),{completion:f}=await d({endpoint:a,body:{completionMetadata:p}});if(f){let u=new I(f).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),C=new A(n);return l&&S.add({completion:u,range:C.computeCacheRange(t,u),textBeforeCursor:h(t,e)}),y([{insertText:u,range:C.computeInsertionRange(t,u,e)}])}}catch(d){if(J(d))return y([]);m?m(d):logger.warn("Cannot provide completion",d);}return y([])};var D=new WeakMap,R=n=>D.get(n),ee=(n,e)=>{D.set(n,e);},N=n=>{D.delete(n);},te=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var oe=(n,e,t)=>{let o=R(e);return o?n.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(r,i,s,a)=>{if(!(t.trigger==="onDemand"&&!o.isExplicitlyTriggered||t.triggerIf&&!t.triggerIf({text:G(e),position:i,triggerType:t.trigger??v})))return Q({monaco:n,mdl:r,pos:i,token:a,isCompletionAccepted:o.isCompletionAccepted,options:t})},handleItemDidShow:(r,i,s)=>{o.isExplicitlyTriggered=false,o.hasRejectedCurrentCompletion=false,!o.isCompletionAccepted&&(o.isCompletionVisible=true,t.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null};var ce={TAB:(n,e)=>e.keyCode===n.KeyCode.Tab,CMD_RIGHT_ARROW:(n,e)=>e.keyCode===n.KeyCode.RightArrow&&e.metaKey},_=class{constructor(e,t,o){this.monaco=e;this.state=t;this.options=o;}handleKeyEvent(e){let t={monaco:this.monaco,event:e,state:this.state,options:this.options};this.handleCompletionAcceptance(t),this.handleCompletionRejection(t);}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(ce).some(t=>t(this.monaco,e))}},ne=(n,e,t,o)=>{let r=new _(n,t,o);return e.onKeyDown(i=>r.handleKeyEvent(i))};var x=null,me=(n,e,t)=>{x&&x.deregister();let o=[];ee(e,te()),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=R(e);if(!r)return logger.warn("Completion is not registered properly. State not found."),ue();let i=oe(n,e,t);i&&o.push(i);let s=ne(n,e,r,t);o.push(s);let a={deregister:()=>{for(let l of o)l.dispose();S.clear(),N(e),x=null;},trigger:()=>de(e)};return x=a,a}catch(r){return t.onError?t.onError(r):logger.report(r),{deregister:()=>{for(let i of o)i.dispose();N(e),x=null;},trigger:()=>{}}}},de=n=>{let e=R(n);if(!e){logger.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,n.trigger("keyboard","editor.action.inlineSuggest.trigger",{});},ue=()=>({deregister:()=>{},trigger:()=>{}});var ut=T;export{T as CompletionCopilot,ut as Copilot,me as registerCompletion};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monacopilot",
3
- "version": "1.1.19",
3
+ "version": "1.1.20",
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.19"
40
+ "@monacopilot/core": "1.1.20"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "monaco-editor": ">=0.41.0"