monacopilot 0.19.17 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  ### Features
4
4
 
5
- - 🎯 Multiple AI Provider Support (Anthropic, OpenAI, Groq, Google, DeepSeek)
6
5
  - 🔄 Real-time Code Completions
7
6
  - ⚡️ Efficient Caching System
8
7
  - 🎨 Context-Aware Suggestions
package/build/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { CustomPrompt, Copilot as Copilot$1, PromptData } from '@monacopilot/core';
2
- export { AnthropicModel, CopilotOptions, CustomCopilotModel, DeepSeekModel, GoogleModel, GroqModel, Model, OpenAIModel, Provider } from '@monacopilot/core';
1
+ import { Endpoint, Filename, Technologies, RelatedFile, BaseCopilotMetadata, CustomPrompt, Copilot as Copilot$1, PromptData } from '@monacopilot/core';
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
 
5
5
  type Monaco = typeof monaco;
@@ -16,24 +16,7 @@ interface FetchCompletionItemParams {
16
16
  body: CompletionRequestBody;
17
17
  }
18
18
 
19
- type Endpoint = string;
20
- type Filename = string;
21
- type Technologies = string[];
22
- type RelatedFile = {
23
- /**
24
- * The relative path from the current editing code in the editor to an external file.
25
- *
26
- * Examples:
27
- * - To include a file `utils.js` in the same directory, set as `./utils.js`.
28
- * - To include a file `utils.js` in the parent directory, set as `../utils.js`.
29
- * - To include a file `utils.js` in the child directory, set as `./child/utils.js`.
30
- */
31
- path: string;
32
- /**
33
- * The content of the external file as a string.
34
- */
35
- content: string;
36
- };
19
+ type CompletionMetadata = BaseCopilotMetadata;
37
20
  interface RegisterCompletionOptions {
38
21
  /**
39
22
  * Language of the current model
@@ -49,13 +32,12 @@ interface RegisterCompletionOptions {
49
32
  * Options:
50
33
  * - `'onIdle'`: Provides completions after a brief pause in typing.
51
34
  * - `'onTyping'`: Provides completions in real-time as you type.
52
- * - *Note:* Best suited for models with low response latency (e.g., Groq).
53
35
  * - *Consideration:* May initiate additional background requests to deliver real-time suggestions.
54
36
  * - `'onDemand'`: Completions are not provided automatically. You need to trigger the completion manually, possibly by using the `trigger` function from `registerCompletion` return.
55
37
  *
56
38
  * @default 'onIdle'
57
39
  */
58
- trigger?: 'onTyping' | 'onIdle' | 'onDemand';
40
+ trigger?: Trigger;
59
41
  /**
60
42
  * The name of the file you are editing. This is used to provide more relevant completions based on the file's purpose.
61
43
  * For example, if you are editing a file named `utils.js`, the completions will be more relevant to utility functions.
@@ -123,7 +105,23 @@ interface RegisterCompletionOptions {
123
105
  * Callback function triggered when a completion is rejected by the user.
124
106
  */
125
107
  onCompletionRejected?: () => void;
108
+ /**
109
+ * Optional function to determine whether a completion should be triggered.
110
+ * This allows for custom logic to control when completions are shown.
111
+ *
112
+ * @param {object} params - Parameters for the trigger decision
113
+ * @param {string} params.text - The current text in the editor
114
+ * @param {CursorPosition} params.position - The current cursor position
115
+ * @param {Trigger} params.triggerType - The type of trigger that initiated the completion
116
+ * @returns {boolean} - Return true to allow the completion, false to prevent it
117
+ */
118
+ triggerIf?: (params: {
119
+ text: string;
120
+ position: CursorPosition;
121
+ triggerType: Trigger;
122
+ }) => boolean;
126
123
  }
124
+ type Trigger = 'onTyping' | 'onIdle' | 'onDemand';
127
125
  interface CompletionRegistration {
128
126
  /**
129
127
  * Triggers the completion.
@@ -159,11 +157,12 @@ interface CompletionRequestOptions {
159
157
  headers?: Record<string, string>;
160
158
  /**
161
159
  * Custom prompt generator function for the completion request.
162
- * This function allows you to override the default system and user prompts
160
+ * This function allows you to override the default prompt
163
161
  * used in the completion request, providing more control over the AI's context and behavior.
164
162
  *
165
163
  * @param completionMetadata - Metadata about the current completion context
166
- * @returns An object containing custom 'system' and 'user' prompts
164
+ * @returns A partial PromptData object that can override context and/or instruction
165
+ * @see {@link https://github.com/arshad-yaseen/monacopilot/blob/main/packages/monacopilot/src/prompt.ts | Monacopilot default prompt implementation}
167
166
  */
168
167
  customPrompt?: CustomPrompt<CompletionMetadata>;
169
168
  }
@@ -181,49 +180,6 @@ interface CompletionResponse {
181
180
  */
182
181
  raw?: unknown;
183
182
  }
