monacopilot 0.12.8 → 0.12.10

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
@@ -70,7 +70,10 @@ import {Copilot} from 'monacopilot';
70
70
 
71
71
  const app = express();
72
72
  const port = process.env.PORT || 3000;
73
- const copilot = new Copilot(process.env.GROQ_API_KEY);
73
+ const copilot = new Copilot(process.env.GROQ_API_KEY!, {
74
+ provider: 'groq',
75
+ model: 'llama-3-70b',
76
+ });
74
77
 
75
78
  app.use(express.json());
76
79
 
@@ -407,6 +410,8 @@ const copilot = new Copilot(process.env.OPENAI_API_KEY, {
407
410
 
408
411
  The default provider is `groq`, and the default model is `llama-3-70b`.
409
412
 
413
+ > **Tip:** Always specify a provider and model when using Monacopilot. This ensures your code remains consistent even if the default settings change in future updates.
414
+
410
415
  There are other providers and models available. Here is a list:
411
416
 
412
417
  | Provider | Models |
package/build/index.js CHANGED
@@ -1,11 +1,11 @@
1
- "use strict";var q=Object.defineProperty;var Te=Object.getOwnPropertyDescriptor;var xe=Object.getOwnPropertyNames;var Ee=Object.prototype.hasOwnProperty;var be=(t,e)=>{for(var o in e)q(t,o,{get:e[o],enumerable:!0})},Me=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of xe(e))!Ee.call(t,n)&&n!==o&&q(t,n,{get:()=>e[n],enumerable:!(r=Te(e,n))||r.enumerable});return t};var Oe=t=>Me(q({},"__esModule",{value:!0}),t);var Ue={};be(Ue,{Copilot:()=>D,registerCompletion:()=>G,registerCopilot:()=>Re});module.exports=Oe(Ue);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-20241022","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"},V={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-preview","o1-mini"],anthropic:["claude-3-5-sonnet","claude-3-opus","claude-3-haiku","claude-3-sonnet"]},J="llama-3-70b",Z="groq",Q={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages"},O=.1;var ee={"claude-3-5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var ve={createRequestBody:(t,e)=>{let r=t==="o1-preview"||t==="o1-mini"?[{role:"user",content:e.user}]:[{role:"system",content:e.system},{role:"user",content:e.user}];return{model:U(t),temperature:O,messages:r}},createHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),parseCompletion:t=>t.choices?.length?t.choices[0].message.content:null},Ie={createRequestBody:(t,e)=>({model:U(t),temperature:O,messages:[{role:"system",content:e.system},{role:"user",content:e.user}]}),createHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),parseCompletion:t=>t.choices?.length?t.choices[0].message.content:null},Ae={createRequestBody:(t,e)=>({model:U(t),temperature:O,system:e.system,messages:[{role:"user",content:e.user}],max_tokens:we(t)}),createHeaders:t=>({"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"}),parseCompletion:t=>!t.content||typeof t.content!="string"?null:t.content},j={openai:ve,groq:Ie,anthropic:Ae},te=(t,e,o)=>j[e].createRequestBody(t,o),oe=(t,e)=>j[e].createHeaders(t),re=(t,e)=>j[e].parseCompletion(t),U=t=>X[t],ne=t=>Q[t],we=t=>ee[t]||4096;var ie="\x1B[91m",se="\x1B[93m",v="\x1B[0m",W="\x1B[1m",h=t=>{let e,o;t instanceof Error?(e=t.message,o=t.stack):typeof t=="string"?e=t:e="An unknown error occurred";let r=`${ie}${W}[MONACOPILOT ERROR] ${e}${v}`;return console.error(o?`${r}
1
+ "use strict";var q=Object.defineProperty;var xe=Object.getOwnPropertyDescriptor;var Te=Object.getOwnPropertyNames;var be=Object.prototype.hasOwnProperty;var Ee=(t,e)=>{for(var o in e)q(t,o,{get:e[o],enumerable:!0})},Me=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Te(e))!be.call(t,n)&&n!==o&&q(t,n,{get:()=>e[n],enumerable:!(r=xe(e,n))||r.enumerable});return t};var Oe=t=>Me(q({},"__esModule",{value:!0}),t);var Ue={};Ee(Ue,{Copilot:()=>D,registerCompletion:()=>G,registerCopilot:()=>Re});module.exports=Oe(Ue);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-20241022","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"},V={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-preview","o1-mini"],anthropic:["claude-3-5-sonnet","claude-3-opus","claude-3-haiku","claude-3-sonnet"]},J="llama-3-70b",Z="groq",Q={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages"},O=.1;var ee={"claude-3-5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var ve={createRequestBody:(t,e)=>{let r=t==="o1-preview"||t==="o1-mini"?[{role:"user",content:e.user}]:[{role:"system",content:e.system},{role:"user",content:e.user}];return{model:U(t),temperature:O,messages:r}},createHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),parseCompletion:t=>t.choices?.length?t.choices[0].message.content:null},Ie={createRequestBody:(t,e)=>({model:U(t),temperature:O,messages:[{role:"system",content:e.system},{role:"user",content:e.user}]}),createHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),parseCompletion:t=>t.choices?.length?t.choices[0].message.content:null},Ae={createRequestBody:(t,e)=>({model:U(t),temperature:O,system:e.system,messages:[{role:"user",content:e.user}],max_tokens:we(t)}),createHeaders:t=>({"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"}),parseCompletion:t=>!t.content||typeof t.content!="string"?null:t.content},j={openai:ve,groq:Ie,anthropic:Ae},te=(t,e,o)=>j[e].createRequestBody(t,o),oe=(t,e)=>j[e].createHeaders(t),re=(t,e)=>j[e].parseCompletion(t),U=t=>X[t],ne=t=>Q[t],we=t=>ee[t]||4096;var ie="\x1B[91m",se="\x1B[93m",v="\x1B[0m",W="\x1B[1m",h=t=>{let e,o;t instanceof Error?(e=t.message,o=t.stack):typeof t=="string"?e=t:e="An unknown error occurred";let r=`${ie}${W}[MONACOPILOT ERROR] ${e}${v}`;return console.error(o?`${r}
2
2
  ${ie}Stack trace:${v}
3
- ${o}`:r),{message:e,stack:o}},I=t=>{console.warn(`${se}${W}[MONACOPILOT DEPRECATED] ${t}${v}`)},ae=t=>{console.warn(`${se}${W}[MONACOPILOT WARN] ${t}${v}`)};var A=(t,e)=>{let o=null,r=null,n=(...i)=>new Promise((s,d)=>{o&&(clearTimeout(o),r&&r("Cancelled")),r=d,o=setTimeout(()=>{s(t(...i)),r=null},e)});return n.cancel=()=>{o&&(clearTimeout(o),r&&r("Cancelled"),o=null,r=null)},n},x=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`;var z=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1];var w=(t,e)=>e.getLineContent(t.lineNumber).slice(t.column-1),le=(t,e)=>e.getLineContent(t.lineNumber).slice(0,t.column-1),f=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),pe=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),K=(t,e,o={})=>{if(e<=0)return"";let r=t.split(`
3
+ ${o}`:r),{message:e,stack:o}},ae=t=>{console.warn(`${se}${W}[MONACOPILOT WARN] ${t}${v}`)};var I=(t,e,o)=>console.warn(`${se}${W}[MONACOPILOT DEPRECATED] "${t}" is deprecated${o?` in ${o}`:""}. Please use "${e}" instead. It will be removed in a future version.${v}`);var A=(t,e)=>{let o=null,r=null,n=(...i)=>new Promise((s,d)=>{o&&(clearTimeout(o),r&&r("Cancelled")),r=d,o=setTimeout(()=>{s(t(...i)),r=null},e)});return n.cancel=()=>{o&&(clearTimeout(o),r&&r("Cancelled"),o=null,r=null)},n},T=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`;var z=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1];var w=(t,e)=>e.getLineContent(t.lineNumber).slice(t.column-1),le=(t,e)=>e.getLineContent(t.lineNumber).slice(0,t.column-1),f=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),pe=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),K=(t,e,o={})=>{if(e<=0)return"";let r=t.split(`
4
4
  `),n=r.length;if(e>=n)return t;if(o.from==="end"){let s=r.slice(-e);return s.every(d=>d==="")?`
