monacopilot 0.18.18 → 0.18.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.d.mts CHANGED
@@ -1,114 +1,7 @@
1
- import { MessageCreateParams, Message } from '@anthropic-ai/sdk/resources';
2
- import { GenerateContentRequest, GenerateContentResponse } from '@google/generative-ai';
3
- import { ChatCompletionCreateParamsBase as ChatCompletionCreateParamsBase$1, ChatCompletion as ChatCompletion$1 } from 'groq-sdk/resources/chat/completions';
4
- import { ChatCompletionCreateParamsBase, ChatCompletion } from 'openai/resources/chat/completions';
1
+ import { CustomPrompt, Copilot as Copilot$1, Provider, Model, PromptData } from '@monacopilot/core';
2
+ export { AnthropicModel, CopilotOptions, CustomCopilotModel, DeepSeekModel, GoogleModel, GroqModel, Model, OpenAIModel, Provider } from '@monacopilot/core';
5
3
  import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
6
4
 
7
- declare const MODEL_IDS: Record<Model, string>;
8
-
9
- /**
10
- * Providers supported by Copilot.
11
- */
12
- type Provider = 'openai' | 'groq' | 'anthropic' | 'google' | 'deepseek';
13
- type DeepSeekChatCompletionType = {
14
- choices: {
15
- text: string;
16
- }[];
17
- };
18
- type DeepSeekChatCompletionCreateParamsBase = {
19
- model: (typeof MODEL_IDS)['v3'];
20
- prompt: string;
21
- suffix: string;
22
- temperature: number;
23
- max_tokens: number;
24
- };
25
- /**
26
- * Core type mapping for provider-specific implementations
27
- */
28
- interface ProviderImplementationMap {
29
- openai: {
30
- Model: 'gpt-4o' | 'gpt-4o-mini' | 'o1-mini';
31
- Params: ChatCompletionCreateParamsBase;
32
- Completion: ChatCompletion;
33
- };
34
- groq: {
35
- Model: 'llama-3-70b';
36
- Params: ChatCompletionCreateParamsBase$1;
37
- Completion: ChatCompletion$1;
38
- };
39
- anthropic: {
40
- Model: 'claude-3-5-sonnet' | 'claude-3-5-haiku' | 'claude-3-haiku';
41
- Params: MessageCreateParams;
42
- Completion: Message;
43
- };
44
- google: {
45
- Model: 'gemini-1.5-flash' | 'gemini-1.5-flash-8b' | 'gemini-1.5-pro';
46
- Params: GenerateContentRequest;
47
- Completion: GenerateContentResponse;
48
- };
49
- deepseek: {
50
- Model: 'v3';
51
- Params: DeepSeekChatCompletionCreateParamsBase;
52
- Completion: DeepSeekChatCompletionType;
53
- };
54
- }
55
- /**
56
- * Models available for each provider (maintained as individual exports)
57
- */
58
- type OpenAIModel = ProviderImplementationMap['openai']['Model'];
59
- type GroqModel = ProviderImplementationMap['groq']['Model'];
60
- type AnthropicModel = ProviderImplementationMap['anthropic']['Model'];
61
- type GoogleModel = ProviderImplementationMap['google']['Model'];
62
- type DeepSeekModel = ProviderImplementationMap['deepseek']['Model'];
63
- /**
64
- * Union of all predefined Copilot models
65
- */
66
- type Model = {
67
- [K in Provider]: ProviderImplementationMap[K]['Model'];
68
- }[Provider];
69
- type OpenAIChatCompletion = ChatCompletion;
70
- type DeepSeekChatCompletion = DeepSeekChatCompletionType;
71
- type GroqChatCompletion = ChatCompletion$1;
72
- type AnthropicChatCompletion = Message;
73
-
74
- /**
75
- * Data structure representing the prompt data.
76
- */
77
- interface PromptData {
78
- system: string;
79
- user: string;
80
- }
81
- /**
82
- * Custom model configuration types
83
- */
84
- type CustomCopilotModelConfig = (apiKey: string, prompt: PromptData) => {
85
- /** The URL endpoint for the custom model's API */
86
- endpoint: string;
87
- /** Additional HTTP headers */
88
- headers?: Record<string, string>;
89
- /** Request body data */
90
- body?: Record<string, unknown>;
91
- };
92
- type CustomCopilotModelTransformResponse = (response: unknown) => {
93
- /** The generated text */
94
- text: string | null;
95
- };
96
- interface CustomCopilotModel {
97
- /** Configuration function */
98
- config: CustomCopilotModelConfig;
99
- /** Response transformer */
100
- transformResponse: CustomCopilotModelTransformResponse;
101
- }
102
- type CustomOptions = {
103
- provider?: undefined;
104
- model: CustomCopilotModel;
105
- };
106
- type CopilotOptions = ProviderOptions<'openai'> | ProviderOptions<'groq'> | ProviderOptions<'anthropic'> | ProviderOptions<'google'> | ProviderOptions<'deepseek'> | CustomOptions;
107
- type ProviderOptions<T extends Provider> = {
108
- provider: T;
109
- model: ProviderImplementationMap[T]['Model'];
110
- };
111
-
112
5
  type Monaco = typeof monaco;
113
6
  type StandaloneCodeEditor = monaco.editor.IStandaloneCodeEditor;
114
7
  type CursorPosition = monaco.IPosition;
@@ -273,9 +166,8 @@ interface CompletionRequestOptions {
273
166
  * @param completionMetadata - Metadata about the current completion context
274
167
  * @returns An object containing custom 'system' and 'user' prompts
275
168
  */
276
- customPrompt?: CustomPrompt;
169
+ customPrompt?: CustomPrompt<CompletionMetadata>;
277
170
  }