184
- type CompletionMode = 'insert' | 'complete' | 'continue';
185
- interface CompletionMetadata {
186
- /**
187
- * The programming language of the code.
188
- */
189
- language: string | undefined;
190
- /**
191
- * The name of the file being edited.
192
- */
193
- filename: Filename | undefined;
194
- /**
195
- * The technologies used in the completion.
196
- */
197
- technologies: Technologies | undefined;
198
- /**
199
- * Additional context from related files.
200
- */
201
- relatedFiles: RelatedFile[] | undefined;
202
- /**
203
- * The text that appears after the cursor.
204
- */
205
- textAfterCursor: string;
206
- /**
207
- * The text that appears before the cursor.
208
- */
209
- textBeforeCursor: string;
210
- /**
211
- * The current cursor position.
212
- */
213
- cursorPosition: CursorPosition;
214
- /**
215
- * The current state of the editor.
216
- */
217
- editorState: {
218
- /**
219
- * The mode of the completion.
220
- * - `insert`: Indicates that there is a character immediately after the cursor. In this mode, the LLM will generate content to be inserted at the cursor position.
221
- * - `complete`: Indicates that there is a character after the cursor but not immediately. In this mode, the LLM will generate content to complete the text from the cursor position.
222
- * - `continue`: Indicates that there is no character after the cursor. In this mode, the LLM will generate content to continue the text from the cursor position.
223
- */
224
- completionMode: CompletionMode;
225
- };
226
- }
227
183
 