5
5
  `.repeat(e):s.join(`
6
6
  `)}let i=r.slice(0,e);return i.every(s=>s==="")?`
7
7
  `.repeat(e):i.join(`
8
- `)};var ce=async(t,e,o={})=>{let r={"Content-Type":"application/json",...o.headers},n=e==="POST"&&o.body?JSON.stringify(o.body):void 0,i=await fetch(t,{method:e,headers:r,body:n,signal:o.signal});if(!i.ok)throw new Error(`${i.statusText||o.fallbackError||"Network error"}`);return i.json()},Le=(t,e)=>ce(t,"GET",e),De=(t,e,o)=>ce(t,"POST",{...o,body:e}),L={GET:Le,POST:De};var de=(t,e)=>{let o=w(t,e).trim(),r=le(t,e).trim();return t.column<=3&&(o!==""||r!=="")};var Se=t=>{let{technologies:e=[],filename:o,relatedFiles:r,language:n}=t,i=x([n,...e].filter(c=>typeof c=="string"&&!!c)),s=`You are an expert ${i?`${i} `:""}developer assistant.`,d="Your task is to provide precise and contextually relevant code completions, modifications, or generations",a=o?`for the file '${o}'`:"",l=r&&r.length>0?"Consider the context of the current and related files provided.":"",m="Ensure that your responses integrate seamlessly with the existing code and maintain consistency with the project's style and conventions.",u="Before providing the completion or modification, think through the problem step-by-step, considering best practices and any potential edge cases.",p=n?`Pay special attention to ${n}-specific syntax and best practices.`:"";return`${s}
8
+ `)};var ce=async(t,e,o={})=>{let r={"Content-Type":"application/json",...o.headers},n=e==="POST"&&o.body?JSON.stringify(o.body):void 0,i=await fetch(t,{method:e,headers:r,body:n,signal:o.signal});if(!i.ok)throw new Error(`${i.statusText||o.fallbackError||"Network error"}`);return i.json()},Le=(t,e)=>ce(t,"GET",e),De=(t,e,o)=>ce(t,"POST",{...o,body:e}),L={GET:Le,POST:De};var de=(t,e)=>{let o=w(t,e).trim(),r=le(t,e).trim();return t.column<=3&&(o!==""||r!=="")};var Se=t=>{let{technologies:e=[],filename:o,relatedFiles:r,language:n}=t,i=T([n,...e].filter(c=>typeof c=="string"&&!!c)),s=`You are an expert ${i?`${i} `:""}developer assistant.`,d="Your task is to provide precise and contextually relevant code completions, modifications, or generations",a=o?`for the file '${o}'`:"",l=r&&r.length>0?"Consider the context of the current and related files provided.":"",m="Ensure that your responses integrate seamlessly with the existing code and maintain consistency with the project's style and conventions.",u="Before providing the completion or modification, think through the problem step-by-step, considering best practices and any potential edge cases.",p=n?`Pay special attention to ${n}-specific syntax and best practices.`:"";return`${s}
9
9
  ${d} ${a}.
10
10
  ${m}
11
11
  ${l}
@@ -52,8 +52,8 @@ Depending on the completion mode, adjust your completion accordingly:
52
52
  ${{continue:"-- Continue writing the code from the current cursor location.",insert:"-- Insert the appropriate code snippet at the cursor point.",complete:"-- Supply the necessary code to finish the ongoing statement or block."}[r]||""}
53
53
 
54
54
  Remember to output **only** the code that should be inserted at the cursor, without any additional formatting or explanations.
