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 +117 -5
- package/build/index.d.mts +19 -9
- package/build/index.d.ts +19 -9
- package/build/index.js +12 -12
- package/build/index.mjs +17 -17
- package/package.json +1 -1
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
|
|
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
|
-
|
|
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?:
|
|
171
|
-
}
|
|
172
|
-
interface RegisterCompletionRequestOptions {
|
|
166
|
+
onError?: OnError;
|
|
173
167
|
/**
|
|
174
|
-
* Custom
|
|
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
|
-
|
|
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?:
|
|
171
|
-
}
|
|
172
|
-
interface RegisterCompletionRequestOptions {
|
|
166
|
+
onError?: OnError;
|
|
173
167
|
/**
|
|
174
|
-
* Custom
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
`,
|
|
20
|
+
`,c=`
|
|
21
21
|
<context>
|
|
22
22
|
<current_file path="${t}">
|
|
23
23
|
<code>
|
|
24
|
-
${o}${
|
|
24
|
+
${o}${Te}${r}
|
|
25
25
|
</code>
|
|
26
26
|
</current_file>
|
|
27
27
|
</context>
|
|
28
|
-
`,
|
|
29
|
-
<related_file path="${
|
|
28
|
+
`,u=n?.map(({path:l,content:C})=>`
|
|
29
|
+
<related_file path="${l}">
|
|
30
30
|
<code>
|
|
31
|
-
${
|
|
31
|
+
${C}
|
|
32
32
|
</code>
|
|
33
33
|
</related_file>
|
|
34
34
|
`).join(`
|
|
35
35
|
`)||"";return`
|
|
36
36
|
<task>
|
|
37
37
|
${p}
|
|
38
|
-
${
|
|
39
|
-
${
|
|
38
|
+
${c}
|
|
39
|
+
${u}
|
|
40
40
|
</task>
|
|
41
|
-
`};function
|
|
42
|
-
${r}`),{message:o,stack:r}}warn(t){console.warn(`${
|
|
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
|
|
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
|
|
2
|
-
`),
|
|
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
|
|
5
|
-
`.repeat(t):
|
|
6
|
-
`)};var
|
|
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."}[
|
|
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
|
-
`,
|
|
20
|
+
`,c=`
|
|
21
21
|
<context>
|
|
22
22
|
<current_file path="${t}">
|
|
23
23
|
<code>
|
|
24
|
-
${o}${
|
|
24
|
+
${o}${Ce}${r}
|
|
25
25
|
</code>
|
|
26
26
|
</current_file>
|
|
27
27
|
</context>
|
|
28
|
-
`,
|
|
29
|
-
<related_file path="${
|
|
28
|
+
`,u=n?.map(({path:l,content:C})=>`
|
|
29
|
+
<related_file path="${l}">
|
|
30
30
|
<code>
|
|
31
|
-
${
|
|
31
|
+
${C}
|
|
32
32
|
</code>
|
|
33
33
|
</related_file>
|
|
34
34
|
`).join(`
|
|
35
35
|
`)||"";return`
|
|
36
36
|
<task>
|
|
37
37
|
${p}
|
|
38
|
-
${
|
|
39
|
-
${
|
|
38
|
+
${c}
|
|
39
|
+
${u}
|
|
40
40
|
</task>
|
|
41
|
-
`};function
|
|
42
|
-
${r}`),{message:o,stack:r}}warn(t){console.warn(`${
|
|
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(
|
|
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
|
|
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};
|