278
- type CustomPrompt = (completionMetadata: CompletionMetadata) => Partial<PromptData>;
279
171
  interface CompletionResponse {
280
172
  /**
281
173
  * The completion text.
@@ -334,6 +226,11 @@ interface CompletionMetadata {
334
226
  };
335
227
  }
336
228
 
229
+ declare class CompletionCopilot extends Copilot$1<Provider, Model, CompletionMetadata> {
230
+ complete(request: CompletionRequest): Promise<CompletionResponse>;
231
+ protected getDefaultPrompt(metadata: CompletionMetadata): PromptData;
232
+ }
233
+
337
234
  /**
338
235
  * Registers completion functionality with the Monaco editor.
339
236
  * @param monaco - The Monaco instance.
@@ -343,17 +240,7 @@ interface CompletionMetadata {
343
240
  */
344
241
  declare const registerCompletion: (monaco: Monaco, editor: StandaloneCodeEditor, options: RegisterCompletionOptions) => CompletionRegistration;
345
242
 
346
- declare class Copilot {
347
- private readonly apiKey;
348
- private provider;
349
- private model;
350
- constructor(apiKey: string, options: CopilotOptions);
351
- complete(request: CompletionRequest): Promise<CompletionResponse>;
352
- private generatePrompt;
353
- private prepareRequestDetails;
354
- private sendCompletionRequest;
355
- private processCompletionResponse;
356
- private handleCompletionError;
357
- }
243
+ /** @deprecated Use `CompletionCopilot` instead */
244
+ declare const Copilot: typeof CompletionCopilot;
358
245
 
359
- export { type AnthropicChatCompletion, type AnthropicModel, type CompletionMetadata, type CompletionRegistration, type CompletionRequest, type CompletionRequestBody, type CompletionRequestOptions, Copilot, type CopilotOptions, type CustomCopilotModel, type CustomCopilotModelConfig, type CustomCopilotModelTransformResponse, type DeepSeekChatCompletion, type DeepSeekModel, type GoogleModel, type GroqChatCompletion, type GroqModel, type Model, type Monaco, type OpenAIChatCompletion, type OpenAIModel, type Provider, type RegisterCompletionOptions, type StandaloneCodeEditor, registerCompletion };
246
+ export { CompletionCopilot, type CompletionMetadata, type CompletionRegistration, type CompletionRequest, type CompletionRequestBody, type CompletionRequestOptions, Copilot, type Monaco, type RegisterCompletionOptions, type StandaloneCodeEditor, registerCompletion };
package/build/index.d.ts CHANGED
@@ -1,114 +1,7 @@
1
- import { MessageCreateParams, Message } from '@anthropic-ai/sdk/resources';
2
- import { GenerateContentRequest, GenerateContentResponse } from '@google/generative-ai';
3
- import { ChatCompletionCreateParamsBase as ChatCompletionCreateParamsBase$1, ChatCompletion as ChatCompletion$1 } from 'groq-sdk/resources/chat/completions';
4
- import { ChatCompletionCreateParamsBase, ChatCompletion } from 'openai/resources/chat/completions';
1
+ import { CustomPrompt, Copilot as Copilot$1, Provider, Model, PromptData } from '@monacopilot/core';
2
+ export { AnthropicModel, CopilotOptions, CustomCopilotModel, DeepSeekModel, GoogleModel, GroqModel, Model, OpenAIModel, Provider } from '@monacopilot/core';
5
3
  import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
6
4
 
7
- declare const MODEL_IDS: Record<Model, string>;
8
-
9
- /**
10
- * Providers supported by Copilot.
11
- */
12
- type Provider = 'openai' | 'groq' | 'anthropic' | 'google' | 'deepseek';
13
- type DeepSeekChatCompletionType = {
14
- choices: {
15
- text: string;
16
- }[];
17
- };
18
- type DeepSeekChatCompletionCreateParamsBase = {
19
- model: (typeof MODEL_IDS)['v3'];
20
- prompt: string;
21
- suffix: string;
22
- temperature: number;
23
- max_tokens: number;
24
- };
25
- /**
26
- * Core type mapping for provider-specific implementations
27
- */
28
- interface ProviderImplementationMap {
29
- openai: {
30
- Model: 'gpt-4o' | 'gpt-4o-mini' | 'o1-mini';
31
- Params: ChatCompletionCreateParamsBase;
32
- Completion: ChatCompletion;
33
- };
34
- groq: {
35
- Model: 'llama-3-70b';
36
- Params: ChatCompletionCreateParamsBase$1;
37
- Completion: ChatCompletion$1;
38
- };
39
- anthropic: {
40
- Model: 'claude-3-5-sonnet' | 'claude-3-5-haiku' | 'claude-3-haiku';
41
- Params: MessageCreateParams;
42
- Completion: Message;
43
- };
44
- google: {
45
- Model: 'gemini-1.5-flash' | 'gemini-1.5-flash-8b' | 'gemini-1.5-pro';
46
- Params: GenerateContentRequest;
47
- Completion: GenerateContentResponse;
48
- };
49
- deepseek: {
50
- Model: 'v3';
51
- Params: DeepSeekChatCompletionCreateParamsBase;
52
- Completion: DeepSeekChatCompletionType;
53
- };
54
- }
55
- /**
56
- * Models available for each provider (maintained as individual exports)
57
- */
58
- type OpenAIModel = ProviderImplementationMap['openai']['Model'];
59
- type GroqModel = ProviderImplementationMap['groq']['Model'];
60
- type AnthropicModel = ProviderImplementationMap['anthropic']['Model'];
61
- type GoogleModel = ProviderImplementationMap['google']['Model'];
62
- type DeepSeekModel = ProviderImplementationMap['deepseek']['Model'];
63
- /**
64
- * Union of all predefined Copilot models
65
- */
66
- type Model = {
67
- [K in Provider]: ProviderImplementationMap[K]['Model'];
68
- }[Provider];
69
- type OpenAIChatCompletion = ChatCompletion;
70
- type DeepSeekChatCompletion = DeepSeekChatCompletionType;
71
- type GroqChatCompletion = ChatCompletion$1;
72
- type AnthropicChatCompletion = Message;
73
-
74
- /**
75
- * Data structure representing the prompt data.
76
- */
77
- interface PromptData {
78
- system: string;
79
- user: string;
80
- }
81
- /**
82
- * Custom model configuration types
83
- */
84
- type CustomCopilotModelConfig = (apiKey: string, prompt: PromptData) => {
85
- /** The URL endpoint for the custom model's API */
86
- endpoint: string;
87
- /** Additional HTTP headers */
88
- headers?: Record<string, string>;
89
- /** Request body data */
90
- body?: Record<string, unknown>;
91
- };
92
- type CustomCopilotModelTransformResponse = (response: unknown) => {
93
- /** The generated text */
94
- text: string | null;
95
- };
96
- interface CustomCopilotModel {
97
- /** Configuration function */
98
- config: CustomCopilotModelConfig;
99
- /** Response transformer */
100
- transformResponse: CustomCopilotModelTransformResponse;
101
- }
102
- type CustomOptions = {
103
- provider?: undefined;
104
- model: CustomCopilotModel;
105
- };
106
- type CopilotOptions = ProviderOptions<'openai'> | ProviderOptions<'groq'> | ProviderOptions<'anthropic'> | ProviderOptions<'google'> | ProviderOptions<'deepseek'> | CustomOptions;
107
- type ProviderOptions<T extends Provider> = {
108
- provider: T;
109
- model: ProviderImplementationMap[T]['Model'];
110
- };
111
-
112
5
  type Monaco = typeof monaco;
113
6
  type StandaloneCodeEditor = monaco.editor.IStandaloneCodeEditor;
114
7
  type CursorPosition = monaco.IPosition;
@@ -273,9 +166,8 @@ interface CompletionRequestOptions {
273
166
  * @param completionMetadata - Metadata about the current completion context
274
167
  * @returns An object containing custom 'system' and 'user' prompts
275
168
  */
276
- customPrompt?: CustomPrompt;
169
+ customPrompt?: CustomPrompt<CompletionMetadata>;
277
170
  }
278
- type CustomPrompt = (completionMetadata: CompletionMetadata) => Partial<PromptData>;
279
171
  interface CompletionResponse {
280
172
  /**
281
173
  * The completion text.
@@ -334,6 +226,11 @@ interface CompletionMetadata {
334
226
  };
335
227
  }
336
228
 
229
+ declare class CompletionCopilot extends Copilot$1<Provider, Model, CompletionMetadata> {
230
+ complete(request: CompletionRequest): Promise<CompletionResponse>;
231
+ protected getDefaultPrompt(metadata: CompletionMetadata): PromptData;
232
+ }
233
+
337
234
  /**
338
235
  * Registers completion functionality with the Monaco editor.
339
236
  * @param monaco - The Monaco instance.
@@ -343,17 +240,7 @@ interface CompletionMetadata {
343
240
  */
344
241
  declare const registerCompletion: (monaco: Monaco, editor: StandaloneCodeEditor, options: RegisterCompletionOptions) => CompletionRegistration;
345
242
 
346
- declare class Copilot {
347
- private readonly apiKey;
348
- private provider;
349
- private model;
350
- constructor(apiKey: string, options: CopilotOptions);
351
- complete(request: CompletionRequest): Promise<CompletionResponse>;
352
- private generatePrompt;
353
- private prepareRequestDetails;
354
- private sendCompletionRequest;
355
- private processCompletionResponse;
356
- private handleCompletionError;
357
- }
243
+ /** @deprecated Use `CompletionCopilot` instead */
244
+ declare const Copilot: typeof CompletionCopilot;
358
245
 
359
- export { type AnthropicChatCompletion, type AnthropicModel, type CompletionMetadata, type CompletionRegistration, type CompletionRequest, type CompletionRequestBody, type CompletionRequestOptions, Copilot, type CopilotOptions, type CustomCopilotModel, type CustomCopilotModelConfig, type CustomCopilotModelTransformResponse, type DeepSeekChatCompletion, type DeepSeekModel, type GoogleModel, type GroqChatCompletion, type GroqModel, type Model, type Monaco, type OpenAIChatCompletion, type OpenAIModel, type Provider, type RegisterCompletionOptions, type StandaloneCodeEditor, registerCompletion };
246
+ export { CompletionCopilot, type CompletionMetadata, type CompletionRegistration, type CompletionRequest, type CompletionRequestBody, type CompletionRequestOptions, Copilot, type Monaco, type RegisterCompletionOptions, type StandaloneCodeEditor, registerCompletion };
package/build/index.js CHANGED
@@ -1,44 +1,42 @@
1
- 'use strict';var xe="\x1B[91m",be="\x1B[93m",te="\x1B[0m",oe="\x1B[1m",re=o=>o instanceof Error?o.message:typeof o=="string"?o:"An unknown error occurred",S=o=>{let e=re(o),t=`${xe}${oe}[MONACOPILOT ERROR] ${e}${te}`;return console.error(t),{message:e}},v=(o,e)=>{console.warn(`${be}${oe}[MONACOPILOT WARN] ${o}${e?`
2
- ${re(e)}`:""}${te}`);};var ne=(o,e)=>e.getLineContent(o.lineNumber)[o.column-1];var ie=(o,e)=>e.getLineContent(o.lineNumber).slice(0,o.column-1),O=(o,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:o.lineNumber,endColumn:o.column}),W=(o,e)=>e.getValueInRange({startLineNumber:o.lineNumber,startColumn:o.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var w=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]=undefined,this.head=(this.head+1)%this.capacity,this.size--,e}getAll(){return this.buffer.filter(e=>e!==undefined)}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 _=class _{constructor(){this.cache=new w(_.MAX_CACHE_SIZE);}get(e,t){return this.cache.getAll().filter(r=>this.isValidCacheItem(r,e,t))}add(e){this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,t,r){let n=r.getValueInRange(e.range),i=O(t,r);return i.length<e.textBeforeCursor.length||!i.startsWith(e.textBeforeCursor)?false:this.isPositionValid(e,t,n)}isPositionValid(e,t,r){let{range:n,completion:i}=e,{startLineNumber:s,startColumn:l,endLineNumber:p,endColumn:d}=n,{lineNumber:c,column:a}=t;if(!i.startsWith(r))return false;let u=c===s&&a===l;if(s===p)return u||c===s&&a>=l&&a<=d;let f=c>s&&c<p?true:c===s&&a>=l||c===p&&a<=d;return u||f}};_.MAX_CACHE_SIZE=10;var L=_;var N=class{constructor(e,t,r){this.formattedCompletion="";this.currentColumn=0;this.textBeforeCursorInLine="";this.formattedCompletion=e,this.currentColumn=t,this.textBeforeCursorInLine=r;}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(`
3
- `);if(e.length<=1||this.textBeforeCursorInLine.trim()!=="")return this;let t=" ".repeat(this.currentColumn-1);return this.formattedCompletion=e[0]+`
4
- `+e.slice(1).map(r=>t+r).join(`
5
- `),this}removeMarkdownCodeBlocks(e){let t=/```[\s\S]*?```/g,r=e,n;for(;(n=t.exec(e))!==null;){let i=n[0],s=i.split(`
6
- `).slice(1,-1).join(`
7
- `);r=r.replace(i,s);}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
8
-
9
- `),this}build(){return this.formattedCompletion}};var B=class{constructor(e){this.monaco=e;}computeInsertionRange(e,t,r){if(!t)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let n=r.getOffsetAt(e),i=r.getValue().substring(0,n),s=r.getValue().substring(n),l=0,p=0,d=0,c=0,a=t.length,u=i.length,f=s.length;if(n>=r.getValue().length)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);if(f===0)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let T=Math.min(a,u);for(let m=1;m<=T;m++){let b=t.substring(0,m),Te=i.slice(-m);b===Te&&(c=m);}let C=Math.min(a,f);for(let m=0;m<C&&t[m]===s[m];m++)l++;for(let m=1;m<=C;m++)t.slice(-m)===s.slice(0,m)&&(p=m);if(d=Math.max(l,p),d===0){for(let m=1;m<a;m++)if(s.startsWith(t.substring(m))){d=a-m;break}}let x=c>0?r.getPositionAt(n-c):e,y=n+d,h=r.getPositionAt(y);return new this.monaco.Range(x.lineNumber,x.column,h.lineNumber,h.column)}computeCacheRange(e,t){let r=e.lineNumber,n=e.column,i=t.split(`
10
- `),s=i.length-1,l=r+s,p=s===0?n+i[0].length:i[s].length+1;return new this.monaco.Range(r,n,l,p)}};var se="application/json";var ve=async(o,e,t={})=>{let r=t.timeout??3e4,n=AbortSignal.timeout(r),i=t.signal?AbortSignal.any([n,t.signal]):n,s={"Content-Type":"application/json",...t.headers},l=t.body?JSON.stringify(t.body):undefined,p=await fetch(o,{method:e,headers:s,body:l,signal:i});if(!p.ok){let d=await p.json().catch(()=>null),c=d?`
11
- ${JSON.stringify(d,null,2)}`:"",a=t.fallbackError||"Network request failed";throw new Error(`${a} (${p.status})${c}`)}return p.json()},Oe=(o,e,t)=>ve(o,"POST",{...t,body:e}),F={post:Oe};var A=o=>!o||o.length===0?"":o.length===1?o[0]:`${o.slice(0,-1).join(", ")} and ${o.slice(-1)}`,ae=o=>o.charAt(0).toUpperCase()+o.slice(1),X=(o,e,t={})=>{if(e<=0)return "";let r=o.split(`
12
- `),n=r.length;if(e>=n)return o;if(t.from==="end"){let s=r.slice(-e);return s.every(l=>l==="")?`
1
+ 'use strict';var core=require('@monacopilot/core');var q=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`,K=t=>t.charAt(0).toUpperCase()+t.slice(1),O=(t,e,o={})=>{if(e<=0)return "";let n=t.split(`
2
+ `),r=n.length;if(e>=r)return t;if(o.from==="end"){let s=n.slice(-e);return s.every(l=>l==="")?`
13
3
  `.repeat(e):s.join(`
14
- `)}let i=r.slice(0,e);return i.every(s=>s==="")?`
4
+ `)}let i=n.slice(0,e);return i.every(s=>s==="")?`
15
5
  `.repeat(e):i.join(`
16
- `)};var le=async o=>{let{endpoint:e,body:t}=o,{completion:r,error:n}=await F.post(e,t,{headers:{"Content-Type":se},fallbackError:"Error while fetching completion item"});if(n)throw new Error(n);return {completion:r}},pe=({pos:o,mdl:e,options:t})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:l}=t,p=Ie(o,e),c=!!s?.length?3:2,a=l?Math.floor(l/c):undefined,u=(y,h,m)=>{let b=y(o,e);return h?X(b,h,m):b},f=(y,h)=>!y||!h?y:y.map(({content:m,...b})=>({...b,content:X(m,h)})),T=u(O,a,{from:"end"}),C=u(W,a),x=f(s,a);return {filename:r,language:n,technologies:i,relatedFiles:x,textBeforeCursor:T,textAfterCursor:C,cursorPosition:o,editorState:{completionMode:p}}},Ie=(o,e)=>{let t=ne(o,e),r=W(o,e);return t?"insert":r.trim()?"complete":"continue"};var I=o=>({items:o,enableForwardStability:true,suppressSuggestions:true});var q=(o,e=600,t=200)=>{let r=null,n=0,i=null,s=null,l=false,p=(...d)=>{if(l)return Promise.resolve(undefined);i=d;let c=Date.now(),a=c-n;n=c,r&&(clearTimeout(r),r=null);let u=a<t?e:t;return s=new Promise((f,T)=>{r=setTimeout(async()=>{l=true;try{if(i){let C=await o(...i);f(C);}else f(void 0);}catch(C){T(C);}finally{l=false,r=null,i=null;}},u);}),s};return p.cancel=()=>{r&&(clearTimeout(r),r=null),i=null;},p};var ke=o=>({onTyping:q(o,600,200),onIdle:q(o,600,400),onDemand:q(o,0,0)}),$=new L,me=async({monaco:o,mdl:e,pos:t,token:r,isCompletionAccepted:n,options:i})=>{let{trigger:s="onIdle",endpoint:l,enableCaching:p=true,onError:d,requestHandler:c}=i;if(p){let a=$.get(t,e).map(u=>({insertText:u.completion,range:u.range}));if(a.length>0)return I(a)}if(r.isCancellationRequested||n)return I([]);try{let u=ke(c??le)[s];r.onCancellationRequested(()=>{u.cancel();});let f=pe({pos:t,mdl:e,options:i}),{completion:T}=await u({endpoint:l,body:{completionMetadata:f}});if(T){let C=new N(T,t.column,ie(t,e)).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().indentByColumn().build(),x=new B(o),y=x.computeInsertionRange(t,C,e),h=x.computeCacheRange(t,C);return p&&$.add({completion:C,range:h,textBeforeCursor:O(t,e)}),I([{insertText:C,range:y}])}}catch(a){if(De(a))return I([]);d?d(a):v("Cannot provide completion",a);}return I([])},De=o=>typeof o=="string"?o==="Cancelled"||o==="AbortError":o instanceof Error?o.message==="Cancelled"||o.name==="AbortError":false;var G=new WeakMap,k=o=>G.get(o),ce=(o,e)=>{G.set(o,e);},Y=o=>{G.delete(o);},de=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var ue=(o,e,t)=>{let r=k(e);return r?o.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(n,i,s,l)=>{if(!(t.trigger==="onDemand"&&!r.isExplicitlyTriggered))return me({monaco:o,mdl:n,pos:i,token:l,isCompletionAccepted:r.isCompletionAccepted,options:t})},handleItemDidShow:(n,i,s)=>{r.isExplicitlyTriggered=false,r.hasRejectedCurrentCompletion=false,!r.isCompletionAccepted&&(r.isCompletionVisible=true,t.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null},Ce=o=>{let e=k(o);if(!e){v("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,o.trigger("keyboard","editor.action.inlineSuggest.trigger",{});};var Se={TAB:(o,e)=>e.keyCode===o.KeyCode.Tab,CMD_RIGHT_ARROW:(o,e)=>e.keyCode===o.KeyCode.RightArrow&&e.metaKey},J=class{constructor(e,t,r){this.monaco=e;this.state=t;this.options=r;}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(Se).some(t=>t(this.monaco,e))}},ge=(o,e,t,r)=>{let n=new J(o,t,r);return e.onKeyDown(i=>n.handleKeyEvent(i))};var D=null,we=(o,e,t)=>{D&&D.deregister();let r=[];ce(e,de()),e.updateOptions({inlineSuggest:{enabled:true,mode:"subwordSmart"}});try{let n=k(e);if(!n)return v("Completion is not registered properly. State not found."),Le();let i=ue(o,e,t);i&&r.push(i);let s=ge(o,e,n,t);r.push(s);let l={deregister:()=>{r.forEach(p=>p.dispose()),$.clear(),Y(e),D=null;},trigger:()=>Ce(e)};return D=l,l}catch(n){return t.onError?t.onError(n):S(n),{deregister:()=>{r.forEach(i=>i.dispose()),Y(e),D=null;},trigger:()=>{}}}},Le=()=>({deregister:()=>{},trigger:()=>{}});var Z=["groq","openai","anthropic","google","deepseek"],P={"llama-3-70b":"llama3-70b-8192","gpt-4o":"gpt-4o-2024-08-06","gpt-4o-mini":"gpt-4o-mini","claude-3-5-sonnet":"claude-3-5-sonnet-20241022","claude-3-haiku":"claude-3-haiku-20240307","claude-3-5-haiku":"claude-3-5-haiku-20241022","o1-mini":"o1-mini","gemini-1.5-flash-8b":"gemini-1.5-flash-8b","gemini-1.5-flash":"gemini-1.5-flash","gemini-1.5-pro":"gemini-1.5-pro",v3:"deepseek-chat"},Q={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-mini"],anthropic:["claude-3-5-sonnet","claude-3-haiku","claude-3-5-haiku"],google:["gemini-1.5-flash-8b","gemini-1.5-pro","gemini-1.5-flash"],deepseek:["v3"]},E={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages",google:"https://generativelanguage.googleapis.com/v1beta/models",deepseek:"https://api.deepseek.com/beta/completions"};var g=class{};var j=class extends g{createEndpoint(){return E.anthropic}createRequestBody(e,t){return {model:P[e],temperature:.1,system:t.system,messages:[{role:"user",content:t.user}],max_tokens:500}}createHeaders(e){return {"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"}}parseCompletion(e){let t=e.content?.[0];return t&&"text"in t?t.text:null}};var H=class extends g{createEndpoint(){return E.deepseek}createRequestBody(e,t,r){return {model:P[e],prompt:r.textBeforeCursor,suffix:r.textAfterCursor,temperature:.1,max_tokens:500}}createHeaders(e){return {"Content-Type":"application/json",Authorization:`Bearer ${e}`}}parseCompletion(e){return typeof e.choices?.[0]?.text=="string"?e.choices[0].text:null}};var K=class extends g{createEndpoint(e,t){return `${E.google}/${P[e]}:generateContent?key=${t}`}createRequestBody(e,t){return {systemInstruction:{role:"system",parts:[{text:t.system}]},generationConfig:{temperature:.1,maxOutputTokens:500},contents:[{role:"user",parts:[{text:t.user}]}]}}createHeaders(){return {"Content-Type":"application/json"}}parseCompletion(e){return e.candidates?.[0]?.content?.parts?.[0]?.text??null}};var V=class extends g{createEndpoint(){return E.groq}createRequestBody(e,t){return {model:P[e],temperature:.1,max_tokens:500,messages:[{role:"system",content:t.system},{role:"user",content:t.user}]}}createHeaders(e){return {"Content-Type":"application/json",Authorization:`Bearer ${e}`}}parseCompletion(e){return e.choices?.[0]?.message.content??null}};var U=class extends g{createEndpoint(){return E.openai}createRequestBody(e,t){let r=e==="o1-mini";return {model:P[e],...!r&&{temperature:.1},max_completion_tokens:500,messages:[{role:"system",content:t.system},{role:"user",content:t.user}]}}createHeaders(e){return {"Content-Type":"application/json",Authorization:`Bearer ${e}`}}parseCompletion(e){return e.choices?.[0]?.message.content??null}};var z={openai:new U,groq:new V,anthropic:new j,google:new K,deepseek:new H},fe=(o,e,t)=>z[t].createEndpoint(o,e),he=(o,e,t,r)=>z[e].createRequestBody(o,t,r),Pe=(o,e)=>z[e].createHeaders(o),Ee=(o,e)=>z[e].parseCompletion(o);var _e=o=>!o||o.length===0?"":o.map(({path:e,content:t})=>`
6
+ `)};var J=t=>!t||t.length===0?"":t.map(({path:e,content:o})=>`
17
7
  <related_file>
18
8
  <filePath>${e}</filePath>
19
9
  <fileContent>
20
10
  \`\`\`
21
- ${t}
11
+ ${o}
22
12
  \`\`\`
23
13
  </fileContent>
24
14
  </related_file>`.trim()).join(`
25
15
 
26
- `),ye=o=>{let{technologies:e=[],filename:t,relatedFiles:r,language:n,textBeforeCursor:i="",textAfterCursor:s="",editorState:{completionMode:l}}=o,p=A([n,...e].filter(a=>typeof a=="string"&&!!a)),d=`
16
+ `),j=t=>{let{technologies:e=[],filename:o,relatedFiles:n,language:r,textBeforeCursor:i="",textAfterCursor:s="",editorState:{completionMode:l}}=t,p=q([r,...e].filter(a=>typeof a=="string"&&!!a)),d=`
27
17
  You are an expert code completion assistant.
28
18
 
29
19
  **Context:**
30
- File: ${t||"Untitled"}
31
- Language: ${n||"Undetermined"}
20
+ File: ${o||"Untitled"}
21
+ Language: ${r||"Undetermined"}
32
22
  Mode: ${l}
33
23
  Stack: ${p||"None"}`,c=`
34
24
  **Related Files:**
35
- ${_e(r)}
25
+ ${J(n)}
36
26
 
37
27
  **Source:**
38
28
  \`\`\`
39
29
  ${i}<cursor>${s}
40
30
  \`\`\`
41
31
 
42
- ${ae(l)} the code at <cursor>.
32
+ ${K(l)} the code at <cursor>.
33
+
34
+ Output only the raw code to be inserted at the cursor location without any additional text or comments.`;return {system:d,user:c}};var v=class extends core.Copilot{async complete(e){let{body:o,options:n}=e,{customPrompt:r,headers:i}=n??{},{completionMetadata:s}=o,{text:l,raw:p,error:d}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:l,raw:p,error:d}}getDefaultPrompt(e){return j(e)}};var V=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1];var H=(t,e)=>e.getLineContent(t.lineNumber).slice(0,t.column-1),E=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),B=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.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 o;return this.size===this.capacity&&(o=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,o}dequeue(){if(this.size===0)return;let e=this.buffer[this.head];return this.buffer[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.size--,e}getAll(){return this.buffer.filter(e=>e!==void 0)}clear(){this.buffer=new Array(this.capacity),this.head=0,this.tail=0,this.size=0;}getSize(){return this.size}isEmpty(){return this.size===0}isFull(){return this.size===this.capacity}};var A=class A{constructor(){this.cache=new T(A.MAX_CACHE_SIZE);}get(e,o){return this.cache.getAll().filter(n=>this.isValidCacheItem(n,e,o))}add(e){this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,o,n){let r=n.getValueInRange(e.range),i=E(o,n);return i.length<e.textBeforeCursor.length||!i.startsWith(e.textBeforeCursor)?false:this.isPositionValid(e,o,r)}isPositionValid(e,o,n){let{range:r,completion:i}=e,{startLineNumber:s,startColumn:l,endLineNumber:p,endColumn:d}=r,{lineNumber:c,column:a}=o;if(!i.startsWith(n))return false;let u=c===s&&a===l;if(s===p)return u||c===s&&a>=l&&a<=d;let g=c>s&&c<p?true:c===s&&a>=l||c===p&&a<=d;return u||g}};A.MAX_CACHE_SIZE=10;var I=A;var S=class{constructor(e,o,n){this.formattedCompletion="";this.currentColumn=0;this.textBeforeCursorInLine="";this.formattedCompletion=e,this.currentColumn=o,this.textBeforeCursorInLine=n;}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(`
35
+ `);if(e.length<=1||this.textBeforeCursorInLine.trim()!=="")return this;let o=" ".repeat(this.currentColumn-1);return this.formattedCompletion=e[0]+`
36
+ `+e.slice(1).map(n=>o+n).join(`
37
+ `),this}removeMarkdownCodeBlocks(e){let o=/```[\s\S]*?```/g,n=e,r;for(;(r=o.exec(e))!==null;){let i=r[0],s=i.split(`
38
+ `).slice(1,-1).join(`
39
+ `);n=n.replace(i,s);}return n.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
43
40
 
44
- Output only the raw code to be inserted at the cursor location without any additional text or comments.`;return {system:d,user:c}};var Re=(o,e)=>{if(!o)throw new Error("Please provide an API key.");if(!e||typeof e=="object"&&Object.keys(e).length===0)throw new Error("Please provide options.")},Me=(o,e)=>{if(typeof o=="object"){if(e!==undefined)throw new Error("Provider should not be specified when using a custom model.");if(!("config"in o)||!("transformResponse"in o))throw new Error("Please ensure both config and transformResponse are provided for custom model.");return}if(!e||!Z.includes(e))throw new Error(`Provider must be specified and supported when using built-in models. Please choose from: ${A(Z)}`);if(typeof o=="string"&&!Q[e].includes(o))throw new Error(`Model "${o}" is not supported by the "${e}" provider. Supported models: ${A(Q[e])}`)};var ee=class{constructor(e,t){Re(e,t),this.apiKey=e,this.provider=t.provider,this.model=t.model,Me(this.model,this.provider);}async complete(e){let{body:t,options:r}=e,{completionMetadata:n}=t,{headers:i={},customPrompt:s}=r??{},l=this.generatePrompt(n,s),{endpoint:p,requestBody:d,headers:c}=this.prepareRequestDetails(l,n);try{let a=await this.sendCompletionRequest(p,d,{...c,...i});return this.processCompletionResponse(a)}catch(a){return this.handleCompletionError(a)}}generatePrompt(e,t){let r=ye(e);return t?{...r,...t(e)}:r}prepareRequestDetails(e,t){if(typeof this.model=="object"&&"config"in this.model){let r=this.model.config(this.apiKey,e),n=r.endpoint,i=r.body??{},s=r.headers??{};return {endpoint:n,requestBody:i,headers:s}}else {if(!this.provider)throw new Error("Provider is required for non-custom models");let r=fe(this.model,this.apiKey,this.provider),n=Pe(this.apiKey,this.provider),i=he(this.model,this.provider,e,t);return {endpoint:r,requestBody:i,headers:n}}}async sendCompletionRequest(e,t,r){return F.post(e,t,{headers:r})}processCompletionResponse(e){if(typeof this.model=="object"&&"transformResponse"in this.model)return {completion:this.model.transformResponse(e).text??null,raw:e};if(!this.provider)throw new Error("Provider is required for non-custom models");return {completion:Ee(e,this.provider),raw:e}}handleCompletionError(e){return {error:S(e).message,completion:null}}};exports.Copilot=ee;exports.registerCompletion=we;
41
+ `),this}build(){return this.formattedCompletion}};var w=class{constructor(e){this.monaco=e;}computeInsertionRange(e,o,n){if(!o)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let r=n.getOffsetAt(e),i=n.getValue().substring(0,r),s=n.getValue().substring(r),l=0,p=0,d=0,c=0,a=o.length,u=i.length,g=s.length;if(r>=n.getValue().length)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);if(g===0)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let y=Math.min(a,u);for(let m=1;m<=y;m++){let b=o.substring(0,m),Q=i.slice(-m);b===Q&&(c=m);}let C=Math.min(a,g);for(let m=0;m<C&&o[m]===s[m];m++)l++;for(let m=1;m<=C;m++)o.slice(-m)===s.slice(0,m)&&(p=m);if(d=Math.max(l,p),d===0){for(let m=1;m<a;m++)if(s.startsWith(o.substring(m))){d=a-m;break}}let R=c>0?n.getPositionAt(r-c):e,h=r+d,f=n.getPositionAt(h);return new this.monaco.Range(R.lineNumber,R.column,f.lineNumber,f.column)}computeCacheRange(e,o){let n=e.lineNumber,r=e.column,i=o.split(`
42
+ `),s=i.length-1,l=n+s,p=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(n,r,l,p)}};var z=async t=>{let{endpoint:e,body:o}=t,{completion:n,error:r}=await core.HTTP.post(e,o,{headers:{"Content-Type":"application/json"},fallbackError:"Error while fetching completion item"});if(r)throw new Error(r);return {completion:n}},$=({pos:t,mdl:e,options:o})=>{let{filename:n,language:r,technologies:i,relatedFiles:s,maxContextLines:l}=o,p=oe(t,e),c=!!s?.length?3:2,a=l?Math.floor(l/c):void 0,u=(h,f,m)=>{let b=h(t,e);return f?O(b,f,m):b},g=(h,f)=>!h||!f?h:h.map(({content:m,...b})=>({...b,content:O(m,f)})),y=u(E,a,{from:"end"}),C=u(B,a),R=g(s,a);return {filename:n,language:r,technologies:i,relatedFiles:R,textBeforeCursor:y,textAfterCursor:C,cursorPosition:t,editorState:{completionMode:p}}},oe=(t,e)=>{let o=V(t,e),n=B(t,e);return o?"insert":n.trim()?"complete":"continue"};var F=(t,e=600,o=200)=>{let n=null,r=0,i=null,s=null,l=false,p=(...d)=>{if(l)return Promise.resolve(void 0);i=d;let c=Date.now(),a=c-r;r=c,n&&(clearTimeout(n),n=null);let u=a<o?e:o;return s=new Promise((g,y)=>{n=setTimeout(async()=>{l=true;try{if(i){let C=await t(...i);g(C);}else g(void 0);}catch(C){y(C);}finally{l=false,n=null,i=null;}},u);}),s};return p.cancel=()=>{n&&(clearTimeout(n),n=null),i=null;},p};var x=t=>({items:t,enableForwardStability:true,suppressSuggestions:true});var ie=t=>({onTyping:F(t,600,200),onIdle:F(t,600,400),onDemand:F(t,0,0)}),L=new I,_=async({monaco:t,mdl:e,pos:o,token:n,isCompletionAccepted:r,options:i})=>{let{trigger:s="onIdle",endpoint:l,enableCaching:p=true,onError:d,requestHandler:c}=i;if(p){let a=L.get(o,e).map(u=>({insertText:u.completion,range:u.range}));if(a.length>0)return x(a)}if(n.isCancellationRequested||r)return x([]);try{let u=ie(c??z)[s];n.onCancellationRequested(()=>{u.cancel();});let g=$({pos:o,mdl:e,options:i}),{completion:y}=await u({endpoint:l,body:{completionMetadata:g}});if(y){let C=new S(y,o.column,H(o,e)).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().indentByColumn().build(),R=new w(t),h=R.computeInsertionRange(o,C,e),f=R.computeCacheRange(o,C);return p&&L.add({completion:C,range:f,textBeforeCursor:E(o,e)}),x([{insertText:C,range:h}])}}catch(a){if(se(a))return x([]);d?d(a):core.logger.warn("Cannot provide completion",a);}return x([])},se=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":false;var N=new WeakMap,M=t=>N.get(t),W=(t,e)=>{N.set(t,e);},k=t=>{N.delete(t);},U=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var G=(t,e,o)=>{let n=M(e);return n?t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(r,i,s,l)=>{if(!(o.trigger==="onDemand"&&!n.isExplicitlyTriggered))return _({monaco:t,mdl:r,pos:i,token:l,isCompletionAccepted:n.isCompletionAccepted,options:o})},handleItemDidShow:(r,i,s)=>{n.isExplicitlyTriggered=false,n.hasRejectedCurrentCompletion=false,!n.isCompletionAccepted&&(n.isCompletionVisible=true,o.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null},X=t=>{let e=M(t);if(!e){core.logger.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{});};var ae={TAB:(t,e)=>e.keyCode===t.KeyCode.Tab,CMD_RIGHT_ARROW:(t,e)=>e.keyCode===t.KeyCode.RightArrow&&e.metaKey},D=class{constructor(e,o,n){this.monaco=e;this.state=o;this.options=n;}handleKeyEvent(e){let o={monaco:this.monaco,event:e,state:this.state,options:this.options};this.handleCompletionAcceptance(o),this.handleCompletionRejection(o);}handleCompletionAcceptance(e){return e.state.isCompletionVisible&&this.isAcceptanceKey(e.event)?(e.options.onCompletionAccepted?.(),e.state.isCompletionAccepted=true,e.state.isCompletionVisible=false,true):(e.state.isCompletionAccepted=false,false)}handleCompletionRejection(e){return this.shouldRejectCompletion(e)?(e.options.onCompletionRejected?.(),e.state.hasRejectedCurrentCompletion=true,true):false}shouldRejectCompletion(e){return e.state.isCompletionVisible&&!e.state.hasRejectedCurrentCompletion&&!e.state.isCompletionAccepted&&!this.isAcceptanceKey(e.event)}isAcceptanceKey(e){return Object.values(ae).some(o=>o(this.monaco,e))}},Y=(t,e,o,n)=>{let r=new D(t,o,n);return e.onKeyDown(i=>r.handleKeyEvent(i))};var P=null,me=(t,e,o)=>{P&&P.deregister();let n=[];W(e,U()),e.updateOptions({inlineSuggest:{enabled:true,mode:"subwordSmart"}});try{let r=M(e);if(!r)return core.logger.warn("Completion is not registered properly. State not found."),pe();let i=G(t,e,o);i&&n.push(i);let s=Y(t,e,r,o);n.push(s);let l={deregister:()=>{n.forEach(p=>p.dispose()),L.clear(),k(e),P=null;},trigger:()=>X(e)};return P=l,l}catch(r){return o.onError?o.onError(r):core.logger.report(r),{deregister:()=>{n.forEach(i=>i.dispose()),k(e),P=null;},trigger:()=>{}}}},pe=()=>({deregister:()=>{},trigger:()=>{}});var lt=v;exports.CompletionCopilot=v;exports.Copilot=lt;exports.registerCompletion=me;
package/build/index.mjs CHANGED
@@ -1,44 +1,42 @@
1
- var xe="\x1B[91m",be="\x1B[93m",te="\x1B[0m",oe="\x1B[1m",re=o=>o instanceof Error?o.message:typeof o=="string"?o:"An unknown error occurred",S=o=>{let e=re(o),t=`${xe}${oe}[MONACOPILOT ERROR] ${e}${te}`;return console.error(t),{message:e}},v=(o,e)=>{console.warn(`${be}${oe}[MONACOPILOT WARN] ${o}${e?`
2
- ${re(e)}`:""}${te}`);};var ne=(o,e)=>e.getLineContent(o.lineNumber)[o.column-1];var ie=(o,e)=>e.getLineContent(o.lineNumber).slice(0,o.column-1),O=(o,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:o.lineNumber,endColumn:o.column}),W=(o,e)=>e.getValueInRange({startLineNumber:o.lineNumber,startColumn:o.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var w=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]=undefined,this.head=(this.head+1)%this.capacity,this.size--,e}getAll(){return this.buffer.filter(e=>e!==undefined)}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 _=class _{constructor(){this.cache=new w(_.MAX_CACHE_SIZE);}get(e,t){return this.cache.getAll().filter(r=>this.isValidCacheItem(r,e,t))}add(e){this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,t,r){let n=r.getValueInRange(e.range),i=O(t,r);return i.length<e.textBeforeCursor.length||!i.startsWith(e.textBeforeCursor)?false:this.isPositionValid(e,t,n)}isPositionValid(e,t,r){let{range:n,completion:i}=e,{startLineNumber:s,startColumn:l,endLineNumber:p,endColumn:d}=n,{lineNumber:c,column:a}=t;if(!i.startsWith(r))return false;let u=c===s&&a===l;if(s===p)return u||c===s&&a>=l&&a<=d;let f=c>s&&c<p?true:c===s&&a>=l||c===p&&a<=d;return u||f}};_.MAX_CACHE_SIZE=10;var L=_;var N=class{constructor(e,t,r){this.formattedCompletion="";this.currentColumn=0;this.textBeforeCursorInLine="";this.formattedCompletion=e,this.currentColumn=t,this.textBeforeCursorInLine=r;}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(`
3
- `);if(e.length<=1||this.textBeforeCursorInLine.trim()!=="")return this;let t=" ".repeat(this.currentColumn-1);return this.formattedCompletion=e[0]+`
4
- `+e.slice(1).map(r=>t+r).join(`
5
- `),this}removeMarkdownCodeBlocks(e){let t=/```[\s\S]*?```/g,r=e,n;for(;(n=t.exec(e))!==null;){let i=n[0],s=i.split(`
6
- `).slice(1,-1).join(`
7
- `);r=r.replace(i,s);}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
8
-
9
- `),this}build(){return this.formattedCompletion}};var B=class{constructor(e){this.monaco=e;}computeInsertionRange(e,t,r){if(!t)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let n=r.getOffsetAt(e),i=r.getValue().substring(0,n),s=r.getValue().substring(n),l=0,p=0,d=0,c=0,a=t.length,u=i.length,f=s.length;if(n>=r.getValue().length)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);if(f===0)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let T=Math.min(a,u);for(let m=1;m<=T;m++){let b=t.substring(0,m),Te=i.slice(-m);b===Te&&(c=m);}let C=Math.min(a,f);for(let m=0;m<C&&t[m]===s[m];m++)l++;for(let m=1;m<=C;m++)t.slice(-m)===s.slice(0,m)&&(p=m);if(d=Math.max(l,p),d===0){for(let m=1;m<a;m++)if(s.startsWith(t.substring(m))){d=a-m;break}}let x=c>0?r.getPositionAt(n-c):e,y=n+d,h=r.getPositionAt(y);return new this.monaco.Range(x.lineNumber,x.column,h.lineNumber,h.column)}computeCacheRange(e,t){let r=e.lineNumber,n=e.column,i=t.split(`
10
- `),s=i.length-1,l=r+s,p=s===0?n+i[0].length:i[s].length+1;return new this.monaco.Range(r,n,l,p)}};var se="application/json";var ve=async(o,e,t={})=>{let r=t.timeout??3e4,n=AbortSignal.timeout(r),i=t.signal?AbortSignal.any([n,t.signal]):n,s={"Content-Type":"application/json",...t.headers},l=t.body?JSON.stringify(t.body):undefined,p=await fetch(o,{method:e,headers:s,body:l,signal:i});if(!p.ok){let d=await p.json().catch(()=>null),c=d?`
11
- ${JSON.stringify(d,null,2)}`:"",a=t.fallbackError||"Network request failed";throw new Error(`${a} (${p.status})${c}`)}return p.json()},Oe=(o,e,t)=>ve(o,"POST",{...t,body:e}),F={post:Oe};var A=o=>!o||o.length===0?"":o.length===1?o[0]:`${o.slice(0,-1).join(", ")} and ${o.slice(-1)}`,ae=o=>o.charAt(0).toUpperCase()+o.slice(1),X=(o,e,t={})=>{if(e<=0)return "";let r=o.split(`
12
- `),n=r.length;if(e>=n)return o;if(t.from==="end"){let s=r.slice(-e);return s.every(l=>l==="")?`
1
+ import {Copilot,logger,HTTP}from'@monacopilot/core';var q=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`,K=t=>t.charAt(0).toUpperCase()+t.slice(1),O=(t,e,o={})=>{if(e<=0)return "";let n=t.split(`
2
+ `),r=n.length;if(e>=r)return t;if(o.from==="end"){let s=n.slice(-e);return s.every(l=>l==="")?`
13
3
  `.repeat(e):s.join(`
14
- `)}let i=r.slice(0,e);return i.every(s=>s==="")?`
4
+ `)}let i=n.slice(0,e);return i.every(s=>s==="")?`
15
5
  `.repeat(e):i.join(`
16
- `)};var le=async o=>{let{endpoint:e,body:t}=o,{completion:r,error:n}=await F.post(e,t,{headers:{"Content-Type":se},fallbackError:"Error while fetching completion item"});if(n)throw new Error(n);return {completion:r}},pe=({pos:o,mdl:e,options:t})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:l}=t,p=Ie(o,e),c=!!s?.length?3:2,a=l?Math.floor(l/c):undefined,u=(y,h,m)=>{let b=y(o,e);return h?X(b,h,m):b},f=(y,h)=>!y||!h?y:y.map(({content:m,...b})=>({...b,content:X(m,h)})),T=u(O,a,{from:"end"}),C=u(W,a),x=f(s,a);return {filename:r,language:n,technologies:i,relatedFiles:x,textBeforeCursor:T,textAfterCursor:C,cursorPosition:o,editorState:{completionMode:p}}},Ie=(o,e)=>{let t=ne(o,e),r=W(o,e);return t?"insert":r.trim()?"complete":"continue"};var I=o=>({items:o,enableForwardStability:true,suppressSuggestions:true});var q=(o,e=600,t=200)=>{let r=null,n=0,i=null,s=null,l=false,p=(...d)=>{if(l)return Promise.resolve(undefined);i=d;let c=Date.now(),a=c-n;n=c,r&&(clearTimeout(r),r=null);let u=a<t?e:t;return s=new Promise((f,T)=>{r=setTimeout(async()=>{l=true;try{if(i){let C=await o(...i);f(C);}else f(void 0);}catch(C){T(C);}finally{l=false,r=null,i=null;}},u);}),s};return p.cancel=()=>{r&&(clearTimeout(r),r=null),i=null;},p};var ke=o=>({onTyping:q(o,600,200),onIdle:q(o,600,400),onDemand:q(o,0,0)}),$=new L,me=async({monaco:o,mdl:e,pos:t,token:r,isCompletionAccepted:n,options:i})=>{let{trigger:s="onIdle",endpoint:l,enableCaching:p=true,onError:d,requestHandler:c}=i;if(p){let a=$.get(t,e).map(u=>({insertText:u.completion,range:u.range}));if(a.length>0)return I(a)}if(r.isCancellationRequested||n)return I([]);try{let u=ke(c??le)[s];r.onCancellationRequested(()=>{u.cancel();});let f=pe({pos:t,mdl:e,options:i}),{completion:T}=await u({endpoint:l,body:{completionMetadata:f}});if(T){let C=new N(T,t.column,ie(t,e)).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().indentByColumn().build(),x=new B(o),y=x.computeInsertionRange(t,C,e),h=x.computeCacheRange(t,C);return p&&$.add({completion:C,range:h,textBeforeCursor:O(t,e)}),I([{insertText:C,range:y}])}}catch(a){if(De(a))return I([]);d?d(a):v("Cannot provide completion",a);}return I([])},De=o=>typeof o=="string"?o==="Cancelled"||o==="AbortError":o instanceof Error?o.message==="Cancelled"||o.name==="AbortError":false;var G=new WeakMap,k=o=>G.get(o),ce=(o,e)=>{G.set(o,e);},Y=o=>{G.delete(o);},de=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var ue=(o,e,t)=>{let r=k(e);return r?o.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(n,i,s,l)=>{if(!(t.trigger==="onDemand"&&!r.isExplicitlyTriggered))return me({monaco:o,mdl:n,pos:i,token:l,isCompletionAccepted:r.isCompletionAccepted,options:t})},handleItemDidShow:(n,i,s)=>{r.isExplicitlyTriggered=false,r.hasRejectedCurrentCompletion=false,!r.isCompletionAccepted&&(r.isCompletionVisible=true,t.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null},Ce=o=>{let e=k(o);if(!e){v("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,o.trigger("keyboard","editor.action.inlineSuggest.trigger",{});};var Se={TAB:(o,e)=>e.keyCode===o.KeyCode.Tab,CMD_RIGHT_ARROW:(o,e)=>e.keyCode===o.KeyCode.RightArrow&&e.metaKey},J=class{constructor(e,t,r){this.monaco=e;this.state=t;this.options=r;}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(Se).some(t=>t(this.monaco,e))}},ge=(o,e,t,r)=>{let n=new J(o,t,r);return e.onKeyDown(i=>n.handleKeyEvent(i))};var D=null,we=(o,e,t)=>{D&&D.deregister();let r=[];ce(e,de()),e.updateOptions({inlineSuggest:{enabled:true,mode:"subwordSmart"}});try{let n=k(e);if(!n)return v("Completion is not registered properly. State not found."),Le();let i=ue(o,e,t);i&&r.push(i);let s=ge(o,e,n,t);r.push(s);let l={deregister:()=>{r.forEach(p=>p.dispose()),$.clear(),Y(e),D=null;},trigger:()=>Ce(e)};return D=l,l}catch(n){return t.onError?t.onError(n):S(n),{deregister:()=>{r.forEach(i=>i.dispose()),Y(e),D=null;},trigger:()=>{}}}},Le=()=>({deregister:()=>{},trigger:()=>{}});var Z=["groq","openai","anthropic","google","deepseek"],P={"llama-3-70b":"llama3-70b-8192","gpt-4o":"gpt-4o-2024-08-06","gpt-4o-mini":"gpt-4o-mini","claude-3-5-sonnet":"claude-3-5-sonnet-20241022","claude-3-haiku":"claude-3-haiku-20240307","claude-3-5-haiku":"claude-3-5-haiku-20241022","o1-mini":"o1-mini","gemini-1.5-flash-8b":"gemini-1.5-flash-8b","gemini-1.5-flash":"gemini-1.5-flash","gemini-1.5-pro":"gemini-1.5-pro",v3:"deepseek-chat"},Q={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-mini"],anthropic:["claude-3-5-sonnet","claude-3-haiku","claude-3-5-haiku"],google:["gemini-1.5-flash-8b","gemini-1.5-pro","gemini-1.5-flash"],deepseek:["v3"]},E={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages",google:"https://generativelanguage.googleapis.com/v1beta/models",deepseek:"https://api.deepseek.com/beta/completions"};var g=class{};var j=class extends g{createEndpoint(){return E.anthropic}createRequestBody(e,t){return {model:P[e],temperature:.1,system:t.system,messages:[{role:"user",content:t.user}],max_tokens:500}}createHeaders(e){return {"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"}}parseCompletion(e){let t=e.content?.[0];return t&&"text"in t?t.text:null}};var H=class extends g{createEndpoint(){return E.deepseek}createRequestBody(e,t,r){return {model:P[e],prompt:r.textBeforeCursor,suffix:r.textAfterCursor,temperature:.1,max_tokens:500}}createHeaders(e){return {"Content-Type":"application/json",Authorization:`Bearer ${e}`}}parseCompletion(e){return typeof e.choices?.[0]?.text=="string"?e.choices[0].text:null}};var K=class extends g{createEndpoint(e,t){return `${E.google}/${P[e]}:generateContent?key=${t}`}createRequestBody(e,t){return {systemInstruction:{role:"system",parts:[{text:t.system}]},generationConfig:{temperature:.1,maxOutputTokens:500},contents:[{role:"user",parts:[{text:t.user}]}]}}createHeaders(){return {"Content-Type":"application/json"}}parseCompletion(e){return e.candidates?.[0]?.content?.parts?.[0]?.text??null}};var V=class extends g{createEndpoint(){return E.groq}createRequestBody(e,t){return {model:P[e],temperature:.1,max_tokens:500,messages:[{role:"system",content:t.system},{role:"user",content:t.user}]}}createHeaders(e){return {"Content-Type":"application/json",Authorization:`Bearer ${e}`}}parseCompletion(e){return e.choices?.[0]?.message.content??null}};var U=class extends g{createEndpoint(){return E.openai}createRequestBody(e,t){let r=e==="o1-mini";return {model:P[e],...!r&&{temperature:.1},max_completion_tokens:500,messages:[{role:"system",content:t.system},{role:"user",content:t.user}]}}createHeaders(e){return {"Content-Type":"application/json",Authorization:`Bearer ${e}`}}parseCompletion(e){return e.choices?.[0]?.message.content??null}};var z={openai:new U,groq:new V,anthropic:new j,google:new K,deepseek:new H},fe=(o,e,t)=>z[t].createEndpoint(o,e),he=(o,e,t,r)=>z[e].createRequestBody(o,t,r),Pe=(o,e)=>z[e].createHeaders(o),Ee=(o,e)=>z[e].parseCompletion(o);var _e=o=>!o||o.length===0?"":o.map(({path:e,content:t})=>`
6
+ `)};var J=t=>!t||t.length===0?"":t.map(({path:e,content:o})=>`
17
7
  <related_file>
18
8
  <filePath>${e}</filePath>
19
9
  <fileContent>
20
10
  \`\`\`
21
- ${t}
11
+ ${o}
22
12
  \`\`\`
23
13
  </fileContent>
24
14
  </related_file>`.trim()).join(`
25
15
 
26
- `),ye=o=>{let{technologies:e=[],filename:t,relatedFiles:r,language:n,textBeforeCursor:i="",textAfterCursor:s="",editorState:{completionMode:l}}=o,p=A([n,...e].filter(a=>typeof a=="string"&&!!a)),d=`
16
+ `),j=t=>{let{technologies:e=[],filename:o,relatedFiles:n,language:r,textBeforeCursor:i="",textAfterCursor:s="",editorState:{completionMode:l}}=t,p=q([r,...e].filter(a=>typeof a=="string"&&!!a)),d=`
27
17
  You are an expert code completion assistant.
28
18
 
29
19
  **Context:**
30
- File: ${t||"Untitled"}
31
- Language: ${n||"Undetermined"}
20
+ File: ${o||"Untitled"}
21
+ Language: ${r||"Undetermined"}
32
22
  Mode: ${l}
33
23
  Stack: ${p||"None"}`,c=`
34
24
  **Related Files:**
35
- ${_e(r)}
25
+ ${J(n)}
36
26
 
37
27
  **Source:**
38
28
  \`\`\`
39
29
  ${i}<cursor>${s}
40
30
  \`\`\`
41
31
 
42
- ${ae(l)} the code at <cursor>.
32
+ ${K(l)} the code at <cursor>.
33
+
34
+ Output only the raw code to be inserted at the cursor location without any additional text or comments.`;return {system:d,user:c}};var v=class extends Copilot{async complete(e){let{body:o,options:n}=e,{customPrompt:r,headers:i}=n??{},{completionMetadata:s}=o,{text:l,raw:p,error:d}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:l,raw:p,error:d}}getDefaultPrompt(e){return j(e)}};var V=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1];var H=(t,e)=>e.getLineContent(t.lineNumber).slice(0,t.column-1),E=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),B=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.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 o;return this.size===this.capacity&&(o=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,o}dequeue(){if(this.size===0)return;let e=this.buffer[this.head];return this.buffer[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.size--,e}getAll(){return this.buffer.filter(e=>e!==void 0)}clear(){this.buffer=new Array(this.capacity),this.head=0,this.tail=0,this.size=0;}getSize(){return this.size}isEmpty(){return this.size===0}isFull(){return this.size===this.capacity}};var A=class A{constructor(){this.cache=new T(A.MAX_CACHE_SIZE);}get(e,o){return this.cache.getAll().filter(n=>this.isValidCacheItem(n,e,o))}add(e){this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,o,n){let r=n.getValueInRange(e.range),i=E(o,n);return i.length<e.textBeforeCursor.length||!i.startsWith(e.textBeforeCursor)?false:this.isPositionValid(e,o,r)}isPositionValid(e,o,n){let{range:r,completion:i}=e,{startLineNumber:s,startColumn:l,endLineNumber:p,endColumn:d}=r,{lineNumber:c,column:a}=o;if(!i.startsWith(n))return false;let u=c===s&&a===l;if(s===p)return u||c===s&&a>=l&&a<=d;let g=c>s&&c<p?true:c===s&&a>=l||c===p&&a<=d;return u||g}};A.MAX_CACHE_SIZE=10;var I=A;var S=class{constructor(e,o,n){this.formattedCompletion="";this.currentColumn=0;this.textBeforeCursorInLine="";this.formattedCompletion=e,this.currentColumn=o,this.textBeforeCursorInLine=n;}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(`
35
+ `);if(e.length<=1||this.textBeforeCursorInLine.trim()!=="")return this;let o=" ".repeat(this.currentColumn-1);return this.formattedCompletion=e[0]+`
36
+ `+e.slice(1).map(n=>o+n).join(`
37
+ `),this}removeMarkdownCodeBlocks(e){let o=/```[\s\S]*?```/g,n=e,r;for(;(r=o.exec(e))!==null;){let i=r[0],s=i.split(`
38
+ `).slice(1,-1).join(`
39
+ `);n=n.replace(i,s);}return n.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
43
40
 
44
- Output only the raw code to be inserted at the cursor location without any additional text or comments.`;return {system:d,user:c}};var Re=(o,e)=>{if(!o)throw new Error("Please provide an API key.");if(!e||typeof e=="object"&&Object.keys(e).length===0)throw new Error("Please provide options.")},Me=(o,e)=>{if(typeof o=="object"){if(e!==undefined)throw new Error("Provider should not be specified when using a custom model.");if(!("config"in o)||!("transformResponse"in o))throw new Error("Please ensure both config and transformResponse are provided for custom model.");return}if(!e||!Z.includes(e))throw new Error(`Provider must be specified and supported when using built-in models. Please choose from: ${A(Z)}`);if(typeof o=="string"&&!Q[e].includes(o))throw new Error(`Model "${o}" is not supported by the "${e}" provider. Supported models: ${A(Q[e])}`)};var ee=class{constructor(e,t){Re(e,t),this.apiKey=e,this.provider=t.provider,this.model=t.model,Me(this.model,this.provider);}async complete(e){let{body:t,options:r}=e,{completionMetadata:n}=t,{headers:i={},customPrompt:s}=r??{},l=this.generatePrompt(n,s),{endpoint:p,requestBody:d,headers:c}=this.prepareRequestDetails(l,n);try{let a=await this.sendCompletionRequest(p,d,{...c,...i});return this.processCompletionResponse(a)}catch(a){return this.handleCompletionError(a)}}generatePrompt(e,t){let r=ye(e);return t?{...r,...t(e)}:r}prepareRequestDetails(e,t){if(typeof this.model=="object"&&"config"in this.model){let r=this.model.config(this.apiKey,e),n=r.endpoint,i=r.body??{},s=r.headers??{};return {endpoint:n,requestBody:i,headers:s}}else {if(!this.provider)throw new Error("Provider is required for non-custom models");let r=fe(this.model,this.apiKey,this.provider),n=Pe(this.apiKey,this.provider),i=he(this.model,this.provider,e,t);return {endpoint:r,requestBody:i,headers:n}}}async sendCompletionRequest(e,t,r){return F.post(e,t,{headers:r})}processCompletionResponse(e){if(typeof this.model=="object"&&"transformResponse"in this.model)return {completion:this.model.transformResponse(e).text??null,raw:e};if(!this.provider)throw new Error("Provider is required for non-custom models");return {completion:Ee(e,this.provider),raw:e}}handleCompletionError(e){return {error:S(e).message,completion:null}}};export{ee as Copilot,we as registerCompletion};
41
+ `),this}build(){return this.formattedCompletion}};var w=class{constructor(e){this.monaco=e;}computeInsertionRange(e,o,n){if(!o)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let r=n.getOffsetAt(e),i=n.getValue().substring(0,r),s=n.getValue().substring(r),l=0,p=0,d=0,c=0,a=o.length,u=i.length,g=s.length;if(r>=n.getValue().length)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);if(g===0)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let y=Math.min(a,u);for(let m=1;m<=y;m++){let b=o.substring(0,m),Q=i.slice(-m);b===Q&&(c=m);}let C=Math.min(a,g);for(let m=0;m<C&&o[m]===s[m];m++)l++;for(let m=1;m<=C;m++)o.slice(-m)===s.slice(0,m)&&(p=m);if(d=Math.max(l,p),d===0){for(let m=1;m<a;m++)if(s.startsWith(o.substring(m))){d=a-m;break}}let R=c>0?n.getPositionAt(r-c):e,h=r+d,f=n.getPositionAt(h);return new this.monaco.Range(R.lineNumber,R.column,f.lineNumber,f.column)}computeCacheRange(e,o){let n=e.lineNumber,r=e.column,i=o.split(`
42
+ `),s=i.length-1,l=n+s,p=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(n,r,l,p)}};var z=async t=>{let{endpoint:e,body:o}=t,{completion:n,error:r}=await HTTP.post(e,o,{headers:{"Content-Type":"application/json"},fallbackError:"Error while fetching completion item"});if(r)throw new Error(r);return {completion:n}},$=({pos:t,mdl:e,options:o})=>{let{filename:n,language:r,technologies:i,relatedFiles:s,maxContextLines:l}=o,p=oe(t,e),c=!!s?.length?3:2,a=l?Math.floor(l/c):void 0,u=(h,f,m)=>{let b=h(t,e);return f?O(b,f,m):b},g=(h,f)=>!h||!f?h:h.map(({content:m,...b})=>({...b,content:O(m,f)})),y=u(E,a,{from:"end"}),C=u(B,a),R=g(s,a);return {filename:n,language:r,technologies:i,relatedFiles:R,textBeforeCursor:y,textAfterCursor:C,cursorPosition:t,editorState:{completionMode:p}}},oe=(t,e)=>{let o=V(t,e),n=B(t,e);return o?"insert":n.trim()?"complete":"continue"};var F=(t,e=600,o=200)=>{let n=null,r=0,i=null,s=null,l=false,p=(...d)=>{if(l)return Promise.resolve(void 0);i=d;let c=Date.now(),a=c-r;r=c,n&&(clearTimeout(n),n=null);let u=a<o?e:o;return s=new Promise((g,y)=>{n=setTimeout(async()=>{l=true;try{if(i){let C=await t(...i);g(C);}else g(void 0);}catch(C){y(C);}finally{l=false,n=null,i=null;}},u);}),s};return p.cancel=()=>{n&&(clearTimeout(n),n=null),i=null;},p};var x=t=>({items:t,enableForwardStability:true,suppressSuggestions:true});var ie=t=>({onTyping:F(t,600,200),onIdle:F(t,600,400),onDemand:F(t,0,0)}),L=new I,_=async({monaco:t,mdl:e,pos:o,token:n,isCompletionAccepted:r,options:i})=>{let{trigger:s="onIdle",endpoint:l,enableCaching:p=true,onError:d,requestHandler:c}=i;if(p){let a=L.get(o,e).map(u=>({insertText:u.completion,range:u.range}));if(a.length>0)return x(a)}if(n.isCancellationRequested||r)return x([]);try{let u=ie(c??z)[s];n.onCancellationRequested(()=>{u.cancel();});let g=$({pos:o,mdl:e,options:i}),{completion:y}=await u({endpoint:l,body:{completionMetadata:g}});if(y){let C=new S(y,o.column,H(o,e)).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().indentByColumn().build(),R=new w(t),h=R.computeInsertionRange(o,C,e),f=R.computeCacheRange(o,C);return p&&L.add({completion:C,range:f,textBeforeCursor:E(o,e)}),x([{insertText:C,range:h}])}}catch(a){if(se(a))return x([]);d?d(a):logger.warn("Cannot provide completion",a);}return x([])},se=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":false;var N=new WeakMap,M=t=>N.get(t),W=(t,e)=>{N.set(t,e);},k=t=>{N.delete(t);},U=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var G=(t,e,o)=>{let n=M(e);return n?t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(r,i,s,l)=>{if(!(o.trigger==="onDemand"&&!n.isExplicitlyTriggered))return _({monaco:t,mdl:r,pos:i,token:l,isCompletionAccepted:n.isCompletionAccepted,options:o})},handleItemDidShow:(r,i,s)=>{n.isExplicitlyTriggered=false,n.hasRejectedCurrentCompletion=false,!n.isCompletionAccepted&&(n.isCompletionVisible=true,o.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null},X=t=>{let e=M(t);if(!e){logger.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{});};var ae={TAB:(t,e)=>e.keyCode===t.KeyCode.Tab,CMD_RIGHT_ARROW:(t,e)=>e.keyCode===t.KeyCode.RightArrow&&e.metaKey},D=class{constructor(e,o,n){this.monaco=e;this.state=o;this.options=n;}handleKeyEvent(e){let o={monaco:this.monaco,event:e,state:this.state,options:this.options};this.handleCompletionAcceptance(o),this.handleCompletionRejection(o);}handleCompletionAcceptance(e){return e.state.isCompletionVisible&&this.isAcceptanceKey(e.event)?(e.options.onCompletionAccepted?.(),e.state.isCompletionAccepted=true,e.state.isCompletionVisible=false,true):(e.state.isCompletionAccepted=false,false)}handleCompletionRejection(e){return this.shouldRejectCompletion(e)?(e.options.onCompletionRejected?.(),e.state.hasRejectedCurrentCompletion=true,true):false}shouldRejectCompletion(e){return e.state.isCompletionVisible&&!e.state.hasRejectedCurrentCompletion&&!e.state.isCompletionAccepted&&!this.isAcceptanceKey(e.event)}isAcceptanceKey(e){return Object.values(ae).some(o=>o(this.monaco,e))}},Y=(t,e,o,n)=>{let r=new D(t,o,n);return e.onKeyDown(i=>r.handleKeyEvent(i))};var P=null,me=(t,e,o)=>{P&&P.deregister();let n=[];W(e,U()),e.updateOptions({inlineSuggest:{enabled:true,mode:"subwordSmart"}});try{let r=M(e);if(!r)return logger.warn("Completion is not registered properly. State not found."),pe();let i=G(t,e,o);i&&n.push(i);let s=Y(t,e,r,o);n.push(s);let l={deregister:()=>{n.forEach(p=>p.dispose()),L.clear(),k(e),P=null;},trigger:()=>X(e)};return P=l,l}catch(r){return o.onError?o.onError(r):logger.report(r),{deregister:()=>{n.forEach(i=>i.dispose()),k(e),P=null;},trigger:()=>{}}}},pe=()=>({deregister:()=>{},trigger:()=>{}});var lt=v;export{v as CompletionCopilot,lt as Copilot,me as registerCompletion};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monacopilot",
3
- "version": "0.18.18",
3
+ "version": "0.18.20",
4
4
  "description": "AI auto-completion plugin for Monaco Editor",
