monacopilot 1.2.4 → 1.2.6
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/dist/index.d.mts +40 -5
- package/dist/index.d.ts +40 -5
- package/dist/index.global.js +8 -8
- package/dist/index.js +3 -3
- package/dist/index.mjs +3 -3
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Endpoint, Filename, Technologies, RelatedFile, BaseCopilotMetadata, CustomPrompt, Copilot as Copilot$1, PromptData } from '@monacopilot/core';
|
|
1
|
+
import { Endpoint, Filename, Technologies, RelatedFile, BaseCopilotMetadata, CustomPrompt, AIRequestHandler, Copilot as Copilot$1, PromptData } from '@monacopilot/core';
|
|
2
2
|
export { CopilotOptions, CustomCopilotModel, MistralModel, Model, Provider } from '@monacopilot/core';
|
|
3
3
|
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
|
|
4
4
|
|
|
@@ -189,10 +189,6 @@ interface CompletionRequestBody {
|
|
|
189
189
|
completionMetadata: CompletionMetadata;
|
|
190
190
|
}
|
|
191
191
|
interface CompletionRequestOptions {
|
|
192
|
-
/**
|
|
193
|
-
* Custom headers to include in the request to the LLM provider.
|
|
194
|
-
*/
|
|
195
|
-
headers?: Record<string, string>;
|
|
196
192
|
/**
|
|
197
193
|
* Custom prompt generator function for the completion request.
|
|
198
194
|
* This function allows you to override the default prompt
|
|
@@ -203,6 +199,45 @@ interface CompletionRequestOptions {
|
|
|
203
199
|
* @see {@link https://github.com/arshad-yaseen/monacopilot/blob/main/packages/monacopilot/src/prompt.ts | Monacopilot default prompt implementation}
|
|
204
200
|
*/
|
|
205
201
|
customPrompt?: CustomPrompt<CompletionMetadata>;
|
|
202
|
+
/**
|
|
203
|
+
* Custom request handler to override the default fetch behavior when making requests to the LLM provider.
|
|
204
|
+
*
|
|
205
|
+
* This allows you to use your own HTTP client (like axios, got, etc.) or add custom logic
|
|
206
|
+
* such as authentication, retry mechanisms, or request/response transformation.
|
|
207
|
+
*
|
|
208
|
+
* @param params - The request parameters
|
|
209
|
+
* @param params.endpoint - The API endpoint URL for the LLM completion request
|
|
210
|
+
* @param params.body - The request body containing completion parameters (model, prompt, etc.)
|
|
211
|
+
* @param params.headers - HTTP headers for authentication and content type
|
|
212
|
+
* @returns A Promise that resolves to the response object returned by the LLM provider
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```ts
|
|
216
|
+
* aiRequestHandler: async ({ endpoint, body, headers }) => {
|
|
217
|
+
* const response = await fetch(endpoint, {
|
|
218
|
+
* method: 'POST',
|
|
219
|
+
* headers: { ...headers, 'X-Custom-Header': 'value' },
|
|
220
|
+
* body: JSON.stringify(body),
|
|
221
|
+
* })
|
|
222
|
+
* if (!response.ok) {
|
|
223
|
+
* throw new Error("Failed to get completion")
|
|
224
|
+
* }
|
|
225
|
+
* return response.json()
|
|
226
|
+
* }
|
|
227
|
+
* ```
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* ```ts
|
|
231
|
+
* aiRequestHandler: async ({ endpoint, body, headers }) => {
|
|
232
|
+
* const response = await axios.post(endpoint, body, {
|
|
233
|
+
* headers: { ...headers, 'X-Custom-Header': 'value' },
|
|
234
|
+
* timeout: 30000,
|
|
235
|
+
* })
|
|
236
|
+
* return response.data
|
|
237
|
+
* }
|
|
238
|
+
* ```
|
|
239
|
+
*/
|
|
240
|
+
aiRequestHandler?: AIRequestHandler;
|
|
206
241
|
}
|
|
207
242
|
interface CompletionResponse {
|
|
208
243
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Endpoint, Filename, Technologies, RelatedFile, BaseCopilotMetadata, CustomPrompt, Copilot as Copilot$1, PromptData } from '@monacopilot/core';
|
|
1
|
+
import { Endpoint, Filename, Technologies, RelatedFile, BaseCopilotMetadata, CustomPrompt, AIRequestHandler, Copilot as Copilot$1, PromptData } from '@monacopilot/core';
|
|
2
2
|
export { CopilotOptions, CustomCopilotModel, MistralModel, Model, Provider } from '@monacopilot/core';
|
|
3
3
|
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
|
|
4
4
|
|
|
@@ -189,10 +189,6 @@ interface CompletionRequestBody {
|
|
|
189
189
|
completionMetadata: CompletionMetadata;
|
|
190
190
|
}
|
|
191
191
|
interface CompletionRequestOptions {
|
|
192
|
-
/**
|
|
193
|
-
* Custom headers to include in the request to the LLM provider.
|
|
194
|
-
*/
|
|
195
|
-
headers?: Record<string, string>;
|
|
196
192
|
/**
|
|
197
193
|
* Custom prompt generator function for the completion request.
|
|
198
194
|
* This function allows you to override the default prompt
|
|
@@ -203,6 +199,45 @@ interface CompletionRequestOptions {
|
|
|
203
199
|
* @see {@link https://github.com/arshad-yaseen/monacopilot/blob/main/packages/monacopilot/src/prompt.ts | Monacopilot default prompt implementation}
|
|
204
200
|
*/
|
|
205
201
|
customPrompt?: CustomPrompt<CompletionMetadata>;
|
|
202
|
+
/**
|
|
203
|
+
* Custom request handler to override the default fetch behavior when making requests to the LLM provider.
|
|
204
|
+
*
|
|
205
|
+
* This allows you to use your own HTTP client (like axios, got, etc.) or add custom logic
|
|
206
|
+
* such as authentication, retry mechanisms, or request/response transformation.
|
|
207
|
+
*
|
|
208
|
+
* @param params - The request parameters
|
|
209
|
+
* @param params.endpoint - The API endpoint URL for the LLM completion request
|
|
210
|
+
* @param params.body - The request body containing completion parameters (model, prompt, etc.)
|
|
211
|
+
* @param params.headers - HTTP headers for authentication and content type
|
|
212
|
+
* @returns A Promise that resolves to the response object returned by the LLM provider
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```ts
|
|
216
|
+
* aiRequestHandler: async ({ endpoint, body, headers }) => {
|
|
217
|
+
* const response = await fetch(endpoint, {
|
|
218
|
+
* method: 'POST',
|
|
219
|
+
* headers: { ...headers, 'X-Custom-Header': 'value' },
|
|
220
|
+
* body: JSON.stringify(body),
|
|
221
|
+
* })
|
|
222
|
+
* if (!response.ok) {
|
|
223
|
+
* throw new Error("Failed to get completion")
|
|
224
|
+
* }
|
|
225
|
+
* return response.json()
|
|
226
|
+
* }
|
|
227
|
+
* ```
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* ```ts
|
|
231
|
+
* aiRequestHandler: async ({ endpoint, body, headers }) => {
|
|
232
|
+
* const response = await axios.post(endpoint, body, {
|
|
233
|
+
* headers: { ...headers, 'X-Custom-Header': 'value' },
|
|
234
|
+
* timeout: 30000,
|
|
235
|
+
* })
|
|
236
|
+
* return response.data
|
|
237
|
+
* }
|
|
238
|
+
* ```
|
|
239
|
+
*/
|
|
240
|
+
aiRequestHandler?: AIRequestHandler;
|
|
206
241
|
}
|
|
207
242
|
interface CompletionResponse {
|
|
208
243
|
/**
|
package/dist/index.global.js
CHANGED
|
@@ -2,13 +2,13 @@ var monacopilot=(function(exports){'use strict';var ue=`
|
|
|
2
2
|
|
|
3
3
|
`;var $=["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
4
|
${e.instruction}
|
|
5
|
-
${o.textBeforeCursor}`,suffix:o.textAfterCursor,stream:false,top_p:.1,temperature:.1,stop:ue,max_tokens:256}}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),S="\x1B[0m",F="\x1B[1m",
|
|
6
|
-
${
|
|
5
|
+
${o.textBeforeCursor}`,suffix:o.textAfterCursor,stream:false,top_p:.1,temperature:.1,stop:ue,max_tokens:256}}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),S="\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}${S}`;return console.error(o),{message:e}},Pe=(t,e)=>{console.warn(`${F}[MONACOPILOT WARN] ${t}${e?`
|
|
6
|
+
${H(e)}`:""}${S}`);},Te=(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.${S}`),f={report:ve,warn:Pe,warnDeprecated:Te},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);}},j=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".')},Ie=(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||!$.includes(e)))throw new Error(`Provider must be specified and supported when using built-in models. Please choose from: ${j($)}`);if(typeof t=="string"&&e!==void 0&&!U[e].includes(t))throw new Error(`Model "${t}" is not supported by the "${e}" provider. Supported models: ${j(U[e])}`)},K={params:Oe,inputs:Ie},V=class{constructor(t,e){K.params(t,e),this.apiKey=t??"",this.provider=e.provider,this.model=e.model,K.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{aiRequestHandler: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,r){let n={"Content-Type":"application/json",...o};if(r)return r({endpoint:t,body:e,headers:n});let i=await be(t,{method:"POST",headers:n,body:JSON.stringify(e)});if(!i.ok)throw new Error(await i.text());return i.json()}handleError(t){return {text:null,error:f.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 N=(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(l=>l==="")?`
|
|
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
|
|
11
|
+
`)};var Me="<|developer_cursor_is_here|>",z=t=>({instruction:Le(),context:Ae(t),fileContent:we(t)}),Le=()=>"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=W([n,...e].filter(a=>!!a)),s=r.length===0?"":r.map(({path:a,content:p})=>`### ${a}
|
|
12
12
|
${p}`).join(`
|
|
13
13
|
|
|
14
14
|
`),l=[i?`Technology stack: ${i}`:"",`File: ${o||"unknown"}`].filter(Boolean).join(`
|
|
@@ -16,11 +16,11 @@ ${p}`).join(`
|
|
|
16
16
|
|
|
17
17
|
`:""}${l}`},we=t=>{let{textBeforeCursor:e,textAfterCursor:o}=t;return `**Current code:**
|
|
18
18
|
\`\`\`
|
|
19
|
-
${e}${
|
|
20
|
-
\`\`\``};var T=class extends
|
|
21
|
-
${p}`;}if(!(s.trim().includes(n)||n.includes(s.trim())))return false;let a=r.getValueInRange(e.range);return this.isPartialMatch(a,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:l}=r,{lineNumber:a,column:p}=o;return a<n||a>s?false:n===s?p>=i-1&&p<=l+1:a===n?p>=i-1:a===s?p<=l+1:true}};
|
|
19
|
+
${e}${Me}${o}
|
|
20
|
+
\`\`\``};var T=class extends V{async complete(e){let{body:o,options:r}=e,{customPrompt:n,aiRequestHandler:i}=r??{},{completionMetadata:s}=o,{text:l,raw:a,error:p}=await this.makeAIRequest(s,{customPrompt:n,aiRequestHandler:i});return {completion:l,raw:a,error:p}}getDefaultPrompt(e){return z(e)}};var X=100,Y=true,b="onIdle",J=true,Q=120,Z=400,ee=0;var h=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),te=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),oe=t=>t.getValue();var O=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 M=class M{constructor(){this.cache=new O(M.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,l=r.getLineContent(o.lineNumber);if(o.column===l.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 a=r.getValueInRange(e.range);return this.isPartialMatch(a,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:l}=r,{lineNumber:a,column:p}=o;return a<n||a>s?false:n===s?p>=i-1&&p<=l+1:a===n?p>=i-1:a===s?p<=l+1:true}};M.MAX_CACHE_SIZE=20;var I=M;var L=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],l=s.trim().startsWith("```");if(l&&!n){n=true;continue}if(l&&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 A=class{findOverlaps(e,o,r){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let n=e.length,i=o.length,s=r.length,l=0,a=0,p=0,d=Math.min(n,i);for(let
|
|
26
|
-
`),s=i.length-1,l=r+s,a=s===0?n+i[0].length:i[s].length+1;return new this.monaco.Range(r,n,l,a)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var re=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();return {completion:n,error:i}},ne=({pos:t,mdl:e,options:o})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:l=X}=o,p=s&&s.length>0?3:2,d=l?Math.floor(l/p):void 0,
|
|
25
|
+
`),this}build(){return this.formattedCompletion}};var A=class{findOverlaps(e,o,r){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let n=e.length,i=o.length,s=r.length,l=0,a=0,p=0,d=Math.min(n,i);for(let m=1;m<=d;m++){let u=e.substring(0,m),C=o.slice(-m);u===C&&(p=m);}let c=Math.min(n,s);for(let m=0;m<c&&e[m]===r[m];m++)l++;for(let m=1;m<=c;m++)e.slice(-m)===r.slice(0,m)&&(a=m);let g=Math.max(l,a);if(g===0){for(let m=1;m<n;m++)if(r.startsWith(e.substring(m))){g=n-m;break}}return {startOverlapLength:p,maxOverlapLength:g}}};var w=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new A;}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:l,maxOverlapLength:a}=this.textOverlapCalculator.findOverlaps(o,i,s),p=l>0?r.getPositionAt(n-l):e,d=n+a,c=r.getPositionAt(d);return new this.monaco.Range(p.lineNumber,p.column,c.lineNumber,c.column)}computeCacheRange(e,o){let r=e.lineNumber,n=e.column,i=o.split(`
|
|
26
|
+
`),s=i.length-1,l=r+s,a=s===0?n+i[0].length:i[s].length+1;return new this.monaco.Range(r,n,l,a)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var re=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();return {completion:n,error:i}},ne=({pos:t,mdl:e,options:o})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:l=X}=o,p=s&&s.length>0?3:2,d=l?Math.floor(l/p):void 0,c=(R,x,_)=>{let v=R(t,e);return x?N(v,x,_):v},g=(R,x)=>!R||!x?R:R.map(({content:_,...v})=>({...v,content:N(_,x)})),m=c(h,d,{truncateDirection:"keepEnd"}),u=c(te,d,{truncateDirection:"keepStart"}),C=g(s,d);return {filename:r,language:n,technologies:i,relatedFiles:C,textBeforeCursor:m,textAfterCursor:u,cursorPosition:t}};var ie=(t,e=300)=>{let o=null,r=null,n=(...i)=>{if(r)return r.args=i,r.promise;let s,l,a=new Promise((p,d)=>{s=p,l=d;});return r={args:i,promise:a,resolve:s,reject:l},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),a};return n.cancel=()=>{o&&(clearTimeout(o),o=null),r&&(r.reject(new Error("Cancelled")),r=null);},n};var se=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 D=new I,ae=async({monaco:t,mdl:e,pos:o,token:r,isCompletionAccepted:n,options:i})=>{let{trigger:s=b,enableCaching:l=Y,allowFollowUpCompletions:a=J,onError:p,requestHandler:d}=i;if(l&&!n){let c=D.get(o,e).map(g=>({insertText:g.completion,range:g.range}));if(c.length>0)return E(c)}if(r.isCancellationRequested||!a&&n)return E([]);try{let c=ie(async u=>{i.onCompletionRequested?.(u);let C;if(d)C=await d(u);else if(i.endpoint)C=await re({endpoint:i.endpoint,...u});else throw new Error('No endpoint specified for completion request. Please set the "endpoint" option in registerCompletion, or provide a custom requestHandler.');if(C.error)throw new Error(C.error);return i.onCompletionRequestFinished?.(u,C),C},{onTyping:Q,onIdle:Z,onDemand:ee}[s]);r.onCancellationRequested(()=>{c.cancel();});let g=ne({pos:o,mdl:e,options:i}),{completion:m}=await c({body:{completionMetadata:g}});if(m){let u=new L(m).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),C=new w(t);return l&&D.add({completion:u,range:C.computeCacheRange(o,u),textBeforeCursor:h(o,e)}),E([{insertText:u,range:C.computeInsertionRange(o,u,e)}])}}catch(c){if(se(c))return E([]);p?p(c):f.warn("Cannot provide completion",c);}return E([])};var q=new WeakMap,y=t=>q.get(t),le=(t,e)=>{q.set(t,e);},k=t=>{q.delete(t);},pe=t=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false,options:t}),me=(t,e)=>{let o=y(t);!o||!o.options||(o.options={...o.options,...e});};var ce=(t,e,o)=>{let r=y(e);return r?t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(n,i,s,l)=>{if(n!==e.getModel())return {items:[]};let a=r.options||o;if(!(a.trigger==="onDemand"&&!r.isExplicitlyTriggered||a.triggerIf&&!a.triggerIf({text:oe(e),position:i,triggerType:a.trigger??b})))return ae({monaco:t,mdl:n,pos:i,token:l,isCompletionAccepted:r.isCompletionAccepted,options:a})},handleItemDidShow:(n,i,s)=>{if(r.isExplicitlyTriggered=false,r.hasRejectedCurrentCompletion=false,r.isCompletionAccepted)return;r.isCompletionVisible=true,(r.options||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},B=class{constructor(e,o,r){this.monaco=e;this.state=o;this.initialOptions=r;}handleKeyEvent(e){let o=this.state.options||this.initialOptions,r={monaco:this.monaco,event:e,state:this.state,options:o};this.handleCompletionAcceptance(r),this.handleCompletionRejection(r);}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 B(t,o,r);return e.onKeyDown(i=>n.handleKeyEvent(i))};var _e=(t,e,o)=>{let r=[];le(e,pe(o)),e.updateOptions({inlineSuggest:{enabled:true}});try{let n=y(e);if(!n)return f.warn("Completion is not registered properly. State not found."),Fe();let i=ce(t,e,o);i&&r.push(i);let s=de(t,e,n,o);return r.push(s),{deregister:()=>{for(let a of r)a.dispose();D.clear(),k(e);},trigger:()=>Se(e),updateOptions:a=>{me(e,a(n.options||o));}}}catch(n){return o.onError?o.onError(n):f.report(n),{deregister:()=>{for(let i of r)i.dispose();k(e);},trigger:()=>{},updateOptions:()=>{}}}},Se=t=>{let e=y(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:()=>{},updateOptions:()=>{}});var Bt=T;exports.CompletionCopilot=T;exports.Copilot=Bt;exports.registerCompletion=_e;return exports;})({});
|
package/dist/index.js
CHANGED
|
@@ -12,10 +12,10 @@ ${p}`).join(`
|
|
|
12
12
|
`:""}${l}`},ae=n=>{let{textBeforeCursor:e,textAfterCursor:o}=n;return `**Current code:**
|
|
13
13
|
\`\`\`
|
|
14
14
|
${e}${re}${o}
|
|
15
|
-
\`\`\``};var b=class extends core.Copilot{async complete(e){let{body:o,options:t}=e,{customPrompt:r,
|
|
15
|
+
\`\`\``};var b=class extends core.Copilot{async complete(e){let{body:o,options:t}=e,{customPrompt:r,aiRequestHandler:i}=t??{},{completionMetadata:s}=o,{text:l,raw:a,error:p}=await this.makeAIRequest(s,{customPrompt:r,aiRequestHandler:i});return {completion:l,raw:a,error:p}}getDefaultPrompt(e){return B(e)}};var U=100,j=true,T="onIdle",K=true,H=120,V=400,$=0;var f=(n,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:n.lineNumber,endColumn:n.column}),W=(n,e)=>e.getValueInRange({startLineNumber:n.lineNumber,startColumn:n.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),z=n=>n.getValue();var v=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 O=class O{constructor(){this.cache=new v(O.MAX_CACHE_SIZE);}get(e,o){return this.cache.getAll().filter(t=>this.isValidCacheItem(t,e,o))}add(e){e.completion.trim()&&this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,o,t){let r=e.textBeforeCursor.trim(),i=f(o,t),s=i,l=t.getLineContent(o.lineNumber);if(o.column===l.length+1&&o.lineNumber<t.getLineCount()){let p=t.getLineContent(o.lineNumber+1);s=`${i}
|
|
16
16
|
${p}`;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let a=t.getValueInRange(e.range);return this.isPartialMatch(a,e.completion)?this.isPositionValid(e,o):false}isPartialMatch(e,o){let t=e.trim(),r=o.trim();return r.startsWith(t)||t.startsWith(r)}isPositionValid(e,o){let{range:t}=e,{startLineNumber:r,startColumn:i,endLineNumber:s,endColumn:l}=t,{lineNumber:a,column:p}=o;return a<r||a>s?false:r===s?p>=i-1&&p<=l+1:a===r?p>=i-1:a===s?p<=l+1:true}};O.MAX_CACHE_SIZE=20;var P=O;var M=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(`
|
|
17
17
|
`),t=[],r=false;for(let i=0;i<o.length;i++){let s=o[i],l=s.trim().startsWith("```");if(l&&!r){r=true;continue}if(l&&r){r=false;continue}t.push(s);}return t.join(`
|
|
18
18
|
`)}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
|
|
19
19
|
|
|
20
|
-
`),this}build(){return this.formattedCompletion}};var
|
|
21
|
-
`),s=i.length-1,l=t+s,a=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(t,r,l,a)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var G=async n=>{let{endpoint:e,body:o}=n,t=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});if(!t.ok)throw new Error(`Error while fetching completion item: ${t.statusText}`);let{completion:r,error:i}=await t.json();return {completion:r,error:i}},X=({pos:n,mdl:e,options:o})=>{let{filename:t,language:r,technologies:i,relatedFiles:s,maxContextLines:l=U}=o,p=s&&s.length>0?3:2,d=l?Math.floor(l/p):void 0,c=(y,R,F)=>{let x=y(n,e);return R?S(x,R,F):x},g=(y,R)=>!y||!R?y:y.map(({content:F,...x})=>({...x,content:S(F,R)})),m=c(f,d,{truncateDirection:"keepEnd"}),u=c(W,d,{truncateDirection:"keepStart"}),C=g(s,d);return {filename:t,language:r,technologies:i,relatedFiles:C,textBeforeCursor:m,textAfterCursor:u,cursorPosition:n}};var Y=(n,e=300)=>{let o=null,t=null,r=(...i)=>{if(t)return t.args=i,t.promise;let s,l,a=new Promise((p,d)=>{s=p,l=d;});return t={args:i,promise:a,resolve:s,reject:l},o&&(clearTimeout(o),o=null),o=setTimeout(async()=>{let p=t;if(p){t=null,o=null;try{let d=await n(...p.args);p.resolve(d);}catch(d){p.reject(d);}}},e),a};return r.cancel=()=>{o&&(clearTimeout(o),o=null),t&&(t.reject(new Error("Cancelled")),t=null);},r};var Z=n=>typeof n=="string"?n==="Cancelled"||n==="AbortError":n instanceof Error?n.message==="Cancelled"||n.name==="AbortError":false;var h=n=>({items:n,enableForwardStability:true});var A=new P,J=async({monaco:n,mdl:e,pos:o,token:t,isCompletionAccepted:r,options:i})=>{let{trigger:s=T,enableCaching:l=j,allowFollowUpCompletions:a=K,onError:p,requestHandler:d}=i;if(l&&!r){let c=A.get(o,e).map(g=>({insertText:g.completion,range:g.range}));if(c.length>0)return h(c)}if(t.isCancellationRequested||!a&&r)return h([]);try{let c=Y(async u=>{i.onCompletionRequested?.(u);let C;if(d)C=await d(u);else if(i.endpoint)C=await G({endpoint:i.endpoint,...u});else throw new Error('No endpoint specified for completion request. Please set the "endpoint" option in registerCompletion, or provide a custom requestHandler.');if(C.error)throw new Error(C.error);return i.onCompletionRequestFinished?.(u,C),C},{onTyping:
|
|
20
|
+
`),this}build(){return this.formattedCompletion}};var I=class{findOverlaps(e,o,t){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=o.length,s=t.length,l=0,a=0,p=0,d=Math.min(r,i);for(let m=1;m<=d;m++){let u=e.substring(0,m),C=o.slice(-m);u===C&&(p=m);}let c=Math.min(r,s);for(let m=0;m<c&&e[m]===t[m];m++)l++;for(let m=1;m<=c;m++)e.slice(-m)===t.slice(0,m)&&(a=m);let g=Math.max(l,a);if(g===0){for(let m=1;m<r;m++)if(t.startsWith(e.substring(m))){g=r-m;break}}return {startOverlapLength:p,maxOverlapLength:g}}};var L=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new I;}computeInsertionRange(e,o,t){if(!o)return this.createEmptyRange(e);let r=t.getOffsetAt(e),i=t.getValue().substring(0,r),s=t.getValue().substring(r);if(r>=t.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:l,maxOverlapLength:a}=this.textOverlapCalculator.findOverlaps(o,i,s),p=l>0?t.getPositionAt(r-l):e,d=r+a,c=t.getPositionAt(d);return new this.monaco.Range(p.lineNumber,p.column,c.lineNumber,c.column)}computeCacheRange(e,o){let t=e.lineNumber,r=e.column,i=o.split(`
|
|
21
|
+
`),s=i.length-1,l=t+s,a=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(t,r,l,a)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var G=async n=>{let{endpoint:e,body:o}=n,t=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});if(!t.ok)throw new Error(`Error while fetching completion item: ${t.statusText}`);let{completion:r,error:i}=await t.json();return {completion:r,error:i}},X=({pos:n,mdl:e,options:o})=>{let{filename:t,language:r,technologies:i,relatedFiles:s,maxContextLines:l=U}=o,p=s&&s.length>0?3:2,d=l?Math.floor(l/p):void 0,c=(y,R,F)=>{let x=y(n,e);return R?S(x,R,F):x},g=(y,R)=>!y||!R?y:y.map(({content:F,...x})=>({...x,content:S(F,R)})),m=c(f,d,{truncateDirection:"keepEnd"}),u=c(W,d,{truncateDirection:"keepStart"}),C=g(s,d);return {filename:t,language:r,technologies:i,relatedFiles:C,textBeforeCursor:m,textAfterCursor:u,cursorPosition:n}};var Y=(n,e=300)=>{let o=null,t=null,r=(...i)=>{if(t)return t.args=i,t.promise;let s,l,a=new Promise((p,d)=>{s=p,l=d;});return t={args:i,promise:a,resolve:s,reject:l},o&&(clearTimeout(o),o=null),o=setTimeout(async()=>{let p=t;if(p){t=null,o=null;try{let d=await n(...p.args);p.resolve(d);}catch(d){p.reject(d);}}},e),a};return r.cancel=()=>{o&&(clearTimeout(o),o=null),t&&(t.reject(new Error("Cancelled")),t=null);},r};var Z=n=>typeof n=="string"?n==="Cancelled"||n==="AbortError":n instanceof Error?n.message==="Cancelled"||n.name==="AbortError":false;var h=n=>({items:n,enableForwardStability:true});var A=new P,J=async({monaco:n,mdl:e,pos:o,token:t,isCompletionAccepted:r,options:i})=>{let{trigger:s=T,enableCaching:l=j,allowFollowUpCompletions:a=K,onError:p,requestHandler:d}=i;if(l&&!r){let c=A.get(o,e).map(g=>({insertText:g.completion,range:g.range}));if(c.length>0)return h(c)}if(t.isCancellationRequested||!a&&r)return h([]);try{let c=Y(async u=>{i.onCompletionRequested?.(u);let C;if(d)C=await d(u);else if(i.endpoint)C=await G({endpoint:i.endpoint,...u});else throw new Error('No endpoint specified for completion request. Please set the "endpoint" option in registerCompletion, or provide a custom requestHandler.');if(C.error)throw new Error(C.error);return i.onCompletionRequestFinished?.(u,C),C},{onTyping:H,onIdle:V,onDemand:$}[s]);t.onCancellationRequested(()=>{c.cancel();});let g=X({pos:o,mdl:e,options:i}),{completion:m}=await c({body:{completionMetadata:g}});if(m){let u=new M(m).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),C=new L(n);return l&&A.add({completion:u,range:C.computeCacheRange(o,u),textBeforeCursor:f(o,e)}),h([{insertText:u,range:C.computeInsertionRange(o,u,e)}])}}catch(c){if(Z(c))return h([]);p?p(c):core.logger.warn("Cannot provide completion",c);}return h([])};var w=new WeakMap,E=n=>w.get(n),Q=(n,e)=>{w.set(n,e);},D=n=>{w.delete(n);},ee=n=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false,options:n}),te=(n,e)=>{let o=E(n);!o||!o.options||(o.options={...o.options,...e});};var oe=(n,e,o)=>{let t=E(e);return t?n.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(r,i,s,l)=>{if(r!==e.getModel())return {items:[]};let a=t.options||o;if(!(a.trigger==="onDemand"&&!t.isExplicitlyTriggered||a.triggerIf&&!a.triggerIf({text:z(e),position:i,triggerType:a.trigger??T})))return J({monaco:n,mdl:r,pos:i,token:l,isCompletionAccepted:t.isCompletionAccepted,options:a})},handleItemDidShow:(r,i,s)=>{if(t.isExplicitlyTriggered=false,t.hasRejectedCurrentCompletion=false,t.isCompletionAccepted)return;t.isCompletionVisible=true,(t.options||o).onCompletionShown?.(s,i.range);},freeInlineCompletions:()=>{}}):null};var me={TAB:(n,e)=>e.keyCode===n.KeyCode.Tab,CMD_RIGHT_ARROW:(n,e)=>e.keyCode===n.KeyCode.RightArrow&&e.metaKey},N=class{constructor(e,o,t){this.monaco=e;this.state=o;this.initialOptions=t;}handleKeyEvent(e){let o=this.state.options||this.initialOptions,t={monaco:this.monaco,event:e,state:this.state,options:o};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(me).some(o=>o(this.monaco,e))}},ne=(n,e,o,t)=>{let r=new N(n,o,t);return e.onKeyDown(i=>r.handleKeyEvent(i))};var ce=(n,e,o)=>{let t=[];Q(e,ee(o)),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=E(e);if(!r)return core.logger.warn("Completion is not registered properly. State not found."),ue();let i=oe(n,e,o);i&&t.push(i);let s=ne(n,e,r,o);return t.push(s),{deregister:()=>{for(let a of t)a.dispose();A.clear(),D(e);},trigger:()=>de(e),updateOptions:a=>{te(e,a(r.options||o));}}}catch(r){return o.onError?o.onError(r):core.logger.report(r),{deregister:()=>{for(let i of t)i.dispose();D(e);},trigger:()=>{},updateOptions:()=>{}}}},de=n=>{let e=E(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:()=>{},updateOptions:()=>{}});var ut=b;exports.CompletionCopilot=b;exports.Copilot=ut;exports.registerCompletion=ce;
|
package/dist/index.mjs
CHANGED
|
@@ -12,10 +12,10 @@ ${p}`).join(`
|
|
|
12
12
|
`:""}${l}`},ae=n=>{let{textBeforeCursor:e,textAfterCursor:o}=n;return `**Current code:**
|
|
13
13
|
\`\`\`
|
|
14
14
|
${e}${re}${o}
|
|
15
|
-
\`\`\``};var b=class extends Copilot{async complete(e){let{body:o,options:t}=e,{customPrompt:r,
|
|
15
|
+
\`\`\``};var b=class extends Copilot{async complete(e){let{body:o,options:t}=e,{customPrompt:r,aiRequestHandler:i}=t??{},{completionMetadata:s}=o,{text:l,raw:a,error:p}=await this.makeAIRequest(s,{customPrompt:r,aiRequestHandler:i});return {completion:l,raw:a,error:p}}getDefaultPrompt(e){return B(e)}};var U=100,j=true,T="onIdle",K=true,H=120,V=400,$=0;var f=(n,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:n.lineNumber,endColumn:n.column}),W=(n,e)=>e.getValueInRange({startLineNumber:n.lineNumber,startColumn:n.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),z=n=>n.getValue();var v=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 O=class O{constructor(){this.cache=new v(O.MAX_CACHE_SIZE);}get(e,o){return this.cache.getAll().filter(t=>this.isValidCacheItem(t,e,o))}add(e){e.completion.trim()&&this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,o,t){let r=e.textBeforeCursor.trim(),i=f(o,t),s=i,l=t.getLineContent(o.lineNumber);if(o.column===l.length+1&&o.lineNumber<t.getLineCount()){let p=t.getLineContent(o.lineNumber+1);s=`${i}
|
|
16
16
|
${p}`;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let a=t.getValueInRange(e.range);return this.isPartialMatch(a,e.completion)?this.isPositionValid(e,o):false}isPartialMatch(e,o){let t=e.trim(),r=o.trim();return r.startsWith(t)||t.startsWith(r)}isPositionValid(e,o){let{range:t}=e,{startLineNumber:r,startColumn:i,endLineNumber:s,endColumn:l}=t,{lineNumber:a,column:p}=o;return a<r||a>s?false:r===s?p>=i-1&&p<=l+1:a===r?p>=i-1:a===s?p<=l+1:true}};O.MAX_CACHE_SIZE=20;var P=O;var M=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(`
|
|
17
17
|
`),t=[],r=false;for(let i=0;i<o.length;i++){let s=o[i],l=s.trim().startsWith("```");if(l&&!r){r=true;continue}if(l&&r){r=false;continue}t.push(s);}return t.join(`
|
|
18
18
|
`)}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
|
|
19
19
|
|
|
20
|
-
`),this}build(){return this.formattedCompletion}};var
|
|
21
|
-
`),s=i.length-1,l=t+s,a=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(t,r,l,a)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var G=async n=>{let{endpoint:e,body:o}=n,t=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});if(!t.ok)throw new Error(`Error while fetching completion item: ${t.statusText}`);let{completion:r,error:i}=await t.json();return {completion:r,error:i}},X=({pos:n,mdl:e,options:o})=>{let{filename:t,language:r,technologies:i,relatedFiles:s,maxContextLines:l=U}=o,p=s&&s.length>0?3:2,d=l?Math.floor(l/p):void 0,c=(y,R,F)=>{let x=y(n,e);return R?S(x,R,F):x},g=(y,R)=>!y||!R?y:y.map(({content:F,...x})=>({...x,content:S(F,R)})),m=c(f,d,{truncateDirection:"keepEnd"}),u=c(W,d,{truncateDirection:"keepStart"}),C=g(s,d);return {filename:t,language:r,technologies:i,relatedFiles:C,textBeforeCursor:m,textAfterCursor:u,cursorPosition:n}};var Y=(n,e=300)=>{let o=null,t=null,r=(...i)=>{if(t)return t.args=i,t.promise;let s,l,a=new Promise((p,d)=>{s=p,l=d;});return t={args:i,promise:a,resolve:s,reject:l},o&&(clearTimeout(o),o=null),o=setTimeout(async()=>{let p=t;if(p){t=null,o=null;try{let d=await n(...p.args);p.resolve(d);}catch(d){p.reject(d);}}},e),a};return r.cancel=()=>{o&&(clearTimeout(o),o=null),t&&(t.reject(new Error("Cancelled")),t=null);},r};var Z=n=>typeof n=="string"?n==="Cancelled"||n==="AbortError":n instanceof Error?n.message==="Cancelled"||n.name==="AbortError":false;var h=n=>({items:n,enableForwardStability:true});var A=new P,J=async({monaco:n,mdl:e,pos:o,token:t,isCompletionAccepted:r,options:i})=>{let{trigger:s=T,enableCaching:l=j,allowFollowUpCompletions:a=K,onError:p,requestHandler:d}=i;if(l&&!r){let c=A.get(o,e).map(g=>({insertText:g.completion,range:g.range}));if(c.length>0)return h(c)}if(t.isCancellationRequested||!a&&r)return h([]);try{let c=Y(async u=>{i.onCompletionRequested?.(u);let C;if(d)C=await d(u);else if(i.endpoint)C=await G({endpoint:i.endpoint,...u});else throw new Error('No endpoint specified for completion request. Please set the "endpoint" option in registerCompletion, or provide a custom requestHandler.');if(C.error)throw new Error(C.error);return i.onCompletionRequestFinished?.(u,C),C},{onTyping:
|
|
20
|
+
`),this}build(){return this.formattedCompletion}};var I=class{findOverlaps(e,o,t){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=o.length,s=t.length,l=0,a=0,p=0,d=Math.min(r,i);for(let m=1;m<=d;m++){let u=e.substring(0,m),C=o.slice(-m);u===C&&(p=m);}let c=Math.min(r,s);for(let m=0;m<c&&e[m]===t[m];m++)l++;for(let m=1;m<=c;m++)e.slice(-m)===t.slice(0,m)&&(a=m);let g=Math.max(l,a);if(g===0){for(let m=1;m<r;m++)if(t.startsWith(e.substring(m))){g=r-m;break}}return {startOverlapLength:p,maxOverlapLength:g}}};var L=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new I;}computeInsertionRange(e,o,t){if(!o)return this.createEmptyRange(e);let r=t.getOffsetAt(e),i=t.getValue().substring(0,r),s=t.getValue().substring(r);if(r>=t.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:l,maxOverlapLength:a}=this.textOverlapCalculator.findOverlaps(o,i,s),p=l>0?t.getPositionAt(r-l):e,d=r+a,c=t.getPositionAt(d);return new this.monaco.Range(p.lineNumber,p.column,c.lineNumber,c.column)}computeCacheRange(e,o){let t=e.lineNumber,r=e.column,i=o.split(`
|
|
21
|
+
`),s=i.length-1,l=t+s,a=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(t,r,l,a)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var G=async n=>{let{endpoint:e,body:o}=n,t=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});if(!t.ok)throw new Error(`Error while fetching completion item: ${t.statusText}`);let{completion:r,error:i}=await t.json();return {completion:r,error:i}},X=({pos:n,mdl:e,options:o})=>{let{filename:t,language:r,technologies:i,relatedFiles:s,maxContextLines:l=U}=o,p=s&&s.length>0?3:2,d=l?Math.floor(l/p):void 0,c=(y,R,F)=>{let x=y(n,e);return R?S(x,R,F):x},g=(y,R)=>!y||!R?y:y.map(({content:F,...x})=>({...x,content:S(F,R)})),m=c(f,d,{truncateDirection:"keepEnd"}),u=c(W,d,{truncateDirection:"keepStart"}),C=g(s,d);return {filename:t,language:r,technologies:i,relatedFiles:C,textBeforeCursor:m,textAfterCursor:u,cursorPosition:n}};var Y=(n,e=300)=>{let o=null,t=null,r=(...i)=>{if(t)return t.args=i,t.promise;let s,l,a=new Promise((p,d)=>{s=p,l=d;});return t={args:i,promise:a,resolve:s,reject:l},o&&(clearTimeout(o),o=null),o=setTimeout(async()=>{let p=t;if(p){t=null,o=null;try{let d=await n(...p.args);p.resolve(d);}catch(d){p.reject(d);}}},e),a};return r.cancel=()=>{o&&(clearTimeout(o),o=null),t&&(t.reject(new Error("Cancelled")),t=null);},r};var Z=n=>typeof n=="string"?n==="Cancelled"||n==="AbortError":n instanceof Error?n.message==="Cancelled"||n.name==="AbortError":false;var h=n=>({items:n,enableForwardStability:true});var A=new P,J=async({monaco:n,mdl:e,pos:o,token:t,isCompletionAccepted:r,options:i})=>{let{trigger:s=T,enableCaching:l=j,allowFollowUpCompletions:a=K,onError:p,requestHandler:d}=i;if(l&&!r){let c=A.get(o,e).map(g=>({insertText:g.completion,range:g.range}));if(c.length>0)return h(c)}if(t.isCancellationRequested||!a&&r)return h([]);try{let c=Y(async u=>{i.onCompletionRequested?.(u);let C;if(d)C=await d(u);else if(i.endpoint)C=await G({endpoint:i.endpoint,...u});else throw new Error('No endpoint specified for completion request. Please set the "endpoint" option in registerCompletion, or provide a custom requestHandler.');if(C.error)throw new Error(C.error);return i.onCompletionRequestFinished?.(u,C),C},{onTyping:H,onIdle:V,onDemand:$}[s]);t.onCancellationRequested(()=>{c.cancel();});let g=X({pos:o,mdl:e,options:i}),{completion:m}=await c({body:{completionMetadata:g}});if(m){let u=new M(m).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),C=new L(n);return l&&A.add({completion:u,range:C.computeCacheRange(o,u),textBeforeCursor:f(o,e)}),h([{insertText:u,range:C.computeInsertionRange(o,u,e)}])}}catch(c){if(Z(c))return h([]);p?p(c):logger.warn("Cannot provide completion",c);}return h([])};var w=new WeakMap,E=n=>w.get(n),Q=(n,e)=>{w.set(n,e);},D=n=>{w.delete(n);},ee=n=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false,options:n}),te=(n,e)=>{let o=E(n);!o||!o.options||(o.options={...o.options,...e});};var oe=(n,e,o)=>{let t=E(e);return t?n.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(r,i,s,l)=>{if(r!==e.getModel())return {items:[]};let a=t.options||o;if(!(a.trigger==="onDemand"&&!t.isExplicitlyTriggered||a.triggerIf&&!a.triggerIf({text:z(e),position:i,triggerType:a.trigger??T})))return J({monaco:n,mdl:r,pos:i,token:l,isCompletionAccepted:t.isCompletionAccepted,options:a})},handleItemDidShow:(r,i,s)=>{if(t.isExplicitlyTriggered=false,t.hasRejectedCurrentCompletion=false,t.isCompletionAccepted)return;t.isCompletionVisible=true,(t.options||o).onCompletionShown?.(s,i.range);},freeInlineCompletions:()=>{}}):null};var me={TAB:(n,e)=>e.keyCode===n.KeyCode.Tab,CMD_RIGHT_ARROW:(n,e)=>e.keyCode===n.KeyCode.RightArrow&&e.metaKey},N=class{constructor(e,o,t){this.monaco=e;this.state=o;this.initialOptions=t;}handleKeyEvent(e){let o=this.state.options||this.initialOptions,t={monaco:this.monaco,event:e,state:this.state,options:o};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(me).some(o=>o(this.monaco,e))}},ne=(n,e,o,t)=>{let r=new N(n,o,t);return e.onKeyDown(i=>r.handleKeyEvent(i))};var ce=(n,e,o)=>{let t=[];Q(e,ee(o)),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=E(e);if(!r)return logger.warn("Completion is not registered properly. State not found."),ue();let i=oe(n,e,o);i&&t.push(i);let s=ne(n,e,r,o);return t.push(s),{deregister:()=>{for(let a of t)a.dispose();A.clear(),D(e);},trigger:()=>de(e),updateOptions:a=>{te(e,a(r.options||o));}}}catch(r){return o.onError?o.onError(r):logger.report(r),{deregister:()=>{for(let i of t)i.dispose();D(e);},trigger:()=>{},updateOptions:()=>{}}}},de=n=>{let e=E(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:()=>{},updateOptions:()=>{}});var ut=b;export{b as CompletionCopilot,ut as Copilot,ce as registerCompletion};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "monacopilot",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.6",
|
|
4
4
|
"description": "AI auto-completion plugin for Monaco Editor",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/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.2.
|
|
40
|
+
"@monacopilot/core": "1.2.6"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"monaco-editor": ">=0.41.0"
|