228
184
  declare class CompletionCopilot extends Copilot$1<CompletionMetadata> {
229
185
  complete(request: CompletionRequest): Promise<CompletionResponse>;
package/build/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { CustomPrompt, Copilot as Copilot$1, PromptData } from '@monacopilot/core';
2
- export { AnthropicModel, CopilotOptions, CustomCopilotModel, DeepSeekModel, GoogleModel, GroqModel, Model, OpenAIModel, Provider } from '@monacopilot/core';
1
+ import { Endpoint, Filename, Technologies, RelatedFile, BaseCopilotMetadata, CustomPrompt, Copilot as Copilot$1, PromptData } from '@monacopilot/core';
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
 
5
5
  type Monaco = typeof monaco;
@@ -16,24 +16,7 @@ interface FetchCompletionItemParams {
16
16
  body: CompletionRequestBody;
17
17
  }
18
18
 
19
- type Endpoint = string;
20
- type Filename = string;
21
- type Technologies = string[];
22
- type RelatedFile = {
23
- /**
24
- * The relative path from the current editing code in the editor to an external file.
25
- *
26
- * Examples:
27
- * - To include a file `utils.js` in the same directory, set as `./utils.js`.
28
- * - To include a file `utils.js` in the parent directory, set as `../utils.js`.
29
- * - To include a file `utils.js` in the child directory, set as `./child/utils.js`.
30
- */
31
- path: string;
32
- /**
33
- * The content of the external file as a string.
34
- */
35
- content: string;
36
- };
19
+ type CompletionMetadata = BaseCopilotMetadata;
37
20
  interface RegisterCompletionOptions {
38
21
  /**
39
22
  * Language of the current model
@@ -49,13 +32,12 @@ interface RegisterCompletionOptions {
49
32
  * Options:
50
33
  * - `'onIdle'`: Provides completions after a brief pause in typing.
51
34
  * - `'onTyping'`: Provides completions in real-time as you type.
52
- * - *Note:* Best suited for models with low response latency (e.g., Groq).
53
35
  * - *Consideration:* May initiate additional background requests to deliver real-time suggestions.
54
36
  * - `'onDemand'`: Completions are not provided automatically. You need to trigger the completion manually, possibly by using the `trigger` function from `registerCompletion` return.
55
37
  *
56
38
  * @default 'onIdle'
57
39
  */
58
- trigger?: 'onTyping' | 'onIdle' | 'onDemand';
40
+ trigger?: Trigger;
59
41
  /**
60
42
  * The name of the file you are editing. This is used to provide more relevant completions based on the file's purpose.
61
43
  * For example, if you are editing a file named `utils.js`, the completions will be more relevant to utility functions.
@@ -123,7 +105,23 @@ interface RegisterCompletionOptions {
123
105
  * Callback function triggered when a completion is rejected by the user.
124
106
  */
125
107
  onCompletionRejected?: () => void;
108
+ /**
109
+ * Optional function to determine whether a completion should be triggered.
110
+ * This allows for custom logic to control when completions are shown.
111
+ *
112
+ * @param {object} params - Parameters for the trigger decision
113
+ * @param {string} params.text - The current text in the editor
114
+ * @param {CursorPosition} params.position - The current cursor position
115
+ * @param {Trigger} params.triggerType - The type of trigger that initiated the completion
116
+ * @returns {boolean} - Return true to allow the completion, false to prevent it
117
+ */
118
+ triggerIf?: (params: {
119
+ text: string;
120
+ position: CursorPosition;
121
+ triggerType: Trigger;
122
+ }) => boolean;
126
123
  }
124
+ type Trigger = 'onTyping' | 'onIdle' | 'onDemand';
127
125
  interface CompletionRegistration {
128
126
  /**
129
127
  * Triggers the completion.
@@ -159,11 +157,12 @@ interface CompletionRequestOptions {
159
157
  headers?: Record<string, string>;
160
158
  /**
161
159
  * Custom prompt generator function for the completion request.
162
- * This function allows you to override the default system and user prompts
160
+ * This function allows you to override the default prompt
163
161
  * used in the completion request, providing more control over the AI's context and behavior.
164
162
  *
165
163
  * @param completionMetadata - Metadata about the current completion context
166
- * @returns An object containing custom 'system' and 'user' prompts
164
+ * @returns A partial PromptData object that can override context and/or instruction
165
+ * @see {@link https://github.com/arshad-yaseen/monacopilot/blob/main/packages/monacopilot/src/prompt.ts | Monacopilot default prompt implementation}
167
166
  */
168
167
  customPrompt?: CustomPrompt<CompletionMetadata>;
169
168
  }
@@ -181,49 +180,6 @@ interface CompletionResponse {
181
180
  */
182
181
  raw?: unknown;
183
182
  }
184
- type CompletionMode = 'insert' | 'complete' | 'continue';
185
- interface CompletionMetadata {
186
- /**
187
- * The programming language of the code.
188
- */
189
- language: string | undefined;
190
- /**
191
- * The name of the file being edited.
192
- */
193
- filename: Filename | undefined;
194
- /**
195
- * The technologies used in the completion.
196
- */
197
- technologies: Technologies | undefined;
198
- /**
199
- * Additional context from related files.
200
- */
201
- relatedFiles: RelatedFile[] | undefined;
202
- /**
203
- * The text that appears after the cursor.
204
- */
205
- textAfterCursor: string;
206
- /**
207
- * The text that appears before the cursor.
208
- */
209
- textBeforeCursor: string;
210
- /**
211
- * The current cursor position.
212
- */
213
- cursorPosition: CursorPosition;
214
- /**
215
- * The current state of the editor.
216
- */
217
- editorState: {
218
- /**
219
- * The mode of the completion.
220
- * - `insert`: Indicates that there is a character immediately after the cursor. In this mode, the LLM will generate content to be inserted at the cursor position.
221
- * - `complete`: Indicates that there is a character after the cursor but not immediately. In this mode, the LLM will generate content to complete the text from the cursor position.
222
- * - `continue`: Indicates that there is no character after the cursor. In this mode, the LLM will generate content to continue the text from the cursor position.
223
- */
224
- completionMode: CompletionMode;
225
- };
226
- }
227
183
 
228
184
  declare class CompletionCopilot extends Copilot$1<CompletionMetadata> {
229
185
  complete(request: CompletionRequest): Promise<CompletionResponse>;
package/build/index.js CHANGED
@@ -1,28 +1,21 @@
1
- 'use strict';var core=require('@monacopilot/core');var q=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(`
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 N=(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==="")?`
5
5
  `.repeat(e):i.join(`
6
- `)};var N="<|developer_cursor_is_here|>",se={insert:{noun:"insertion",verb:"Insert"},complete:{noun:"completion",verb:"Complete"},continue:{noun:"continuation",verb:"Continue"}},K=n=>{let{technologies:e=[],filename:t,relatedFiles:o,language:r,textBeforeCursor:i="",textAfterCursor:s="",editorState:{completionMode:a}}=n,{noun:c,verb:l}=se[a],u=a==="continue"||a==="complete",m=q([r,...e].filter(C=>typeof C=="string"&&!!C)),d=!o||o.length===0?"":o.map(({path:C,content:S})=>`### ${C}
7
- ${S}`).join(`
6
+ `)};var ne="<|developer_cursor_is_here|>",j=n=>({instruction:re(),context:ie(n),fileContent:se(n)}),re=()=>"You are an expert code assistant completing code in an editor. Provide concise, accurate code that seamlessly integrates with the existing context.",ie=n=>{let{technologies:e=[],filename:t,relatedFiles:o=[],language:r}=n,i=B([r,...e].filter(l=>!!l)),s=o.length===0?"":o.map(({path:l,content:p})=>`### ${l}
7
+ ${p}`).join(`
8
8
 
9
- `),p=`You are an expert code ${c} assistant. ${l}${u?" the full":""} code naturally as if you were the developer, following their patterns and style. Use ${m||"appropriate"} best practices. Focus on writing concise, accurate code that matches the context perfectly, including proper indentation and formatting to seamlessly integrate with the existing code. Do not include explanations, comments, or backticks.`,g=`${d}
9
+ `),a=[i?`Technology stack: ${i}`:"",`File: ${t||"unknown"}`].filter(Boolean).join(`
10
+ `);return `${s?`${s}
10
11
 
11
- File: ${t||"unknown"}
12
- Mode: ${a}
13
-
14
- Here is the code context with the ${N} marker indicating where to ${l.toLowerCase()} the code:
15
- \`\`\`
16
- ${i}${N}${s}
12
+ `:""}${a}`},se=n=>{let{textBeforeCursor:e,textAfterCursor:t}=n;return `**Current code:**
17
13
  \`\`\`
18
-
19
- Provide only the code that should replace the ${N} marker. Ensure it is properly indented and formatted to seamlessly integrate with the existing code. Do not include any additional text, explanations, or syntax highlighting. Your response will be directly inserted in place of the marker.`;return {system:p,user:g}};var v=class extends core.Copilot{async complete(e){let{body:t,options:o}=e,{customPrompt:r,headers:i}=o??{},{completionMetadata:s}=t,{text:a,raw:c,error:l}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:a,raw:c,error:l}}getDefaultPrompt(e){return K(e)}};var U=(n,e)=>e.getLineContent(n.lineNumber)[n.column-1];var $=(n,e)=>e.getLineContent(n.lineNumber).slice(0,n.column-1),f=(n,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:n.lineNumber,endColumn:n.column}),F=(n,e)=>e.getValueInRange({startLineNumber:n.lineNumber,startColumn:n.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var T=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 P=class P{constructor(){this.cache=new T(P.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=f(t,o),s=i,a=o.getLineContent(t.lineNumber);if(t.column===a.length+1&&t.lineNumber<o.getLineCount()){let l=o.getLineContent(t.lineNumber+1);s=i+`
20
- `+l;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let c=o.getValueInRange(e.range);return this.isPartialMatch(c,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:c,column:l}=t;return c<r||c>s?false:r===s?l>=i-1&&l<=a+1:c===r?l>=i-1:c===s?l<=a+1:true}};P.MAX_CACHE_SIZE=20;var M=P;var L=class{constructor(e,t,o){this.formattedCompletion="";this.currentColumn=0;this.textBeforeCursorInLine="";this.formattedCompletion=e,this.currentColumn=t,this.textBeforeCursorInLine=o;}setCompletion(e){return this.formattedCompletion=e,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}indentByColumn(){let e=this.formattedCompletion.split(`
21
- `);if(this.textBeforeCursorInLine.trim()!=="")return this;let t=e[0].trimStart(),o=e[0].length-t.length;return e.length===1?(this.formattedCompletion=t,this):(this.formattedCompletion=t+`
22
- `+e.slice(1).map(r=>{let i=r.length-r.trimStart().length,s=Math.min(o,i),a=r.slice(s);return " ".repeat(this.currentColumn-1)+a}).join(`
23
- `),this)}removeMarkdownCodeBlocks(e){let t=e.split(`
14
+ ${e}${ne}${t}
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:p}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:a,raw:l,error:p}}getDefaultPrompt(e){return j(e)}};var K=100,U=true,v="onIdle",V=120,H=400,$=0;var f=(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=f(t,o),s=i,a=o.getLineContent(t.lineNumber);if(t.column===a.length+1&&t.lineNumber<o.getLineCount()){let p=o.getLineContent(t.lineNumber+1);s=i+`
16
+ `+p;}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:p}=t;return l<r||l>s?false:r===s?p>=i-1&&p<=a+1:l===r?p>=i-1:l===s?p<=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(`
24
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(`
25
18
  `)}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
26
19
 
27
- `),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,c=0,l=0,u=Math.min(r,i);for(let p=1;p<=u;p++){let g=e.substring(0,p),C=t.slice(-p);g===C&&(l=p);}let m=Math.min(r,s);for(let p=0;p<m&&e[p]===o[p];p++)a++;for(let p=1;p<=m;p++)e.slice(-p)===o.slice(0,p)&&(c=p);let d=Math.max(a,c);if(d===0){for(let p=1;p<r;p++)if(o.startsWith(e.substring(p))){d=r-p;break}}return {startOverlapLength:l,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:c}=this.textOverlapCalculator.findOverlaps(t,i,s),l=a>0?o.getPositionAt(r-a):e,u=r+c,m=o.getPositionAt(u);return new this.monaco.Range(l.lineNumber,l.column,m.lineNumber,m.column)}computeCacheRange(e,t){let o=e.lineNumber,r=e.column,i=t.split(`
28
- `),s=i.length-1,a=o+s,c=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(o,r,a,c)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var H=100,z=true,G="onIdle",W=120,X=400,Y=0;var Z=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");let{completion:r,error:i}=await o.json();if(i)throw new Error(i);return {completion:r}},J=({pos:n,mdl:e,options:t})=>{let{filename:o,language:r,technologies:i,relatedFiles:s,maxContextLines:a=H}=t,c=le(n,e),u=s&&s.length>0?3:2,m=a?Math.floor(a/u):void 0,d=(y,E,D)=>{let R=y(n,e);return E?w(R,E,D):R},p=(y,E)=>!y||!E?y:y.map(({content:D,...R})=>({...R,content:w(D,E)})),g=d(f,m,{truncateDirection:"keepEnd"}),C=d(F,m,{truncateDirection:"keepStart"}),S=p(s,m);return {filename:o,language:r,technologies:i,relatedFiles:S,textBeforeCursor:g,textAfterCursor:C,cursorPosition:n,editorState:{completionMode:c}}},le=(n,e)=>{let t=U(n,e),o=F(n,e);return t?"insert":o.trim()?"complete":"continue"};var Q=(n,e=300)=>{let t=null,o=null,r=(...i)=>{if(o)return o.args=i,o.promise;let s,a,c=new Promise((l,u)=>{s=l,a=u;});return o={args:i,promise:c,resolve:s,reject:a},t&&(clearTimeout(t),t=null),t=setTimeout(async()=>{let l=o;if(l){o=null,t=null;try{let u=await n(...l.args);l.resolve(u);}catch(u){l.reject(u);}}},e),c};return r.cancel=()=>{t&&(clearTimeout(t),t=null),o&&(o.reject(new Error("Cancelled")),o=null);},r};var ee=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 O=new M,te=async({monaco:n,mdl:e,pos:t,token:o,isCompletionAccepted:r,options:i})=>{let{trigger:s=G,endpoint:a,enableCaching:c=z,onError:l,requestHandler:u}=i;if(c){let m=O.get(t,e).map(d=>({insertText:d.completion,range:d.range}));if(m.length>0)return h(m)}if(o.isCancellationRequested||r)return h([]);try{let m=Q(u??Z,{onTyping:W,onIdle:X,onDemand:Y}[s]);o.onCancellationRequested(()=>{m.cancel();});let d=J({pos:t,mdl:e,options:i}),{completion:p}=await m({endpoint:a,body:{completionMetadata:d}});if(p){let g=new L(p,t.column,$(t,e)).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().indentByColumn().build(),C=new A(n);return c&&O.add({completion:g,range:C.computeCacheRange(t,g),textBeforeCursor:f(t,e)}),h([{insertText:g,range:C.computeInsertionRange(t,g,e)}])}}catch(m){if(ee(m))return h([]);l?l(m):core.logger.warn("Cannot provide completion",m);}return h([])};var _=new WeakMap,x=n=>_.get(n),oe=(n,e)=>{_.set(n,e);},k=n=>{_.delete(n);},ne=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var re=(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))return te({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},B=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))}},ie=(n,e,t,o)=>{let r=new B(n,t,o);return e.onKeyDown(i=>r.handleKeyEvent(i))};var b=null,me=(n,e,t)=>{b&&b.deregister();let o=[];oe(e,ne()),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=x(e);if(!r)return core.logger.warn("Completion is not registered properly. State not found."),de();let i=re(n,e,t);i&&o.push(i);let s=ie(n,e,r,t);o.push(s);let a={deregister:()=>{o.forEach(c=>c.dispose()),O.clear(),k(e),b=null;},trigger:()=>ue(e)};return b=a,a}catch(r){return t.onError?t.onError(r):core.logger.report(r),{deregister:()=>{o.forEach(i=>i.dispose()),k(e),b=null;},trigger:()=>{}}}},ue=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",{});},de=()=>({deregister:()=>{},trigger:()=>{}});var gt=v;exports.CompletionCopilot=v;exports.Copilot=gt;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,p=0,d=Math.min(r,i);for(let c=1;c<=d;c++){let C=e.substring(0,c),g=t.slice(-c);C===g&&(p=c);}let m=Math.min(r,s);for(let c=0;c<m&&e[c]===o[c];c++)a++;for(let c=1;c<=m;c++)e.slice(-c)===o.slice(0,c)&&(l=c);let u=Math.max(a,l);if(u===0){for(let c=1;c<r;c++)if(o.startsWith(e.substring(c))){u=r-c;break}}return {startOverlapLength:p,maxOverlapLength:u}}};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),p=a>0?o.getPositionAt(r-a):e,d=r+l,m=o.getPositionAt(d);return new this.monaco.Range(p.lineNumber,p.column,m.lineNumber,m.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 W=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}},X=({pos:n,mdl:e,options:t})=>{let{filename:o,language:r,technologies:i,relatedFiles:s,maxContextLines:a=K}=t,p=s&&s.length>0?3:2,d=a?Math.floor(a/p):void 0,m=(E,y,D)=>{let b=E(n,e);return y?N(b,y,D):b},u=(E,y)=>!E||!y?E:E.map(({content:D,...b})=>({...b,content:N(D,y)})),c=m(f,d,{truncateDirection:"keepEnd"}),C=m(z,d,{truncateDirection:"keepStart"}),g=u(s,d);return {filename:o,language:r,technologies:i,relatedFiles:g,textBeforeCursor:c,textAfterCursor:C,cursorPosition:n}};var Y=(n,e=300)=>{let t=null,o=null,r=(...i)=>{if(o)return o.args=i,o.promise;let s,a,l=new Promise((p,d)=>{s=p,a=d;});return o={args:i,promise:l,resolve:s,reject:a},t&&(clearTimeout(t),t=null),t=setTimeout(async()=>{let p=o;if(p){o=null,t=null;try{let d=await n(...p.args);p.resolve(d);}catch(d){p.reject(d);}}},e),l};return r.cancel=()=>{t&&(clearTimeout(t),t=null),o&&(o.reject(new Error("Cancelled")),o=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 S=new M,J=async({monaco:n,mdl:e,pos:t,token:o,isCompletionAccepted:r,options:i})=>{let{trigger:s=v,endpoint:a,enableCaching:l=U,onError:p,requestHandler:d}=i;if(l&&!r){let m=S.get(t,e).map(u=>({insertText:u.completion,range:u.range}));if(m.length>0)return h(m)}if(o.isCancellationRequested)return h([]);try{let m=Y(d??W,{onTyping:V,onIdle:H,onDemand:$}[s]);o.onCancellationRequested(()=>{m.cancel();});let u=X({pos:t,mdl:e,options:i}),{completion:c}=await m({endpoint:a,body:{completionMetadata:u}});if(c){let C=new I(c).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),g=new A(n);return l&&S.add({completion:C,range:g.computeCacheRange(t,C),textBeforeCursor:f(t,e)}),h([{insertText:C,range:g.computeInsertionRange(t,C,e)}])}}catch(m){if(Z(m))return h([]);p?p(m):core.logger.warn("Cannot provide completion",m);}return h([])};var w=new WeakMap,x=n=>w.get(n),Q=(n,e)=>{w.set(n,e);},F=n=>{w.delete(n);},ee=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var te=(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 J({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 pe={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(pe).some(t=>t(this.monaco,e))}},oe=(n,e,t,o)=>{let r=new _(n,t,o);return e.onKeyDown(i=>r.handleKeyEvent(i))};var R=null,ce=(n,e,t)=>{R&&R.deregister();let o=[];Q(e,ee()),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=x(e);if(!r)return core.logger.warn("Completion is not registered properly. State not found."),de();let i=te(n,e,t);i&&o.push(i);let s=oe(n,e,r,t);o.push(s);let a={deregister:()=>{o.forEach(l=>l.dispose()),S.clear(),F(e),R=null;},trigger:()=>me(e)};return R=a,a}catch(r){return t.onError?t.onError(r):core.logger.report(r),{deregister:()=>{o.forEach(i=>i.dispose()),F(e),R=null;},trigger:()=>{}}}},me=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",{});},de=()=>({deregister:()=>{},trigger:()=>{}});var ft=T;exports.CompletionCopilot=T;exports.Copilot=ft;exports.registerCompletion=ce;
package/build/index.mjs CHANGED
@@ -1,28 +1,21 @@
1
- import {Copilot,logger}from'@monacopilot/core';var q=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(`
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 N=(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==="")?`
5
5
  `.repeat(e):i.join(`
6
- `)};var N="<|developer_cursor_is_here|>",se={insert:{noun:"insertion",verb:"Insert"},complete:{noun:"completion",verb:"Complete"},continue:{noun:"continuation",verb:"Continue"}},K=n=>{let{technologies:e=[],filename:t,relatedFiles:o,language:r,textBeforeCursor:i="",textAfterCursor:s="",editorState:{completionMode:a}}=n,{noun:c,verb:l}=se[a],u=a==="continue"||a==="complete",m=q([r,...e].filter(C=>typeof C=="string"&&!!C)),d=!o||o.length===0?"":o.map(({path:C,content:S})=>`### ${C}
7
- ${S}`).join(`
6
+ `)};var ne="<|developer_cursor_is_here|>",j=n=>({instruction:re(),context:ie(n),fileContent:se(n)}),re=()=>"You are an expert code assistant completing code in an editor. Provide concise, accurate code that seamlessly integrates with the existing context.",ie=n=>{let{technologies:e=[],filename:t,relatedFiles:o=[],language:r}=n,i=B([r,...e].filter(l=>!!l)),s=o.length===0?"":o.map(({path:l,content:p})=>`### ${l}
7
+ ${p}`).join(`
8
8
 
9
- `),p=`You are an expert code ${c} assistant. ${l}${u?" the full":""} code naturally as if you were the developer, following their patterns and style. Use ${m||"appropriate"} best practices. Focus on writing concise, accurate code that matches the context perfectly, including proper indentation and formatting to seamlessly integrate with the existing code. Do not include explanations, comments, or backticks.`,g=`${d}
9
+ `),a=[i?`Technology stack: ${i}`:"",`File: ${t||"unknown"}`].filter(Boolean).join(`
10
+ `);return `${s?`${s}
10
11
 
11
- File: ${t||"unknown"}
12
- Mode: ${a}
13
-
14
- Here is the code context with the ${N} marker indicating where to ${l.toLowerCase()} the code:
15
- \`\`\`
16
- ${i}${N}${s}
12
+ `:""}${a}`},se=n=>{let{textBeforeCursor:e,textAfterCursor:t}=n;return `**Current code:**
17
13
  \`\`\`
18
-
19
- Provide only the code that should replace the ${N} marker. Ensure it is properly indented and formatted to seamlessly integrate with the existing code. Do not include any additional text, explanations, or syntax highlighting. Your response will be directly inserted in place of the marker.`;return {system:p,user:g}};var v=class extends Copilot{async complete(e){let{body:t,options:o}=e,{customPrompt:r,headers:i}=o??{},{completionMetadata:s}=t,{text:a,raw:c,error:l}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:a,raw:c,error:l}}getDefaultPrompt(e){return K(e)}};var U=(n,e)=>e.getLineContent(n.lineNumber)[n.column-1];var $=(n,e)=>e.getLineContent(n.lineNumber).slice(0,n.column-1),f=(n,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:n.lineNumber,endColumn:n.column}),F=(n,e)=>e.getValueInRange({startLineNumber:n.lineNumber,startColumn:n.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var T=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 P=class P{constructor(){this.cache=new T(P.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=f(t,o),s=i,a=o.getLineContent(t.lineNumber);if(t.column===a.length+1&&t.lineNumber<o.getLineCount()){let l=o.getLineContent(t.lineNumber+1);s=i+`
20
- `+l;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let c=o.getValueInRange(e.range);return this.isPartialMatch(c,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:c,column:l}=t;return c<r||c>s?false:r===s?l>=i-1&&l<=a+1:c===r?l>=i-1:c===s?l<=a+1:true}};P.MAX_CACHE_SIZE=20;var M=P;var L=class{constructor(e,t,o){this.formattedCompletion="";this.currentColumn=0;this.textBeforeCursorInLine="";this.formattedCompletion=e,this.currentColumn=t,this.textBeforeCursorInLine=o;}setCompletion(e){return this.formattedCompletion=e,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}indentByColumn(){let e=this.formattedCompletion.split(`
21
- `);if(this.textBeforeCursorInLine.trim()!=="")return this;let t=e[0].trimStart(),o=e[0].length-t.length;return e.length===1?(this.formattedCompletion=t,this):(this.formattedCompletion=t+`
22
- `+e.slice(1).map(r=>{let i=r.length-r.trimStart().length,s=Math.min(o,i),a=r.slice(s);return " ".repeat(this.currentColumn-1)+a}).join(`
23
- `),this)}removeMarkdownCodeBlocks(e){let t=e.split(`
14
+ ${e}${ne}${t}
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:p}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:a,raw:l,error:p}}getDefaultPrompt(e){return j(e)}};var K=100,U=true,v="onIdle",V=120,H=400,$=0;var f=(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=f(t,o),s=i,a=o.getLineContent(t.lineNumber);if(t.column===a.length+1&&t.lineNumber<o.getLineCount()){let p=o.getLineContent(t.lineNumber+1);s=i+`
16
+ `+p;}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:p}=t;return l<r||l>s?false:r===s?p>=i-1&&p<=a+1:l===r?p>=i-1:l===s?p<=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(`
24
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(`
25
18
  `)}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
26
19
 
27
- `),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,c=0,l=0,u=Math.min(r,i);for(let p=1;p<=u;p++){let g=e.substring(0,p),C=t.slice(-p);g===C&&(l=p);}let m=Math.min(r,s);for(let p=0;p<m&&e[p]===o[p];p++)a++;for(let p=1;p<=m;p++)e.slice(-p)===o.slice(0,p)&&(c=p);let d=Math.max(a,c);if(d===0){for(let p=1;p<r;p++)if(o.startsWith(e.substring(p))){d=r-p;break}}return {startOverlapLength:l,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:c}=this.textOverlapCalculator.findOverlaps(t,i,s),l=a>0?o.getPositionAt(r-a):e,u=r+c,m=o.getPositionAt(u);return new this.monaco.Range(l.lineNumber,l.column,m.lineNumber,m.column)}computeCacheRange(e,t){let o=e.lineNumber,r=e.column,i=t.split(`
28
- `),s=i.length-1,a=o+s,c=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(o,r,a,c)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var H=100,z=true,G="onIdle",W=120,X=400,Y=0;var Z=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");let{completion:r,error:i}=await o.json();if(i)throw new Error(i);return {completion:r}},J=({pos:n,mdl:e,options:t})=>{let{filename:o,language:r,technologies:i,relatedFiles:s,maxContextLines:a=H}=t,c=le(n,e),u=s&&s.length>0?3:2,m=a?Math.floor(a/u):void 0,d=(y,E,D)=>{let R=y(n,e);return E?w(R,E,D):R},p=(y,E)=>!y||!E?y:y.map(({content:D,...R})=>({...R,content:w(D,E)})),g=d(f,m,{truncateDirection:"keepEnd"}),C=d(F,m,{truncateDirection:"keepStart"}),S=p(s,m);return {filename:o,language:r,technologies:i,relatedFiles:S,textBeforeCursor:g,textAfterCursor:C,cursorPosition:n,editorState:{completionMode:c}}},le=(n,e)=>{let t=U(n,e),o=F(n,e);return t?"insert":o.trim()?"complete":"continue"};var Q=(n,e=300)=>{let t=null,o=null,r=(...i)=>{if(o)return o.args=i,o.promise;let s,a,c=new Promise((l,u)=>{s=l,a=u;});return o={args:i,promise:c,resolve:s,reject:a},t&&(clearTimeout(t),t=null),t=setTimeout(async()=>{let l=o;if(l){o=null,t=null;try{let u=await n(...l.args);l.resolve(u);}catch(u){l.reject(u);}}},e),c};return r.cancel=()=>{t&&(clearTimeout(t),t=null),o&&(o.reject(new Error("Cancelled")),o=null);},r};var ee=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 O=new M,te=async({monaco:n,mdl:e,pos:t,token:o,isCompletionAccepted:r,options:i})=>{let{trigger:s=G,endpoint:a,enableCaching:c=z,onError:l,requestHandler:u}=i;if(c){let m=O.get(t,e).map(d=>({insertText:d.completion,range:d.range}));if(m.length>0)return h(m)}if(o.isCancellationRequested||r)return h([]);try{let m=Q(u??Z,{onTyping:W,onIdle:X,onDemand:Y}[s]);o.onCancellationRequested(()=>{m.cancel();});let d=J({pos:t,mdl:e,options:i}),{completion:p}=await m({endpoint:a,body:{completionMetadata:d}});if(p){let g=new L(p,t.column,$(t,e)).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().indentByColumn().build(),C=new A(n);return c&&O.add({completion:g,range:C.computeCacheRange(t,g),textBeforeCursor:f(t,e)}),h([{insertText:g,range:C.computeInsertionRange(t,g,e)}])}}catch(m){if(ee(m))return h([]);l?l(m):logger.warn("Cannot provide completion",m);}return h([])};var _=new WeakMap,x=n=>_.get(n),oe=(n,e)=>{_.set(n,e);},k=n=>{_.delete(n);},ne=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var re=(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))return te({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},B=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))}},ie=(n,e,t,o)=>{let r=new B(n,t,o);return e.onKeyDown(i=>r.handleKeyEvent(i))};var b=null,me=(n,e,t)=>{b&&b.deregister();let o=[];oe(e,ne()),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=x(e);if(!r)return logger.warn("Completion is not registered properly. State not found."),de();let i=re(n,e,t);i&&o.push(i);let s=ie(n,e,r,t);o.push(s);let a={deregister:()=>{o.forEach(c=>c.dispose()),O.clear(),k(e),b=null;},trigger:()=>ue(e)};return b=a,a}catch(r){return t.onError?t.onError(r):logger.report(r),{deregister:()=>{o.forEach(i=>i.dispose()),k(e),b=null;},trigger:()=>{}}}},ue=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",{});},de=()=>({deregister:()=>{},trigger:()=>{}});var gt=v;export{v as CompletionCopilot,gt 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,p=0,d=Math.min(r,i);for(let c=1;c<=d;c++){let C=e.substring(0,c),g=t.slice(-c);C===g&&(p=c);}let m=Math.min(r,s);for(let c=0;c<m&&e[c]===o[c];c++)a++;for(let c=1;c<=m;c++)e.slice(-c)===o.slice(0,c)&&(l=c);let u=Math.max(a,l);if(u===0){for(let c=1;c<r;c++)if(o.startsWith(e.substring(c))){u=r-c;break}}return {startOverlapLength:p,maxOverlapLength:u}}};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),p=a>0?o.getPositionAt(r-a):e,d=r+l,m=o.getPositionAt(d);return new this.monaco.Range(p.lineNumber,p.column,m.lineNumber,m.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 W=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}},X=({pos:n,mdl:e,options:t})=>{let{filename:o,language:r,technologies:i,relatedFiles:s,maxContextLines:a=K}=t,p=s&&s.length>0?3:2,d=a?Math.floor(a/p):void 0,m=(E,y,D)=>{let b=E(n,e);return y?N(b,y,D):b},u=(E,y)=>!E||!y?E:E.map(({content:D,...b})=>({...b,content:N(D,y)})),c=m(f,d,{truncateDirection:"keepEnd"}),C=m(z,d,{truncateDirection:"keepStart"}),g=u(s,d);return {filename:o,language:r,technologies:i,relatedFiles:g,textBeforeCursor:c,textAfterCursor:C,cursorPosition:n}};var Y=(n,e=300)=>{let t=null,o=null,r=(...i)=>{if(o)return o.args=i,o.promise;let s,a,l=new Promise((p,d)=>{s=p,a=d;});return o={args:i,promise:l,resolve:s,reject:a},t&&(clearTimeout(t),t=null),t=setTimeout(async()=>{let p=o;if(p){o=null,t=null;try{let d=await n(...p.args);p.resolve(d);}catch(d){p.reject(d);}}},e),l};return r.cancel=()=>{t&&(clearTimeout(t),t=null),o&&(o.reject(new Error("Cancelled")),o=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 S=new M,J=async({monaco:n,mdl:e,pos:t,token:o,isCompletionAccepted:r,options:i})=>{let{trigger:s=v,endpoint:a,enableCaching:l=U,onError:p,requestHandler:d}=i;if(l&&!r){let m=S.get(t,e).map(u=>({insertText:u.completion,range:u.range}));if(m.length>0)return h(m)}if(o.isCancellationRequested)return h([]);try{let m=Y(d??W,{onTyping:V,onIdle:H,onDemand:$}[s]);o.onCancellationRequested(()=>{m.cancel();});let u=X({pos:t,mdl:e,options:i}),{completion:c}=await m({endpoint:a,body:{completionMetadata:u}});if(c){let C=new I(c).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),g=new A(n);return l&&S.add({completion:C,range:g.computeCacheRange(t,C),textBeforeCursor:f(t,e)}),h([{insertText:C,range:g.computeInsertionRange(t,C,e)}])}}catch(m){if(Z(m))return h([]);p?p(m):logger.warn("Cannot provide completion",m);}return h([])};var w=new WeakMap,x=n=>w.get(n),Q=(n,e)=>{w.set(n,e);},F=n=>{w.delete(n);},ee=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var te=(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 J({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 pe={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(pe).some(t=>t(this.monaco,e))}},oe=(n,e,t,o)=>{let r=new _(n,t,o);return e.onKeyDown(i=>r.handleKeyEvent(i))};var R=null,ce=(n,e,t)=>{R&&R.deregister();let o=[];Q(e,ee()),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=x(e);if(!r)return logger.warn("Completion is not registered properly. State not found."),de();let i=te(n,e,t);i&&o.push(i);let s=oe(n,e,r,t);o.push(s);let a={deregister:()=>{o.forEach(l=>l.dispose()),S.clear(),F(e),R=null;},trigger:()=>me(e)};return R=a,a}catch(r){return t.onError?t.onError(r):logger.report(r),{deregister:()=>{o.forEach(i=>i.dispose()),F(e),R=null;},trigger:()=>{}}}},me=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",{});},de=()=>({deregister:()=>{},trigger:()=>{}});var ft=T;export{T as CompletionCopilot,ft as Copilot,ce as registerCompletion};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monacopilot",
3
- "version": "0.19.17",
3
+ "version": "1.0.1",
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": "0.19.17"
40
+ "@monacopilot/core": "1.0.1"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "monaco-editor": ">=0.41.0"