5
5
  "main": "./build/index.js",
6
6
  "module": "./build/index.mjs",
@@ -11,37 +11,14 @@
11
11
  "scripts": {
12
12
  "build": "tsup src/index.ts",
13
13
  "dev": "tsup src/index.ts --watch",
14
- "test": "vitest run",
15
- "dev:test-ui": "pnpm -C tests/ui dev",
16
- "dev:docs": "pnpm -C docs dev",
17
- "build:docs": "pnpm -C docs build",
18
- "tsc": "tsc --noEmit",
19
- "lint": "eslint . --ext .ts,.tsx --fix",
20
- "lint:test-ui": "pnpm -C tests/ui lint",
21
- "validate": "pnpm build && pnpm format && pnpm tsc && pnpm lint && pnpm lint:test-ui",
22
- "format": "prettier --write .",
23
- "release": "release-it",
24
- "prepare": "husky"
14
+ "release": "release-it"
25
15
  },
26
16
  "devDependencies": {
27
- "@anthropic-ai/sdk": "^0.27.3",
28
- "@commitlint/cli": "^19.5.0",
29
- "@commitlint/config-conventional": "^19.5.0",
30
- "@google/generative-ai": "^0.21.0",
31
- "@ianvs/prettier-plugin-sort-imports": "^4.2.1",
32
- "@release-it/conventional-changelog": "^8.0.2",
33
- "@typescript-eslint/eslint-plugin": "^7.3.1",
34
- "eslint": "^8.57.0",
35
- "groq-sdk": "^0.3.2",
36
- "husky": "^9.1.6",
17
+ "@release-it/bumper": "^7.0.1",
37
18
  "monaco-editor": "^0.52.0",
38
- "openai": "^4.60.1",
39
- "prettier": "^3.2.5",
40
19
  "release-it": "^17.6.0",
41
20
  "tsup": "^8.0.2",
42
- "typescript": "^5.4.3",
43
- "vite-tsconfig-paths": "^5.1.4",
44
- "vitest": "^2.0.5"
21
+ "typescript": "^5.4.3"
45
22
  },
