monacopilot 0.10.19 → 0.11.1
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 +110 -17
- 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.
|
|
@@ -257,35 +279,106 @@ registerCompletion(monaco, editor, {
|
|
|
257
279
|
|
|
258
280
|
> **Note:** If you're using `Groq` as your provider, it's recommended to set `maxContextLines` to `60` or less due to its low rate limits and lack of pay-as-you-go pricing. However, `Groq` is expected to offer pay-as-you-go pricing in the near future.
|
|
259
281
|
|
|
260
|
-
###
|
|
282
|
+
### Handling Errors
|
|
261
283
|
|
|
262
|
-
You can
|
|
284
|
+
You can handle errors that occur during completion requests by providing an `onError` function when calling `registerCompletion`. This allows you to customize error handling and logging based on your application's needs.
|
|
263
285
|
|
|
264
|
-
|
|
286
|
+
This will disable the default error handling and logging behavior of Monacopilot.
|
|
265
287
|
|
|
266
|
-
|
|
288
|
+
```javascript
|
|
289
|
+
registerCompletion(monaco, editor, {
|
|
290
|
+
onError: error => {
|
|
291
|
+
console.error(error);
|
|
292
|
+
},
|
|
293
|
+
});
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Custom Request Handler
|
|
297
|
+
|
|
298
|
+
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.
|
|
267
299
|
|
|
268
300
|
```javascript
|
|
269
301
|
registerCompletion(monaco, editor, {
|
|
270
302
|
endpoint: 'https://api.example.com/complete',
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
303
|
+
// ... other options
|
|
304
|
+
requestHandler: async ({endpoint, body}) => {
|
|
305
|
+
const response = await fetch(endpoint, {
|
|
306
|
+
method: 'POST',
|
|
307
|
+
headers: {
|
|
308
|
+
'Content-Type': 'application/json',
|
|
309
|
+
},
|
|
310
|
+
body: JSON.stringify(body),
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
const data = await response.json();
|
|
314
|
+
|
|
315
|
+
return {
|
|
316
|
+
completion: data.completion,
|
|
317
|
+
};
|
|
275
318
|
},
|
|
276
319
|
});
|
|
277
320
|
```
|
|
278
321
|
|
|
279
|
-
|
|
322
|
+
The `requestHandler` function takes an object with `endpoint` and `body` as parameters.
|
|
280
323
|
|
|
281
|
-
|
|
324
|
+
| Property | Type | Description |
|
|
325
|
+
| ---------- | -------- | ------------------------------------------------------------------------------------------------------ |
|
|
326
|
+
| `endpoint` | `string` | The endpoint to which the request is sent. This is the same as the `endpoint` in `registerCompletion`. |
|
|
327
|
+
| `body` | `object` | The body of the request processed by Monacopilot. |
|
|
282
328
|
|
|
283
|
-
|
|
329
|
+
> **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:
|
|
330
|
+
>
|
|
331
|
+
> ```javascript
|
|
332
|
+
> const customBody = {
|
|
333
|
+
> ...body,
|
|
334
|
+
> myCustomProperty: 'value',
|
|
335
|
+
> };
|
|
336
|
+
> ```
|
|
337
|
+
|
|
338
|
+
The `requestHandler` should return an object with the following property:
|
|
339
|
+
|
|
340
|
+
| Property | Type | Description |
|
|
341
|
+
| ------------ | ------------------ | ------------------------------------------------------------------------------------------------ |
|
|
342
|
+
| `completion` | `string` or `null` | The completion text to be inserted into the editor. Return `null` if no completion is available. |
|
|
343
|
+
|
|
344
|
+
#### Example
|
|
345
|
+
|
|
346
|
+
The example below demonstrates how to use the `requestHandler` function for more customized handling:
|
|
284
347
|
|
|
285
348
|
```javascript
|
|
286
349
|
registerCompletion(monaco, editor, {
|
|
287
|
-
|
|
288
|
-
|
|
350
|
+
endpoint: 'https://api.example.com/complete',
|
|
351
|
+
// ... other options
|
|
352
|
+
requestHandler: async ({endpoint, body}) => {
|
|
353
|
+
try {
|
|
354
|
+
const response = await fetch(endpoint, {
|
|
355
|
+
method: 'POST',
|
|
356
|
+
headers: {
|
|
357
|
+
'Content-Type': 'application/json',
|
|
358
|
+
'X-Request-ID': generateUniqueId(),
|
|
359
|
+
},
|
|
360
|
+
body: JSON.stringify({
|
|
361
|
+
...body,
|
|
362
|
+
additionalProperty: 'value',
|
|
363
|
+
}),
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
if (!response.ok) {
|
|
367
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const data = await response.json();
|
|
371
|
+
|
|
372
|
+
if (data.error) {
|
|
373
|
+
console.error('API Error:', data.error);
|
|
374
|
+
return {completion: null};
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
return {completion: data.completion.trim()};
|
|
378
|
+
} catch (error) {
|
|
379
|
+
console.error('Fetch error:', error);
|
|
380
|
+
return {completion: null};
|
|
381
|
+
}
|
|
289
382
|
},
|
|
290
383
|
});
|
|
291
384
|
```
|
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};
|