monacopilot 0.9.32 → 0.9.34

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
@@ -137,6 +137,8 @@ There are other providers and models available. Here is a list:
137
137
 
138
138
  You can use a custom AI model that isn't built into Monacopilot by setting up a `model` when you create a new Copilot. This feature lets you connect to AI models from other services or your own custom-built models.
139
139
 
140
+ Please make sure you are using a better model, especially for coding tasks, to get the best and most accurate completions. Also, use a model with very low response latency (I suggest at least under 1.5 s) to enjoy a great experience or utilize the full power of Monacopilot. Otherwise, you may experience poor performance or inaccurate completions.
141
+
140
142
  #### Example
141
143
 
142
144
  ```javascript
@@ -175,8 +177,6 @@ const copilot = new Copilot(process.env.HUGGINGFACE_API_KEY, {
175
177
  });
176
178
  ```
177
179
 
178
- > Please make sure you are using a better model, especially for coding tasks, to get the best and most accurate completions. Otherwise, you may experience poor performance or inaccurate completions.
179
-
180
180
  #### Configuration
181
181
 
182
182
  The `model` option accepts an object with two functions:
@@ -322,14 +322,14 @@ registerCopilot(monaco, editor, {
322
322
  });
323
323
  ```
324
324
 
325
- | Trigger | Description | Notes |
326
- | ---------------------- | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
327
- | `'onTyping'` (default) | Copilot provides completions in real-time as you type. | This approach is best suited for models with low response latency, such as Groq. Please note that this trigger mode initiates additional background requests to deliver real-time suggestions. Technically, this method is called predictive caching. |
328
- | `'onIdle'` | Copilot provides completions after a brief pause in typing. | This approach is less resource-intensive, as it only initiates a request when the editor is idle. However, compared to `onTyping` it may result in a bit reduced experience with completions. |
325
+ | Trigger | Description | Notes |
326
+ | -------------------- | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
327
+ | `'onIdle'` (default) | Copilot provides completions after a brief pause in typing. | This approach is less resource-intensive, as it only initiates a request when the editor is idle. However, compared to `onTyping` it may result in a bit reduced experience with completions. |
328
+ | `'onTyping'` | Copilot provides completions in real-time as you type. | This approach is best suited for models with low response latency, such as Groq. Please note that this trigger mode initiates additional background requests to deliver real-time suggestions. Technically, this method is called predictive caching. |
329
329
 
330
330
  [OnTyping Demo](https://github.com/user-attachments/assets/22c2ce44-334c-4963-b853-01b890b8e39f)
331
331
 
332
- If you prefer real-time completions, you can set the `trigger` option to `'onTyping'`. This is ideal for those who need immediate or fast completion experiences.
332
+ > **Note:** If you prefer real-time completions, you can set the `trigger` option to `'onTyping'`. This may increase the number of requests made to the provider and the cost. This is not too costly since most small models are very inexpensive.
333
333
 
334
334
  ### External Context
335
335
 
package/build/index.d.mts CHANGED
@@ -109,7 +109,7 @@ interface RegisterCopilotOptions {
109
109
  * - *Note:* Best suited for models with low response latency (e.g., Groq).
110
110
  * - *Consideration:* May initiate additional background requests to deliver real-time suggestions.
111
111
  *
112
- * @default 'onTyping'
112
+ * @default 'onIdle'
113
113
  */
114
114
  trigger?: 'onTyping' | 'onIdle';
115
115
  /**
package/build/index.d.ts CHANGED
@@ -109,7 +109,7 @@ interface RegisterCopilotOptions {
109
109
  * - *Note:* Best suited for models with low response latency (e.g., Groq).
110
110
  * - *Consideration:* May initiate additional background requests to deliver real-time suggestions.
111
111
  *
112
- * @default 'onTyping'
112
+ * @default 'onIdle'
113
113
  */
114
114
  trigger?: 'onTyping' | 'onIdle';
115
115
  /**
package/build/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var B=Object.defineProperty;var fe=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var Te=Object.prototype.hasOwnProperty;var ye=(o,e)=>{for(var t in e)B(o,t,{get:e[t],enumerable:!0})},Pe=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ee(e))!Te.call(o,n)&&n!==t&&B(o,n,{get:()=>e[n],enumerable:!(r=fe(e,n))||r.enumerable});return o};var xe=o=>Pe(B({},"__esModule",{value:!0}),o);var qe={};ye(qe,{Copilot:()=>L,registerCopilot:()=>ge});module.exports=xe(qe);var k=["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"},H={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"},R=.3;var Q=new Set(['"',"'","`","{","}","[","]","(",")",","," ",":","."]);var O=class o{constructor(){}static getInstance(){return o.instance||(o.instance=new o),o.instance}error(e,t){console.error(this.styleMessage(t.message,e,"error")),t.stack&&console.error(this.styleStackTrace(t.stack))}warn(e,t){console.warn(this.styleMessage(t,e,"warning"))}styleMessage(e,t,r){let n=this.getTimestamp(),i="Please create an issue on GitHub if the issue persists.",a=100,s="\u2500".repeat(a-2),p=`\u250C${s}\u2510`,c=`\u2514${s}\u2518`,m=((f,M)=>{let he=f.split(" "),S=[],C="";return he.forEach(K=>{(C+K).length>M&&(S.push(C.trim()),C=""),C+=K+" "}),C.trim()&&S.push(C.trim()),S})(e,a-4),h=[p,...m.map(f=>`\u2502 ${f.padEnd(a-4)} \u2502`),c].join(`
1
+ "use strict";var B=Object.defineProperty;var fe=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var Te=Object.prototype.hasOwnProperty;var Pe=(o,e)=>{for(var t in e)B(o,t,{get:e[t],enumerable:!0})},ye=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ee(e))!Te.call(o,n)&&n!==t&&B(o,n,{get:()=>e[n],enumerable:!(r=fe(e,n))||r.enumerable});return o};var xe=o=>ye(B({},"__esModule",{value:!0}),o);var qe={};Pe(qe,{Copilot:()=>L,registerCopilot:()=>ge});module.exports=xe(qe);var k=["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"},H={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"},R=.3;var Q=new Set(['"',"'","`","{","}","[","]","(",")",","," ",":","."]);var O=class o{constructor(){}static getInstance(){return o.instance||(o.instance=new o),o.instance}error(e,t){console.error(this.styleMessage(t.message,e,"error")),t.stack&&console.error(this.styleStackTrace(t.stack))}warn(e,t){console.warn(this.styleMessage(t,e,"warning"))}styleMessage(e,t,r){let n=this.getTimestamp(),i="Please create an issue on GitHub if the issue persists.",a=100,s="\u2500".repeat(a-2),p=`\u250C${s}\u2510`,c=`\u2514${s}\u2518`,m=((f,M)=>{let he=f.split(" "),S=[],C="";return he.forEach(K=>{(C+K).length>M&&(S.push(C.trim()),C=""),C+=K+" "}),C.trim()&&S.push(C.trim()),S})(e,a-4),h=[p,...m.map(f=>`\u2502 ${f.padEnd(a-4)} \u2502`),c].join(`
2
2
  `);return`
3
3
  \x1B[1m\x1B[37m[${n}]\x1B[0m${r==="error"?"\x1B[31m":"\x1B[33m"} [${t}]\x1B[0m \x1B[2m${i}\x1B[0m
4
4
  ${h}
@@ -35,4 +35,4 @@ ${m.content}
35
35
  `).slice(1,-1).join(`
36
36
  `);r=r.replace(i,a)}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
37
37
 
38
- `),this}build(){return this.formattedCompletion}};var A=class{constructor(e,t){this.cursorPosition=e,this.model=t}shouldProvideCompletions(){return!re(this.cursorPosition,this.model)&&!ne(this.cursorPosition,this.model)}};var _=class _{constructor(){this.cache=[]}getCompletionCache(e,t){return this.cache.filter(r=>this.isCacheItemValid(r,e,t))}addCompletionCache(e){this.cache=[...this.cache.slice(-(_.MAX_CACHE_SIZE-1)),e]}clearCompletionCache(){this.cache=[]}isCacheItemValid(e,t,r){let n=r.getValueInRange(e.range);return g(t,r).startsWith(e.textBeforeCursorInLine)&&this.isPositionValid(e,t,n)}isPositionValid(e,t,r){return e.range.startLineNumber===t.lineNumber&&t.column===e.range.startColumn||e.completion.startsWith(r)&&e.range.startLineNumber===t.lineNumber&&t.column>=e.range.startColumn-r.length&&t.column<=e.range.endColumn}};_.MAX_CACHE_SIZE=10;var w=_;var we="application/json",W=async({filename:o,endpoint:e,language:t,technologies:r,externalContext:n,model:i,position:a})=>{try{let{completion:s}=await b.POST(e,{completionMetadata:_e({filename:o,position:a,model:i,language:t,technologies:r,externalContext:n})},{headers:{"Content-Type":we},error:"Error while fetching completion item"});return s}catch(s){return d(s,"FETCH_COMPLETION_ITEM_ERROR"),null}},_e=({filename:o,position:e,model:t,language:r,technologies:n,externalContext:i})=>{let a=De(e,t),s=F(e,t),p=U(e,t);return{filename:o,language:r,technologies:n,externalContext:i,textBeforeCursor:s,textAfterCursor:p,cursorPosition:e,editorState:{completionMode:a}}},De=(o,e)=>{let t=F(o,e),r=U(o,e);return t&&r?"fill-in-the-middle":"completion"};var de=(o,e,t,r)=>{let n=(o.match(/\n/g)||[]).length,i=oe(o),a=I(t,r);return{startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:t.lineNumber+n,endColumn:o.includes(a)?t.lineNumber===e.startLineNumber&&n===0?t.column+(i-1):i:t.column}};function ue(o){return N.create(o).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build()}var u=o=>({items:o,enableForwardStability:!0});var Se=300,Be=600,ke={onTyping:q(W,Se),onIdle:q(W,Be)},D=new w,He=async({monaco:o,model:e,position:t,token:r,isCompletionAccepted:n,onShowCompletion:i,options:a})=>{let{trigger:s="onTyping",...p}=a;if(!new A(t,e).shouldProvideCompletions())return u([]);let c=D.getCompletionCache(t,e).map(l=>({insertText:l.completion,range:l.range}));if(c.length>0)return i(),u(c);if(r.isCancellationRequested||n)return u([]);try{let l=s==="onTyping"?"onTyping":"onIdle",m=ke[l];r.onCancellationRequested(()=>{m.cancel()});let h=await m({...p,text:e.getValue(),model:e,position:t});if(h){let x=ue(h),f=new o.Range(t.lineNumber,t.column,t.lineNumber,t.column),M=de(x,f,t,e);return D.addCompletionCache({completion:x,range:M,textBeforeCursorInLine:g(t,e)}),i(),u([{insertText:x,range:M}])}}catch(l){if($e(l))return u([]);d(l,"FETCH_COMPLETION_ITEM_ERROR")}return u([])},$e=o=>typeof o=="string"&&(o==="Cancelled"||o==="AbortError")||o instanceof Error&&(o.message==="Cancelled"||o.name==="AbortError"),Ce=He;var y=new WeakMap,P=null,ge=(o,e,t)=>{P&&P.deregister();let r=[];y.set(e,{isCompletionAccepted:!1,isCompletionVisible:!1});try{let n=o.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(s,p,c,l)=>{let m=y.get(e);if(m)return Ce({monaco:o,model:s,position:p,token:l,isCompletionAccepted:m.isCompletionAccepted,onShowCompletion:()=>{m.isCompletionVisible=!0},options:t})},freeInlineCompletions:()=>{}});r.push(n);let i=e.onKeyDown(s=>{let p=y.get(e);if(!p)return;let c=s.keyCode===o.KeyCode.Tab||s.keyCode===o.KeyCode.RightArrow&&s.metaKey;p.isCompletionVisible&&c?(p.isCompletionAccepted=!0,p.isCompletionVisible=!1):p.isCompletionAccepted=!1});r.push(i);let a={deregister:()=>{r.forEach(s=>s.dispose()),D.clearCompletionCache(),y.delete(e),P=null}};return P=a,a}catch(n){return d(n,"REGISTER_COPILOT_ERROR"),{deregister:()=>{r.forEach(i=>i.dispose()),y.delete(e),P=null}}}};0&&(module.exports={Copilot,registerCopilot});
38
+ `),this}build(){return this.formattedCompletion}};var A=class{constructor(e,t){this.cursorPosition=e,this.model=t}shouldProvideCompletions(){return!re(this.cursorPosition,this.model)&&!ne(this.cursorPosition,this.model)}};var _=class _{constructor(){this.cache=[]}getCompletionCache(e,t){return this.cache.filter(r=>this.isCacheItemValid(r,e,t))}addCompletionCache(e){this.cache=[...this.cache.slice(-(_.MAX_CACHE_SIZE-1)),e]}clearCompletionCache(){this.cache=[]}isCacheItemValid(e,t,r){let n=r.getValueInRange(e.range);return g(t,r).startsWith(e.textBeforeCursorInLine)&&this.isPositionValid(e,t,n)}isPositionValid(e,t,r){return e.range.startLineNumber===t.lineNumber&&t.column===e.range.startColumn||e.completion.startsWith(r)&&e.range.startLineNumber===t.lineNumber&&t.column>=e.range.startColumn-r.length&&t.column<=e.range.endColumn}};_.MAX_CACHE_SIZE=10;var w=_;var we="application/json",W=async({filename:o,endpoint:e,language:t,technologies:r,externalContext:n,model:i,position:a})=>{try{let{completion:s}=await b.POST(e,{completionMetadata:_e({filename:o,position:a,model:i,language:t,technologies:r,externalContext:n})},{headers:{"Content-Type":we},error:"Error while fetching completion item"});return s}catch(s){return d(s,"FETCH_COMPLETION_ITEM_ERROR"),null}},_e=({filename:o,position:e,model:t,language:r,technologies:n,externalContext:i})=>{let a=De(e,t),s=F(e,t),p=U(e,t);return{filename:o,language:r,technologies:n,externalContext:i,textBeforeCursor:s,textAfterCursor:p,cursorPosition:e,editorState:{completionMode:a}}},De=(o,e)=>{let t=F(o,e),r=U(o,e);return t&&r?"fill-in-the-middle":"completion"};var de=(o,e,t,r)=>{let n=(o.match(/\n/g)||[]).length,i=oe(o),a=I(t,r);return{startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:t.lineNumber+n,endColumn:o.includes(a)?t.lineNumber===e.startLineNumber&&n===0?t.column+(i-1):i:t.column}};function ue(o){return N.create(o).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build()}var u=o=>({items:o,enableForwardStability:!0});var Se=300,Be=600,ke={onTyping:q(W,Se),onIdle:q(W,Be)},D=new w,He=async({monaco:o,model:e,position:t,token:r,isCompletionAccepted:n,onShowCompletion:i,options:a})=>{let{trigger:s="onIdle",...p}=a;if(!new A(t,e).shouldProvideCompletions())return u([]);let c=D.getCompletionCache(t,e).map(l=>({insertText:l.completion,range:l.range}));if(c.length>0)return i(),u(c);if(r.isCancellationRequested||n)return u([]);try{let l=s==="onTyping"?"onTyping":"onIdle",m=ke[l];r.onCancellationRequested(()=>{m.cancel()});let h=await m({...p,text:e.getValue(),model:e,position:t});if(h){let x=ue(h),f=new o.Range(t.lineNumber,t.column,t.lineNumber,t.column),M=de(x,f,t,e);return D.addCompletionCache({completion:x,range:M,textBeforeCursorInLine:g(t,e)}),i(),u([{insertText:x,range:M}])}}catch(l){if($e(l))return u([]);d(l,"FETCH_COMPLETION_ITEM_ERROR")}return u([])},$e=o=>typeof o=="string"&&(o==="Cancelled"||o==="AbortError")||o instanceof Error&&(o.message==="Cancelled"||o.name==="AbortError"),Ce=He;var P=new WeakMap,y=null,ge=(o,e,t)=>{y&&y.deregister();let r=[];P.set(e,{isCompletionAccepted:!1,isCompletionVisible:!1});try{let n=o.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(s,p,c,l)=>{let m=P.get(e);if(m)return Ce({monaco:o,model:s,position:p,token:l,isCompletionAccepted:m.isCompletionAccepted,onShowCompletion:()=>{m.isCompletionVisible=!0},options:t})},freeInlineCompletions:()=>{}});r.push(n);let i=e.onKeyDown(s=>{let p=P.get(e);if(!p)return;let c=s.keyCode===o.KeyCode.Tab||s.keyCode===o.KeyCode.RightArrow&&s.metaKey;p.isCompletionVisible&&c?(p.isCompletionAccepted=!0,p.isCompletionVisible=!1):p.isCompletionAccepted=!1});r.push(i);let a={deregister:()=>{r.forEach(s=>s.dispose()),D.clearCompletionCache(),P.delete(e),y=null}};return y=a,a}catch(n){return d(n,"REGISTER_COPILOT_ERROR"),{deregister:()=>{r.forEach(i=>i.dispose()),P.delete(e),y=null}}}};0&&(module.exports={Copilot,registerCopilot});
package/build/index.mjs CHANGED
@@ -31,8 +31,8 @@ Additional context from related files:
31
31
  `,l+=s.map(m=>`// Path: ${m.path}
32
32
  ${m.content}
33
33
  `).join(`
34
- `)),l.endsWith(".")?l:`${l}.`};function F(o){return{system:fe(o),user:Te(o)}}var se={"claude-3.5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var ye={createRequestBody:(o,e)=>{let r=o==="o1-preview"||o==="o1-mini"?[{role:"user",content:e.user}]:[{role:"system",content:e.system},{role:"user",content:e.user}];return{model:V(o),temperature:R,messages:r}},createHeaders:o=>({"Content-Type":"application/json",Authorization:`Bearer ${o}`}),parseCompletion:o=>o.choices?.length?{completion:o.choices[0].message.content}:{completion:null,error:"No completion found in the OpenAI response"}},Pe={createRequestBody:(o,e)=>({model:V(o),temperature:R,messages:[{role:"system",content:e.system},{role:"user",content:e.user}]}),createHeaders:o=>({"Content-Type":"application/json",Authorization:`Bearer ${o}`}),parseCompletion:o=>o.choices?.length?{completion:o.choices[0].message.content}:{completion:null,error:"No completion found in the Groq response"}},xe={createRequestBody:(o,e)=>({model:V(o),temperature:R,system:e.system,messages:[{role:"user",content:e.user}],max_tokens:Me(o)}),createHeaders:o=>({"Content-Type":"application/json","x-api-key":o,"anthropic-version":"2023-06-01"}),parseCompletion:o=>o.content?typeof o.content!="string"?{completion:null,error:"Completion content is not a string"}:{completion:o.content}:{completion:null,error:"No completion found in the Anthropic response"}},U={openai:ye,groq:Pe,anthropic:xe},ae=(o,e,t)=>U[e].createRequestBody(o,t),le=(o,e)=>U[e].createHeaders(o),pe=(o,e)=>U[e].parseCompletion(o),V=o=>K[o],me=o=>J[o],Me=o=>se[o]||4096;var j=class{constructor(e,t={}){if(!e)throw new Error("Please provide an API key.");this.apiKey=e,this.provider=t.provider??z,this.model=t.model??X,this.validateInputs()}validateInputs(){if(!S.includes(this.provider))throw new Error(`The provider "${this.provider}" is not supported. Please choose a supported provider: ${T(S)}. If you're using a custom model, you don't need to specify a provider.`);if(typeof this.model=="string"&&!B[this.provider].includes(this.model)){let e=T(B[this.provider]);throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${e}`)}}generatePrompt(e,t){let r=F(e);return t?{...r,...t(e)}:r}prepareRequest(e,t){let r=me(this.provider),n,i=le(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let s=this.model.config(this.apiKey,e);r=s.endpoint??r,n=s.body??{},i={...i,...s.headers}}else n=ae(this.model,this.provider,e);let a={...i,...t};return{endpoint:r,requestBody:n,headers:a}}async complete(e){let{body:t,options:r}=e,{completionMetadata:n}=t,{headers:i={},customPrompt:a}=r??{},s=this.generatePrompt(n,a),{endpoint:p,requestBody:c,headers:l}=this.prepareRequest(s,i);try{let m=await b.POST(p,c,{headers:l});return typeof this.model=="object"&&"transformResponse"in this.model?this.model.transformResponse(m):pe(m,this.provider)}catch(m){return{error:d(m,"COPILOT_COMPLETION_FETCH_ERROR").message,completion:null}}}};var L=class o{constructor(e){this.formattedCompletion="";this.formattedCompletion=e}static create(e){return new o(e)}setCompletion(e){return this.formattedCompletion=e,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}removeMarkdownCodeBlocks(e){let t=/```[\s\S]*?```/g,r=e,n;for(;(n=t.exec(e))!==null;){let i=n[0],a=i.split(`
34
+ `)),l.endsWith(".")?l:`${l}.`};function F(o){return{system:fe(o),user:Te(o)}}var se={"claude-3.5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var Pe={createRequestBody:(o,e)=>{let r=o==="o1-preview"||o==="o1-mini"?[{role:"user",content:e.user}]:[{role:"system",content:e.system},{role:"user",content:e.user}];return{model:V(o),temperature:R,messages:r}},createHeaders:o=>({"Content-Type":"application/json",Authorization:`Bearer ${o}`}),parseCompletion:o=>o.choices?.length?{completion:o.choices[0].message.content}:{completion:null,error:"No completion found in the OpenAI response"}},ye={createRequestBody:(o,e)=>({model:V(o),temperature:R,messages:[{role:"system",content:e.system},{role:"user",content:e.user}]}),createHeaders:o=>({"Content-Type":"application/json",Authorization:`Bearer ${o}`}),parseCompletion:o=>o.choices?.length?{completion:o.choices[0].message.content}:{completion:null,error:"No completion found in the Groq response"}},xe={createRequestBody:(o,e)=>({model:V(o),temperature:R,system:e.system,messages:[{role:"user",content:e.user}],max_tokens:Me(o)}),createHeaders:o=>({"Content-Type":"application/json","x-api-key":o,"anthropic-version":"2023-06-01"}),parseCompletion:o=>o.content?typeof o.content!="string"?{completion:null,error:"Completion content is not a string"}:{completion:o.content}:{completion:null,error:"No completion found in the Anthropic response"}},U={openai:Pe,groq:ye,anthropic:xe},ae=(o,e,t)=>U[e].createRequestBody(o,t),le=(o,e)=>U[e].createHeaders(o),pe=(o,e)=>U[e].parseCompletion(o),V=o=>K[o],me=o=>J[o],Me=o=>se[o]||4096;var j=class{constructor(e,t={}){if(!e)throw new Error("Please provide an API key.");this.apiKey=e,this.provider=t.provider??z,this.model=t.model??X,this.validateInputs()}validateInputs(){if(!S.includes(this.provider))throw new Error(`The provider "${this.provider}" is not supported. Please choose a supported provider: ${T(S)}. If you're using a custom model, you don't need to specify a provider.`);if(typeof this.model=="string"&&!B[this.provider].includes(this.model)){let e=T(B[this.provider]);throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${e}`)}}generatePrompt(e,t){let r=F(e);return t?{...r,...t(e)}:r}prepareRequest(e,t){let r=me(this.provider),n,i=le(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let s=this.model.config(this.apiKey,e);r=s.endpoint??r,n=s.body??{},i={...i,...s.headers}}else n=ae(this.model,this.provider,e);let a={...i,...t};return{endpoint:r,requestBody:n,headers:a}}async complete(e){let{body:t,options:r}=e,{completionMetadata:n}=t,{headers:i={},customPrompt:a}=r??{},s=this.generatePrompt(n,a),{endpoint:p,requestBody:c,headers:l}=this.prepareRequest(s,i);try{let m=await b.POST(p,c,{headers:l});return typeof this.model=="object"&&"transformResponse"in this.model?this.model.transformResponse(m):pe(m,this.provider)}catch(m){return{error:d(m,"COPILOT_COMPLETION_FETCH_ERROR").message,completion:null}}}};var L=class o{constructor(e){this.formattedCompletion="";this.formattedCompletion=e}static create(e){return new o(e)}setCompletion(e){return this.formattedCompletion=e,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}removeMarkdownCodeBlocks(e){let t=/```[\s\S]*?```/g,r=e,n;for(;(n=t.exec(e))!==null;){let i=n[0],a=i.split(`
35
35
  `).slice(1,-1).join(`
36
36
  `);r=r.replace(i,a)}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
37
37
 
38
- `),this}build(){return this.formattedCompletion}};var N=class{constructor(e,t){this.cursorPosition=e,this.model=t}shouldProvideCompletions(){return!te(this.cursorPosition,this.model)&&!re(this.cursorPosition,this.model)}};var w=class w{constructor(){this.cache=[]}getCompletionCache(e,t){return this.cache.filter(r=>this.isCacheItemValid(r,e,t))}addCompletionCache(e){this.cache=[...this.cache.slice(-(w.MAX_CACHE_SIZE-1)),e]}clearCompletionCache(){this.cache=[]}isCacheItemValid(e,t,r){let n=r.getValueInRange(e.range);return g(t,r).startsWith(e.textBeforeCursorInLine)&&this.isPositionValid(e,t,n)}isPositionValid(e,t,r){return e.range.startLineNumber===t.lineNumber&&t.column===e.range.startColumn||e.completion.startsWith(r)&&e.range.startLineNumber===t.lineNumber&&t.column>=e.range.startColumn-r.length&&t.column<=e.range.endColumn}};w.MAX_CACHE_SIZE=10;var A=w;var Re="application/json",G=async({filename:o,endpoint:e,language:t,technologies:r,externalContext:n,model:i,position:a})=>{try{let{completion:s}=await b.POST(e,{completionMetadata:Oe({filename:o,position:a,model:i,language:t,technologies:r,externalContext:n})},{headers:{"Content-Type":Re},error:"Error while fetching completion item"});return s}catch(s){return d(s,"FETCH_COMPLETION_ITEM_ERROR"),null}},Oe=({filename:o,position:e,model:t,language:r,technologies:n,externalContext:i})=>{let a=Ie(e,t),s=$(e,t),p=q(e,t);return{filename:o,language:r,technologies:n,externalContext:i,textBeforeCursor:s,textAfterCursor:p,cursorPosition:e,editorState:{completionMode:a}}},Ie=(o,e)=>{let t=$(o,e),r=q(o,e);return t&&r?"fill-in-the-middle":"completion"};var ce=(o,e,t,r)=>{let n=(o.match(/\n/g)||[]).length,i=ee(o),a=I(t,r);return{startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:t.lineNumber+n,endColumn:o.includes(a)?t.lineNumber===e.startLineNumber&&n===0?t.column+(i-1):i:t.column}};function de(o){return L.create(o).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build()}var u=o=>({items:o,enableForwardStability:!0});var be=300,ve=600,Le={onTyping:H(G,be),onIdle:H(G,ve)},_=new A,Ne=async({monaco:o,model:e,position:t,token:r,isCompletionAccepted:n,onShowCompletion:i,options:a})=>{let{trigger:s="onTyping",...p}=a;if(!new N(t,e).shouldProvideCompletions())return u([]);let c=_.getCompletionCache(t,e).map(l=>({insertText:l.completion,range:l.range}));if(c.length>0)return i(),u(c);if(r.isCancellationRequested||n)return u([]);try{let l=s==="onTyping"?"onTyping":"onIdle",m=Le[l];r.onCancellationRequested(()=>{m.cancel()});let h=await m({...p,text:e.getValue(),model:e,position:t});if(h){let x=de(h),f=new o.Range(t.lineNumber,t.column,t.lineNumber,t.column),M=ce(x,f,t,e);return _.addCompletionCache({completion:x,range:M,textBeforeCursorInLine:g(t,e)}),i(),u([{insertText:x,range:M}])}}catch(l){if(Ae(l))return u([]);d(l,"FETCH_COMPLETION_ITEM_ERROR")}return u([])},Ae=o=>typeof o=="string"&&(o==="Cancelled"||o==="AbortError")||o instanceof Error&&(o.message==="Cancelled"||o.name==="AbortError"),ue=Ne;var y=new WeakMap,P=null,we=(o,e,t)=>{P&&P.deregister();let r=[];y.set(e,{isCompletionAccepted:!1,isCompletionVisible:!1});try{let n=o.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(s,p,c,l)=>{let m=y.get(e);if(m)return ue({monaco:o,model:s,position:p,token:l,isCompletionAccepted:m.isCompletionAccepted,onShowCompletion:()=>{m.isCompletionVisible=!0},options:t})},freeInlineCompletions:()=>{}});r.push(n);let i=e.onKeyDown(s=>{let p=y.get(e);if(!p)return;let c=s.keyCode===o.KeyCode.Tab||s.keyCode===o.KeyCode.RightArrow&&s.metaKey;p.isCompletionVisible&&c?(p.isCompletionAccepted=!0,p.isCompletionVisible=!1):p.isCompletionAccepted=!1});r.push(i);let a={deregister:()=>{r.forEach(s=>s.dispose()),_.clearCompletionCache(),y.delete(e),P=null}};return P=a,a}catch(n){return d(n,"REGISTER_COPILOT_ERROR"),{deregister:()=>{r.forEach(i=>i.dispose()),y.delete(e),P=null}}}};export{j as Copilot,we as registerCopilot};
38
+ `),this}build(){return this.formattedCompletion}};var N=class{constructor(e,t){this.cursorPosition=e,this.model=t}shouldProvideCompletions(){return!te(this.cursorPosition,this.model)&&!re(this.cursorPosition,this.model)}};var w=class w{constructor(){this.cache=[]}getCompletionCache(e,t){return this.cache.filter(r=>this.isCacheItemValid(r,e,t))}addCompletionCache(e){this.cache=[...this.cache.slice(-(w.MAX_CACHE_SIZE-1)),e]}clearCompletionCache(){this.cache=[]}isCacheItemValid(e,t,r){let n=r.getValueInRange(e.range);return g(t,r).startsWith(e.textBeforeCursorInLine)&&this.isPositionValid(e,t,n)}isPositionValid(e,t,r){return e.range.startLineNumber===t.lineNumber&&t.column===e.range.startColumn||e.completion.startsWith(r)&&e.range.startLineNumber===t.lineNumber&&t.column>=e.range.startColumn-r.length&&t.column<=e.range.endColumn}};w.MAX_CACHE_SIZE=10;var A=w;var Re="application/json",G=async({filename:o,endpoint:e,language:t,technologies:r,externalContext:n,model:i,position:a})=>{try{let{completion:s}=await b.POST(e,{completionMetadata:Oe({filename:o,position:a,model:i,language:t,technologies:r,externalContext:n})},{headers:{"Content-Type":Re},error:"Error while fetching completion item"});return s}catch(s){return d(s,"FETCH_COMPLETION_ITEM_ERROR"),null}},Oe=({filename:o,position:e,model:t,language:r,technologies:n,externalContext:i})=>{let a=Ie(e,t),s=$(e,t),p=q(e,t);return{filename:o,language:r,technologies:n,externalContext:i,textBeforeCursor:s,textAfterCursor:p,cursorPosition:e,editorState:{completionMode:a}}},Ie=(o,e)=>{let t=$(o,e),r=q(o,e);return t&&r?"fill-in-the-middle":"completion"};var ce=(o,e,t,r)=>{let n=(o.match(/\n/g)||[]).length,i=ee(o),a=I(t,r);return{startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:t.lineNumber+n,endColumn:o.includes(a)?t.lineNumber===e.startLineNumber&&n===0?t.column+(i-1):i:t.column}};function de(o){return L.create(o).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build()}var u=o=>({items:o,enableForwardStability:!0});var be=300,ve=600,Le={onTyping:H(G,be),onIdle:H(G,ve)},_=new A,Ne=async({monaco:o,model:e,position:t,token:r,isCompletionAccepted:n,onShowCompletion:i,options:a})=>{let{trigger:s="onIdle",...p}=a;if(!new N(t,e).shouldProvideCompletions())return u([]);let c=_.getCompletionCache(t,e).map(l=>({insertText:l.completion,range:l.range}));if(c.length>0)return i(),u(c);if(r.isCancellationRequested||n)return u([]);try{let l=s==="onTyping"?"onTyping":"onIdle",m=Le[l];r.onCancellationRequested(()=>{m.cancel()});let h=await m({...p,text:e.getValue(),model:e,position:t});if(h){let x=de(h),f=new o.Range(t.lineNumber,t.column,t.lineNumber,t.column),M=ce(x,f,t,e);return _.addCompletionCache({completion:x,range:M,textBeforeCursorInLine:g(t,e)}),i(),u([{insertText:x,range:M}])}}catch(l){if(Ae(l))return u([]);d(l,"FETCH_COMPLETION_ITEM_ERROR")}return u([])},Ae=o=>typeof o=="string"&&(o==="Cancelled"||o==="AbortError")||o instanceof Error&&(o.message==="Cancelled"||o.name==="AbortError"),ue=Ne;var P=new WeakMap,y=null,we=(o,e,t)=>{y&&y.deregister();let r=[];P.set(e,{isCompletionAccepted:!1,isCompletionVisible:!1});try{let n=o.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(s,p,c,l)=>{let m=P.get(e);if(m)return ue({monaco:o,model:s,position:p,token:l,isCompletionAccepted:m.isCompletionAccepted,onShowCompletion:()=>{m.isCompletionVisible=!0},options:t})},freeInlineCompletions:()=>{}});r.push(n);let i=e.onKeyDown(s=>{let p=P.get(e);if(!p)return;let c=s.keyCode===o.KeyCode.Tab||s.keyCode===o.KeyCode.RightArrow&&s.metaKey;p.isCompletionVisible&&c?(p.isCompletionAccepted=!0,p.isCompletionVisible=!1):p.isCompletionAccepted=!1});r.push(i);let a={deregister:()=>{r.forEach(s=>s.dispose()),_.clearCompletionCache(),P.delete(e),y=null}};return y=a,a}catch(n){return d(n,"REGISTER_COPILOT_ERROR"),{deregister:()=>{r.forEach(i=>i.dispose()),P.delete(e),y=null}}}};export{j as Copilot,we as registerCopilot};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monacopilot",
3
- "version": "0.9.32",
3
+ "version": "0.9.34",
4
4
  "description": "AI auto-completion plugin for Monaco Editor",
5
5
  "main": "./build/index.js",
6
6
  "module": "./build/index.mjs",