46
23
  "keywords": [
47
24
  "monaco-editor",
@@ -65,5 +42,21 @@
65
42
  }
66
43
  ],
67
44
  "license": "MIT",
68
- "author": "Arshad Yaseen <m@arshadyaseen.com> (https://arshadyaseen.com)"
45
+ "author": "Arshad Yaseen <m@arshadyaseen.com> (https://arshadyaseen.com)",
46
+ "release-it": {
47
+ "git": false,
48
+ "plugins": {
49
+ "@release-it/bumper": {
50
+ "out": {
51
+ "file": "package.json",
52
+ "path": [
53
+ "dependencies.@monacopilot/core"
54
+ ]
55
+ }
56
+ }
57
+ }
58
+ },
59
+ "dependencies": {
60
+ "@monacopilot/core": "0.18.20"
61
+ }
69
62
  }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2024 Arshad Yaseen
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
package/README.md DELETED
@@ -1,26 +0,0 @@
1
- ![Monacopilot Banner](https://i.postimg.cc/GhpGVjVG/monacopilot-banner.png)
2
-
3
- ### Features
4
-
5
- - 🎯 Multiple AI Provider Support (Anthropic, OpenAI, Groq, Google, DeepSeek)
6
- - 🔄 Real-time Code Completions
7
- - ⚡️ Efficient Caching System
8
- - 🎨 Context-Aware Suggestions
9
- - 🛠️ Customizable Completion Behavior
10
- - 📦 Framework Agnostic
11
- - 🔌 Custom Model Support
12
- - 🎮 Manual Trigger Support
13
-
14
- ### See it in action
15
-
16
- [Inline Completions Demo Video](https://github.com/user-attachments/assets/f2ec4ae1-f658-4002-af9c-c6b1bbad70d9)
17
-
18
- ## Documentation
19
-
20
- Go to the [documentation](https://copilot.arshadyaseen.com) to get started with Monacopilot.
21
-
22
- ## Contributing
23
-
24
- For guidelines on contributing, please read the [contributing guide](https://github.com/arshad-yaseen/monacopilot/blob/main/CONTRIBUTING.md).
25
-
26
- We welcome contributions from the community to enhance Monacopilot's capabilities and make it even more powerful. ❤️