monacopilot 0.10.19 → 0.11.0

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
@@ -26,8 +26,7 @@
26
26
  - [Completions for Specific Technologies](#completions-for-specific-technologies)
27
27
  - [Max Context Lines](#max-context-lines)
28
28
  - [Handling Errors](#handling-errors)
29
- - [Request Options](#request-options)
30
- - [Custom Headers](#custom-headers)
29
+ - [Custom Request Handler](#custom-request-handler)
31
30
  - [Copilot Options](#copilot-options)
32
31
  - [Changing the Provider and Model](#changing-the-provider-and-model)
33
32
  - [Custom Model](#custom-model)
@@ -77,15 +76,38 @@ const copilot = new Copilot(process.env.GROQ_API_KEY);
77
76
  app.use(express.json());
78
77
 
79
78
  app.post('/complete', async (req, res) => {
80
- const completion = await copilot.complete({
79
+ const {completion, error} = await copilot.complete({
81
80
  body: req.body,
82
81
  });
83
- res.status(200).json(completion);
82
+
83
+ // Handle error if you want
84
+ if (error) {
85
+ res.status(500).json({error});
86
+ }
87
+
88
+ res.status(200).json({completion});
84
89
  });
85
90
 
86
91
  app.listen(port);
87
92
  ```
88
93
 
94
+ The handler should return a JSON response with the following structure:
95
+
96
+ ```json
97
+ {
98
+ "completion": "Generated completion text"
99
+ }
100
+ ```
101
+
102
+ Or in case of an error:
103
+
104
+ ```json
105
+ {
106
+ "completion": null,
107
+ "error": "Error message"
108
+ }
109
+ ```
110
+
89
111
  If you prefer to use a different programming language for your API handler in cases where your backend is not in JavaScript, please refer to the section [Using a Different Language for the API Handler](#using-a-different-language-for-the-api-handler) for guidance on implementing the handler in your chosen language.
90
112
 
91
113
  Now, Monacopilot is set up to send completion requests to the `/complete` endpoint and receive completions in response.
@@ -290,6 +312,96 @@ registerCompletion(monaco, editor, {
290
312
  });
291
313
  ```
292
314
 
315
+ ### Custom Request Handler
316
+
317
+ The `requestHandler` option in the `registerCompletion` function allows you to handle requests sent to the specified endpoint, offering high customization for both requests and responses. By leveraging this functionality, you can manipulate and customize the request or response to meet your specific requirements.
318
+
319
+ ```javascript
320
+ registerCompletion(monaco, editor, {
321
+ endpoint: 'https://api.example.com/complete',
322
+ // ... other options
323
+ requestHandler: async ({endpoint, body}) => {
324
+ const response = await fetch(endpoint, {
325
+ method: 'POST',
326
+ headers: {
327
+ 'Content-Type': 'application/json',
328
+ },
329
+ body: JSON.stringify(body),
330
+ });
331
+
332
+ const data = await response.json();
333
+
334
+ return {
335
+ completion: data.completion,
336
+ };
337
+ },
338
+ });
339
+ ```
340
+
341
+ The `requestHandler` function takes an object with `endpoint` and `body` as parameters.
342
+
343
+ | Property | Type | Description |
344
+ | ---------- | -------- | ------------------------------------------------------------------------------------------------------ |
345
+ | `endpoint` | `string` | The endpoint to which the request is sent. This is the same as the `endpoint` in `registerCompletion`. |
346
+ | `body` | `object` | The body of the request processed by Monacopilot. |
347
+
348
+ > **Note:** The `body` object contains properties generated by Monacopilot. If you need to include additional properties in the request body, you can create a new object that combines the existing `body` with your custom properties. For example:
349
+ >
350
+ > ```javascript
351
+ > const customBody = {
352
+ > ...body,
353
+ > myCustomProperty: 'value',
354
+ > };
355
+ > ```
356
+
357
+ The `requestHandler` should return an object with the following property:
358
+
359
+ | Property | Type | Description |
360
+ | ------------ | ------------------ | ------------------------------------------------------------------------------------------------ |
361
+ | `completion` | `string` or `null` | The completion text to be inserted into the editor. Return `null` if no completion is available. |
362
+
363
+ #### Example
364
+
365
+ The example below demonstrates how to use the `requestHandler` function for more customized handling:
366
+
367
+ ````javascript
368
+ registerCompletion(monaco, editor, {
369
+ endpoint: 'https://api.example.com/complete',
370
+ // ... other options
371
+ requestHandler: async ({endpoint, body}) => {
372
+ try {
373
+ const response = await fetch(endpoint, {
374
+ method: 'POST',
375
+ headers: {
376
+ 'Content-Type': 'application/json',
377
+ 'X-Request-ID': generateUniqueId(),
378
+ },
379
+ body: JSON.stringify({
380
+ ...body,
381
+ additionalProperty: 'value',
382
+ }),
383
+ });
384
+
385
+ if (!response.ok) {
386
+ throw new Error(`HTTP error! status: ${response.status}`);
387
+ }
388
+
389
+ const data = await response.json();
390
+
391
+ if (data.error) {
392
+ console.error('API Error:', data.error);
393
+ return { completion: null };
394
+ }
395
+
396
+ return { completion: data.completion.trim() };
397
+ } catch (error) {
398
+ console.error('Fetch error:', error);
399
+ return { completion: null };
400
+ }
401
+ },
402
+ });
403
+ ```
404
+
293
405
  ## Copilot Options
294
406
 
295
407
  ### Changing the Provider and Model
@@ -301,7 +413,7 @@ const copilot = new Copilot(process.env.OPENAI_API_KEY, {
301
413
  provider: 'openai',
302
414
  model: 'gpt-4o',
303
415
  });
304
- ```
416
+ ````
305
417
 
306
418
  The default provider is `groq`, and the default model is `llama-3-70b`.
307
419
 
package/build/index.d.mts CHANGED
@@ -158,23 +158,25 @@ interface RegisterCompletionOptions {
158
158
  * since `Groq` does not implement pay-as-you-go pricing and has only low rate limits.
159
159
  */
160
160
  maxContextLines?: number;
161
- /**
162
- * Additional options to include in the request sent to the endpoint specified in the `registerCompletion` function.
163
- */
164
- requestOptions?: RegisterCompletionRequestOptions;
165
161
  /**
166
162
  * Callback function that is called when an error occurs during the completion request.
167
163
  * This function allows you to handle errors gracefully and provide appropriate feedback to the user.
168
164
  * @param error - The error object containing information about the encountered error.
169
165
  */
170
- onError?: (error: Error) => void;
171
- }
172
- interface RegisterCompletionRequestOptions {
166
+ onError?: OnError;
173
167
  /**
174
- * Custom headers to include in the request sent to the endpoint specified in the `registerCompletion` function.
168
+ * Custom fetch completion handler. This function overrides the default fetch completion handler.
169
+ * It allows you to customize how completion requests are made and responses are processed.
170
+ * You can implement your own logic for fetching and processing completions.
171
+ * The function should return either a string (the completion to be inserted into the editor) or null.
172
+ * @param params - The parameters for the completion request.
173
+ * @param {string} params.endpoint - The endpoint to fetch the completion from.
174
+ * @param {CompletionRequestBody} params.body - The body of the completion request.
175
+ * @returns {Promise<{completion: string | null}>} An object containing the completion or null if no completion is available.
175
176
  */
176
- headers?: Record<string, string>;
177
+ requestHandler?: FetchCompletionItemHandler;
177
178
  }
179
+ type OnError = (error: Error) => void;
178
180
  interface CompletionRegistration {
179
181
  /**
180
182
  * Triggers the completion.
@@ -264,6 +266,14 @@ interface CompletionMetadata {
264
266
  completionMode: CompletionMode;
265
267
  };
266
268
  }
269
+ type FetchCompletionItemHandler = (params: FetchCompletionItemParams) => Promise<FetchCompletionItemReturn>;
270
+ type FetchCompletionItemReturn = {
271
+ completion: string | null;
272
+ };
273
+ interface FetchCompletionItemParams {
274
+ endpoint: string;
275
+ body: CompletionRequestBody;
276
+ }
267
277
 
268
278
  declare class Copilot {
269
279
  private readonly apiKey;
package/build/index.d.ts CHANGED
@@ -158,23 +158,25 @@ interface RegisterCompletionOptions {
158
158
  * since `Groq` does not implement pay-as-you-go pricing and has only low rate limits.
159
159
  */
160
160
  maxContextLines?: number;
161
- /**
162
- * Additional options to include in the request sent to the endpoint specified in the `registerCompletion` function.
163
- */
164
- requestOptions?: RegisterCompletionRequestOptions;
165
161
  /**
166
162
  * Callback function that is called when an error occurs during the completion request.
167
163
  * This function allows you to handle errors gracefully and provide appropriate feedback to the user.
168
164
  * @param error - The error object containing information about the encountered error.
169
165
  */
170
- onError?: (error: Error) => void;
171
- }
172
- interface RegisterCompletionRequestOptions {
166
+ onError?: OnError;
173
167
  /**
174
- * Custom headers to include in the request sent to the endpoint specified in the `registerCompletion` function.
168
+ * Custom fetch completion handler. This function overrides the default fetch completion handler.
169
+ * It allows you to customize how completion requests are made and responses are processed.
170
+ * You can implement your own logic for fetching and processing completions.
171
+ * The function should return either a string (the completion to be inserted into the editor) or null.
172
+ * @param params - The parameters for the completion request.
173
+ * @param {string} params.endpoint - The endpoint to fetch the completion from.
174
+ * @param {CompletionRequestBody} params.body - The body of the completion request.
175
+ * @returns {Promise<{completion: string | null}>} An object containing the completion or null if no completion is available.
175
176
  */
176
- headers?: Record<string, string>;
177
+ requestHandler?: FetchCompletionItemHandler;
177
178
  }
179
+ type OnError = (error: Error) => void;
178
180
  interface CompletionRegistration {
179
181
  /**
180
182
  * Triggers the completion.
@@ -264,6 +266,14 @@ interface CompletionMetadata {
264
266
  completionMode: CompletionMode;
265
267
  };
266
268
  }
269
+ type FetchCompletionItemHandler = (params: FetchCompletionItemParams) => Promise<FetchCompletionItemReturn>;
270
+ type FetchCompletionItemReturn = {
271
+ completion: string | null;
272
+ };
273
+ interface FetchCompletionItemParams {
274
+ endpoint: string;
275
+ body: CompletionRequestBody;
276
+ }
267
277
 
268
278
  declare class Copilot {
269
279
  private readonly apiKey;
package/build/index.js CHANGED
@@ -1,9 +1,9 @@
1
- "use strict";var F=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames;var Ce=Object.prototype.hasOwnProperty;var ge=(e,t)=>{for(var o in t)F(e,o,{get:t[o],enumerable:!0})},he=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ue(t))!Ce.call(e,n)&&n!==o&&F(e,n,{get:()=>t[n],enumerable:!(r=me(t,n))||r.enumerable});return e};var fe=e=>he(F({},"__esModule",{value:!0}),e);var _e={};ge(_e,{Copilot:()=>L,registerCompletion:()=>Y,registerCopilot:()=>ce});module.exports=fe(_e);var _=["groq","openai","anthropic"],G={"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-20240620","claude-3-opus":"claude-3-opus-20240229","claude-3-sonnet":"claude-3-sonnet-20240229","claude-3-haiku":"claude-3-haiku-20240307","o1-preview":"o1-preview","o1-mini":"o1-mini"},$={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-preview","o1-mini"],anthropic:["claude-3.5-sonnet","claude-3-opus","claude-3-haiku","claude-3-sonnet"]},J="llama-3-70b",X="groq",z={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages"},M=.1;var v=(e,t)=>{let o=null,r=null,n=(...i)=>new Promise((s,a)=>{o&&(clearTimeout(o),r&&r("Cancelled")),r=a,o=setTimeout(()=>{s(e(...i)),r=null},t)});return n.cancel=()=>{o&&(clearTimeout(o),r&&r("Cancelled"),o=null,r=null)},n},x=e=>!e||e.length===0?"":e.length===1?e[0]:`${e.slice(0,-1).join(", ")} and ${e.slice(-1)}`;var H=(e,t)=>t.getLineContent(e.lineNumber)[e.column-1];var b=(e,t)=>t.getLineContent(e.lineNumber).slice(e.column-1),f=(e,t)=>t.getLineContent(e.lineNumber).slice(0,e.column-1),Z=(e,t)=>t.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:e.lineNumber,endColumn:e.column}),Q=(e,t)=>t.getValueInRange({startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:t.getLineCount(),endColumn:t.getLineMaxColumn(t.getLineCount())}),U=(e,t,o={})=>{if(t<=0)return"";let r=e.split(`
1
+ "use strict";var q=Object.defineProperty;var Ce=Object.getOwnPropertyDescriptor;var ge=Object.getOwnPropertyNames;var he=Object.prototype.hasOwnProperty;var fe=(e,t)=>{for(var o in t)q(e,o,{get:t[o],enumerable:!0})},Pe=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ge(t))!he.call(e,n)&&n!==o&&q(e,n,{get:()=>t[n],enumerable:!(r=Ce(t,n))||r.enumerable});return e};var ye=e=>Pe(q({},"__esModule",{value:!0}),e);var ke={};fe(ke,{Copilot:()=>D,registerCompletion:()=>G,registerCopilot:()=>ue});module.exports=ye(ke);var H=["groq","openai","anthropic"],X={"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-20240620","claude-3-opus":"claude-3-opus-20240229","claude-3-sonnet":"claude-3-sonnet-20240229","claude-3-haiku":"claude-3-haiku-20240307","o1-preview":"o1-preview","o1-mini":"o1-mini"},$={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-preview","o1-mini"],anthropic:["claude-3.5-sonnet","claude-3-opus","claude-3-haiku","claude-3-sonnet"]},z="llama-3-70b",J="groq",Z={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages"},v=.1;var I=(e,t)=>{let o=null,r=null,n=(...i)=>new Promise((s,a)=>{o&&(clearTimeout(o),r&&r("Cancelled")),r=a,o=setTimeout(()=>{s(e(...i)),r=null},t)});return n.cancel=()=>{o&&(clearTimeout(o),r&&r("Cancelled"),o=null,r=null)},n},E=e=>!e||e.length===0?"":e.length===1?e[0]:`${e.slice(0,-1).join(", ")} and ${e.slice(-1)}`;var _=(e,t)=>t.getLineContent(e.lineNumber)[e.column-1];var L=(e,t)=>t.getLineContent(e.lineNumber).slice(e.column-1),P=(e,t)=>t.getLineContent(e.lineNumber).slice(0,e.column-1),Q=(e,t)=>t.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:e.lineNumber,endColumn:e.column}),ee=(e,t)=>t.getValueInRange({startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:t.getLineCount(),endColumn:t.getLineMaxColumn(t.getLineCount())}),V=(e,t,o={})=>{if(t<=0)return"";let r=e.split(`
2
2
  `),n=r.length;if(t>=n)return e;if(o.from==="end"){let s=r.slice(-t);return s.every(a=>a==="")?`
3
3
  `.repeat(t):s.join(`
4
4
  `)}let i=r.slice(0,t);return i.every(s=>s==="")?`
5
5
  `.repeat(t):i.join(`
6
- `)};var ee=async(e,t,o={})=>{let r={"Content-Type":"application/json",...o.headers},n=t==="POST"&&o.body?JSON.stringify(o.body):void 0,i=await fetch(e,{method:t,headers:r,body:n,signal:o.signal});if(!i.ok)throw new Error(`${i.statusText||o.fallbackError||"Network error"}`);return i.json()},Pe=(e,t)=>ee(e,"GET",t),Ee=(e,t,o)=>ee(e,"POST",{...o,body:t}),I={GET:Pe,POST:Ee};var te=(e,t)=>{let o=b(e,t).trim(),r=f(e,t).trim();return e.column<=3&&(o!==""||r!=="")};var Re="<user-current-cursor-position-is-here>",ye=e=>e==="javascript"?"JavaScript (ESNext)":e,xe=e=>`You are an expert ${ye(e.language)||x(e.technologies)} developer assistant with extensive experience in code completion and adhering to best coding practices. Your role is to provide precise and contextually relevant code completions without any errors, including syntax, punctuation, spaces, tabs, and line breaks. Focus on integrating seamlessly with the existing code and follow the user's instructions carefully.`,Te=e=>{let{filename:t="/",textBeforeCursor:o="",textAfterCursor:r="",relatedFiles:n,editorState:i}=e,p=`
6
+ `)};var te=async(e,t,o={})=>{let r={"Content-Type":"application/json",...o.headers},n=t==="POST"&&o.body?JSON.stringify(o.body):void 0,i=await fetch(e,{method:t,headers:r,body:n,signal:o.signal});if(!i.ok)throw new Error(`${i.statusText||o.fallbackError||"Network error"}`);return i.json()},Re=(e,t)=>te(e,"GET",t),xe=(e,t,o)=>te(e,"POST",{...o,body:t}),A={GET:Re,POST:xe};var oe=(e,t)=>{let o=L(e,t).trim(),r=P(e,t).trim();return e.column<=3&&(o!==""||r!=="")};var Te="<user-current-cursor-position-is-here>",Ee=e=>e==="javascript"?"JavaScript (ESNext)":e,Oe=e=>`You are an expert ${Ee(e.language)||E(e.technologies)} developer assistant with extensive experience in code completion and adhering to best coding practices. Your role is to provide precise and contextually relevant code completions without any errors, including syntax, punctuation, spaces, tabs, and line breaks. Focus on integrating seamlessly with the existing code and follow the user's instructions carefully.`,Me=e=>{let{filename:t="/",textBeforeCursor:o="",textAfterCursor:r="",relatedFiles:n,editorState:i}=e,p=`
7
7
  <guidelines>
8
8
  <instruction>${{continue:"Continue writing the code from where the cursor is positioned.",insert:"Insert the appropriate code snippet at the cursor position.",complete:"Provide the necessary code to complete the current statement or block."}[i.completionMode]}</instruction>
9
9
  <steps>
@@ -17,30 +17,30 @@
17
17
  <step>Return <strong>only</strong> the code required at the cursor position.</step>
18
18
  </steps>
19
19
  </guidelines>
20
- `,l=`
20
+ `,c=`
21
21
  <context>
22
22
  <current_file path="${t}">
23
23
  <code>
24
- ${o}${Re}${r}
24
+ ${o}${Te}${r}
25
25
  </code>
26
26
  </current_file>
27
27
  </context>
28
- `,m=n?.map(({path:c,content:u})=>`
29
- <related_file path="${c}">
28
+ `,u=n?.map(({path:l,content:C})=>`
29
+ <related_file path="${l}">
30
30
  <code>
31
- ${u}
31
+ ${C}
32
32
  </code>
33
33
  </related_file>
34
34
  `).join(`
35
35
  `)||"";return`
36
36
  <task>
37
37
  ${p}
38
- ${l}
39
- ${m}
38
+ ${c}
39
+ ${u}
40
40
  </task>
41
- `};function V(e){return{system:xe(e),user:Te(e)}}var oe={"claude-3.5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var Oe={createRequestBody:(e,t)=>{let r=e==="o1-preview"||e==="o1-mini"?[{role:"user",content:t.user}]:[{role:"system",content:t.system},{role:"user",content:t.user}];return{model:W(e),temperature:M,messages:r}},createHeaders:e=>({"Content-Type":"application/json",Authorization:`Bearer ${e}`}),parseCompletion:e=>e.choices?.length?e.choices[0].message.content:null},Me={createRequestBody:(e,t)=>({model:W(e),temperature:M,messages:[{role:"system",content:t.system},{role:"user",content:t.user}]}),createHeaders:e=>({"Content-Type":"application/json",Authorization:`Bearer ${e}`}),parseCompletion:e=>e.choices?.length?e.choices[0].message.content:null},ve={createRequestBody:(e,t)=>({model:W(e),temperature:M,system:t.system,messages:[{role:"user",content:t.user}],max_tokens:be(e)}),createHeaders:e=>({"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"}),parseCompletion:e=>!e.content||typeof e.content!="string"?null:e.content},j={openai:Oe,groq:Me,anthropic:ve},re=(e,t,o)=>j[t].createRequestBody(e,o),ne=(e,t)=>j[t].createHeaders(e),ie=(e,t)=>j[t].parseCompletion(e),W=e=>G[e],se=e=>z[e],be=e=>oe[e]||4096;var d=class d{constructor(){}static getInstance(){return d.instance}logError(t){let o,r;t instanceof Error?(o=t.message,r=t.stack):typeof t=="string"?o=t:o="An unknown error occurred";let n=`${d.RED}${d.BOLD}[MONACOPILOT ERROR] ${o}${d.RESET}`;return console.error(n),r&&console.error(`${d.RED}[MONACOPILOT ERROR] Stack trace:${d.RESET}
42
- ${r}`),{message:o,stack:r}}warn(t){console.warn(`${d.YELLOW}${d.BOLD}[MONACOPILOT WARN] ${t}${d.RESET}`)}log(t){console.log(`${d.BOLD}[MONACOPILOT] ${t}${d.RESET}`)}};d.instance=new d,d.RED="\x1B[31m",d.YELLOW="\x1B[33m",d.RESET="\x1B[0m",d.BOLD="\x1B[1m";var K=d,g=K.getInstance();var L=class{constructor(t,o={}){if(!t)throw new Error("Please provide an API key.");this.apiKey=t,this.provider=o.provider??X,this.model=o.model??J,this.validateInputs()}validateInputs(){if(!_.includes(this.provider))throw new Error(`Unsupported provider "${this.provider}". Please choose from: ${x(_)}. For custom models, provider specification is not needed.`);if(typeof this.model=="string"&&!$[this.provider].includes(this.model))throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${x($[this.provider])}`)}async complete(t){let{body:o,options:r}=t,{completionMetadata:n}=o,{headers:i={},customPrompt:s}=r??{},a=this.generatePrompt(n,s),{endpoint:p,requestBody:l,headers:m}=this.prepareRequestDetails(a);try{let c=await this.sendCompletionRequest(p,l,{...m,...i});return this.processCompletionResponse(c)}catch(c){return this.handleCompletionError(c)}}generatePrompt(t,o){let r=V(t);return o?{...r,...o(t)}:r}prepareRequestDetails(t){let o=se(this.provider),r,n=ne(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let i=this.model.config(this.apiKey,t);o=i.endpoint??o,r=i.body??{},n={...n,...i.headers}}else r=re(this.model,this.provider,t);return{endpoint:o,requestBody:r,headers:n}}async sendCompletionRequest(t,o,r){return I.POST(t,o,{headers:r})}processCompletionResponse(t){if(typeof this.model=="object"&&"transformResponse"in this.model){let o=this.model.transformResponse(t);return"completion"in o&&g.warn("The `completion` property in `transformResponse` function is deprecated. Please use `text` instead."),{completion:o.text??o.completion}}else return{completion:ie(t,this.provider)}}handleCompletionError(t){return{error:g.logError(t).message,completion:null}}};var A=class e{constructor(t){this.formattedCompletion="";this.formattedCompletion=t}static create(t){return new e(t)}setCompletion(t){return this.formattedCompletion=t,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}removeMarkdownCodeBlocks(t){let o=/```[\s\S]*?```/g,r=t,n;for(;(n=o.exec(t))!==null;){let i=n[0],s=i.split(`
41
+ `};function j(e){return{system:Oe(e),user:Me(e)}}var re={"claude-3.5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var be={createRequestBody:(e,t)=>{let r=e==="o1-preview"||e==="o1-mini"?[{role:"user",content:t.user}]:[{role:"system",content:t.system},{role:"user",content:t.user}];return{model:W(e),temperature:v,messages:r}},createHeaders:e=>({"Content-Type":"application/json",Authorization:`Bearer ${e}`}),parseCompletion:e=>e.choices?.length?e.choices[0].message.content:null},ve={createRequestBody:(e,t)=>({model:W(e),temperature:v,messages:[{role:"system",content:t.system},{role:"user",content:t.user}]}),createHeaders:e=>({"Content-Type":"application/json",Authorization:`Bearer ${e}`}),parseCompletion:e=>e.choices?.length?e.choices[0].message.content:null},Ie={createRequestBody:(e,t)=>({model:W(e),temperature:v,system:t.system,messages:[{role:"user",content:t.user}],max_tokens:Le(e)}),createHeaders:e=>({"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"}),parseCompletion:e=>!e.content||typeof e.content!="string"?null:e.content},U={openai:be,groq:ve,anthropic:Ie},ne=(e,t,o)=>U[t].createRequestBody(e,o),ie=(e,t)=>U[t].createHeaders(e),se=(e,t)=>U[t].parseCompletion(e),W=e=>X[e],le=e=>Z[e],Le=e=>re[e]||4096;var m=class m{constructor(){}static getInstance(){return m.instance}logError(t){let o,r;t instanceof Error?(o=t.message,r=t.stack):typeof t=="string"?o=t:o="An unknown error occurred";let n=`${m.RED}${m.BOLD}[MONACOPILOT ERROR] ${o}${m.RESET}`;return console.error(n),r&&console.error(`${m.RED}[MONACOPILOT ERROR] Stack trace:${m.RESET}
42
+ ${r}`),{message:o,stack:r}}warn(t){console.warn(`${m.YELLOW}${m.BOLD}[MONACOPILOT WARN] ${t}${m.RESET}`)}log(t){console.log(`${m.BOLD}[MONACOPILOT] ${t}${m.RESET}`)}};m.instance=new m,m.RED="\x1B[31m",m.YELLOW="\x1B[33m",m.RESET="\x1B[0m",m.BOLD="\x1B[1m";var K=m,g=K.getInstance();var D=class{constructor(t,o={}){if(!t)throw new Error("Please provide an API key.");this.apiKey=t,this.provider=o.provider??J,this.model=o.model??z,this.validateInputs()}validateInputs(){if(!H.includes(this.provider))throw new Error(`Unsupported provider "${this.provider}". Please choose from: ${E(H)}. For custom models, provider specification is not needed.`);if(typeof this.model=="string"&&!$[this.provider].includes(this.model))throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${E($[this.provider])}`)}async complete(t){let{body:o,options:r}=t,{completionMetadata:n}=o,{headers:i={},customPrompt:s}=r??{},a=this.generatePrompt(n,s),{endpoint:p,requestBody:c,headers:u}=this.prepareRequestDetails(a);try{let l=await this.sendCompletionRequest(p,c,{...u,...i});return this.processCompletionResponse(l)}catch(l){return this.handleCompletionError(l)}}generatePrompt(t,o){let r=j(t);return o?{...r,...o(t)}:r}prepareRequestDetails(t){let o=le(this.provider),r,n=ie(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let i=this.model.config(this.apiKey,t);o=i.endpoint??o,r=i.body??{},n={...n,...i.headers}}else r=ne(this.model,this.provider,t);return{endpoint:o,requestBody:r,headers:n}}async sendCompletionRequest(t,o,r){return A.POST(t,o,{headers:r})}processCompletionResponse(t){if(typeof this.model=="object"&&"transformResponse"in this.model){let o=this.model.transformResponse(t);return"completion"in o&&g.warn("The `completion` property in `transformResponse` function is deprecated. Please use `text` instead."),{completion:o.text??o.completion}}else return{completion:se(t,this.provider)}}handleCompletionError(t){return{error:g.logError(t).message,completion:null}}};var S=class e{constructor(t){this.formattedCompletion="";this.formattedCompletion=t}static create(t){return new e(t)}setCompletion(t){return this.formattedCompletion=t,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}removeMarkdownCodeBlocks(t){let o=/```[\s\S]*?```/g,r=t,n;for(;(n=o.exec(t))!==null;){let i=n[0],s=i.split(`
43
43
  `).slice(1,-1).join(`
44
44
  `);r=r.replace(i,s)}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
45
45
 
46
- `),this}build(){return this.formattedCompletion}};var D=class{constructor(t,o){this.cursorPos=t,this.mdl=o}shouldProvideCompletions(){return!te(this.cursorPos,this.mdl)}};var S=class S{constructor(){this.cache=[]}get(t,o){return this.cache.filter(r=>this.isValidCacheItem(r,t,o))}add(t){let o=[...this.cache.slice(-(S.MAX_CACHE_SIZE-1)),t];this.cache=o}clear(){this.cache=[]}isValidCacheItem(t,o,r){let n=r.getValueInRange(t.range);return f(o,r).startsWith(t.textBeforeCursorInLine)&&this.isPositionValid(t,o,n)}isPositionValid(t,o,r){let{range:n,completion:i}=t,{startLineNumber:s,startColumn:a,endColumn:p}=n,{lineNumber:l,column:m}=o,c=l===s&&m===a,u=i.startsWith(r)&&l===s&&m>=a-r.length&&m<=p+r.length;return c||u}};S.MAX_CACHE_SIZE=10;var N=S;var Ie="application/json",w=async({mdl:e,pos:t,...o})=>{let{endpoint:r,requestOptions:n,onError:i}=o,{headers:s}=n??{};try{let{completion:a,error:p}=await I.POST(r,{completionMetadata:Le({pos:t,mdl:e,options:o})},{headers:{"Content-Type":Ie,...s},fallbackError:"Error while fetching completion item"});if(p)throw new Error(p);return a}catch(a){return i?i(a):g.logError(a),null}},Le=({pos:e,mdl:t,options:o})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:a}=o,p=Ae(e,t),m=!!s?.length?3:2,c=a?Math.floor(a/m):void 0,u=(R,y,q)=>{let O=R(e,t);return y?U(O,y,q):O},C=(R,y)=>!R||!y?R:R.map(({content:q,...O})=>({...O,content:U(q,y)})),E=u(Z,c,{from:"end"}),k=u(Q,c),de=C(s,c);return{filename:r,language:n,technologies:i,relatedFiles:de,textBeforeCursor:E,textAfterCursor:k,cursorPosition:e,editorState:{completionMode:p}}},Ae=(e,t)=>{let o=H(e,t),r=b(e,t);return o?"insert":r.trim()?"complete":"continue"};var le=(e,t,o)=>{if(!o)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};let r=t.getOffsetAt(e),n=t.getValue().substring(r),i=0,s=0,a=0,p=o.length,l=n.length;if(r>=t.getValue().length)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};if(l===0)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};let m=Math.min(p,l);for(let C=0;C<m&&o[C]===n[C];C++)i++;for(let C=1;C<=m;C++){let E=o.slice(-C),k=n.slice(0,C);E===k&&(s=C)}if(a=Math.max(i,s),a===0)for(let C=1;C<p;C++){let E=o.substring(C);if(n.startsWith(E)){a=p-C;break}}let c=r+a,u=t.getPositionAt(c);return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:u.lineNumber,endColumn:u.column}},ae=e=>A.create(e).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),h=e=>({items:e,enableForwardStability:!0});var Ne=300,Se=600,we=0,Be={onTyping:v(w,Ne),onIdle:v(w,Se),onDemand:v(w,we)},B=new N,ke=async({mdl:e,pos:t,token:o,isCompletionAccepted:r,onShowCompletion:n,options:i})=>{let{trigger:s="onIdle",...a}=i;if(!new D(t,e).shouldProvideCompletions())return h([]);let p=B.get(t,e).map(l=>({insertText:l.completion,range:{...l.range,endColumn:t.column}}));if(p.length>0)return n(),h(p);if(o.isCancellationRequested||r)return h([]);try{let l=Be[s];o.onCancellationRequested(()=>{l.cancel()});let m=await l({mdl:e,pos:t,...a});if(m){let c=ae(m),u=le(t,e,c);return B.add({completion:c,range:u,textBeforeCursorInLine:f(t,e)}),n(),h([{insertText:c,range:u}])}}catch(l){return i.onError?i.onError(l):qe(l)||g.logError(l),h([])}return h([])},qe=e=>typeof e=="string"&&(e==="Cancelled"||e==="AbortError")||e instanceof Error&&(e.message==="Cancelled"||e.name==="AbortError"),pe=ke;var P=new WeakMap,T=null,Y=(e,t,o)=>{T&&T.deregister();let r=[],n={isCompletionAccepted:!1,isCompletionVisible:!1,isManualTrigger:!1};P.set(t,n),t.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let i=e.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(p,l,m,c)=>{let u=P.get(t);if(!(!u||o.trigger==="onDemand"&&!u.isManualTrigger))return pe({mdl:p,pos:l,token:c,isCompletionAccepted:u.isCompletionAccepted,onShowCompletion:()=>{u.isCompletionVisible=!0,u.isManualTrigger=!1},options:o})},freeInlineCompletions:()=>{}});r.push(i);let s=t.onKeyDown(p=>{let l=P.get(t);if(!l)return;let m=p.keyCode===e.KeyCode.Tab||p.keyCode===e.KeyCode.RightArrow&&p.metaKey;l.isCompletionVisible&&m?(l.isCompletionAccepted=!0,l.isCompletionVisible=!1):l.isCompletionAccepted=!1});r.push(s);let a={deregister:()=>{r.forEach(p=>p.dispose()),B.clear(),P.delete(t),T=null},trigger:()=>Fe(t)};return T=a,a}catch(i){return o.onError?o.onError(i):g.logError(i),{deregister:()=>{r.forEach(s=>s.dispose()),P.delete(t),T=null},trigger:()=>{}}}},Fe=e=>{let t=P.get(e);if(!t){g.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}t.isManualTrigger=!0,e.trigger("keyboard","editor.action.inlineSuggest.trigger",{})},ce=(...e)=>(g.warn("The `registerCopilot` function is deprecated. Use `registerCompletion` instead."),Y(...e));0&&(module.exports={Copilot,registerCompletion,registerCopilot});
46
+ `),this}build(){return this.formattedCompletion}};var w=class{constructor(t,o){this.cursorPos=t,this.mdl=o}shouldProvideCompletions(){return!oe(this.cursorPos,this.mdl)}};var B=class B{constructor(){this.cache=[]}get(t,o){return this.cache.filter(r=>this.isValidCacheItem(r,t,o))}add(t){let o=[...this.cache.slice(-(B.MAX_CACHE_SIZE-1)),t];this.cache=o}clear(){this.cache=[]}isValidCacheItem(t,o,r){let n=r.getValueInRange(t.range);return P(o,r).startsWith(t.textBeforeCursorInLine)&&this.isPositionValid(t,o,n)}isPositionValid(t,o,r){let{range:n,completion:i}=t,{startLineNumber:s,startColumn:a,endColumn:p}=n,{lineNumber:c,column:u}=o,l=c===s&&u===a,C=i.startsWith(r)&&c===s&&u>=a-r.length&&u<=p+r.length;return l||C}};B.MAX_CACHE_SIZE=10;var N=B;var Ae="application/json",ae=async e=>{let{endpoint:t,body:o}=e,{completion:r,error:n}=await A.POST(t,o,{headers:{"Content-Type":Ae},fallbackError:"Error while fetching completion item"});if(n)throw new Error(n);return{completion:r}},pe=({pos:e,mdl:t,options:o})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:a}=o,p=De(e,t),u=!!s?.length?3:2,l=a?Math.floor(a/u):void 0,C=(x,T,k)=>{let b=x(e,t);return T?V(b,T,k):b},d=(x,T)=>!x||!T?x:x.map(({content:k,...b})=>({...b,content:V(k,T)})),h=C(Q,l,{from:"end"}),f=C(ee,l),M=d(s,l);return{filename:r,language:n,technologies:i,relatedFiles:M,textBeforeCursor:h,textAfterCursor:f,cursorPosition:e,editorState:{completionMode:p}}},De=(e,t)=>{let o=_(e,t),r=L(e,t);return o?"insert":r.trim()?"complete":"continue"};var ce=(e,t,o)=>{if(!o)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};let r=t.getOffsetAt(e),n=t.getValue().substring(r),i=0,s=0,a=0,p=o.length,c=n.length;if(r>=t.getValue().length)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};if(c===0)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};let u=Math.min(p,c);for(let d=0;d<u&&o[d]===n[d];d++)i++;for(let d=1;d<=u;d++){let h=o.slice(-d),f=n.slice(0,d);h===f&&(s=d)}if(a=Math.max(i,s),a===0)for(let d=1;d<p;d++){let h=o.substring(d);if(n.startsWith(h)){a=p-d;break}}let l=r+a,C=t.getPositionAt(l);return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:C.lineNumber,endColumn:C.column}},de=e=>S.create(e).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),y=e=>({items:e,enableForwardStability:!0});var Y={onTyping:300,onIdle:600,onDemand:0},we=e=>({onTyping:I(e,Y.onTyping),onIdle:I(e,Y.onIdle),onDemand:I(e,Y.onDemand)}),F=new N,Ne=async({mdl:e,pos:t,token:o,isCompletionAccepted:r,onShowCompletion:n,options:i})=>{let{trigger:s="onIdle",endpoint:a,onError:p,requestHandler:c}=i;if(!new w(t,e).shouldProvideCompletions())return y([]);let u=F.get(t,e).map(l=>({insertText:l.completion,range:{...l.range,endColumn:t.column}}));if(u.length>0)return n(),y(u);if(o.isCancellationRequested||r)return y([]);try{let C=we(c??ae)[s];o.onCancellationRequested(()=>{C.cancel()});let d=pe({pos:t,mdl:e,options:i}),{completion:h}=await C({endpoint:a,body:{completionMetadata:d}});if(h){let f=de(h),M=ce(t,e,f);return F.add({completion:f,range:M,textBeforeCursorInLine:P(t,e)}),n(),y([{insertText:f,range:M}])}}catch(l){p?p(l):Be(l)||g.logError(l)}return y([])},Be=e=>typeof e=="string"?e==="Cancelled"||e==="AbortError":e instanceof Error?e.message==="Cancelled"||e.name==="AbortError":!1,me=Ne;var R=new WeakMap,O=null,G=(e,t,o)=>{O&&O.deregister();let r=[],n={isCompletionAccepted:!1,isCompletionVisible:!1,isManualTrigger:!1};R.set(t,n),t.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let i=e.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(p,c,u,l)=>{let C=R.get(t);if(!(!C||o.trigger==="onDemand"&&!C.isManualTrigger))return me({mdl:p,pos:c,token:l,isCompletionAccepted:C.isCompletionAccepted,onShowCompletion:()=>{C.isCompletionVisible=!0,C.isManualTrigger=!1},options:o})},freeInlineCompletions:()=>{}});r.push(i);let s=t.onKeyDown(p=>{let c=R.get(t);if(!c)return;let u=p.keyCode===e.KeyCode.Tab||p.keyCode===e.KeyCode.RightArrow&&p.metaKey;c.isCompletionVisible&&u?(c.isCompletionAccepted=!0,c.isCompletionVisible=!1):c.isCompletionAccepted=!1});r.push(s);let a={deregister:()=>{r.forEach(p=>p.dispose()),F.clear(),R.delete(t),O=null},trigger:()=>Fe(t)};return O=a,a}catch(i){return o.onError?o.onError(i):g.logError(i),{deregister:()=>{r.forEach(s=>s.dispose()),R.delete(t),O=null},trigger:()=>{}}}},Fe=e=>{let t=R.get(e);if(!t){g.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}t.isManualTrigger=!0,e.trigger("keyboard","editor.action.inlineSuggest.trigger",{})},ue=(...e)=>(g.warn("The `registerCopilot` function is deprecated. Use `registerCompletion` instead."),G(...e));0&&(module.exports={Copilot,registerCompletion,registerCopilot});
package/build/index.mjs CHANGED
@@ -1,11 +1,11 @@
1
- var q=["groq","openai","anthropic"],K={"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-20240620","claude-3-opus":"claude-3-opus-20240229","claude-3-sonnet":"claude-3-sonnet-20240229","claude-3-haiku":"claude-3-haiku-20240307","o1-preview":"o1-preview","o1-mini":"o1-mini"},F={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-preview","o1-mini"],anthropic:["claude-3.5-sonnet","claude-3-opus","claude-3-haiku","claude-3-sonnet"]},Y="llama-3-70b",G="groq",J={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages"},M=.1;var v=(e,t)=>{let o=null,r=null,i=(...n)=>new Promise((s,a)=>{o&&(clearTimeout(o),r&&r("Cancelled")),r=a,o=setTimeout(()=>{s(e(...n)),r=null},t)});return i.cancel=()=>{o&&(clearTimeout(o),r&&r("Cancelled"),o=null,r=null)},i},x=e=>!e||e.length===0?"":e.length===1?e[0]:`${e.slice(0,-1).join(", ")} and ${e.slice(-1)}`;var _=(e,t)=>t.getLineContent(e.lineNumber)[e.column-1];var b=(e,t)=>t.getLineContent(e.lineNumber).slice(e.column-1),f=(e,t)=>t.getLineContent(e.lineNumber).slice(0,e.column-1),X=(e,t)=>t.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:e.lineNumber,endColumn:e.column}),z=(e,t)=>t.getValueInRange({startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:t.getLineCount(),endColumn:t.getLineMaxColumn(t.getLineCount())}),$=(e,t,o={})=>{if(t<=0)return"";let r=e.split(`
2
- `),i=r.length;if(t>=i)return e;if(o.from==="end"){let s=r.slice(-t);return s.every(a=>a==="")?`
1
+ var k=["groq","openai","anthropic"],Y={"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-20240620","claude-3-opus":"claude-3-opus-20240229","claude-3-sonnet":"claude-3-sonnet-20240229","claude-3-haiku":"claude-3-haiku-20240307","o1-preview":"o1-preview","o1-mini":"o1-mini"},q={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-preview","o1-mini"],anthropic:["claude-3.5-sonnet","claude-3-opus","claude-3-haiku","claude-3-sonnet"]},G="llama-3-70b",X="groq",z={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages"},v=.1;var I=(e,t)=>{let o=null,r=null,n=(...i)=>new Promise((s,a)=>{o&&(clearTimeout(o),r&&r("Cancelled")),r=a,o=setTimeout(()=>{s(e(...i)),r=null},t)});return n.cancel=()=>{o&&(clearTimeout(o),r&&r("Cancelled"),o=null,r=null)},n},E=e=>!e||e.length===0?"":e.length===1?e[0]:`${e.slice(0,-1).join(", ")} and ${e.slice(-1)}`;var H=(e,t)=>t.getLineContent(e.lineNumber)[e.column-1];var L=(e,t)=>t.getLineContent(e.lineNumber).slice(e.column-1),P=(e,t)=>t.getLineContent(e.lineNumber).slice(0,e.column-1),J=(e,t)=>t.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:e.lineNumber,endColumn:e.column}),Z=(e,t)=>t.getValueInRange({startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:t.getLineCount(),endColumn:t.getLineMaxColumn(t.getLineCount())}),$=(e,t,o={})=>{if(t<=0)return"";let r=e.split(`
2
+ `),n=r.length;if(t>=n)return e;if(o.from==="end"){let s=r.slice(-t);return s.every(a=>a==="")?`
3
3
  `.repeat(t):s.join(`
4
- `)}let n=r.slice(0,t);return n.every(s=>s==="")?`
5
- `.repeat(t):n.join(`
6
- `)};var Z=async(e,t,o={})=>{let r={"Content-Type":"application/json",...o.headers},i=t==="POST"&&o.body?JSON.stringify(o.body):void 0,n=await fetch(e,{method:t,headers:r,body:i,signal:o.signal});if(!n.ok)throw new Error(`${n.statusText||o.fallbackError||"Network error"}`);return n.json()},ce=(e,t)=>Z(e,"GET",t),de=(e,t,o)=>Z(e,"POST",{...o,body:t}),I={GET:ce,POST:de};var Q=(e,t)=>{let o=b(e,t).trim(),r=f(e,t).trim();return e.column<=3&&(o!==""||r!=="")};var me="<user-current-cursor-position-is-here>",ue=e=>e==="javascript"?"JavaScript (ESNext)":e,Ce=e=>`You are an expert ${ue(e.language)||x(e.technologies)} developer assistant with extensive experience in code completion and adhering to best coding practices. Your role is to provide precise and contextually relevant code completions without any errors, including syntax, punctuation, spaces, tabs, and line breaks. Focus on integrating seamlessly with the existing code and follow the user's instructions carefully.`,ge=e=>{let{filename:t="/",textBeforeCursor:o="",textAfterCursor:r="",relatedFiles:i,editorState:n}=e,p=`
4
+ `)}let i=r.slice(0,t);return i.every(s=>s==="")?`
5
+ `.repeat(t):i.join(`
6
+ `)};var Q=async(e,t,o={})=>{let r={"Content-Type":"application/json",...o.headers},n=t==="POST"&&o.body?JSON.stringify(o.body):void 0,i=await fetch(e,{method:t,headers:r,body:n,signal:o.signal});if(!i.ok)throw new Error(`${i.statusText||o.fallbackError||"Network error"}`);return i.json()},me=(e,t)=>Q(e,"GET",t),ue=(e,t,o)=>Q(e,"POST",{...o,body:t}),A={GET:me,POST:ue};var ee=(e,t)=>{let o=L(e,t).trim(),r=P(e,t).trim();return e.column<=3&&(o!==""||r!=="")};var Ce="<user-current-cursor-position-is-here>",ge=e=>e==="javascript"?"JavaScript (ESNext)":e,he=e=>`You are an expert ${ge(e.language)||E(e.technologies)} developer assistant with extensive experience in code completion and adhering to best coding practices. Your role is to provide precise and contextually relevant code completions without any errors, including syntax, punctuation, spaces, tabs, and line breaks. Focus on integrating seamlessly with the existing code and follow the user's instructions carefully.`,fe=e=>{let{filename:t="/",textBeforeCursor:o="",textAfterCursor:r="",relatedFiles:n,editorState:i}=e,p=`
7
7
  <guidelines>
8
- <instruction>${{continue:"Continue writing the code from where the cursor is positioned.",insert:"Insert the appropriate code snippet at the cursor position.",complete:"Provide the necessary code to complete the current statement or block."}[n.completionMode]}</instruction>
8
+ <instruction>${{continue:"Continue writing the code from where the cursor is positioned.",insert:"Insert the appropriate code snippet at the cursor position.",complete:"Provide the necessary code to complete the current statement or block."}[i.completionMode]}</instruction>
9
9
  <steps>
10
10
  <step>Analyze the provided code and any related files thoroughly.</step>
11
11
  <step>Ensure the generated code integrates seamlessly with the existing code.</step>
@@ -17,30 +17,30 @@ var q=["groq","openai","anthropic"],K={"llama-3-70b":"llama3-70b-8192","gpt-4o":
17
17
  <step>Return <strong>only</strong> the code required at the cursor position.</step>
18
18
  </steps>
19
19
  </guidelines>
20
- `,l=`
20
+ `,c=`
21
21
  <context>
22
22
  <current_file path="${t}">
23
23
  <code>
24
- ${o}${me}${r}
24
+ ${o}${Ce}${r}
25
25
  </code>
26
26
  </current_file>
27
27
  </context>
28
- `,m=i?.map(({path:c,content:u})=>`
29
- <related_file path="${c}">
28
+ `,u=n?.map(({path:l,content:C})=>`
29
+ <related_file path="${l}">
30
30
  <code>
31
- ${u}
31
+ ${C}
32
32
  </code>
33
33
  </related_file>
34
34
  `).join(`
35
35
  `)||"";return`
36
36
  <task>
37
37
  ${p}
38
- ${l}
39
- ${m}
38
+ ${c}
39
+ ${u}
40
40
  </task>
41
- `};function H(e){return{system:Ce(e),user:ge(e)}}var ee={"claude-3.5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var he={createRequestBody:(e,t)=>{let r=e==="o1-preview"||e==="o1-mini"?[{role:"user",content:t.user}]:[{role:"system",content:t.system},{role:"user",content:t.user}];return{model:V(e),temperature:M,messages:r}},createHeaders:e=>({"Content-Type":"application/json",Authorization:`Bearer ${e}`}),parseCompletion:e=>e.choices?.length?e.choices[0].message.content:null},fe={createRequestBody:(e,t)=>({model:V(e),temperature:M,messages:[{role:"system",content:t.system},{role:"user",content:t.user}]}),createHeaders:e=>({"Content-Type":"application/json",Authorization:`Bearer ${e}`}),parseCompletion:e=>e.choices?.length?e.choices[0].message.content:null},Pe={createRequestBody:(e,t)=>({model:V(e),temperature:M,system:t.system,messages:[{role:"user",content:t.user}],max_tokens:Ee(e)}),createHeaders:e=>({"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"}),parseCompletion:e=>!e.content||typeof e.content!="string"?null:e.content},U={openai:he,groq:fe,anthropic:Pe},te=(e,t,o)=>U[t].createRequestBody(e,o),oe=(e,t)=>U[t].createHeaders(e),re=(e,t)=>U[t].parseCompletion(e),V=e=>K[e],ne=e=>J[e],Ee=e=>ee[e]||4096;var d=class d{constructor(){}static getInstance(){return d.instance}logError(t){let o,r;t instanceof Error?(o=t.message,r=t.stack):typeof t=="string"?o=t:o="An unknown error occurred";let i=`${d.RED}${d.BOLD}[MONACOPILOT ERROR] ${o}${d.RESET}`;return console.error(i),r&&console.error(`${d.RED}[MONACOPILOT ERROR] Stack trace:${d.RESET}
42
- ${r}`),{message:o,stack:r}}warn(t){console.warn(`${d.YELLOW}${d.BOLD}[MONACOPILOT WARN] ${t}${d.RESET}`)}log(t){console.log(`${d.BOLD}[MONACOPILOT] ${t}${d.RESET}`)}};d.instance=new d,d.RED="\x1B[31m",d.YELLOW="\x1B[33m",d.RESET="\x1B[0m",d.BOLD="\x1B[1m";var j=d,g=j.getInstance();var W=class{constructor(t,o={}){if(!t)throw new Error("Please provide an API key.");this.apiKey=t,this.provider=o.provider??G,this.model=o.model??Y,this.validateInputs()}validateInputs(){if(!q.includes(this.provider))throw new Error(`Unsupported provider "${this.provider}". Please choose from: ${x(q)}. For custom models, provider specification is not needed.`);if(typeof this.model=="string"&&!F[this.provider].includes(this.model))throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${x(F[this.provider])}`)}async complete(t){let{body:o,options:r}=t,{completionMetadata:i}=o,{headers:n={},customPrompt:s}=r??{},a=this.generatePrompt(i,s),{endpoint:p,requestBody:l,headers:m}=this.prepareRequestDetails(a);try{let c=await this.sendCompletionRequest(p,l,{...m,...n});return this.processCompletionResponse(c)}catch(c){return this.handleCompletionError(c)}}generatePrompt(t,o){let r=H(t);return o?{...r,...o(t)}:r}prepareRequestDetails(t){let o=ne(this.provider),r,i=oe(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let n=this.model.config(this.apiKey,t);o=n.endpoint??o,r=n.body??{},i={...i,...n.headers}}else r=te(this.model,this.provider,t);return{endpoint:o,requestBody:r,headers:i}}async sendCompletionRequest(t,o,r){return I.POST(t,o,{headers:r})}processCompletionResponse(t){if(typeof this.model=="object"&&"transformResponse"in this.model){let o=this.model.transformResponse(t);return"completion"in o&&g.warn("The `completion` property in `transformResponse` function is deprecated. Please use `text` instead."),{completion:o.text??o.completion}}else return{completion:re(t,this.provider)}}handleCompletionError(t){return{error:g.logError(t).message,completion:null}}};var L=class e{constructor(t){this.formattedCompletion="";this.formattedCompletion=t}static create(t){return new e(t)}setCompletion(t){return this.formattedCompletion=t,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}removeMarkdownCodeBlocks(t){let o=/```[\s\S]*?```/g,r=t,i;for(;(i=o.exec(t))!==null;){let n=i[0],s=n.split(`
41
+ `};function _(e){return{system:he(e),user:fe(e)}}var te={"claude-3.5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var Pe={createRequestBody:(e,t)=>{let r=e==="o1-preview"||e==="o1-mini"?[{role:"user",content:t.user}]:[{role:"system",content:t.system},{role:"user",content:t.user}];return{model:j(e),temperature:v,messages:r}},createHeaders:e=>({"Content-Type":"application/json",Authorization:`Bearer ${e}`}),parseCompletion:e=>e.choices?.length?e.choices[0].message.content:null},ye={createRequestBody:(e,t)=>({model:j(e),temperature:v,messages:[{role:"system",content:t.system},{role:"user",content:t.user}]}),createHeaders:e=>({"Content-Type":"application/json",Authorization:`Bearer ${e}`}),parseCompletion:e=>e.choices?.length?e.choices[0].message.content:null},Re={createRequestBody:(e,t)=>({model:j(e),temperature:v,system:t.system,messages:[{role:"user",content:t.user}],max_tokens:xe(e)}),createHeaders:e=>({"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"}),parseCompletion:e=>!e.content||typeof e.content!="string"?null:e.content},V={openai:Pe,groq:ye,anthropic:Re},oe=(e,t,o)=>V[t].createRequestBody(e,o),re=(e,t)=>V[t].createHeaders(e),ne=(e,t)=>V[t].parseCompletion(e),j=e=>Y[e],ie=e=>z[e],xe=e=>te[e]||4096;var m=class m{constructor(){}static getInstance(){return m.instance}logError(t){let o,r;t instanceof Error?(o=t.message,r=t.stack):typeof t=="string"?o=t:o="An unknown error occurred";let n=`${m.RED}${m.BOLD}[MONACOPILOT ERROR] ${o}${m.RESET}`;return console.error(n),r&&console.error(`${m.RED}[MONACOPILOT ERROR] Stack trace:${m.RESET}
42
+ ${r}`),{message:o,stack:r}}warn(t){console.warn(`${m.YELLOW}${m.BOLD}[MONACOPILOT WARN] ${t}${m.RESET}`)}log(t){console.log(`${m.BOLD}[MONACOPILOT] ${t}${m.RESET}`)}};m.instance=new m,m.RED="\x1B[31m",m.YELLOW="\x1B[33m",m.RESET="\x1B[0m",m.BOLD="\x1B[1m";var U=m,g=U.getInstance();var W=class{constructor(t,o={}){if(!t)throw new Error("Please provide an API key.");this.apiKey=t,this.provider=o.provider??X,this.model=o.model??G,this.validateInputs()}validateInputs(){if(!k.includes(this.provider))throw new Error(`Unsupported provider "${this.provider}". Please choose from: ${E(k)}. For custom models, provider specification is not needed.`);if(typeof this.model=="string"&&!q[this.provider].includes(this.model))throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${E(q[this.provider])}`)}async complete(t){let{body:o,options:r}=t,{completionMetadata:n}=o,{headers:i={},customPrompt:s}=r??{},a=this.generatePrompt(n,s),{endpoint:p,requestBody:c,headers:u}=this.prepareRequestDetails(a);try{let l=await this.sendCompletionRequest(p,c,{...u,...i});return this.processCompletionResponse(l)}catch(l){return this.handleCompletionError(l)}}generatePrompt(t,o){let r=_(t);return o?{...r,...o(t)}:r}prepareRequestDetails(t){let o=ie(this.provider),r,n=re(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let i=this.model.config(this.apiKey,t);o=i.endpoint??o,r=i.body??{},n={...n,...i.headers}}else r=oe(this.model,this.provider,t);return{endpoint:o,requestBody:r,headers:n}}async sendCompletionRequest(t,o,r){return A.POST(t,o,{headers:r})}processCompletionResponse(t){if(typeof this.model=="object"&&"transformResponse"in this.model){let o=this.model.transformResponse(t);return"completion"in o&&g.warn("The `completion` property in `transformResponse` function is deprecated. Please use `text` instead."),{completion:o.text??o.completion}}else return{completion:ne(t,this.provider)}}handleCompletionError(t){return{error:g.logError(t).message,completion:null}}};var D=class e{constructor(t){this.formattedCompletion="";this.formattedCompletion=t}static create(t){return new e(t)}setCompletion(t){return this.formattedCompletion=t,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}removeMarkdownCodeBlocks(t){let o=/```[\s\S]*?```/g,r=t,n;for(;(n=o.exec(t))!==null;){let i=n[0],s=i.split(`
43
43
  `).slice(1,-1).join(`
44
- `);r=r.replace(n,s)}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
44
+ `);r=r.replace(i,s)}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
45
45
 
46
- `),this}build(){return this.formattedCompletion}};var A=class{constructor(t,o){this.cursorPos=t,this.mdl=o}shouldProvideCompletions(){return!Q(this.cursorPos,this.mdl)}};var N=class N{constructor(){this.cache=[]}get(t,o){return this.cache.filter(r=>this.isValidCacheItem(r,t,o))}add(t){let o=[...this.cache.slice(-(N.MAX_CACHE_SIZE-1)),t];this.cache=o}clear(){this.cache=[]}isValidCacheItem(t,o,r){let i=r.getValueInRange(t.range);return f(o,r).startsWith(t.textBeforeCursorInLine)&&this.isPositionValid(t,o,i)}isPositionValid(t,o,r){let{range:i,completion:n}=t,{startLineNumber:s,startColumn:a,endColumn:p}=i,{lineNumber:l,column:m}=o,c=l===s&&m===a,u=n.startsWith(r)&&l===s&&m>=a-r.length&&m<=p+r.length;return c||u}};N.MAX_CACHE_SIZE=10;var D=N;var Re="application/json",S=async({mdl:e,pos:t,...o})=>{let{endpoint:r,requestOptions:i,onError:n}=o,{headers:s}=i??{};try{let{completion:a,error:p}=await I.POST(r,{completionMetadata:ye({pos:t,mdl:e,options:o})},{headers:{"Content-Type":Re,...s},fallbackError:"Error while fetching completion item"});if(p)throw new Error(p);return a}catch(a){return n?n(a):g.logError(a),null}},ye=({pos:e,mdl:t,options:o})=>{let{filename:r,language:i,technologies:n,relatedFiles:s,maxContextLines:a}=o,p=xe(e,t),m=!!s?.length?3:2,c=a?Math.floor(a/m):void 0,u=(R,y,k)=>{let O=R(e,t);return y?$(O,y,k):O},C=(R,y)=>!R||!y?R:R.map(({content:k,...O})=>({...O,content:$(k,y)})),E=u(X,c,{from:"end"}),B=u(z,c),pe=C(s,c);return{filename:r,language:i,technologies:n,relatedFiles:pe,textBeforeCursor:E,textAfterCursor:B,cursorPosition:e,editorState:{completionMode:p}}},xe=(e,t)=>{let o=_(e,t),r=b(e,t);return o?"insert":r.trim()?"complete":"continue"};var ie=(e,t,o)=>{if(!o)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};let r=t.getOffsetAt(e),i=t.getValue().substring(r),n=0,s=0,a=0,p=o.length,l=i.length;if(r>=t.getValue().length)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};if(l===0)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};let m=Math.min(p,l);for(let C=0;C<m&&o[C]===i[C];C++)n++;for(let C=1;C<=m;C++){let E=o.slice(-C),B=i.slice(0,C);E===B&&(s=C)}if(a=Math.max(n,s),a===0)for(let C=1;C<p;C++){let E=o.substring(C);if(i.startsWith(E)){a=p-C;break}}let c=r+a,u=t.getPositionAt(c);return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:u.lineNumber,endColumn:u.column}},se=e=>L.create(e).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),h=e=>({items:e,enableForwardStability:!0});var Oe=300,Me=600,ve=0,be={onTyping:v(S,Oe),onIdle:v(S,Me),onDemand:v(S,ve)},w=new D,Ie=async({mdl:e,pos:t,token:o,isCompletionAccepted:r,onShowCompletion:i,options:n})=>{let{trigger:s="onIdle",...a}=n;if(!new A(t,e).shouldProvideCompletions())return h([]);let p=w.get(t,e).map(l=>({insertText:l.completion,range:{...l.range,endColumn:t.column}}));if(p.length>0)return i(),h(p);if(o.isCancellationRequested||r)return h([]);try{let l=be[s];o.onCancellationRequested(()=>{l.cancel()});let m=await l({mdl:e,pos:t,...a});if(m){let c=se(m),u=ie(t,e,c);return w.add({completion:c,range:u,textBeforeCursorInLine:f(t,e)}),i(),h([{insertText:c,range:u}])}}catch(l){return n.onError?n.onError(l):Le(l)||g.logError(l),h([])}return h([])},Le=e=>typeof e=="string"&&(e==="Cancelled"||e==="AbortError")||e instanceof Error&&(e.message==="Cancelled"||e.name==="AbortError"),le=Ie;var P=new WeakMap,T=null,ae=(e,t,o)=>{T&&T.deregister();let r=[],i={isCompletionAccepted:!1,isCompletionVisible:!1,isManualTrigger:!1};P.set(t,i),t.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let n=e.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(p,l,m,c)=>{let u=P.get(t);if(!(!u||o.trigger==="onDemand"&&!u.isManualTrigger))return le({mdl:p,pos:l,token:c,isCompletionAccepted:u.isCompletionAccepted,onShowCompletion:()=>{u.isCompletionVisible=!0,u.isManualTrigger=!1},options:o})},freeInlineCompletions:()=>{}});r.push(n);let s=t.onKeyDown(p=>{let l=P.get(t);if(!l)return;let m=p.keyCode===e.KeyCode.Tab||p.keyCode===e.KeyCode.RightArrow&&p.metaKey;l.isCompletionVisible&&m?(l.isCompletionAccepted=!0,l.isCompletionVisible=!1):l.isCompletionAccepted=!1});r.push(s);let a={deregister:()=>{r.forEach(p=>p.dispose()),w.clear(),P.delete(t),T=null},trigger:()=>Ae(t)};return T=a,a}catch(n){return o.onError?o.onError(n):g.logError(n),{deregister:()=>{r.forEach(s=>s.dispose()),P.delete(t),T=null},trigger:()=>{}}}},Ae=e=>{let t=P.get(e);if(!t){g.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}t.isManualTrigger=!0,e.trigger("keyboard","editor.action.inlineSuggest.trigger",{})},De=(...e)=>(g.warn("The `registerCopilot` function is deprecated. Use `registerCompletion` instead."),ae(...e));export{W as Copilot,ae as registerCompletion,De as registerCopilot};
46
+ `),this}build(){return this.formattedCompletion}};var S=class{constructor(t,o){this.cursorPos=t,this.mdl=o}shouldProvideCompletions(){return!ee(this.cursorPos,this.mdl)}};var N=class N{constructor(){this.cache=[]}get(t,o){return this.cache.filter(r=>this.isValidCacheItem(r,t,o))}add(t){let o=[...this.cache.slice(-(N.MAX_CACHE_SIZE-1)),t];this.cache=o}clear(){this.cache=[]}isValidCacheItem(t,o,r){let n=r.getValueInRange(t.range);return P(o,r).startsWith(t.textBeforeCursorInLine)&&this.isPositionValid(t,o,n)}isPositionValid(t,o,r){let{range:n,completion:i}=t,{startLineNumber:s,startColumn:a,endColumn:p}=n,{lineNumber:c,column:u}=o,l=c===s&&u===a,C=i.startsWith(r)&&c===s&&u>=a-r.length&&u<=p+r.length;return l||C}};N.MAX_CACHE_SIZE=10;var w=N;var Te="application/json",se=async e=>{let{endpoint:t,body:o}=e,{completion:r,error:n}=await A.POST(t,o,{headers:{"Content-Type":Te},fallbackError:"Error while fetching completion item"});if(n)throw new Error(n);return{completion:r}},le=({pos:e,mdl:t,options:o})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:a}=o,p=Ee(e,t),u=!!s?.length?3:2,l=a?Math.floor(a/u):void 0,C=(x,T,F)=>{let b=x(e,t);return T?$(b,T,F):b},d=(x,T)=>!x||!T?x:x.map(({content:F,...b})=>({...b,content:$(F,T)})),h=C(J,l,{from:"end"}),f=C(Z,l),M=d(s,l);return{filename:r,language:n,technologies:i,relatedFiles:M,textBeforeCursor:h,textAfterCursor:f,cursorPosition:e,editorState:{completionMode:p}}},Ee=(e,t)=>{let o=H(e,t),r=L(e,t);return o?"insert":r.trim()?"complete":"continue"};var ae=(e,t,o)=>{if(!o)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};let r=t.getOffsetAt(e),n=t.getValue().substring(r),i=0,s=0,a=0,p=o.length,c=n.length;if(r>=t.getValue().length)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};if(c===0)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};let u=Math.min(p,c);for(let d=0;d<u&&o[d]===n[d];d++)i++;for(let d=1;d<=u;d++){let h=o.slice(-d),f=n.slice(0,d);h===f&&(s=d)}if(a=Math.max(i,s),a===0)for(let d=1;d<p;d++){let h=o.substring(d);if(n.startsWith(h)){a=p-d;break}}let l=r+a,C=t.getPositionAt(l);return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:C.lineNumber,endColumn:C.column}},pe=e=>D.create(e).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),y=e=>({items:e,enableForwardStability:!0});var K={onTyping:300,onIdle:600,onDemand:0},Me=e=>({onTyping:I(e,K.onTyping),onIdle:I(e,K.onIdle),onDemand:I(e,K.onDemand)}),B=new w,be=async({mdl:e,pos:t,token:o,isCompletionAccepted:r,onShowCompletion:n,options:i})=>{let{trigger:s="onIdle",endpoint:a,onError:p,requestHandler:c}=i;if(!new S(t,e).shouldProvideCompletions())return y([]);let u=B.get(t,e).map(l=>({insertText:l.completion,range:{...l.range,endColumn:t.column}}));if(u.length>0)return n(),y(u);if(o.isCancellationRequested||r)return y([]);try{let C=Me(c??se)[s];o.onCancellationRequested(()=>{C.cancel()});let d=le({pos:t,mdl:e,options:i}),{completion:h}=await C({endpoint:a,body:{completionMetadata:d}});if(h){let f=pe(h),M=ae(t,e,f);return B.add({completion:f,range:M,textBeforeCursorInLine:P(t,e)}),n(),y([{insertText:f,range:M}])}}catch(l){p?p(l):ve(l)||g.logError(l)}return y([])},ve=e=>typeof e=="string"?e==="Cancelled"||e==="AbortError":e instanceof Error?e.message==="Cancelled"||e.name==="AbortError":!1,ce=be;var R=new WeakMap,O=null,de=(e,t,o)=>{O&&O.deregister();let r=[],n={isCompletionAccepted:!1,isCompletionVisible:!1,isManualTrigger:!1};R.set(t,n),t.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let i=e.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(p,c,u,l)=>{let C=R.get(t);if(!(!C||o.trigger==="onDemand"&&!C.isManualTrigger))return ce({mdl:p,pos:c,token:l,isCompletionAccepted:C.isCompletionAccepted,onShowCompletion:()=>{C.isCompletionVisible=!0,C.isManualTrigger=!1},options:o})},freeInlineCompletions:()=>{}});r.push(i);let s=t.onKeyDown(p=>{let c=R.get(t);if(!c)return;let u=p.keyCode===e.KeyCode.Tab||p.keyCode===e.KeyCode.RightArrow&&p.metaKey;c.isCompletionVisible&&u?(c.isCompletionAccepted=!0,c.isCompletionVisible=!1):c.isCompletionAccepted=!1});r.push(s);let a={deregister:()=>{r.forEach(p=>p.dispose()),B.clear(),R.delete(t),O=null},trigger:()=>Ie(t)};return O=a,a}catch(i){return o.onError?o.onError(i):g.logError(i),{deregister:()=>{r.forEach(s=>s.dispose()),R.delete(t),O=null},trigger:()=>{}}}},Ie=e=>{let t=R.get(e);if(!t){g.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}t.isManualTrigger=!0,e.trigger("keyboard","editor.action.inlineSuggest.trigger",{})},Le=(...e)=>(g.warn("The `registerCopilot` function is deprecated. Use `registerCompletion` instead."),de(...e));export{W as Copilot,de as registerCompletion,Le as registerCopilot};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monacopilot",
3
- "version": "0.10.19",
3
+ "version": "0.11.0",
4
4
  "description": "AI auto-completion plugin for Monaco Editor",
5
5
  "main": "./build/index.js",
6
6
  "module": "./build/index.mjs",