monacopilot 0.18.1 → 0.18.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -43,6 +43,7 @@
43
43
  - [Caching Completions](#caching-completions)
44
44
  - [Handling Errors](#handling-errors)
45
45
  - [Custom Request Handler](#custom-request-handler)
46
+ - [Request Handler Example](#request-handler-example)
46
47
  - [Completion Event Handlers](#completion-event-handlers)
47
48
  - [onCompletionShown](#oncompletionshown)
48
49
  - [onCompletionAccepted](#oncompletionaccepted)
@@ -383,48 +384,100 @@ The `requestHandler` should return an object with the following property:
383
384
  | ------------ | ------------------ | ------------------------------------------------------------------------------------------------ |
384
385
  | `completion` | `string` or `null` | The completion text to be inserted into the editor. Return `null` if no completion is available. |
385
386
 
386
- #### Example
387
+ #### Request Handler Example
388
+
389
+ Here's a practical example demonstrating how to let users select different models for AI auto-completion, We use the `requestHandler` option to attach the selected model to the request body and use it in the server-side API handler.
387
390
 
388
- The example below demonstrates how to use the `requestHandler` function for more customized handling:
391
+ Client-side implementation:
389
392
 
390
393
  ```javascript
394
+ const selectedModel = 'gpt-4'; // Example of model selected by user via UI (e.g. dropdown, settings panel)
395
+
391
396
  registerCompletion(monaco, editor, {
392
397
  endpoint: 'https://api.example.com/complete',
393
- // ... other options
394
398
  requestHandler: async ({endpoint, body}) => {
395
- try {
396
- const response = await fetch(endpoint, {
397
- method: 'POST',
398
- headers: {
399
- 'Content-Type': 'application/json',
400
- 'X-Request-ID': generateUniqueId(),
401
- },
402
- body: JSON.stringify({
403
- ...body,
404
- additionalProperty: 'value',
405
- }),
406
- });
399
+ const response = await fetch(endpoint, {
400
+ method: 'POST',
401
+ headers: {
402
+ 'Content-Type': 'application/json',
403
+ },
404
+ body: JSON.stringify({
405
+ ...body,
406
+ model: selectedModel, // Attach selected model to request body
407
+ }),
408
+ });
409
+
410
+ const data = await response.json();
411
+ return {
412
+ completion: data.completion,
413
+ };
414
+ },
415
+ });
416
+ ```
417
+
418
+ Server-side implementation (Example using Express.js): This is the server-side API handler that the `endpoint` parameter points to in the `registerCompletion` function.
407
419
 
408
- if (!response.ok) {
409
- throw new Error(`HTTP error! status: ${response.status}`);
410
- }
420
+ ```javascript
421
+ import express from 'express';
422
+ import {Copilot} from 'monacopilot';
411
423
 
412
- const data = await response.json();
424
+ const app = express();
413
425
 
414
- if (data.error) {
415
- console.error('API Error:', data.error);
416
- return {completion: null};
417
- }
426
+ // Initialize different copilot instances for different models
427
+ const copilotInstances = {
428
+ 'gpt-4o': new Copilot(process.env.OPENAI_API_KEY, {
429
+ provider: 'openai',
430
+ model: 'gpt-4o',
431
+ }),
432
+ 'sonnet-3.5': new Copilot(process.env.ANTHROPIC_API_KEY, {
433
+ provider: 'anthropic',
434
+ model: 'claude-3-5-sonnet',
435
+ }),
436
+ 'llama-3': new Copilot(process.env.GROQ_API_KEY, {
437
+ provider: 'groq',
438
+ model: 'llama-3-70b',
439
+ }),
440
+ };
418
441
 
419
- return {completion: data.completion.trim()};
420
- } catch (error) {
421
- console.error('Fetch error:', error);
422
- return {completion: null};
442
+ app.post('/complete', async (req, res) => {
443
+ try {
444
+ // Get the selected model from the request body
445
+ const {model, ...completionBody} = req.body;
446
+
447
+ // Use the appropriate copilot instance based on selected model
448
+ const copilot = copilotInstances[model];
449
+ if (!copilot) {
450
+ return res.status(400).json({
451
+ completion: null,
452
+ error: 'Invalid model selected',
453
+ });
423
454
  }
424
- },
455
+
456
+ const {completion, error} = await copilot.complete({
457
+ body: completionBody,
458
+ });
459
+
460
+ if (error) {
461
+ return res.status(500).json({
462
+ completion: null,
463
+ error,
464
+ });
465
+ }
466
+
467
+ res.json({completion});
468
+ } catch (err) {
469
+ res.status(500).json({
470
+ completion: null,
471
+ error: err.message,
472
+ });
473
+ }
425
474
  });
475
+
476
+ app.listen(3000);
426
477
  ```
427
478
 
479
+ The server maintains a map of Copilot instances configured with different providers and models, allowing for flexible model selection while keeping API keys secure on the server side.
480
+
428
481
  ### Completion Event Handlers
429
482
 
430
483
  The editor provides several events to handle completion suggestions. These events allow you to respond to different stages of the completion process, such as when a suggestion is shown or accepted by the user.
@@ -444,8 +497,8 @@ registerCompletion(monaco, editor, {
444
497
 
445
498
  **Parameters:**
446
499
 
447
- - `completion` (string): The completion text that is being shown
448
- - `range` (EditorRange | undefined): The editor range where the completion will be inserted
500
+ - `completion`: The completion text that is being shown
501
+ - `range`: The editor range object where the completion will be inserted
449
502
 
450
503
  #### onCompletionAccepted
451
504
 
package/build/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
- import { Message, MessageCreateParams } from '@anthropic-ai/sdk/resources';
1
+ import { MessageCreateParams, Message } from '@anthropic-ai/sdk/resources';
2
2
  import { GenerateContentRequest, GenerateContentResponse } from '@google/generative-ai';
3
- import { ChatCompletion as ChatCompletion$1, ChatCompletionCreateParamsBase as ChatCompletionCreateParamsBase$1 } from 'groq-sdk/resources/chat/completions';
4
- import { ChatCompletion, ChatCompletionCreateParamsBase } from 'openai/resources/chat/completions';
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';
5
5
  import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
6
6
 
7
7
  declare const MODEL_IDS: Record<Model, string>;
@@ -58,6 +58,8 @@ interface ProviderImplementationMap {
58
58
  type OpenAIModel = ProviderImplementationMap['openai']['Model'];
59
59
  type GroqModel = ProviderImplementationMap['groq']['Model'];
60
60
  type AnthropicModel = ProviderImplementationMap['anthropic']['Model'];
61
+ type GoogleModel = ProviderImplementationMap['google']['Model'];
62
+ type DeepSeekModel = ProviderImplementationMap['deepseek']['Model'];
61
63
  /**
62
64
  * Union of all predefined Copilot models
63
65
  */
@@ -114,6 +116,15 @@ type StandaloneCodeEditor = monaco.editor.IStandaloneCodeEditor;
114
116
  type CursorPosition = monaco.IPosition;
115
117
  type EditorRange = monaco.IRange;
116
118
 
119
+ type FetchCompletionItemHandler = (params: FetchCompletionItemParams) => Promise<FetchCompletionItemReturn>;
120
+ type FetchCompletionItemReturn = {
121
+ completion: string | null;
122
+ };
123
+ interface FetchCompletionItemParams {
124
+ endpoint: string;
125
+ body: CompletionRequestBody;
126
+ }
127
+
117
128
  type Endpoint = string;
118
129
  type Filename = string;
119
130
  type Technologies = string[];
@@ -324,22 +335,21 @@ interface CompletionMetadata {
324
335
  completionMode: CompletionMode;
325
336
  };
326
337
  }
327
- type FetchCompletionItemHandler = (params: FetchCompletionItemParams) => Promise<FetchCompletionItemReturn>;
328
- type FetchCompletionItemReturn = {
329
- completion: string | null;
330
- };
331
- interface FetchCompletionItemParams {
332
- endpoint: string;
333
- body: CompletionRequestBody;
334
- }
338
+
339
+ /**
340
+ * Registers completion functionality with the Monaco editor.
341
+ * @param monaco - The Monaco instance.
342
+ * @param editor - The editor instance.
343
+ * @param options - Options for the completion.
344
+ * @returns A CompletionRegistration object with deregister and trigger methods.
345
+ */
346
+ declare const registerCompletion: (monaco: Monaco, editor: StandaloneCodeEditor, options: RegisterCompletionOptions) => CompletionRegistration;
335
347
 
336
348
  declare class Copilot {
337
349
  private readonly apiKey;
338
350
  private provider;
339
351
  private model;
340
352
  constructor(apiKey: string, options: CopilotOptions);
341
- private validateParams;
342
- private validateInputs;
343
353
  complete(request: CompletionRequest): Promise<CompletionResponse>;
344
354
  private generatePrompt;
345
355
  private prepareRequestDetails;
@@ -348,13 +358,4 @@ declare class Copilot {
348
358
  private handleCompletionError;
349
359
  }
350
360
 
351
- /**
352
- * Registers completion functionality with the Monaco editor.
353
- * @param monaco - The Monaco instance.
354
- * @param editor - The editor instance.
355
- * @param options - Options for the completion.
356
- * @returns A CompletionRegistration object with deregister and trigger methods.
357
- */
358
- declare const registerCompletion: (monaco: Monaco, editor: StandaloneCodeEditor, options: RegisterCompletionOptions) => CompletionRegistration;
359
-
360
- 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 GroqChatCompletion, type GroqModel, type Model, type Monaco, type OpenAIChatCompletion, type OpenAIModel, type Provider, type RegisterCompletionOptions, type StandaloneCodeEditor, registerCompletion };
361
+ 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 };
package/build/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { Message, MessageCreateParams } from '@anthropic-ai/sdk/resources';
1
+ import { MessageCreateParams, Message } from '@anthropic-ai/sdk/resources';
2
2
  import { GenerateContentRequest, GenerateContentResponse } from '@google/generative-ai';
3
- import { ChatCompletion as ChatCompletion$1, ChatCompletionCreateParamsBase as ChatCompletionCreateParamsBase$1 } from 'groq-sdk/resources/chat/completions';
4
- import { ChatCompletion, ChatCompletionCreateParamsBase } from 'openai/resources/chat/completions';
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';
5
5
  import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
6
6
 
7
7
  declare const MODEL_IDS: Record<Model, string>;
@@ -58,6 +58,8 @@ interface ProviderImplementationMap {
58
58
  type OpenAIModel = ProviderImplementationMap['openai']['Model'];
59
59
  type GroqModel = ProviderImplementationMap['groq']['Model'];
60
60
  type AnthropicModel = ProviderImplementationMap['anthropic']['Model'];
61
+ type GoogleModel = ProviderImplementationMap['google']['Model'];
62
+ type DeepSeekModel = ProviderImplementationMap['deepseek']['Model'];
61
63
  /**
62
64
  * Union of all predefined Copilot models
63
65
  */
@@ -114,6 +116,15 @@ type StandaloneCodeEditor = monaco.editor.IStandaloneCodeEditor;
114
116
  type CursorPosition = monaco.IPosition;
115
117
  type EditorRange = monaco.IRange;
116
118
 
119
+ type FetchCompletionItemHandler = (params: FetchCompletionItemParams) => Promise<FetchCompletionItemReturn>;
120
+ type FetchCompletionItemReturn = {
121
+ completion: string | null;
122
+ };
123
+ interface FetchCompletionItemParams {
124
+ endpoint: string;
125
+ body: CompletionRequestBody;
126
+ }
127
+
117
128
  type Endpoint = string;
118
129
  type Filename = string;
119
130
  type Technologies = string[];
@@ -324,22 +335,21 @@ interface CompletionMetadata {
324
335
  completionMode: CompletionMode;
325
336
  };
326
337
  }
327
- type FetchCompletionItemHandler = (params: FetchCompletionItemParams) => Promise<FetchCompletionItemReturn>;
328
- type FetchCompletionItemReturn = {
329
- completion: string | null;
330
- };
331
- interface FetchCompletionItemParams {
332
- endpoint: string;
333
- body: CompletionRequestBody;
334
- }
338
+
339
+ /**
340
+ * Registers completion functionality with the Monaco editor.
341
+ * @param monaco - The Monaco instance.
342
+ * @param editor - The editor instance.
343
+ * @param options - Options for the completion.
344
+ * @returns A CompletionRegistration object with deregister and trigger methods.
345
+ */
346
+ declare const registerCompletion: (monaco: Monaco, editor: StandaloneCodeEditor, options: RegisterCompletionOptions) => CompletionRegistration;
335
347
 
336
348
  declare class Copilot {
337
349
  private readonly apiKey;
338
350
  private provider;
339
351
  private model;
340
352
  constructor(apiKey: string, options: CopilotOptions);
341
- private validateParams;
342
- private validateInputs;
343
353
  complete(request: CompletionRequest): Promise<CompletionResponse>;
344
354
  private generatePrompt;
345
355
  private prepareRequestDetails;
@@ -348,13 +358,4 @@ declare class Copilot {
348
358
  private handleCompletionError;
349
359
  }
350
360
 
351
- /**
352
- * Registers completion functionality with the Monaco editor.
353
- * @param monaco - The Monaco instance.
354
- * @param editor - The editor instance.
355
- * @param options - Options for the completion.
356
- * @returns A CompletionRegistration object with deregister and trigger methods.
357
- */
358
- declare const registerCompletion: (monaco: Monaco, editor: StandaloneCodeEditor, options: RegisterCompletionOptions) => CompletionRegistration;
359
-
360
- 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 GroqChatCompletion, type GroqModel, type Model, type Monaco, type OpenAIChatCompletion, type OpenAIModel, type Provider, type RegisterCompletionOptions, type StandaloneCodeEditor, registerCompletion };
361
+ 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 };
package/build/index.js CHANGED
@@ -1,12 +1,19 @@
1
- 'use strict';
1
+ 'use strict';var Oe="\x1B[91m",re="\x1B[93m",W="\x1B[0m",G="\x1B[1m",ne=o=>o instanceof Error?o.message:typeof o=="string"?o:"An unknown error occurred",S=o=>{let e=ne(o),t=`${Oe}${G}[MONACOPILOT ERROR] ${e}${W}`;return console.error(t),{message:e}},v=(o,e)=>{console.warn(`${re}${G}[MONACOPILOT WARN] ${o}${e?`
2
+ ${ne(e)}`:""}${W}`);};var ie=(o,e,t)=>console.warn(`${re}${G}[MONACOPILOT DEPRECATED] "${o}" is deprecated${` in ${t}`}. Please use "${e}" instead. It will be removed in a future version.${W}`);var se=(o,e)=>e.getLineContent(o.lineNumber)[o.column-1];var ae=(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}),X=(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,`
2
8
 
3
- var k=o=>!o||o.length===0?"":o.length===1?o[0]:`${o.slice(0,-1).join(", ")} and ${o.slice(-1)}`,oe=o=>o.charAt(0).toUpperCase()+o.slice(1),W=(o,e,t={})=>{if(e<=0)return "";let r=o.split(`
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),ve=i.slice(-m);b===ve&&(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 le="application/json";var pe=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=e==="POST"&&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()},Ie=(o,e)=>pe(o,"GET",e),Ae=(o,e,t)=>pe(o,"POST",{...t,body:e}),q={GET:Ie,POST:Ae};var A=o=>!o||o.length===0?"":o.length===1?o[0]:`${o.slice(0,-1).join(", ")} and ${o.slice(-1)}`,me=o=>o.charAt(0).toUpperCase()+o.slice(1),Y=(o,e,t={})=>{if(e<=0)return "";let r=o.split(`
4
12
  `),n=r.length;if(e>=n)return o;if(t.from==="end"){let s=r.slice(-e);return s.every(l=>l==="")?`
5
13
  `.repeat(e):s.join(`
6
14
  `)}let i=r.slice(0,e);return i.every(s=>s==="")?`
7
15
  `.repeat(e):i.join(`
8
- `)};var re=(o,e)=>e.getLineContent(o.lineNumber)[o.column-1];var ne=(o,e)=>e.getLineContent(o.lineNumber).slice(0,o.column-1),v=(o,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:o.lineNumber,endColumn:o.column}),X=(o,e)=>e.getValueInRange({startLineNumber:o.lineNumber,startColumn:o.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var ie=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=e==="POST"&&t.body?JSON.stringify(t.body):void 0,p=await fetch(o,{method:e,headers:s,body:l,signal:i});if(!p.ok){let d=await p.json().catch(()=>null),c=d?`
9
- ${JSON.stringify(d,null,2)}`:"",a=t.fallbackError||"Network request failed";throw new Error(`${a} (${p.status})${c}`)}return p.json()},Te=(o,e)=>ie(o,"GET",e),be=(o,e,t)=>ie(o,"POST",{...t,body:e}),S={GET:Te,POST:be};var w=(o,e=600,t=200)=>{let r=null,n=0,i=null,s=null,l=!1,p=(...d)=>{if(l)return Promise.resolve(void 0);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,M)=>{r=setTimeout(async()=>{l=!0;try{if(i){let C=await o(...i);f(C);}else f(void 0);}catch(C){M(C);}finally{l=!1,r=null,i=null;}},u);}),s};return p.cancel=()=>{r&&(clearTimeout(r),r=null),i=null;},p};var ve=o=>!o||o.length===0?"":o.map(({path:e,content:t})=>`
16
+ `)};var ce=async o=>{let{endpoint:e,body:t}=o,{completion:r,error:n}=await q.POST(e,t,{headers:{"Content-Type":le},fallbackError:"Error while fetching completion item"});if(n)throw new Error(n);return {completion:r}},de=({pos:o,mdl:e,options:t})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:l}=t,p=ke(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?Y(b,h,m):b},f=(y,h)=>!y||!h?y:y.map(({content:m,...b})=>({...b,content:Y(m,h)})),T=u(O,a,{from:"end"}),C=u(X,a),x=f(s,a);return {filename:r,language:n,technologies:i,relatedFiles:x,textBeforeCursor:T,textAfterCursor:C,cursorPosition:o,editorState:{completionMode:p}}},ke=(o,e)=>{let t=se(o,e),r=X(o,e);return t?"insert":r.trim()?"complete":"continue"};var I=o=>({items:o,enableForwardStability:true,suppressSuggestions:true});var F=(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 Se=o=>({onTyping:F(o,600,200),onIdle:F(o,600,400),onDemand:F(o,0,0)}),$=new L,ue=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=Se(c??ce)[s];r.onCancellationRequested(()=>{u.cancel();});let f=de({pos:t,mdl:e,options:i}),{completion:T}=await u({endpoint:l,body:{completionMetadata:f}});if(T){let C=new N(T,t.column,ae(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(we(a))return I([]);d?d(a):v("Cannot provide completion",a);}return I([])},we=o=>typeof o=="string"?o==="Cancelled"||o==="AbortError":o instanceof Error?o.message==="Cancelled"||o.name==="AbortError":false;var J=new WeakMap,k=o=>J.get(o),Ce=(o,e)=>{J.set(o,e);},Z=o=>{J.delete(o);},ge=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var fe=(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 ue({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},he=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 Le={TAB:(o,e)=>e.keyCode===o.KeyCode.Tab,CMD_RIGHT_ARROW:(o,e)=>e.keyCode===o.KeyCode.RightArrow&&e.metaKey},Q=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(Le).some(t=>t(this.monaco,e))}},Pe=(o,e,t,r)=>{let n=new Q(o,t,r);return e.onKeyDown(i=>n.handleKeyEvent(i))};var D=null,_e=(o,e,t)=>{D&&D.deregister();let r=[];Ce(e,ge()),e.updateOptions({inlineSuggest:{enabled:true,mode:"subwordSmart"}});try{let n=k(e);if(!n)return v("Completion is not registered properly. State not found."),Ne();let i=fe(o,e,t);i&&r.push(i);let s=Pe(o,e,n,t);r.push(s);let l={deregister:()=>{r.forEach(p=>p.dispose()),$.clear(),Z(e),D=null;},trigger:()=>he(e)};return D=l,l}catch(n){return t.onError?t.onError(n):S(n),{deregister:()=>{r.forEach(i=>i.dispose()),Z(e),D=null;},trigger:()=>{}}}},Ne=()=>({deregister:()=>{},trigger:()=>{}});var ee=["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"},te={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},Ee=(o,e,t)=>z[t].createEndpoint(o,e),ye=(o,e,t,r)=>z[e].createRequestBody(o,t,r),Re=(o,e)=>z[e].createHeaders(o),Me=(o,e)=>z[e].parseCompletion(o);var Be=o=>!o||o.length===0?"":o.map(({path:e,content:t})=>`
10
17
  <related_file>
11
18
  <filePath>${e}</filePath>
12
19
  <fileContent>
@@ -16,7 +23,7 @@ ${t}
16
23
  </fileContent>
17
24
  </related_file>`.trim()).join(`
18
25
 
19
- `),se=o=>{let{technologies:e=[],filename:t,relatedFiles:r,language:n,textBeforeCursor:i="",textAfterCursor:s="",editorState:{completionMode:l}}=o,p=k([n,...e].filter(a=>typeof a=="string"&&!!a)),d=`
26
+ `),Te=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=`
20
27
  You are an expert code completion assistant.
21
28
 
22
29
  **Context:**
@@ -25,25 +32,13 @@ Language: ${n||"Undetermined"}
25
32
  Mode: ${l}
26
33
  Stack: ${p||"None"}`,c=`
27
34
  **Related Files:**
28
- ${ve(r)}
35
+ ${Be(r)}
29
36
 
30
37
  **Source:**
31
38
  \`\`\`
32
39
  ${i}<cursor>${s}
33
40
  \`\`\`
34
41
 
35
- ${oe(l)} the code at <cursor>.
36
-
37
- Output only the raw code to be inserted at the cursor location without any additional text or comments.`;return {system:d,user:c}};var G=["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"},J={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 L=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 N=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 _=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 B=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 F=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 q={openai:new F,groq:new B,anthropic:new L,google:new _,deepseek:new N},ae=(o,e,t)=>q[t].createEndpoint(o,e),le=(o,e,t,r)=>q[e].createRequestBody(o,t,r),pe=(o,e)=>q[e].createHeaders(o),me=(o,e)=>q[e].parseCompletion(o);var Oe="\x1B[91m",ce="\x1B[93m",Y="\x1B[0m",Z="\x1B[1m",de=o=>o instanceof Error?o.message:typeof o=="string"?o:"An unknown error occurred",$=o=>{let e=de(o),t=`${Oe}${Z}[MONACOPILOT ERROR] ${e}${Y}`;return console.error(t),{message:e}},O=(o,e)=>{console.warn(`${ce}${Z}[MONACOPILOT WARN] ${o}${e?`
38
- ${de(e)}`:""}${Y}`);};var ue=(o,e,t)=>console.warn(`${ce}${Z}[MONACOPILOT DEPRECATED] "${o}" is deprecated${` in ${t}`}. Please use "${e}" instead. It will be removed in a future version.${Y}`);var Q=class{constructor(e,t){this.validateParams(e,t),this.apiKey=e,this.provider=t.provider,this.model=t.model,this.validateInputs();}validateParams(e,t){if(!e)throw new Error("Please provide an API key.");if(!t||typeof t=="object"&&Object.keys(t).length===0)throw new Error("Please provide options.")}validateInputs(){if(typeof this.model=="object"){if(this.provider!==void 0)throw new Error("Provider should not be specified when using a custom model.");if(!("config"in this.model)||!("transformResponse"in this.model))throw new Error("Please ensure both config and transformResponse are provided for custom model.");return}if(!this.provider||!G.includes(this.provider))throw new Error(`Provider must be specified and supported when using built-in models. Please choose from: ${k(G)}`);if(typeof this.model=="string"&&!J[this.provider].includes(this.model))throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${k(J[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=se(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=ae(this.model,this.apiKey,this.provider),n=pe(this.apiKey,this.provider),i=le(this.model,this.provider,e,t);return {endpoint:r,requestBody:i,headers:n}}}async sendCompletionRequest(e,t,r){return S.POST(e,t,{headers:r})}processCompletionResponse(e){if(typeof this.model=="object"&&"transformResponse"in this.model){let t=this.model.transformResponse(e);return "completion"in t&&ue("completion","text","Copilot.options.model.transformResponse"),{completion:t.text??t.completion??null,raw:e}}else {if(!this.provider)throw new Error("Provider is required for non-custom models");return {completion:me(e,this.provider),raw:e}}}handleCompletionError(e){return {error:$(e).message,completion:null}}};var j=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(`
39
- `);if(e.length<=1||this.textBeforeCursorInLine.trim()!=="")return this;let t=" ".repeat(this.currentColumn-1);return this.formattedCompletion=e[0]+`
40
- `+e.slice(1).map(r=>t+r).join(`
41
- `),this}removeMarkdownCodeBlocks(e){let t=/```[\s\S]*?```/g,r=e,n;for(;(n=t.exec(e))!==null;){let i=n[0],s=i.split(`
42
- `).slice(1,-1).join(`
43
- `);r=r.replace(i,s);}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
44
-
45
- `),this}build(){return this.formattedCompletion}};var ee=new WeakMap,A=o=>ee.get(o),Ce=(o,e)=>{ee.set(o,e);},te=o=>{ee.delete(o);},ge=()=>({isCompletionAccepted:!1,isCompletionVisible:!1,isExplicitlyTriggered:!1,hasRejectedCurrentCompletion:!1});var H=class{constructor(e){this.capacity=e;this.head=0;this.tail=0;this.size=0;this.buffer=new Array(e);}enqueue(e){let t;return this.size===this.capacity&&(t=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,t}dequeue(){if(this.size===0)return;let e=this.buffer[this.head];return this.buffer[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.size--,e}getAll(){return this.buffer.filter(e=>e!==void 0)}clear(){this.buffer=new Array(this.capacity),this.head=0,this.tail=0,this.size=0;}getSize(){return this.size}isEmpty(){return this.size===0}isFull(){return this.size===this.capacity}};var V=class V{constructor(){this.cache=new H(V.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=v(t,r);return i.length<e.textBeforeCursor.length||!i.startsWith(e.textBeforeCursor)?!1: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 !1;let u=c===s&&a===l;if(s===p)return u||c===s&&a>=l&&a<=d;let f=c>s&&c<p?!0:c===s&&a>=l||c===p&&a<=d;return u||f}};V.MAX_CACHE_SIZE=10;var K=V;var U=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 M=Math.min(a,u);for(let m=1;m<=M;m++){let b=t.substring(0,m),Me=i.slice(-m);b===Me&&(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 T=c>0?r.getPositionAt(n-c):e,R=n+d,h=r.getPositionAt(R);return new this.monaco.Range(T.lineNumber,T.column,h.lineNumber,h.column)}computeCacheRange(e,t){let r=e.lineNumber,n=e.column,i=t.split(`
46
- `),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 Ie="application/json",fe=async o=>{let{endpoint:e,body:t}=o,{completion:r,error:n}=await S.POST(e,t,{headers:{"Content-Type":Ie},fallbackError:"Error while fetching completion item"});if(n)throw new Error(n);return {completion:r}},he=({pos:o,mdl:e,options:t})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:l}=t,p=ke(o,e),c=!!s?.length?3:2,a=l?Math.floor(l/c):void 0,u=(R,h,m)=>{let b=R(o,e);return h?W(b,h,m):b},f=(R,h)=>!R||!h?R:R.map(({content:m,...b})=>({...b,content:W(m,h)})),M=u(v,a,{from:"end"}),C=u(X,a),T=f(s,a);return {filename:r,language:n,technologies:i,relatedFiles:T,textBeforeCursor:M,textAfterCursor:C,cursorPosition:o,editorState:{completionMode:p}}},ke=(o,e)=>{let t=re(o,e),r=X(o,e);return t?"insert":r.trim()?"complete":"continue"};var I=o=>({items:o,enableForwardStability:!0,suppressSuggestions:!0});var De=o=>({onTyping:w(o,600,200),onIdle:w(o,600,400),onDemand:w(o,0,0)}),z=new K,Pe=async({monaco:o,mdl:e,pos:t,token:r,isCompletionAccepted:n,options:i})=>{let{trigger:s="onIdle",endpoint:l,enableCaching:p=!0,onError:d,requestHandler:c}=i;if(p){let a=z.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=De(c??fe)[s];r.onCancellationRequested(()=>{u.cancel();});let f=he({pos:t,mdl:e,options:i}),{completion:M}=await u({endpoint:l,body:{completionMetadata:f}});if(M){let C=new j(M,t.column,ne(t,e)).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().indentByColumn().build(),T=new U(o),R=T.computeInsertionRange(t,C,e),h=T.computeCacheRange(t,C);return p&&z.add({completion:C,range:h,textBeforeCursor:v(t,e)}),I([{insertText:C,range:R}])}}catch(a){if(Se(a))return I([]);d?d(a):O("Cannot provide completion",a);}return I([])},Se=o=>typeof o=="string"?o==="Cancelled"||o==="AbortError":o instanceof Error?o.message==="Cancelled"||o.name==="AbortError":!1;var Ee=(o,e,t)=>{let r=A(e);return r?o.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(n,i,s,l)=>{if(!(t.trigger==="onDemand"&&!r.isExplicitlyTriggered))return Pe({monaco:o,mdl:n,pos:i,token:l,isCompletionAccepted:r.isCompletionAccepted,options:t})},handleItemDidShow:(n,i,s)=>{r.isExplicitlyTriggered=!1,r.hasRejectedCurrentCompletion=!1,!r.isCompletionAccepted&&(r.isCompletionVisible=!0,t.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null},Re=o=>{let e=A(o);if(!e){O("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=!0,o.trigger("keyboard","editor.action.inlineSuggest.trigger",{});};var ye=(o,e,t,r)=>e.onKeyDown(n=>{we({monaco:o,event:n,state:t,options:r}),Le({monaco:o,event:n,state:t,options:r});}),we=({monaco:o,event:e,state:t,options:r})=>t.isCompletionVisible&&xe(o,e)?(r.onCompletionAccepted?.(),t.isCompletionAccepted=!0,t.isCompletionVisible=!1,!0):(t.isCompletionAccepted=!1,!1),Le=({monaco:o,event:e,state:t,options:r})=>{let n=!xe(o,e);return t.isCompletionVisible&&!t.hasRejectedCurrentCompletion&&!t.isCompletionAccepted&&n?(r.onCompletionRejected?.(),t.hasRejectedCurrentCompletion=!0,!0):!1},xe=(o,e)=>e.keyCode===o.KeyCode.Tab||e.keyCode===o.KeyCode.RightArrow&&e.metaKey;var D=null,Ne=(o,e,t)=>{D&&D.deregister();let r=[];Ce(e,ge()),e.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let n=A(e);if(!n)return O("Completion is not registered properly. State not found."),_e();let i=Ee(o,e,t);i&&r.push(i);let s=ye(o,e,n,t);r.push(s);let l={deregister:()=>{r.forEach(p=>p.dispose()),z.clear(),te(e),D=null;},trigger:()=>Re(e)};return D=l,l}catch(n){return t.onError?t.onError(n):$(n),{deregister:()=>{r.forEach(i=>i.dispose()),te(e),D=null;},trigger:()=>{}}}},_e=()=>({deregister:()=>{},trigger:()=>{}});
42
+ ${me(l)} the code at <cursor>.
47
43
 
48
- exports.Copilot = Q;
49
- exports.registerCompletion = Ne;
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 xe=(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.")},be=(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||!ee.includes(e))throw new Error(`Provider must be specified and supported when using built-in models. Please choose from: ${A(ee)}`);if(typeof o=="string"&&!te[e].includes(o))throw new Error(`Model "${o}" is not supported by the "${e}" provider. Supported models: ${A(te[e])}`)};var oe=class{constructor(e,t){xe(e,t),this.apiKey=e,this.provider=t.provider,this.model=t.model,be(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=Te(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=Ee(this.model,this.apiKey,this.provider),n=Re(this.apiKey,this.provider),i=ye(this.model,this.provider,e,t);return {endpoint:r,requestBody:i,headers:n}}}async sendCompletionRequest(e,t,r){return q.POST(e,t,{headers:r})}processCompletionResponse(e){if(typeof this.model=="object"&&"transformResponse"in this.model){let t=this.model.transformResponse(e);return "completion"in t&&ie("completion","text","Copilot.options.model.transformResponse"),{completion:t.text??t.completion??null,raw:e}}else {if(!this.provider)throw new Error("Provider is required for non-custom models");return {completion:Me(e,this.provider),raw:e}}}handleCompletionError(e){return {error:S(e).message,completion:null}}};exports.Copilot=oe;exports.registerCompletion=_e;
package/build/index.mjs CHANGED
@@ -1,10 +1,19 @@
1
- var k=o=>!o||o.length===0?"":o.length===1?o[0]:`${o.slice(0,-1).join(", ")} and ${o.slice(-1)}`,oe=o=>o.charAt(0).toUpperCase()+o.slice(1),W=(o,e,t={})=>{if(e<=0)return "";let r=o.split(`
1
+ var Oe="\x1B[91m",re="\x1B[93m",W="\x1B[0m",G="\x1B[1m",ne=o=>o instanceof Error?o.message:typeof o=="string"?o:"An unknown error occurred",S=o=>{let e=ne(o),t=`${Oe}${G}[MONACOPILOT ERROR] ${e}${W}`;return console.error(t),{message:e}},v=(o,e)=>{console.warn(`${re}${G}[MONACOPILOT WARN] ${o}${e?`
2
+ ${ne(e)}`:""}${W}`);};var ie=(o,e,t)=>console.warn(`${re}${G}[MONACOPILOT DEPRECATED] "${o}" is deprecated${` in ${t}`}. Please use "${e}" instead. It will be removed in a future version.${W}`);var se=(o,e)=>e.getLineContent(o.lineNumber)[o.column-1];var ae=(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}),X=(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),ve=i.slice(-m);b===ve&&(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 le="application/json";var pe=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=e==="POST"&&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()},Ie=(o,e)=>pe(o,"GET",e),Ae=(o,e,t)=>pe(o,"POST",{...t,body:e}),q={GET:Ie,POST:Ae};var A=o=>!o||o.length===0?"":o.length===1?o[0]:`${o.slice(0,-1).join(", ")} and ${o.slice(-1)}`,me=o=>o.charAt(0).toUpperCase()+o.slice(1),Y=(o,e,t={})=>{if(e<=0)return "";let r=o.split(`
2
12
  `),n=r.length;if(e>=n)return o;if(t.from==="end"){let s=r.slice(-e);return s.every(l=>l==="")?`
3
13
  `.repeat(e):s.join(`
4
14
  `)}let i=r.slice(0,e);return i.every(s=>s==="")?`
5
15
  `.repeat(e):i.join(`
6
- `)};var re=(o,e)=>e.getLineContent(o.lineNumber)[o.column-1];var ne=(o,e)=>e.getLineContent(o.lineNumber).slice(0,o.column-1),v=(o,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:o.lineNumber,endColumn:o.column}),X=(o,e)=>e.getValueInRange({startLineNumber:o.lineNumber,startColumn:o.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var ie=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=e==="POST"&&t.body?JSON.stringify(t.body):void 0,p=await fetch(o,{method:e,headers:s,body:l,signal:i});if(!p.ok){let d=await p.json().catch(()=>null),c=d?`
7
- ${JSON.stringify(d,null,2)}`:"",a=t.fallbackError||"Network request failed";throw new Error(`${a} (${p.status})${c}`)}return p.json()},Te=(o,e)=>ie(o,"GET",e),be=(o,e,t)=>ie(o,"POST",{...t,body:e}),S={GET:Te,POST:be};var w=(o,e=600,t=200)=>{let r=null,n=0,i=null,s=null,l=!1,p=(...d)=>{if(l)return Promise.resolve(void 0);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,M)=>{r=setTimeout(async()=>{l=!0;try{if(i){let C=await o(...i);f(C);}else f(void 0);}catch(C){M(C);}finally{l=!1,r=null,i=null;}},u);}),s};return p.cancel=()=>{r&&(clearTimeout(r),r=null),i=null;},p};var ve=o=>!o||o.length===0?"":o.map(({path:e,content:t})=>`
16
+ `)};var ce=async o=>{let{endpoint:e,body:t}=o,{completion:r,error:n}=await q.POST(e,t,{headers:{"Content-Type":le},fallbackError:"Error while fetching completion item"});if(n)throw new Error(n);return {completion:r}},de=({pos:o,mdl:e,options:t})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:l}=t,p=ke(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?Y(b,h,m):b},f=(y,h)=>!y||!h?y:y.map(({content:m,...b})=>({...b,content:Y(m,h)})),T=u(O,a,{from:"end"}),C=u(X,a),x=f(s,a);return {filename:r,language:n,technologies:i,relatedFiles:x,textBeforeCursor:T,textAfterCursor:C,cursorPosition:o,editorState:{completionMode:p}}},ke=(o,e)=>{let t=se(o,e),r=X(o,e);return t?"insert":r.trim()?"complete":"continue"};var I=o=>({items:o,enableForwardStability:true,suppressSuggestions:true});var F=(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 Se=o=>({onTyping:F(o,600,200),onIdle:F(o,600,400),onDemand:F(o,0,0)}),$=new L,ue=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=Se(c??ce)[s];r.onCancellationRequested(()=>{u.cancel();});let f=de({pos:t,mdl:e,options:i}),{completion:T}=await u({endpoint:l,body:{completionMetadata:f}});if(T){let C=new N(T,t.column,ae(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(we(a))return I([]);d?d(a):v("Cannot provide completion",a);}return I([])},we=o=>typeof o=="string"?o==="Cancelled"||o==="AbortError":o instanceof Error?o.message==="Cancelled"||o.name==="AbortError":false;var J=new WeakMap,k=o=>J.get(o),Ce=(o,e)=>{J.set(o,e);},Z=o=>{J.delete(o);},ge=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var fe=(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 ue({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},he=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 Le={TAB:(o,e)=>e.keyCode===o.KeyCode.Tab,CMD_RIGHT_ARROW:(o,e)=>e.keyCode===o.KeyCode.RightArrow&&e.metaKey},Q=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(Le).some(t=>t(this.monaco,e))}},Pe=(o,e,t,r)=>{let n=new Q(o,t,r);return e.onKeyDown(i=>n.handleKeyEvent(i))};var D=null,_e=(o,e,t)=>{D&&D.deregister();let r=[];Ce(e,ge()),e.updateOptions({inlineSuggest:{enabled:true,mode:"subwordSmart"}});try{let n=k(e);if(!n)return v("Completion is not registered properly. State not found."),Ne();let i=fe(o,e,t);i&&r.push(i);let s=Pe(o,e,n,t);r.push(s);let l={deregister:()=>{r.forEach(p=>p.dispose()),$.clear(),Z(e),D=null;},trigger:()=>he(e)};return D=l,l}catch(n){return t.onError?t.onError(n):S(n),{deregister:()=>{r.forEach(i=>i.dispose()),Z(e),D=null;},trigger:()=>{}}}},Ne=()=>({deregister:()=>{},trigger:()=>{}});var ee=["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"},te={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},Ee=(o,e,t)=>z[t].createEndpoint(o,e),ye=(o,e,t,r)=>z[e].createRequestBody(o,t,r),Re=(o,e)=>z[e].createHeaders(o),Me=(o,e)=>z[e].parseCompletion(o);var Be=o=>!o||o.length===0?"":o.map(({path:e,content:t})=>`
8
17
  <related_file>
9
18
  <filePath>${e}</filePath>
10
19
  <fileContent>
@@ -14,7 +23,7 @@ ${t}
14
23
  </fileContent>
15
24
  </related_file>`.trim()).join(`
16
25
 
17
- `),se=o=>{let{technologies:e=[],filename:t,relatedFiles:r,language:n,textBeforeCursor:i="",textAfterCursor:s="",editorState:{completionMode:l}}=o,p=k([n,...e].filter(a=>typeof a=="string"&&!!a)),d=`
26
+ `),Te=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=`
18
27
  You are an expert code completion assistant.
19
28
 
20
29
  **Context:**
@@ -23,24 +32,13 @@ Language: ${n||"Undetermined"}
23
32
  Mode: ${l}
24
33
  Stack: ${p||"None"}`,c=`
25
34
  **Related Files:**
26
- ${ve(r)}
35
+ ${Be(r)}
27
36
 
28
37
  **Source:**
29
38
  \`\`\`
30
39
  ${i}<cursor>${s}
31
40
  \`\`\`
32
41
 
33
- ${oe(l)} the code at <cursor>.
34
-
35
- Output only the raw code to be inserted at the cursor location without any additional text or comments.`;return {system:d,user:c}};var G=["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"},J={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 L=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 N=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 _=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 B=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 F=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 q={openai:new F,groq:new B,anthropic:new L,google:new _,deepseek:new N},ae=(o,e,t)=>q[t].createEndpoint(o,e),le=(o,e,t,r)=>q[e].createRequestBody(o,t,r),pe=(o,e)=>q[e].createHeaders(o),me=(o,e)=>q[e].parseCompletion(o);var Oe="\x1B[91m",ce="\x1B[93m",Y="\x1B[0m",Z="\x1B[1m",de=o=>o instanceof Error?o.message:typeof o=="string"?o:"An unknown error occurred",$=o=>{let e=de(o),t=`${Oe}${Z}[MONACOPILOT ERROR] ${e}${Y}`;return console.error(t),{message:e}},O=(o,e)=>{console.warn(`${ce}${Z}[MONACOPILOT WARN] ${o}${e?`
36
- ${de(e)}`:""}${Y}`);};var ue=(o,e,t)=>console.warn(`${ce}${Z}[MONACOPILOT DEPRECATED] "${o}" is deprecated${` in ${t}`}. Please use "${e}" instead. It will be removed in a future version.${Y}`);var Q=class{constructor(e,t){this.validateParams(e,t),this.apiKey=e,this.provider=t.provider,this.model=t.model,this.validateInputs();}validateParams(e,t){if(!e)throw new Error("Please provide an API key.");if(!t||typeof t=="object"&&Object.keys(t).length===0)throw new Error("Please provide options.")}validateInputs(){if(typeof this.model=="object"){if(this.provider!==void 0)throw new Error("Provider should not be specified when using a custom model.");if(!("config"in this.model)||!("transformResponse"in this.model))throw new Error("Please ensure both config and transformResponse are provided for custom model.");return}if(!this.provider||!G.includes(this.provider))throw new Error(`Provider must be specified and supported when using built-in models. Please choose from: ${k(G)}`);if(typeof this.model=="string"&&!J[this.provider].includes(this.model))throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${k(J[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=se(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=ae(this.model,this.apiKey,this.provider),n=pe(this.apiKey,this.provider),i=le(this.model,this.provider,e,t);return {endpoint:r,requestBody:i,headers:n}}}async sendCompletionRequest(e,t,r){return S.POST(e,t,{headers:r})}processCompletionResponse(e){if(typeof this.model=="object"&&"transformResponse"in this.model){let t=this.model.transformResponse(e);return "completion"in t&&ue("completion","text","Copilot.options.model.transformResponse"),{completion:t.text??t.completion??null,raw:e}}else {if(!this.provider)throw new Error("Provider is required for non-custom models");return {completion:me(e,this.provider),raw:e}}}handleCompletionError(e){return {error:$(e).message,completion:null}}};var j=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(`
37
- `);if(e.length<=1||this.textBeforeCursorInLine.trim()!=="")return this;let t=" ".repeat(this.currentColumn-1);return this.formattedCompletion=e[0]+`
38
- `+e.slice(1).map(r=>t+r).join(`
39
- `),this}removeMarkdownCodeBlocks(e){let t=/```[\s\S]*?```/g,r=e,n;for(;(n=t.exec(e))!==null;){let i=n[0],s=i.split(`
40
- `).slice(1,-1).join(`
41
- `);r=r.replace(i,s);}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
42
-
43
- `),this}build(){return this.formattedCompletion}};var ee=new WeakMap,A=o=>ee.get(o),Ce=(o,e)=>{ee.set(o,e);},te=o=>{ee.delete(o);},ge=()=>({isCompletionAccepted:!1,isCompletionVisible:!1,isExplicitlyTriggered:!1,hasRejectedCurrentCompletion:!1});var H=class{constructor(e){this.capacity=e;this.head=0;this.tail=0;this.size=0;this.buffer=new Array(e);}enqueue(e){let t;return this.size===this.capacity&&(t=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,t}dequeue(){if(this.size===0)return;let e=this.buffer[this.head];return this.buffer[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.size--,e}getAll(){return this.buffer.filter(e=>e!==void 0)}clear(){this.buffer=new Array(this.capacity),this.head=0,this.tail=0,this.size=0;}getSize(){return this.size}isEmpty(){return this.size===0}isFull(){return this.size===this.capacity}};var V=class V{constructor(){this.cache=new H(V.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=v(t,r);return i.length<e.textBeforeCursor.length||!i.startsWith(e.textBeforeCursor)?!1: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 !1;let u=c===s&&a===l;if(s===p)return u||c===s&&a>=l&&a<=d;let f=c>s&&c<p?!0:c===s&&a>=l||c===p&&a<=d;return u||f}};V.MAX_CACHE_SIZE=10;var K=V;var U=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 M=Math.min(a,u);for(let m=1;m<=M;m++){let b=t.substring(0,m),Me=i.slice(-m);b===Me&&(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 T=c>0?r.getPositionAt(n-c):e,R=n+d,h=r.getPositionAt(R);return new this.monaco.Range(T.lineNumber,T.column,h.lineNumber,h.column)}computeCacheRange(e,t){let r=e.lineNumber,n=e.column,i=t.split(`
44
- `),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 Ie="application/json",fe=async o=>{let{endpoint:e,body:t}=o,{completion:r,error:n}=await S.POST(e,t,{headers:{"Content-Type":Ie},fallbackError:"Error while fetching completion item"});if(n)throw new Error(n);return {completion:r}},he=({pos:o,mdl:e,options:t})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:l}=t,p=ke(o,e),c=!!s?.length?3:2,a=l?Math.floor(l/c):void 0,u=(R,h,m)=>{let b=R(o,e);return h?W(b,h,m):b},f=(R,h)=>!R||!h?R:R.map(({content:m,...b})=>({...b,content:W(m,h)})),M=u(v,a,{from:"end"}),C=u(X,a),T=f(s,a);return {filename:r,language:n,technologies:i,relatedFiles:T,textBeforeCursor:M,textAfterCursor:C,cursorPosition:o,editorState:{completionMode:p}}},ke=(o,e)=>{let t=re(o,e),r=X(o,e);return t?"insert":r.trim()?"complete":"continue"};var I=o=>({items:o,enableForwardStability:!0,suppressSuggestions:!0});var De=o=>({onTyping:w(o,600,200),onIdle:w(o,600,400),onDemand:w(o,0,0)}),z=new K,Pe=async({monaco:o,mdl:e,pos:t,token:r,isCompletionAccepted:n,options:i})=>{let{trigger:s="onIdle",endpoint:l,enableCaching:p=!0,onError:d,requestHandler:c}=i;if(p){let a=z.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=De(c??fe)[s];r.onCancellationRequested(()=>{u.cancel();});let f=he({pos:t,mdl:e,options:i}),{completion:M}=await u({endpoint:l,body:{completionMetadata:f}});if(M){let C=new j(M,t.column,ne(t,e)).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().indentByColumn().build(),T=new U(o),R=T.computeInsertionRange(t,C,e),h=T.computeCacheRange(t,C);return p&&z.add({completion:C,range:h,textBeforeCursor:v(t,e)}),I([{insertText:C,range:R}])}}catch(a){if(Se(a))return I([]);d?d(a):O("Cannot provide completion",a);}return I([])},Se=o=>typeof o=="string"?o==="Cancelled"||o==="AbortError":o instanceof Error?o.message==="Cancelled"||o.name==="AbortError":!1;var Ee=(o,e,t)=>{let r=A(e);return r?o.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(n,i,s,l)=>{if(!(t.trigger==="onDemand"&&!r.isExplicitlyTriggered))return Pe({monaco:o,mdl:n,pos:i,token:l,isCompletionAccepted:r.isCompletionAccepted,options:t})},handleItemDidShow:(n,i,s)=>{r.isExplicitlyTriggered=!1,r.hasRejectedCurrentCompletion=!1,!r.isCompletionAccepted&&(r.isCompletionVisible=!0,t.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null},Re=o=>{let e=A(o);if(!e){O("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=!0,o.trigger("keyboard","editor.action.inlineSuggest.trigger",{});};var ye=(o,e,t,r)=>e.onKeyDown(n=>{we({monaco:o,event:n,state:t,options:r}),Le({monaco:o,event:n,state:t,options:r});}),we=({monaco:o,event:e,state:t,options:r})=>t.isCompletionVisible&&xe(o,e)?(r.onCompletionAccepted?.(),t.isCompletionAccepted=!0,t.isCompletionVisible=!1,!0):(t.isCompletionAccepted=!1,!1),Le=({monaco:o,event:e,state:t,options:r})=>{let n=!xe(o,e);return t.isCompletionVisible&&!t.hasRejectedCurrentCompletion&&!t.isCompletionAccepted&&n?(r.onCompletionRejected?.(),t.hasRejectedCurrentCompletion=!0,!0):!1},xe=(o,e)=>e.keyCode===o.KeyCode.Tab||e.keyCode===o.KeyCode.RightArrow&&e.metaKey;var D=null,Ne=(o,e,t)=>{D&&D.deregister();let r=[];Ce(e,ge()),e.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let n=A(e);if(!n)return O("Completion is not registered properly. State not found."),_e();let i=Ee(o,e,t);i&&r.push(i);let s=ye(o,e,n,t);r.push(s);let l={deregister:()=>{r.forEach(p=>p.dispose()),z.clear(),te(e),D=null;},trigger:()=>Re(e)};return D=l,l}catch(n){return t.onError?t.onError(n):$(n),{deregister:()=>{r.forEach(i=>i.dispose()),te(e),D=null;},trigger:()=>{}}}},_e=()=>({deregister:()=>{},trigger:()=>{}});
42
+ ${me(l)} the code at <cursor>.
45
43
 
46
- export { Q as Copilot, Ne as registerCompletion };
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 xe=(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.")},be=(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||!ee.includes(e))throw new Error(`Provider must be specified and supported when using built-in models. Please choose from: ${A(ee)}`);if(typeof o=="string"&&!te[e].includes(o))throw new Error(`Model "${o}" is not supported by the "${e}" provider. Supported models: ${A(te[e])}`)};var oe=class{constructor(e,t){xe(e,t),this.apiKey=e,this.provider=t.provider,this.model=t.model,be(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=Te(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=Ee(this.model,this.apiKey,this.provider),n=Re(this.apiKey,this.provider),i=ye(this.model,this.provider,e,t);return {endpoint:r,requestBody:i,headers:n}}}async sendCompletionRequest(e,t,r){return q.POST(e,t,{headers:r})}processCompletionResponse(e){if(typeof this.model=="object"&&"transformResponse"in this.model){let t=this.model.transformResponse(e);return "completion"in t&&ie("completion","text","Copilot.options.model.transformResponse"),{completion:t.text??t.completion??null,raw:e}}else {if(!this.provider)throw new Error("Provider is required for non-custom models");return {completion:Me(e,this.provider),raw:e}}}handleCompletionError(e){return {error:S(e).message,completion:null}}};export{oe as Copilot,_e as registerCompletion};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monacopilot",
3
- "version": "0.18.1",
3
+ "version": "0.18.3",
4
4
  "description": "AI auto-completion plugin for Monaco Editor",
5
5
  "main": "./build/index.js",
6
6
  "module": "./build/index.mjs",
@@ -38,6 +38,7 @@
38
38
  "release-it": "^17.6.0",
39
39
  "tsup": "^8.0.2",
40
40
  "typescript": "^5.4.3",
41
+ "vite-tsconfig-paths": "^5.1.4",
41
42
  "vitest": "^2.0.5"
42
43
  },
43
44
  "keywords": [
@@ -61,6 +62,5 @@
61
62
  }
62
63
  ],
63
64
  "license": "MIT",
64
- "author": "Arshad Yaseen <m@arshadyaseen.com> (https://arshadyaseen.com)",
65
- "dependencies": {}
65
+ "author": "Arshad Yaseen <m@arshadyaseen.com> (https://arshadyaseen.com)"
66
66
  }