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 +11 -124
- package/build/index.d.ts +11 -124
- package/build/index.js +19 -21
- package/build/index.mjs +19 -21
- package/package.json +21 -28
- package/LICENSE +0 -21
- package/README.md +0 -26
package/build/index.d.mts
CHANGED
|
@@ -1,114 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
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
|
-
|
|
347
|
-
|
|
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 {
|
|
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 {
|
|
2
|
-
|
|
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
|
-
|
|
347
|
-
|
|
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 {
|
|
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
|
|
2
|
-
|
|
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=
|
|
4
|
+
`)}let i=n.slice(0,e);return i.every(s=>s==="")?`
|
|
15
5
|
`.repeat(e):i.join(`
|
|
16
|
-
`)};var
|
|
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
|
-
${
|
|
11
|
+
${o}
|
|
22
12
|
\`\`\`
|
|
23
13
|
</fileContent>
|
|
24
14
|
</related_file>`.trim()).join(`
|
|
25
15
|
|
|
26
|
-
`),
|
|
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: ${
|
|
31
|
-
Language: ${
|
|
20
|
+
File: ${o||"Untitled"}
|
|
21
|
+
Language: ${r||"Undetermined"}
|
|
32
22
|
Mode: ${l}
|
|
33
23
|
Stack: ${p||"None"}`,c=`
|
|
34
24
|
**Related Files:**
|
|
35
|
-
${
|
|
25
|
+
${J(n)}
|
|
36
26
|
|
|
37
27
|
**Source:**
|
|
38
28
|
\`\`\`
|
|
39
29
|
${i}<cursor>${s}
|
|
40
30
|
\`\`\`
|
|
41
31
|
|
|
42
|
-
${
|
|
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
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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=
|
|
4
|
+
`)}let i=n.slice(0,e);return i.every(s=>s==="")?`
|
|
15
5
|
`.repeat(e):i.join(`
|
|
16
|
-
`)};var
|
|
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
|
-
${
|
|
11
|
+
${o}
|
|
22
12
|
\`\`\`
|
|
23
13
|
</fileContent>
|
|
24
14
|
</related_file>`.trim()).join(`
|
|
25
15
|
|
|
26
|
-
`),
|
|
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: ${
|
|
31
|
-
Language: ${
|
|
20
|
+
File: ${o||"Untitled"}
|
|
21
|
+
Language: ${r||"Undetermined"}
|
|
32
22
|
Mode: ${l}
|
|
33
23
|
Stack: ${p||"None"}`,c=`
|
|
34
24
|
**Related Files:**
|
|
35
|
-
${
|
|
25
|
+
${J(n)}
|
|
36
26
|
|
|
37
27
|
**Source:**
|
|
38
28
|
\`\`\`
|
|
39
29
|
${i}<cursor>${s}
|
|
40
30
|
\`\`\`
|
|
41
31
|
|
|
42
|
-
${
|
|
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
|
-
|
|
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.
|
|
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
|
-
"
|
|
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
|
-
"@
|
|
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
|
-

|
|
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. ❤️
|