55
- `.trim();return me(s,t)},Ce=Be;var D=class{constructor(e,o={}){if(!e)throw new Error("Please provide an API key.");this.apiKey=e,this.provider=o.provider??Z,this.model=o.model??J,this.validateInputs()}validateInputs(){if(!H.includes(this.provider))throw new Error(`Unsupported provider "${this.provider}". Please choose from: ${x(H)}. For custom models, provider specification is not needed.`);if(typeof this.model=="string"&&!V[this.provider].includes(this.model))throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${x(V[this.provider])}`)}async complete(e){let{body:o,options:r}=e,{completionMetadata:n}=o,{headers:i={},customPrompt:s}=r??{},d=this.generatePrompt(n,s),{endpoint:a,requestBody:l,headers:m}=this.prepareRequestDetails(d);try{let u=await this.sendCompletionRequest(a,l,{...m,...i});return this.processCompletionResponse(u)}catch(u){return this.handleCompletionError(u)}}generatePrompt(e,o){let r=Ce(e);return o?{...r,...o(e)}:r}prepareRequestDetails(e){let o=ne(this.provider),r,n=oe(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let i=this.model.config(this.apiKey,e);o=i.endpoint??o,r=i.body??{},n={...n,...i.headers}}else r=te(this.model,this.provider,e);return{endpoint:o,requestBody:r,headers:n}}async sendCompletionRequest(e,o,r){return L.POST(e,o,{headers:r})}processCompletionResponse(e){if(typeof this.model=="object"&&"transformResponse"in this.model){let o=this.model.transformResponse(e);return"completion"in o&&I("The `completion` property in `transformResponse` function is deprecated. Please use `text` instead."),{completion:o.text??o.completion??null}}else return{completion:re(e,this.provider)}}handleCompletionError(e){return{error:h(e).message,completion:null}}};var S=class t{constructor(e){this.formattedCompletion="";this.formattedCompletion=e}static create(e){return new t(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 o=/```[\s\S]*?```/g,r=e,n;for(;(n=o.exec(e))!==null;){let i=n[0],s=i.split(`
55
+ `.trim();return me(s,t)},Ce=Be;var D=class{constructor(e,o={}){if(!e)throw new Error("Please provide an API key.");this.apiKey=e,this.provider=o.provider??Z,this.model=o.model??J,this.validateInputs()}validateInputs(){if(!H.includes(this.provider))throw new Error(`Unsupported provider "${this.provider}". Please choose from: ${T(H)}. For custom models, provider specification is not needed.`);if(typeof this.model=="string"&&!V[this.provider].includes(this.model))throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${T(V[this.provider])}`)}async complete(e){let{body:o,options:r}=e,{completionMetadata:n}=o,{headers:i={},customPrompt:s}=r??{},d=this.generatePrompt(n,s),{endpoint:a,requestBody:l,headers:m}=this.prepareRequestDetails(d);try{let u=await this.sendCompletionRequest(a,l,{...m,...i});return this.processCompletionResponse(u)}catch(u){return this.handleCompletionError(u)}}generatePrompt(e,o){let r=Ce(e);return o?{...r,...o(e)}:r}prepareRequestDetails(e){let o=ne(this.provider),r,n=oe(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let i=this.model.config(this.apiKey,e);o=i.endpoint??o,r=i.body??{},n={...n,...i.headers}}else r=te(this.model,this.provider,e);return{endpoint:o,requestBody:r,headers:n}}async sendCompletionRequest(e,o,r){return L.POST(e,o,{headers:r})}processCompletionResponse(e){if(typeof this.model=="object"&&"transformResponse"in this.model){let o=this.model.transformResponse(e);return"completion"in o&&I("completion","text","Copilot.model.transformResponse"),{completion:o.text??o.completion??null}}else return{completion:re(e,this.provider)}}handleCompletionError(e){return{error:h(e).message,completion:null}}};var S=class t{constructor(e){this.formattedCompletion="";this.formattedCompletion=e}static create(e){return new t(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 o=/```[\s\S]*?```/g,r=e,n;for(;(n=o.exec(e))!==null;){let i=n[0],s=i.split(`
56
56
  `).slice(1,-1).join(`
57
57
  `);r=r.replace(i,s)}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
58
58
 
59
- `),this}build(){return this.formattedCompletion}};var F=class{constructor(e,o){this.cursorPos=e,this.mdl=o}shouldProvideCompletions(){return!de(this.cursorPos,this.mdl)}};var k=class{constructor(e){this.capacity=e;this.head=0;this.tail=0;this.size=0;this.buffer=new Array(e)}enqueue(e){let o;return this.size===this.capacity&&(o=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,o}dequeue(){if(this.size===0)return;let e=this.buffer[this.head];return this.buffer[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.size--,e}getAll(){return this.buffer.filter(e=>e!==void 0)}clear(){this.buffer=new Array(this.capacity),this.head=0,this.tail=0,this.size=0}getSize(){return this.size}isEmpty(){return this.size===0}isFull(){return this.size===this.capacity}};var $=class ${constructor(){this.cache=new k($.MAX_CACHE_SIZE)}get(e,o){return this.cache.getAll().filter(r=>this.isValidCacheItem(r,e,o))}add(e){this.cache.enqueue(e)}clear(){this.cache.clear()}isValidCacheItem(e,o,r){let n=r.getValueInRange(e.range);return f(o,r).startsWith(e.textBeforeCursor)&&this.isPositionValid(e,o,n)}isPositionValid(e,o,r){let{range:n,completion:i}=e,{startLineNumber:s,startColumn:d,endColumn:a}=n,{lineNumber:l,column:m}=o,u=l===s&&m===d,p=i.startsWith(r)&&l===s&&m>=d-r.length&&m<=a+r.length;return u||p}};$.MAX_CACHE_SIZE=10;var B=$;var $e="application/json",ge=async t=>{let{endpoint:e,body:o}=t,{completion:r,error:n}=await L.POST(e,o,{headers:{"Content-Type":$e},fallbackError:"Error while fetching completion item"});if(n)throw new Error(n);return{completion:r}},he=({pos:t,mdl:e,options:o})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:d}=o,a=Ne(t,e),m=!!s?.length?3:2,u=d?Math.floor(d/m):void 0,p=(g,T,_)=>{let M=g(t,e);return T?K(M,T,_):M},C=(g,T)=>!g||!T?g:g.map(({content:_,...M})=>({...M,content:K(_,T)})),c=p(f,u,{from:"end"}),b=p(pe,u),R=C(s,u);return{filename:r,language:n,technologies:i,relatedFiles:R,textBeforeCursor:c,textAfterCursor:b,cursorPosition:t,editorState:{completionMode:a}}},Ne=(t,e)=>{let o=z(t,e),r=w(t,e);return o?"insert":r.trim()?"complete":"continue"};var fe=(t,e,o,r)=>{if(!r)return new t.Range(e.lineNumber,e.column,e.lineNumber,e.column);let n=o.getOffsetAt(e),i=o.getValue().substring(n),s=0,d=0,a=0,l=r.length,m=i.length;if(n>=o.getValue().length)return new t.Range(e.lineNumber,e.column,e.lineNumber,e.column);if(m===0)return new t.Range(e.lineNumber,e.column,e.lineNumber,e.column);let u=Math.min(l,m);for(let c=0;c<u&&r[c]===i[c];c++)s++;for(let c=1;c<=u;c++)r.slice(-c)===i.slice(0,c)&&(d=c);if(a=Math.max(s,d),a===0){for(let c=1;c<l;c++)if(i.startsWith(r.substring(c))){a=l-c;break}}let p=n+a,C=o.getPositionAt(p);return new t.Range(e.lineNumber,e.column,C.lineNumber,C.column)},Pe=t=>S.create(t).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),P=t=>({items:t,enableForwardStability:!0});var Y={onTyping:300,onIdle:600,onDemand:0},qe=t=>({onTyping:A(t,Y.onTyping),onIdle:A(t,Y.onIdle),onDemand:A(t,Y.onDemand)}),N=new B,He=async({monaco:t,mdl:e,pos:o,token:r,isCompletionAccepted:n,onShowCompletion:i,options:s})=>{let{trigger:d="onIdle",endpoint:a,enableCaching:l=!0,onError:m,requestHandler:u}=s;if(!new F(o,e).shouldProvideCompletions())return P([]);if(l){let p=N.get(o,e).map(C=>({insertText:C.completion,range:C.range}));if(p.length>0)return i(),P(p)}if(r.isCancellationRequested||n)return P([]);try{let C=qe(u??ge)[d];r.onCancellationRequested(()=>{C.cancel()});let c=he({pos:o,mdl:e,options:s}),{completion:b}=await C({endpoint:a,body:{completionMetadata:c}});if(b){let R=Pe(b),g=fe(t,o,e,R);return l&&N.add({completion:R,range:g,textBeforeCursor:f(o,e)}),i(),P([{insertText:R,range:g}])}}catch(p){m?m(p):Ve(p)||h(p)}return P([])},Ve=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":!1,ye=He;var y=new WeakMap,E=null,G=(t,e,o)=>{E&&E.deregister();let r=[],n={isCompletionAccepted:!1,isCompletionVisible:!1,isManualTrigger:!1};y.set(e,n),e.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let i=t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(a,l,m,u)=>{let p=y.get(e);if(!(!p||o.trigger==="onDemand"&&!p.isManualTrigger))return ye({monaco:t,mdl:a,pos:l,token:u,isCompletionAccepted:p.isCompletionAccepted,onShowCompletion:()=>{p.isCompletionVisible=!0,p.isManualTrigger=!1},options:o})},freeInlineCompletions:()=>{}});r.push(i);let s=e.onKeyDown(a=>{let l=y.get(e);if(!l)return;let m=a.keyCode===t.KeyCode.Tab||a.keyCode===t.KeyCode.RightArrow&&a.metaKey;l.isCompletionVisible&&m?(l.isCompletionAccepted=!0,l.isCompletionVisible=!1):l.isCompletionAccepted=!1});r.push(s);let d={deregister:()=>{r.forEach(a=>a.dispose()),N.clear(),y.delete(e),E=null},trigger:()=>je(e)};return E=d,d}catch(i){return o.onError?o.onError(i):h(i),{deregister:()=>{r.forEach(s=>s.dispose()),y.delete(e),E=null},trigger:()=>{}}}},je=t=>{let e=y.get(t);if(!e){ae("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isManualTrigger=!0,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{})},Re=(...t)=>(I("The `registerCopilot` function is deprecated. Use `registerCompletion` instead."),G(...t));0&&(module.exports={Copilot,registerCompletion,registerCopilot});
59
+ `),this}build(){return this.formattedCompletion}};var F=class{constructor(e,o){this.cursorPos=e,this.mdl=o}shouldProvideCompletions(){return!de(this.cursorPos,this.mdl)}};var k=class{constructor(e){this.capacity=e;this.head=0;this.tail=0;this.size=0;this.buffer=new Array(e)}enqueue(e){let o;return this.size===this.capacity&&(o=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,o}dequeue(){if(this.size===0)return;let e=this.buffer[this.head];return this.buffer[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.size--,e}getAll(){return this.buffer.filter(e=>e!==void 0)}clear(){this.buffer=new Array(this.capacity),this.head=0,this.tail=0,this.size=0}getSize(){return this.size}isEmpty(){return this.size===0}isFull(){return this.size===this.capacity}};var $=class ${constructor(){this.cache=new k($.MAX_CACHE_SIZE)}get(e,o){return this.cache.getAll().filter(r=>this.isValidCacheItem(r,e,o))}add(e){this.cache.enqueue(e)}clear(){this.cache.clear()}isValidCacheItem(e,o,r){let n=r.getValueInRange(e.range);return f(o,r).startsWith(e.textBeforeCursor)&&this.isPositionValid(e,o,n)}isPositionValid(e,o,r){let{range:n,completion:i}=e,{startLineNumber:s,startColumn:d,endColumn:a}=n,{lineNumber:l,column:m}=o,u=l===s&&m===d,p=i.startsWith(r)&&l===s&&m>=d-r.length&&m<=a+r.length;return u||p}};$.MAX_CACHE_SIZE=10;var B=$;var $e="application/json",ge=async t=>{let{endpoint:e,body:o}=t,{completion:r,error:n}=await L.POST(e,o,{headers:{"Content-Type":$e},fallbackError:"Error while fetching completion item"});if(n)throw new Error(n);return{completion:r}},he=({pos:t,mdl:e,options:o})=>{let{filename:r,language:n,technologies:i,relatedFiles:s,maxContextLines:d}=o,a=Ne(t,e),m=!!s?.length?3:2,u=d?Math.floor(d/m):void 0,p=(g,x,_)=>{let M=g(t,e);return x?K(M,x,_):M},C=(g,x)=>!g||!x?g:g.map(({content:_,...M})=>({...M,content:K(_,x)})),c=p(f,u,{from:"end"}),E=p(pe,u),R=C(s,u);return{filename:r,language:n,technologies:i,relatedFiles:R,textBeforeCursor:c,textAfterCursor:E,cursorPosition:t,editorState:{completionMode:a}}},Ne=(t,e)=>{let o=z(t,e),r=w(t,e);return o?"insert":r.trim()?"complete":"continue"};var fe=(t,e,o,r)=>{if(!r)return new t.Range(e.lineNumber,e.column,e.lineNumber,e.column);let n=o.getOffsetAt(e),i=o.getValue().substring(n),s=0,d=0,a=0,l=r.length,m=i.length;if(n>=o.getValue().length)return new t.Range(e.lineNumber,e.column,e.lineNumber,e.column);if(m===0)return new t.Range(e.lineNumber,e.column,e.lineNumber,e.column);let u=Math.min(l,m);for(let c=0;c<u&&r[c]===i[c];c++)s++;for(let c=1;c<=u;c++)r.slice(-c)===i.slice(0,c)&&(d=c);if(a=Math.max(s,d),a===0){for(let c=1;c<l;c++)if(i.startsWith(r.substring(c))){a=l-c;break}}let p=n+a,C=o.getPositionAt(p);return new t.Range(e.lineNumber,e.column,C.lineNumber,C.column)},Pe=t=>S.create(t).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),P=t=>({items:t,enableForwardStability:!0});var Y={onTyping:300,onIdle:600,onDemand:0},qe=t=>({onTyping:A(t,Y.onTyping),onIdle:A(t,Y.onIdle),onDemand:A(t,Y.onDemand)}),N=new B,He=async({monaco:t,mdl:e,pos:o,token:r,isCompletionAccepted:n,onShowCompletion:i,options:s})=>{let{trigger:d="onIdle",endpoint:a,enableCaching:l=!0,onError:m,requestHandler:u}=s;if(!new F(o,e).shouldProvideCompletions())return P([]);if(l){let p=N.get(o,e).map(C=>({insertText:C.completion,range:C.range}));if(p.length>0)return i(),P(p)}if(r.isCancellationRequested||n)return P([]);try{let C=qe(u??ge)[d];r.onCancellationRequested(()=>{C.cancel()});let c=he({pos:o,mdl:e,options:s}),{completion:E}=await C({endpoint:a,body:{completionMetadata:c}});if(E){let R=Pe(E),g=fe(t,o,e,R);return l&&N.add({completion:R,range:g,textBeforeCursor:f(o,e)}),i(),P([{insertText:R,range:g}])}}catch(p){m?m(p):Ve(p)||h(p)}return P([])},Ve=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":!1,ye=He;var y=new WeakMap,b=null,G=(t,e,o)=>{b&&b.deregister();let r=[],n={isCompletionAccepted:!1,isCompletionVisible:!1,isManualTrigger:!1};y.set(e,n),e.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let i=t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(a,l,m,u)=>{let p=y.get(e);if(!(!p||o.trigger==="onDemand"&&!p.isManualTrigger))return ye({monaco:t,mdl:a,pos:l,token:u,isCompletionAccepted:p.isCompletionAccepted,onShowCompletion:()=>{p.isCompletionVisible=!0,p.isManualTrigger=!1},options:o})},freeInlineCompletions:()=>{}});r.push(i);let s=e.onKeyDown(a=>{let l=y.get(e);if(!l)return;let m=a.keyCode===t.KeyCode.Tab||a.keyCode===t.KeyCode.RightArrow&&a.metaKey;l.isCompletionVisible&&m?(l.isCompletionAccepted=!0,l.isCompletionVisible=!1):l.isCompletionAccepted=!1});r.push(s);let d={deregister:()=>{r.forEach(a=>a.dispose()),N.clear(),y.delete(e),b=null},trigger:()=>je(e)};return b=d,d}catch(i){return o.onError?o.onError(i):h(i),{deregister:()=>{r.forEach(s=>s.dispose()),y.delete(e),b=null},trigger:()=>{}}}},je=t=>{let e=y.get(t);if(!e){ae("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isManualTrigger=!0,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{})},Re=(...t)=>(I("registerCopilot","registerCompletion"),G(...t));0&&(module.exports={Copilot,registerCompletion,registerCopilot});
package/build/index.mjs CHANGED
@@ -1,11 +1,11 @@
1
- var _=["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-20241022","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",J={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages"},O=.1;var Z={"claude-3-5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var ye={createRequestBody:(t,e)=>{let r=t==="o1-preview"||t==="o1-mini"?[{role:"user",content:e.user}]:[{role:"system",content:e.system},{role:"user",content:e.user}];return{model:V(t),temperature:O,messages:r}},createHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),parseCompletion:t=>t.choices?.length?t.choices[0].message.content:null},Re={createRequestBody:(t,e)=>({model:V(t),temperature:O,messages:[{role:"system",content:e.system},{role:"user",content:e.user}]}),createHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),parseCompletion:t=>t.choices?.length?t.choices[0].message.content:null},Te={createRequestBody:(t,e)=>({model:V(t),temperature:O,system:e.system,messages:[{role:"user",content:e.user}],max_tokens:xe(t)}),createHeaders:t=>({"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"}),parseCompletion:t=>!t.content||typeof t.content!="string"?null:t.content},H={openai:ye,groq:Re,anthropic:Te},Q=(t,e,o)=>H[e].createRequestBody(t,o),ee=(t,e)=>H[e].createHeaders(t),te=(t,e)=>H[e].parseCompletion(t),V=t=>Y[t],oe=t=>J[t],xe=t=>Z[t]||4096;var re="\x1B[91m",ne="\x1B[93m",v="\x1B[0m",j="\x1B[1m",h=t=>{let e,o;t instanceof Error?(e=t.message,o=t.stack):typeof t=="string"?e=t:e="An unknown error occurred";let r=`${re}${j}[MONACOPILOT ERROR] ${e}${v}`;return console.error(o?`${r}
1
+ var _=["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-20241022","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",J={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages"},O=.1;var Z={"claude-3-5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var ye={createRequestBody:(t,e)=>{let r=t==="o1-preview"||t==="o1-mini"?[{role:"user",content:e.user}]:[{role:"system",content:e.system},{role:"user",content:e.user}];return{model:V(t),temperature:O,messages:r}},createHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),parseCompletion:t=>t.choices?.length?t.choices[0].message.content:null},Re={createRequestBody:(t,e)=>({model:V(t),temperature:O,messages:[{role:"system",content:e.system},{role:"user",content:e.user}]}),createHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),parseCompletion:t=>t.choices?.length?t.choices[0].message.content:null},xe={createRequestBody:(t,e)=>({model:V(t),temperature:O,system:e.system,messages:[{role:"user",content:e.user}],max_tokens:Te(t)}),createHeaders:t=>({"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"}),parseCompletion:t=>!t.content||typeof t.content!="string"?null:t.content},H={openai:ye,groq:Re,anthropic:xe},Q=(t,e,o)=>H[e].createRequestBody(t,o),ee=(t,e)=>H[e].createHeaders(t),te=(t,e)=>H[e].parseCompletion(t),V=t=>Y[t],oe=t=>J[t],Te=t=>Z[t]||4096;var re="\x1B[91m",ne="\x1B[93m",v="\x1B[0m",j="\x1B[1m",h=t=>{let e,o;t instanceof Error?(e=t.message,o=t.stack):typeof t=="string"?e=t:e="An unknown error occurred";let r=`${re}${j}[MONACOPILOT ERROR] ${e}${v}`;return console.error(o?`${r}
2
2
  ${re}Stack trace:${v}
3
- ${o}`:r),{message:e,stack:o}},I=t=>{console.warn(`${ne}${j}[MONACOPILOT DEPRECATED] ${t}${v}`)},ie=t=>{console.warn(`${ne}${j}[MONACOPILOT WARN] ${t}${v}`)};var A=(t,e)=>{let o=null,r=null,i=(...n)=>new Promise((s,d)=>{o&&(clearTimeout(o),r&&r("Cancelled")),r=d,o=setTimeout(()=>{s(t(...n)),r=null},e)});return i.cancel=()=>{o&&(clearTimeout(o),r&&r("Cancelled"),o=null,r=null)},i},x=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`;var U=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1];var w=(t,e)=>e.getLineContent(t.lineNumber).slice(t.column-1),se=(t,e)=>e.getLineContent(t.lineNumber).slice(0,t.column-1),f=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),ae=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),W=(t,e,o={})=>{if(e<=0)return"";let r=t.split(`
3
+ ${o}`:r),{message:e,stack:o}},ie=t=>{console.warn(`${ne}${j}[MONACOPILOT WARN] ${t}${v}`)};var I=(t,e,o)=>console.warn(`${ne}${j}[MONACOPILOT DEPRECATED] "${t}" is deprecated${o?` in ${o}`:""}. Please use "${e}" instead. It will be removed in a future version.${v}`);var A=(t,e)=>{let o=null,r=null,i=(...n)=>new Promise((s,d)=>{o&&(clearTimeout(o),r&&r("Cancelled")),r=d,o=setTimeout(()=>{s(t(...n)),r=null},e)});return i.cancel=()=>{o&&(clearTimeout(o),r&&r("Cancelled"),o=null,r=null)},i},T=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`;var U=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1];var w=(t,e)=>e.getLineContent(t.lineNumber).slice(t.column-1),se=(t,e)=>e.getLineContent(t.lineNumber).slice(0,t.column-1),f=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),ae=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),W=(t,e,o={})=>{if(e<=0)return"";let r=t.split(`
4
4
  `),i=r.length;if(e>=i)return t;if(o.from==="end"){let s=r.slice(-e);return s.every(d=>d==="")?`
5
5
  `.repeat(e):s.join(`
6
6
  `)}let n=r.slice(0,e);return n.every(s=>s==="")?`
7
7
  `.repeat(e):n.join(`
8
- `)};var le=async(t,e,o={})=>{let r={"Content-Type":"application/json",...o.headers},i=e==="POST"&&o.body?JSON.stringify(o.body):void 0,n=await fetch(t,{method:e,headers:r,body:i,signal:o.signal});if(!n.ok)throw new Error(`${n.statusText||o.fallbackError||"Network error"}`);return n.json()},Ee=(t,e)=>le(t,"GET",e),be=(t,e,o)=>le(t,"POST",{...o,body:e}),L={GET:Ee,POST:be};var pe=(t,e)=>{let o=w(t,e).trim(),r=se(t,e).trim();return t.column<=3&&(o!==""||r!=="")};var Me=t=>{let{technologies:e=[],filename:o,relatedFiles:r,language:i}=t,n=x([i,...e].filter(c=>typeof c=="string"&&!!c)),s=`You are an expert ${n?`${n} `:""}developer assistant.`,d="Your task is to provide precise and contextually relevant code completions, modifications, or generations",a=o?`for the file '${o}'`:"",l=r&&r.length>0?"Consider the context of the current and related files provided.":"",m="Ensure that your responses integrate seamlessly with the existing code and maintain consistency with the project's style and conventions.",u="Before providing the completion or modification, think through the problem step-by-step, considering best practices and any potential edge cases.",p=i?`Pay special attention to ${i}-specific syntax and best practices.`:"";return`${s}
8
+ `)};var le=async(t,e,o={})=>{let r={"Content-Type":"application/json",...o.headers},i=e==="POST"&&o.body?JSON.stringify(o.body):void 0,n=await fetch(t,{method:e,headers:r,body:i,signal:o.signal});if(!n.ok)throw new Error(`${n.statusText||o.fallbackError||"Network error"}`);return n.json()},be=(t,e)=>le(t,"GET",e),Ee=(t,e,o)=>le(t,"POST",{...o,body:e}),L={GET:be,POST:Ee};var pe=(t,e)=>{let o=w(t,e).trim(),r=se(t,e).trim();return t.column<=3&&(o!==""||r!=="")};var Me=t=>{let{technologies:e=[],filename:o,relatedFiles:r,language:i}=t,n=T([i,...e].filter(c=>typeof c=="string"&&!!c)),s=`You are an expert ${n?`${n} `:""}developer assistant.`,d="Your task is to provide precise and contextually relevant code completions, modifications, or generations",a=o?`for the file '${o}'`:"",l=r&&r.length>0?"Consider the context of the current and related files provided.":"",m="Ensure that your responses integrate seamlessly with the existing code and maintain consistency with the project's style and conventions.",u="Before providing the completion or modification, think through the problem step-by-step, considering best practices and any potential edge cases.",p=i?`Pay special attention to ${i}-specific syntax and best practices.`:"";return`${s}
9
9
  ${d} ${a}.
10
10
  ${m}
11
11
  ${l}
@@ -52,8 +52,8 @@ Depending on the completion mode, adjust your completion accordingly:
52
52
  ${{continue:"-- Continue writing the code from the current cursor location.",insert:"-- Insert the appropriate code snippet at the cursor point.",complete:"-- Supply the necessary code to finish the ongoing statement or block."}[r]||""}
53
53
 
54
54
  Remember to output **only** the code that should be inserted at the cursor, without any additional formatting or explanations.
55
- `.trim();return ce(s,t)},me=Ie;var z=class{constructor(e,o={}){if(!e)throw new Error("Please provide an API key.");this.apiKey=e,this.provider=o.provider??X,this.model=o.model??G,this.validateInputs()}validateInputs(){if(!_.includes(this.provider))throw new Error(`Unsupported provider "${this.provider}". Please choose from: ${x(_)}. For custom models, provider specification is not needed.`);if(typeof this.model=="string"&&!q[this.provider].includes(this.model))throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${x(q[this.provider])}`)}async complete(e){let{body:o,options:r}=e,{completionMetadata:i}=o,{headers:n={},customPrompt:s}=r??{},d=this.generatePrompt(i,s),{endpoint:a,requestBody:l,headers:m}=this.prepareRequestDetails(d);try{let u=await this.sendCompletionRequest(a,l,{...m,...n});return this.processCompletionResponse(u)}catch(u){return this.handleCompletionError(u)}}generatePrompt(e,o){let r=me(e);return o?{...r,...o(e)}:r}prepareRequestDetails(e){let o=oe(this.provider),r,i=ee(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let n=this.model.config(this.apiKey,e);o=n.endpoint??o,r=n.body??{},i={...i,...n.headers}}else r=Q(this.model,this.provider,e);return{endpoint:o,requestBody:r,headers:i}}async sendCompletionRequest(e,o,r){return L.POST(e,o,{headers:r})}processCompletionResponse(e){if(typeof this.model=="object"&&"transformResponse"in this.model){let o=this.model.transformResponse(e);return"completion"in o&&I("The `completion` property in `transformResponse` function is deprecated. Please use `text` instead."),{completion:o.text??o.completion??null}}else return{completion:te(e,this.provider)}}handleCompletionError(e){return{error:h(e).message,completion:null}}};var D=class t{constructor(e){this.formattedCompletion="";this.formattedCompletion=e}static create(e){return new t(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 o=/```[\s\S]*?```/g,r=e,i;for(;(i=o.exec(e))!==null;){let n=i[0],s=n.split(`
55
+ `.trim();return ce(s,t)},me=Ie;var z=class{constructor(e,o={}){if(!e)throw new Error("Please provide an API key.");this.apiKey=e,this.provider=o.provider??X,this.model=o.model??G,this.validateInputs()}validateInputs(){if(!_.includes(this.provider))throw new Error(`Unsupported provider "${this.provider}". Please choose from: ${T(_)}. 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: ${T(q[this.provider])}`)}async complete(e){let{body:o,options:r}=e,{completionMetadata:i}=o,{headers:n={},customPrompt:s}=r??{},d=this.generatePrompt(i,s),{endpoint:a,requestBody:l,headers:m}=this.prepareRequestDetails(d);try{let u=await this.sendCompletionRequest(a,l,{...m,...n});return this.processCompletionResponse(u)}catch(u){return this.handleCompletionError(u)}}generatePrompt(e,o){let r=me(e);return o?{...r,...o(e)}:r}prepareRequestDetails(e){let o=oe(this.provider),r,i=ee(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let n=this.model.config(this.apiKey,e);o=n.endpoint??o,r=n.body??{},i={...i,...n.headers}}else r=Q(this.model,this.provider,e);return{endpoint:o,requestBody:r,headers:i}}async sendCompletionRequest(e,o,r){return L.POST(e,o,{headers:r})}processCompletionResponse(e){if(typeof this.model=="object"&&"transformResponse"in this.model){let o=this.model.transformResponse(e);return"completion"in o&&I("completion","text","Copilot.model.transformResponse"),{completion:o.text??o.completion??null}}else return{completion:te(e,this.provider)}}handleCompletionError(e){return{error:h(e).message,completion:null}}};var D=class t{constructor(e){this.formattedCompletion="";this.formattedCompletion=e}static create(e){return new t(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 o=/```[\s\S]*?```/g,r=e,i;for(;(i=o.exec(e))!==null;){let n=i[0],s=n.split(`
56
56
  `).slice(1,-1).join(`
57
57
  `);r=r.replace(n,s)}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
58
58
 
59
- `),this}build(){return this.formattedCompletion}};var S=class{constructor(e,o){this.cursorPos=e,this.mdl=o}shouldProvideCompletions(){return!pe(this.cursorPos,this.mdl)}};var F=class{constructor(e){this.capacity=e;this.head=0;this.tail=0;this.size=0;this.buffer=new Array(e)}enqueue(e){let o;return this.size===this.capacity&&(o=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,o}dequeue(){if(this.size===0)return;let e=this.buffer[this.head];return this.buffer[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.size--,e}getAll(){return this.buffer.filter(e=>e!==void 0)}clear(){this.buffer=new Array(this.capacity),this.head=0,this.tail=0,this.size=0}getSize(){return this.size}isEmpty(){return this.size===0}isFull(){return this.size===this.capacity}};var B=class B{constructor(){this.cache=new F(B.MAX_CACHE_SIZE)}get(e,o){return this.cache.getAll().filter(r=>this.isValidCacheItem(r,e,o))}add(e){this.cache.enqueue(e)}clear(){this.cache.clear()}isValidCacheItem(e,o,r){let i=r.getValueInRange(e.range);return f(o,r).startsWith(e.textBeforeCursor)&&this.isPositionValid(e,o,i)}isPositionValid(e,o,r){let{range:i,completion:n}=e,{startLineNumber:s,startColumn:d,endColumn:a}=i,{lineNumber:l,column:m}=o,u=l===s&&m===d,p=n.startsWith(r)&&l===s&&m>=d-r.length&&m<=a+r.length;return u||p}};B.MAX_CACHE_SIZE=10;var k=B;var Ae="application/json",ue=async t=>{let{endpoint:e,body:o}=t,{completion:r,error:i}=await L.POST(e,o,{headers:{"Content-Type":Ae},fallbackError:"Error while fetching completion item"});if(i)throw new Error(i);return{completion:r}},Ce=({pos:t,mdl:e,options:o})=>{let{filename:r,language:i,technologies:n,relatedFiles:s,maxContextLines:d}=o,a=we(t,e),m=!!s?.length?3:2,u=d?Math.floor(d/m):void 0,p=(g,T,N)=>{let M=g(t,e);return T?W(M,T,N):M},C=(g,T)=>!g||!T?g:g.map(({content:N,...M})=>({...M,content:W(N,T)})),c=p(f,u,{from:"end"}),b=p(ae,u),R=C(s,u);return{filename:r,language:i,technologies:n,relatedFiles:R,textBeforeCursor:c,textAfterCursor:b,cursorPosition:t,editorState:{completionMode:a}}},we=(t,e)=>{let o=U(t,e),r=w(t,e);return o?"insert":r.trim()?"complete":"continue"};var ge=(t,e,o,r)=>{if(!r)return new t.Range(e.lineNumber,e.column,e.lineNumber,e.column);let i=o.getOffsetAt(e),n=o.getValue().substring(i),s=0,d=0,a=0,l=r.length,m=n.length;if(i>=o.getValue().length)return new t.Range(e.lineNumber,e.column,e.lineNumber,e.column);if(m===0)return new t.Range(e.lineNumber,e.column,e.lineNumber,e.column);let u=Math.min(l,m);for(let c=0;c<u&&r[c]===n[c];c++)s++;for(let c=1;c<=u;c++)r.slice(-c)===n.slice(0,c)&&(d=c);if(a=Math.max(s,d),a===0){for(let c=1;c<l;c++)if(n.startsWith(r.substring(c))){a=l-c;break}}let p=i+a,C=o.getPositionAt(p);return new t.Range(e.lineNumber,e.column,C.lineNumber,C.column)},he=t=>D.create(t).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),P=t=>({items:t,enableForwardStability:!0});var K={onTyping:300,onIdle:600,onDemand:0},De=t=>({onTyping:A(t,K.onTyping),onIdle:A(t,K.onIdle),onDemand:A(t,K.onDemand)}),$=new k,Se=async({monaco:t,mdl:e,pos:o,token:r,isCompletionAccepted:i,onShowCompletion:n,options:s})=>{let{trigger:d="onIdle",endpoint:a,enableCaching:l=!0,onError:m,requestHandler:u}=s;if(!new S(o,e).shouldProvideCompletions())return P([]);if(l){let p=$.get(o,e).map(C=>({insertText:C.completion,range:C.range}));if(p.length>0)return n(),P(p)}if(r.isCancellationRequested||i)return P([]);try{let C=De(u??ue)[d];r.onCancellationRequested(()=>{C.cancel()});let c=Ce({pos:o,mdl:e,options:s}),{completion:b}=await C({endpoint:a,body:{completionMetadata:c}});if(b){let R=he(b),g=ge(t,o,e,R);return l&&$.add({completion:R,range:g,textBeforeCursor:f(o,e)}),n(),P([{insertText:R,range:g}])}}catch(p){m?m(p):Fe(p)||h(p)}return P([])},Fe=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":!1,fe=Se;var y=new WeakMap,E=null,Pe=(t,e,o)=>{E&&E.deregister();let r=[],i={isCompletionAccepted:!1,isCompletionVisible:!1,isManualTrigger:!1};y.set(e,i),e.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let n=t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(a,l,m,u)=>{let p=y.get(e);if(!(!p||o.trigger==="onDemand"&&!p.isManualTrigger))return fe({monaco:t,mdl:a,pos:l,token:u,isCompletionAccepted:p.isCompletionAccepted,onShowCompletion:()=>{p.isCompletionVisible=!0,p.isManualTrigger=!1},options:o})},freeInlineCompletions:()=>{}});r.push(n);let s=e.onKeyDown(a=>{let l=y.get(e);if(!l)return;let m=a.keyCode===t.KeyCode.Tab||a.keyCode===t.KeyCode.RightArrow&&a.metaKey;l.isCompletionVisible&&m?(l.isCompletionAccepted=!0,l.isCompletionVisible=!1):l.isCompletionAccepted=!1});r.push(s);let d={deregister:()=>{r.forEach(a=>a.dispose()),$.clear(),y.delete(e),E=null},trigger:()=>ke(e)};return E=d,d}catch(n){return o.onError?o.onError(n):h(n),{deregister:()=>{r.forEach(s=>s.dispose()),y.delete(e),E=null},trigger:()=>{}}}},ke=t=>{let e=y.get(t);if(!e){ie("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isManualTrigger=!0,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{})},Be=(...t)=>(I("The `registerCopilot` function is deprecated. Use `registerCompletion` instead."),Pe(...t));export{z as Copilot,Pe as registerCompletion,Be as registerCopilot};
59
+ `),this}build(){return this.formattedCompletion}};var S=class{constructor(e,o){this.cursorPos=e,this.mdl=o}shouldProvideCompletions(){return!pe(this.cursorPos,this.mdl)}};var F=class{constructor(e){this.capacity=e;this.head=0;this.tail=0;this.size=0;this.buffer=new Array(e)}enqueue(e){let o;return this.size===this.capacity&&(o=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,o}dequeue(){if(this.size===0)return;let e=this.buffer[this.head];return this.buffer[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.size--,e}getAll(){return this.buffer.filter(e=>e!==void 0)}clear(){this.buffer=new Array(this.capacity),this.head=0,this.tail=0,this.size=0}getSize(){return this.size}isEmpty(){return this.size===0}isFull(){return this.size===this.capacity}};var B=class B{constructor(){this.cache=new F(B.MAX_CACHE_SIZE)}get(e,o){return this.cache.getAll().filter(r=>this.isValidCacheItem(r,e,o))}add(e){this.cache.enqueue(e)}clear(){this.cache.clear()}isValidCacheItem(e,o,r){let i=r.getValueInRange(e.range);return f(o,r).startsWith(e.textBeforeCursor)&&this.isPositionValid(e,o,i)}isPositionValid(e,o,r){let{range:i,completion:n}=e,{startLineNumber:s,startColumn:d,endColumn:a}=i,{lineNumber:l,column:m}=o,u=l===s&&m===d,p=n.startsWith(r)&&l===s&&m>=d-r.length&&m<=a+r.length;return u||p}};B.MAX_CACHE_SIZE=10;var k=B;var Ae="application/json",ue=async t=>{let{endpoint:e,body:o}=t,{completion:r,error:i}=await L.POST(e,o,{headers:{"Content-Type":Ae},fallbackError:"Error while fetching completion item"});if(i)throw new Error(i);return{completion:r}},Ce=({pos:t,mdl:e,options:o})=>{let{filename:r,language:i,technologies:n,relatedFiles:s,maxContextLines:d}=o,a=we(t,e),m=!!s?.length?3:2,u=d?Math.floor(d/m):void 0,p=(g,x,N)=>{let M=g(t,e);return x?W(M,x,N):M},C=(g,x)=>!g||!x?g:g.map(({content:N,...M})=>({...M,content:W(N,x)})),c=p(f,u,{from:"end"}),E=p(ae,u),R=C(s,u);return{filename:r,language:i,technologies:n,relatedFiles:R,textBeforeCursor:c,textAfterCursor:E,cursorPosition:t,editorState:{completionMode:a}}},we=(t,e)=>{let o=U(t,e),r=w(t,e);return o?"insert":r.trim()?"complete":"continue"};var ge=(t,e,o,r)=>{if(!r)return new t.Range(e.lineNumber,e.column,e.lineNumber,e.column);let i=o.getOffsetAt(e),n=o.getValue().substring(i),s=0,d=0,a=0,l=r.length,m=n.length;if(i>=o.getValue().length)return new t.Range(e.lineNumber,e.column,e.lineNumber,e.column);if(m===0)return new t.Range(e.lineNumber,e.column,e.lineNumber,e.column);let u=Math.min(l,m);for(let c=0;c<u&&r[c]===n[c];c++)s++;for(let c=1;c<=u;c++)r.slice(-c)===n.slice(0,c)&&(d=c);if(a=Math.max(s,d),a===0){for(let c=1;c<l;c++)if(n.startsWith(r.substring(c))){a=l-c;break}}let p=i+a,C=o.getPositionAt(p);return new t.Range(e.lineNumber,e.column,C.lineNumber,C.column)},he=t=>D.create(t).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),P=t=>({items:t,enableForwardStability:!0});var K={onTyping:300,onIdle:600,onDemand:0},De=t=>({onTyping:A(t,K.onTyping),onIdle:A(t,K.onIdle),onDemand:A(t,K.onDemand)}),$=new k,Se=async({monaco:t,mdl:e,pos:o,token:r,isCompletionAccepted:i,onShowCompletion:n,options:s})=>{let{trigger:d="onIdle",endpoint:a,enableCaching:l=!0,onError:m,requestHandler:u}=s;if(!new S(o,e).shouldProvideCompletions())return P([]);if(l){let p=$.get(o,e).map(C=>({insertText:C.completion,range:C.range}));if(p.length>0)return n(),P(p)}if(r.isCancellationRequested||i)return P([]);try{let C=De(u??ue)[d];r.onCancellationRequested(()=>{C.cancel()});let c=Ce({pos:o,mdl:e,options:s}),{completion:E}=await C({endpoint:a,body:{completionMetadata:c}});if(E){let R=he(E),g=ge(t,o,e,R);return l&&$.add({completion:R,range:g,textBeforeCursor:f(o,e)}),n(),P([{insertText:R,range:g}])}}catch(p){m?m(p):Fe(p)||h(p)}return P([])},Fe=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":!1,fe=Se;var y=new WeakMap,b=null,Pe=(t,e,o)=>{b&&b.deregister();let r=[],i={isCompletionAccepted:!1,isCompletionVisible:!1,isManualTrigger:!1};y.set(e,i),e.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let n=t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(a,l,m,u)=>{let p=y.get(e);if(!(!p||o.trigger==="onDemand"&&!p.isManualTrigger))return fe({monaco:t,mdl:a,pos:l,token:u,isCompletionAccepted:p.isCompletionAccepted,onShowCompletion:()=>{p.isCompletionVisible=!0,p.isManualTrigger=!1},options:o})},freeInlineCompletions:()=>{}});r.push(n);let s=e.onKeyDown(a=>{let l=y.get(e);if(!l)return;let m=a.keyCode===t.KeyCode.Tab||a.keyCode===t.KeyCode.RightArrow&&a.metaKey;l.isCompletionVisible&&m?(l.isCompletionAccepted=!0,l.isCompletionVisible=!1):l.isCompletionAccepted=!1});r.push(s);let d={deregister:()=>{r.forEach(a=>a.dispose()),$.clear(),y.delete(e),b=null},trigger:()=>ke(e)};return b=d,d}catch(n){return o.onError?o.onError(n):h(n),{deregister:()=>{r.forEach(s=>s.dispose()),y.delete(e),b=null},trigger:()=>{}}}},ke=t=>{let e=y.get(t);if(!e){ie("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isManualTrigger=!0,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{})},Be=(...t)=>(I("registerCopilot","registerCompletion"),Pe(...t));export{z as Copilot,Pe as registerCompletion,Be as registerCopilot};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monacopilot",
3
- "version": "0.12.8",
3
+ "version": "0.12.10",
4
4
  "description": "AI auto-completion plugin for Monaco Editor",
5
5
  "main": "./build/index.js",
6
6
  "module": "./build/index.mjs",