monacopilot 0.10.4 → 0.10.5

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/build/index.js CHANGED
@@ -1,9 +1,9 @@
1
- "use strict";var S=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames;var Ce=Object.prototype.hasOwnProperty;var ge=(t,e)=>{for(var o in e)S(t,o,{get:e[o],enumerable:!0})},he=(t,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ue(e))!Ce.call(t,r)&&r!==o&&S(t,r,{get:()=>e[r],enumerable:!(n=me(e,r))||n.enumerable});return t};var fe=t=>he(S({},"__esModule",{value:!0}),t);var Se={};ge(Se,{Copilot:()=>b,registerCompletion:()=>W,registerCopilot:()=>ce});module.exports=fe(Se);var B=["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"},k={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"]},X="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"},M=.3;var P=class P{constructor(){}static getInstance(){return P.instance}handleError(e,o){let n=this.getErrorDetails(e),r=`\x1B[31m[${o}]\x1B[0m \x1B[1m${n.message}\x1B[0m`;return console.error(r),n}getErrorDetails(e){return e instanceof Error?{message:e.message,name:e.name,stack:e.stack,context:e.context}:{message:String(e),name:"UnknownError"}}};P.instance=new P;var H=P;var C=(t,e)=>H.getInstance().handleError(t,e);var q=(t,e)=>{let o=null,n=null,r=(...i)=>new Promise((s,l)=>{o&&(clearTimeout(o),n&&n("Cancelled")),n=l,o=setTimeout(()=>{s(t(...i)),n=null},e)});return r.cancel=()=>{o&&(clearTimeout(o),n&&n("Cancelled"),o=null,n=null)},r},T=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`;var F=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1];var I=(t,e)=>e.getLineContent(t.lineNumber).slice(t.column-1),h=(t,e)=>e.getLineContent(t.lineNumber).slice(0,t.column-1),Z=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),Q=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),$=(t,e,o={})=>{if(e<=0)return"";let n=t.split(`
2
- `),r=n.length;if(e>=r)return t;if(o.from==="end"){let s=n.slice(-e);return s.every(l=>l==="")?`
3
- `.repeat(e):s.join(`
4
- `)}let i=n.slice(0,e);return i.every(s=>s==="")?`
5
- `.repeat(e):i.join(`
6
- `)};var ee=async(t,e,o={})=>{let n={"Content-Type":"application/json",...o.headers},r=e==="POST"&&o.body?JSON.stringify(o.body):void 0,i=await fetch(t,{method:e,headers:n,body:r,signal:o.signal});if(!i.ok)throw new Error(`${o.error||"Network error"}: ${i.statusText}`);return i.json()},xe=(t,e)=>ee(t,"GET",e),Ee=(t,e,o)=>ee(t,"POST",{...o,body:e}),v={GET:xe,POST:Ee};var te=(t,e)=>{let o=I(t,e).trim(),n=h(t,e).trim();return t.column<=3&&(o!==""||n!=="")};var Pe=t=>t==="javascript"?"JavaScript (ESNext)":t,Te=t=>`You are an expert ${Pe(t.language)||T(t.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.`,ye=t=>{let{filename:e="/",textBeforeCursor:o="",textAfterCursor:n="",externalContext:r,editorState:i}=t,a=`
1
+ "use strict";var B=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames;var Ce=Object.prototype.hasOwnProperty;var ge=(e,t)=>{for(var o in t)B(e,o,{get:t[o],enumerable:!0})},he=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ue(t))!Ce.call(e,r)&&r!==o&&B(e,r,{get:()=>t[r],enumerable:!(n=me(t,r))||n.enumerable});return e};var fe=e=>he(B({},"__esModule",{value:!0}),e);var Be={};ge(Be,{Copilot:()=>v,registerCompletion:()=>Y,registerCopilot:()=>de});module.exports=fe(Be);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"]},J="llama-3-70b",z="groq",Z={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages"},M=.1;var P=class P{constructor(){}static getInstance(){return P.instance}handleError(t,o){let n=this.getErrorDetails(t),r=`\x1B[31m[${o}]\x1B[0m \x1B[1m${n.message}\x1B[0m`;return console.error(r),n}getErrorDetails(t){return t instanceof Error?{message:t.message,name:t.name,stack:t.stack,context:t.context}:{message:String(t),name:"UnknownError"}}};P.instance=new P;var q=P;var g=(e,t)=>q.getInstance().handleError(e,t);var F=(e,t)=>{let o=null,n=null,r=(...i)=>new Promise((l,s)=>{o&&(clearTimeout(o),n&&n("Cancelled")),n=s,o=setTimeout(()=>{l(e(...i)),n=null},t)});return r.cancel=()=>{o&&(clearTimeout(o),n&&n("Cancelled"),o=null,n=null)},r},T=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 I=(e,t)=>t.getLineContent(e.lineNumber).slice(e.column-1),f=(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 n=e.split(`
2
+ `),r=n.length;if(t>=r)return e;if(o.from==="end"){let l=n.slice(-t);return l.every(s=>s==="")?`
3
+ `.repeat(t):l.join(`
4
+ `)}let i=n.slice(0,t);return i.every(l=>l==="")?`
5
+ `.repeat(t):i.join(`
6
+ `)};var te=async(e,t,o={})=>{let n={"Content-Type":"application/json",...o.headers},r=t==="POST"&&o.body?JSON.stringify(o.body):void 0,i=await fetch(e,{method:t,headers:n,body:r,signal:o.signal});if(!i.ok)throw new Error(`${o.error||"Network error"}: ${i.statusText}`);return i.json()},xe=(e,t)=>te(e,"GET",t),Ee=(e,t,o)=>te(e,"POST",{...o,body:t}),b={GET:xe,POST:Ee};var oe=(e,t)=>{let o=I(e,t).trim(),n=f(e,t).trim();return e.column<=3&&(o!==""||n!=="")};var Pe="<user-current-cursor-position-is-here>",Te=e=>e==="javascript"?"JavaScript (ESNext)":e,ye=e=>`You are an expert ${Te(e.language)||T(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.`,Oe=e=>{let{filename:t="/",textBeforeCursor:o="",textAfterCursor:n="",externalContext:r,editorState:i}=e,a=`
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,29 +17,29 @@
17
17
  <step>Return <strong>only</strong> the code required at the cursor position.</step>
18
18
  </steps>
19
19
  </guidelines>
20
- `,p=`
20
+ `,c=`
21
21
  <context>
22
- <current_file path="${e}">
22
+ <current_file path="${t}">
23
23
  <code>
24
- ${o}\u2588${n}
24
+ ${o}${Pe}${n}
25
25
  </code>
26
26
  </current_file>
27
27
  </context>
28
- `,m=r?.map(({path:c,content:d})=>`
29
- <external_file path="${c}">
28
+ `,d=r?.map(({path:m,content:u})=>`
29
+ <external_file path="${m}">
30
30
  <code>
31
- ${d}
31
+ ${u}
32
32
  </code>
33
33
  </external_file>
34
34
  `).join(`
35
35
  `)||"";return`
36
36
  <task>
37
37
  ${a}
38
- ${p}
39
- ${m}
38
+ ${c}
39
+ ${d}
40
40
  </task>
41
- `};function V(t){return{system:Te(t),user:ye(t)}}var oe={"claude-3.5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var Re={createRequestBody:(t,e)=>{let n=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:M,messages:n}},createHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),parseCompletion:t=>t.choices?.length?t.choices[0].message.content:null},Oe={createRequestBody:(t,e)=>({model:U(t),temperature:M,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},Me={createRequestBody:(t,e)=>({model:U(t),temperature:M,system:e.system,messages:[{role:"user",content:e.user}],max_tokens:Ie(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:Re,groq:Oe,anthropic:Me},ne=(t,e,o)=>j[e].createRequestBody(t,o),re=(t,e)=>j[e].createHeaders(t),ie=(t,e)=>j[e].parseCompletion(t),U=t=>Y[t],se=t=>z[t],Ie=t=>oe[t]||4096;var b=class{constructor(e,o={}){if(!e)throw new Error("Please provide an API key.");this.apiKey=e,this.provider=o.provider??J,this.model=o.model??X,this.validateInputs()}validateInputs(){if(!B.includes(this.provider))throw new Error(`The provider "${this.provider}" is not supported. Please choose a supported provider: ${T(B)}. If you're using a custom model, you don't need to specify a provider.`);if(typeof this.model=="string"&&!k[this.provider].includes(this.model)){let e=T(k[this.provider]);throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${e}`)}}async complete(e){let{body:o,options:n}=e,{completionMetadata:r}=o,{headers:i={},customPrompt:s}=n??{},l=V(r),a=s?{...l,...s(r)}:l,p=se(this.provider),m,c=re(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let d=this.model.config(this.apiKey,a);p=d.endpoint??p,m=d.body??{},c={...c,...d.headers}}else m=ne(this.model,this.provider,a);c={...c,...i};try{let d=await v.POST(p,m,{headers:c}),u;if(typeof this.model=="object"&&"transformResponse"in this.model){let f=this.model.transformResponse(d);u={completion:f.text??f.completion}}else u={completion:ie(d,this.provider)};return u}catch(d){return{error:C(d,"COPILOT_COMPLETION_FETCH_ERROR").message,completion:null}}}};var L=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,n=e,r;for(;(r=o.exec(e))!==null;){let i=r[0],s=i.split(`
41
+ `};function U(e){return{system:ye(e),user:Oe(e)}}var ne={"claude-3.5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var Re={createRequestBody:(e,t)=>{let n=e==="o1-preview"||e==="o1-mini"?[{role:"user",content:t.user}]:[{role:"system",content:t.system},{role:"user",content:t.user}];return{model:K(e),temperature:M,messages:n}},createHeaders:e=>({"Content-Type":"application/json",Authorization:`Bearer ${e}`}),parseCompletion:e=>e.choices?.length?e.choices[0].message.content:null},Me={createRequestBody:(e,t)=>({model:K(e),temperature:M,messages:[{role:"system",content:t.system},{role:"user",content:t.user}]}),createHeaders:e=>({"Content-Type":"application/json",Authorization:`Bearer ${e}`}),parseCompletion:e=>e.choices?.length?e.choices[0].message.content:null},Ie={createRequestBody:(e,t)=>({model:K(e),temperature:M,system:t.system,messages:[{role:"user",content:t.user}],max_tokens:be(e)}),createHeaders:e=>({"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"}),parseCompletion:e=>!e.content||typeof e.content!="string"?null:e.content},j={openai:Re,groq:Me,anthropic:Ie},re=(e,t,o)=>j[t].createRequestBody(e,o),ie=(e,t)=>j[t].createHeaders(e),se=(e,t)=>j[t].parseCompletion(e),K=e=>X[e],le=e=>Z[e],be=e=>ne[e]||4096;var v=class{constructor(t,o={}){if(!t)throw new Error("Please provide an API key.");this.apiKey=t,this.provider=o.provider??z,this.model=o.model??J,this.validateInputs()}validateInputs(){if(!k.includes(this.provider))throw new Error(`The provider "${this.provider}" is not supported. Please choose a supported provider: ${T(k)}. If you're using a custom model, you don't need to specify a provider.`);if(typeof this.model=="string"&&!H[this.provider].includes(this.model)){let t=T(H[this.provider]);throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${t}`)}}async complete(t){let{body:o,options:n}=t,{completionMetadata:r}=o,{headers:i={},customPrompt:l}=n??{},s=U(r),a=l?{...s,...l(r)}:s,c=le(this.provider),d,m=ie(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let u=this.model.config(this.apiKey,a);c=u.endpoint??c,d=u.body??{},m={...m,...u.headers}}else d=re(this.model,this.provider,a);m={...m,...i};try{let u=await b.POST(c,d,{headers:m}),p;if(typeof this.model=="object"&&"transformResponse"in this.model){let C=this.model.transformResponse(u);p={completion:C.text??C.completion}}else p={completion:se(u,this.provider)};return p}catch(u){return{error:g(u,"COPILOT_COMPLETION_FETCH_ERROR").message,completion:null}}}};var L=class e{constructor(t){this.formattedCompletion="";this.formattedCompletion=t}static create(t){return new e(t)}setCompletion(t){return this.formattedCompletion=t,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}removeMarkdownCodeBlocks(t){let o=/```[\s\S]*?```/g,n=t,r;for(;(r=o.exec(t))!==null;){let i=r[0],l=i.split(`
42
42
  `).slice(1,-1).join(`
43
- `);n=n.replace(i,s)}return n.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
43
+ `);n=n.replace(i,l)}return n.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
44
44
 
45
- `),this}build(){return this.formattedCompletion}};var A=class{constructor(e,o){this.cursorPos=e,this.mdl=o}shouldProvideCompletions(){return!te(this.cursorPos,this.mdl)}};var N=class N{constructor(){this.cache=[]}getCompletionCache(e,o){return this.cache.filter(n=>this.isCacheItemValid(n,e,o))}addCompletionCache(e){this.cache=[...this.cache.slice(-(N.MAX_CACHE_SIZE-1)),e]}clearCompletionCache(){this.cache=[]}isCacheItemValid(e,o,n){let r=n.getValueInRange(e.range);return h(o,n).startsWith(e.textBeforeCursorInLine)&&this.isPositionValid(e,o,r)}isPositionValid(e,o,n){return e.range.startLineNumber===o.lineNumber&&o.column===e.range.startColumn||e.completion.startsWith(n)&&e.range.startLineNumber===o.lineNumber&&o.column>=e.range.startColumn-n.length&&o.column<=e.range.endColumn}};N.MAX_CACHE_SIZE=10;var _=N;var ve="application/json",G=async({filename:t,endpoint:e,language:o,technologies:n,externalContext:r,mdl:i,pos:s,maxContextLines:l})=>{try{let{completion:a}=await v.POST(e,{completionMetadata:be({filename:t,pos:s,mdl:i,language:o,technologies:n,externalContext:r,maxContextLines:l})},{headers:{"Content-Type":ve},error:"Error while fetching completion item"});return a}catch(a){return C(a,"FETCH_COMPLETION_ITEM_ERROR"),null}},be=({filename:t,pos:e,mdl:o,language:n,technologies:r,externalContext:i,maxContextLines:s})=>{let l=Le(e,o),p=!!i?.length?3:2,m=s?Math.floor(s/p):void 0,c=(x,E,D)=>{let O=x(e,o);return E?$(O,E,D):O},d=(x,E)=>!x||!E?x:x.map(({content:D,...O})=>({...O,content:$(D,E)})),u=c(Z,m,{from:"end"}),f=c(Q,m),de=d(i,m);return{filename:t,language:n,technologies:r,externalContext:de,textBeforeCursor:u,textAfterCursor:f,cursorPosition:e,editorState:{completionMode:l}}},Le=(t,e)=>{let o=F(t,e),n=I(t,e);return o?"insert":n.trim()?"complete":"continue"};function le(t,e,o){let n=e.getOffsetAt(t),r=e.getValue().slice(n),i=0,s=Math.min(o.length,r.length);for(let p=0;p<s&&o[p]===r[p];p++)i++;let l=n+i,a=e.getPositionAt(l);return{startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:a.lineNumber,endColumn:a.column}}function ae(t){return L.create(t).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build()}var g=t=>({items:t,enableForwardStability:!0});var Ae=300,_e=600,Ne={onTyping:q(G,Ae),onIdle:q(G,_e)},w=new _,we=async({mdl:t,pos:e,token:o,isCompletionAccepted:n,onShowCompletion:r,options:i})=>{let{trigger:s="onIdle",...l}=i;if(!new A(e,t).shouldProvideCompletions())return g([]);let a=w.getCompletionCache(e,t).map(p=>({insertText:p.completion,range:p.range}));if(a.length>0)return r(),g(a);if(o.isCancellationRequested||n)return g([]);try{let p=s==="onTyping"?"onTyping":"onIdle",m=Ne[p];o.onCancellationRequested(()=>{m.cancel()});let c=await m({...l,text:t.getValue(),mdl:t,pos:e});if(c){let d=ae(c),u=le(e,t,d);return w.addCompletionCache({completion:d,range:{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column},textBeforeCursorInLine:h(e,t)}),r(),g([{insertText:d,range:u}])}}catch(p){if(De(p))return g([]);C(p,"FETCH_COMPLETION_ITEM_ERROR")}return g([])},De=t=>typeof t=="string"&&(t==="Cancelled"||t==="AbortError")||t instanceof Error&&(t.message==="Cancelled"||t.name==="AbortError"),pe=we;var y=new WeakMap,R=null,W=(t,e,o)=>{R&&R.deregister();let n=[];y.set(e,{isCompletionAccepted:!1,isCompletionVisible:!1});try{let r=t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(l,a,p,m)=>{let c=y.get(e);if(c)return pe({mdl:l,pos:a,token:m,isCompletionAccepted:c.isCompletionAccepted,onShowCompletion:()=>{c.isCompletionVisible=!0},options:o})},freeInlineCompletions:()=>{}});n.push(r);let i=e.onKeyDown(l=>{let a=y.get(e);if(!a)return;let p=l.keyCode===t.KeyCode.Tab||l.keyCode===t.KeyCode.RightArrow&&l.metaKey;a.isCompletionVisible&&p?(a.isCompletionAccepted=!0,a.isCompletionVisible=!1):a.isCompletionAccepted=!1});n.push(i),e.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});let s={deregister:()=>{n.forEach(l=>l.dispose()),w.clearCompletionCache(),y.delete(e),R=null}};return R=s,s}catch(r){return C(r,"REGISTER_COMPLETION_ERROR"),{deregister:()=>{n.forEach(i=>i.dispose()),y.delete(e),R=null}}}},ce=W;0&&(module.exports={Copilot,registerCompletion,registerCopilot});
45
+ `),this}build(){return this.formattedCompletion}};var A=class{constructor(t,o){this.cursorPos=t,this.mdl=o}shouldProvideCompletions(){return!oe(this.cursorPos,this.mdl)}};var N=class N{constructor(){this.cache=[]}get(t,o){return this.cache.filter(n=>this.isValidCacheItem(n,t,o))}add(t){let o=[...this.cache.slice(-(N.MAX_CACHE_SIZE-1)),t];this.cache=o}clear(){this.cache=[]}isValidCacheItem(t,o,n){let r=n.getValueInRange(t.range);return f(o,n).startsWith(t.textBeforeCursorInLine)&&this.isPositionValid(t,o,r)}isPositionValid(t,o,n){let{range:r,completion:i}=t,{startLineNumber:l,startColumn:s,endColumn:a}=r,{lineNumber:c,column:d}=o,m=c===l&&d===s,u=i.startsWith(n)&&c===l&&d>=s-n.length&&d<=a+n.length;return m||u}};N.MAX_CACHE_SIZE=10;var _=N;var ve="application/json",G=async({filename:e,endpoint:t,language:o,technologies:n,externalContext:r,mdl:i,pos:l,maxContextLines:s})=>{try{let{completion:a}=await b.POST(t,{completionMetadata:Le({filename:e,pos:l,mdl:i,language:o,technologies:n,externalContext:r,maxContextLines:s})},{headers:{"Content-Type":ve},error:"Error while fetching completion item"});return a}catch(a){return g(a,"FETCH_COMPLETION_ITEM_ERROR"),null}},Le=({filename:e,pos:t,mdl:o,language:n,technologies:r,externalContext:i,maxContextLines:l})=>{let s=Ae(t,o),c=!!i?.length?3:2,d=l?Math.floor(l/c):void 0,m=(x,E,D)=>{let R=x(t,o);return E?V(R,E,D):R},u=(x,E)=>!x||!E?x:x.map(({content:D,...R})=>({...R,content:V(D,E)})),p=m(Q,d,{from:"end"}),C=m(ee,d),w=u(i,d);return{filename:e,language:n,technologies:r,externalContext:w,textBeforeCursor:p,textAfterCursor:C,cursorPosition:t,editorState:{completionMode:s}}},Ae=(e,t)=>{let o=$(e,t),n=I(e,t);return o?"insert":n.trim()?"complete":"continue"};var ae=(e,t,o)=>{if(!o)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};let n=t.getOffsetAt(e),r=t.getValue().substring(n),i=0,l=0,s=0,a=o.length,c=r.length;if(n>=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 d=Math.min(a,c);for(let p=0;p<d&&o[p]===r[p];p++)i++;for(let p=1;p<=d;p++){let C=o.slice(-p),w=r.slice(0,p);C===w&&(l=p)}if(s=Math.max(i,l),s===0)for(let p=1;p<a;p++){let C=o.substring(p);if(r.startsWith(C)){s=a-p;break}}let m=n+s,u=t.getPositionAt(m);return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:u.lineNumber,endColumn:u.column}},pe=e=>L.create(e).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),h=e=>({items:e,enableForwardStability:!0});var _e=300,Ne=600,Se={onTyping:F(G,_e),onIdle:F(G,Ne)},S=new _,we=async({mdl:e,pos:t,token:o,isCompletionAccepted:n,onShowCompletion:r,options:i})=>{let{trigger:l="onIdle",...s}=i;if(!new A(t,e).shouldProvideCompletions())return h([]);let a=S.get(t,e).map(c=>({insertText:c.completion,range:{...c.range,endColumn:t.column}}));if(a.length>0)return r(),h(a);if(o.isCancellationRequested||n)return h([]);try{let c=l==="onTyping"?"onTyping":"onIdle",d=Se[c];o.onCancellationRequested(()=>{d.cancel()});let m=await d({...s,text:e.getValue(),mdl:e,pos:t});if(m){let u=pe(m),p=ae(t,e,u);return S.add({completion:u,range:p,textBeforeCursorInLine:f(t,e)}),r(),h([{insertText:u,range:p}])}}catch(c){if(De(c))return h([]);g(c,"FETCH_COMPLETION_ITEM_ERROR")}return h([])},De=e=>typeof e=="string"&&(e==="Cancelled"||e==="AbortError")||e instanceof Error&&(e.message==="Cancelled"||e.name==="AbortError"),ce=we;var y=new WeakMap,O=null,Y=(e,t,o)=>{O&&O.deregister();let n=[];y.set(t,{isCompletionAccepted:!1,isCompletionVisible:!1}),t.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let r=e.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(s,a,c,d)=>{let m=y.get(t);if(m)return ce({mdl:s,pos:a,token:d,isCompletionAccepted:m.isCompletionAccepted,onShowCompletion:()=>{m.isCompletionVisible=!0},options:o})},freeInlineCompletions:()=>{}});n.push(r);let i=t.onKeyDown(s=>{let a=y.get(t);if(!a)return;let c=s.keyCode===e.KeyCode.Tab||s.keyCode===e.KeyCode.RightArrow&&s.metaKey;a.isCompletionVisible&&c?(a.isCompletionAccepted=!0,a.isCompletionVisible=!1):a.isCompletionAccepted=!1});n.push(i);let l={deregister:()=>{n.forEach(s=>s.dispose()),S.clear(),y.delete(t),O=null}};return O=l,l}catch(r){return g(r,"REGISTER_COMPLETION_ERROR"),{deregister:()=>{n.forEach(i=>i.dispose()),y.delete(t),O=null}}}},de=Y;0&&(module.exports={Copilot,registerCompletion,registerCopilot});
package/build/index.mjs CHANGED
@@ -1,9 +1,9 @@
1
- var D=["groq","openai","anthropic"],G={"llama-3-70b":"llama3-70b-8192","gpt-4o":"gpt-4o-2024-08-06","gpt-4o-mini":"gpt-4o-mini","claude-3.5-sonnet":"claude-3.5-sonnet-20240620","claude-3-opus":"claude-3-opus-20240229","claude-3-sonnet":"claude-3-sonnet-20240229","claude-3-haiku":"claude-3-haiku-20240307","o1-preview":"o1-preview","o1-mini":"o1-mini"},S={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"]},W="llama-3-70b",Y="groq",X={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages"},M=.3;var P=class P{constructor(){}static getInstance(){return P.instance}handleError(e,o){let n=this.getErrorDetails(e),r=`\x1B[31m[${o}]\x1B[0m \x1B[1m${n.message}\x1B[0m`;return console.error(r),n}getErrorDetails(e){return e instanceof Error?{message:e.message,name:e.name,stack:e.stack,context:e.context}:{message:String(e),name:"UnknownError"}}};P.instance=new P;var B=P;var C=(t,e)=>B.getInstance().handleError(t,e);var k=(t,e)=>{let o=null,n=null,r=(...i)=>new Promise((s,l)=>{o&&(clearTimeout(o),n&&n("Cancelled")),n=l,o=setTimeout(()=>{s(t(...i)),n=null},e)});return r.cancel=()=>{o&&(clearTimeout(o),n&&n("Cancelled"),o=null,n=null)},r},T=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`;var H=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1];var I=(t,e)=>e.getLineContent(t.lineNumber).slice(t.column-1),h=(t,e)=>e.getLineContent(t.lineNumber).slice(0,t.column-1),J=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),z=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),q=(t,e,o={})=>{if(e<=0)return"";let n=t.split(`
2
- `),r=n.length;if(e>=r)return t;if(o.from==="end"){let s=n.slice(-e);return s.every(l=>l==="")?`
3
- `.repeat(e):s.join(`
4
- `)}let i=n.slice(0,e);return i.every(s=>s==="")?`
5
- `.repeat(e):i.join(`
6
- `)};var Z=async(t,e,o={})=>{let n={"Content-Type":"application/json",...o.headers},r=e==="POST"&&o.body?JSON.stringify(o.body):void 0,i=await fetch(t,{method:e,headers:n,body:r,signal:o.signal});if(!i.ok)throw new Error(`${o.error||"Network error"}: ${i.statusText}`);return i.json()},ce=(t,e)=>Z(t,"GET",e),de=(t,e,o)=>Z(t,"POST",{...o,body:e}),v={GET:ce,POST:de};var Q=(t,e)=>{let o=I(t,e).trim(),n=h(t,e).trim();return t.column<=3&&(o!==""||n!=="")};var me=t=>t==="javascript"?"JavaScript (ESNext)":t,ue=t=>`You are an expert ${me(t.language)||T(t.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.`,Ce=t=>{let{filename:e="/",textBeforeCursor:o="",textAfterCursor:n="",externalContext:r,editorState:i}=t,a=`
1
+ var D=["groq","openai","anthropic"],G={"llama-3-70b":"llama3-70b-8192","gpt-4o":"gpt-4o-2024-08-06","gpt-4o-mini":"gpt-4o-mini","claude-3.5-sonnet":"claude-3.5-sonnet-20240620","claude-3-opus":"claude-3-opus-20240229","claude-3-sonnet":"claude-3-sonnet-20240229","claude-3-haiku":"claude-3-haiku-20240307","o1-preview":"o1-preview","o1-mini":"o1-mini"},B={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-preview","o1-mini"],anthropic:["claude-3.5-sonnet","claude-3-opus","claude-3-haiku","claude-3-sonnet"]},Y="llama-3-70b",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"},M=.1;var P=class P{constructor(){}static getInstance(){return P.instance}handleError(t,o){let n=this.getErrorDetails(t),r=`\x1B[31m[${o}]\x1B[0m \x1B[1m${n.message}\x1B[0m`;return console.error(r),n}getErrorDetails(t){return t instanceof Error?{message:t.message,name:t.name,stack:t.stack,context:t.context}:{message:String(t),name:"UnknownError"}}};P.instance=new P;var k=P;var g=(e,t)=>k.getInstance().handleError(e,t);var H=(e,t)=>{let o=null,n=null,r=(...i)=>new Promise((l,s)=>{o&&(clearTimeout(o),n&&n("Cancelled")),n=s,o=setTimeout(()=>{l(e(...i)),n=null},t)});return r.cancel=()=>{o&&(clearTimeout(o),n&&n("Cancelled"),o=null,n=null)},r},T=e=>!e||e.length===0?"":e.length===1?e[0]:`${e.slice(0,-1).join(", ")} and ${e.slice(-1)}`;var q=(e,t)=>t.getLineContent(e.lineNumber)[e.column-1];var I=(e,t)=>t.getLineContent(e.lineNumber).slice(e.column-1),f=(e,t)=>t.getLineContent(e.lineNumber).slice(0,e.column-1),z=(e,t)=>t.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:e.lineNumber,endColumn:e.column}),Z=(e,t)=>t.getValueInRange({startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:t.getLineCount(),endColumn:t.getLineMaxColumn(t.getLineCount())}),F=(e,t,o={})=>{if(t<=0)return"";let n=e.split(`
2
+ `),r=n.length;if(t>=r)return e;if(o.from==="end"){let l=n.slice(-t);return l.every(s=>s==="")?`
3
+ `.repeat(t):l.join(`
4
+ `)}let i=n.slice(0,t);return i.every(l=>l==="")?`
5
+ `.repeat(t):i.join(`
6
+ `)};var Q=async(e,t,o={})=>{let n={"Content-Type":"application/json",...o.headers},r=t==="POST"&&o.body?JSON.stringify(o.body):void 0,i=await fetch(e,{method:t,headers:n,body:r,signal:o.signal});if(!i.ok)throw new Error(`${o.error||"Network error"}: ${i.statusText}`);return i.json()},ce=(e,t)=>Q(e,"GET",t),de=(e,t,o)=>Q(e,"POST",{...o,body:t}),b={GET:ce,POST:de};var ee=(e,t)=>{let o=I(e,t).trim(),n=f(e,t).trim();return e.column<=3&&(o!==""||n!=="")};var me="<user-current-cursor-position-is-here>",ue=e=>e==="javascript"?"JavaScript (ESNext)":e,Ce=e=>`You are an expert ${ue(e.language)||T(e.technologies)} developer assistant with extensive experience in code completion and adhering to best coding practices. Your role is to provide precise and contextually relevant code completions without any errors, including syntax, punctuation, spaces, tabs, and line breaks. Focus on integrating seamlessly with the existing code and follow the user's instructions carefully.`,ge=e=>{let{filename:t="/",textBeforeCursor:o="",textAfterCursor:n="",externalContext:r,editorState:i}=e,a=`
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,29 +17,29 @@ var D=["groq","openai","anthropic"],G={"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
- `,p=`
20
+ `,c=`
21
21
  <context>
22
- <current_file path="${e}">
22
+ <current_file path="${t}">
23
23
  <code>
24
- ${o}\u2588${n}
24
+ ${o}${me}${n}
25
25
  </code>
26
26
  </current_file>
27
27
  </context>
28
- `,m=r?.map(({path:c,content:d})=>`
29
- <external_file path="${c}">
28
+ `,d=r?.map(({path:m,content:u})=>`
29
+ <external_file path="${m}">
30
30
  <code>
31
- ${d}
31
+ ${u}
32
32
  </code>
33
33
  </external_file>
34
34
  `).join(`
35
35
  `)||"";return`
36
36
  <task>
37
37
  ${a}
38
- ${p}
39
- ${m}
38
+ ${c}
39
+ ${d}
40
40
  </task>
41
- `};function F(t){return{system:ue(t),user:Ce(t)}}var ee={"claude-3.5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var ge={createRequestBody:(t,e)=>{let n=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:M,messages:n}},createHeaders:t=>({"Content-Type":"application/json",Authorization:`Bearer ${t}`}),parseCompletion:t=>t.choices?.length?t.choices[0].message.content:null},he={createRequestBody:(t,e)=>({model:V(t),temperature:M,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},fe={createRequestBody:(t,e)=>({model:V(t),temperature:M,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},$={openai:ge,groq:he,anthropic:fe},te=(t,e,o)=>$[e].createRequestBody(t,o),oe=(t,e)=>$[e].createHeaders(t),ne=(t,e)=>$[e].parseCompletion(t),V=t=>G[t],re=t=>X[t],xe=t=>ee[t]||4096;var j=class{constructor(e,o={}){if(!e)throw new Error("Please provide an API key.");this.apiKey=e,this.provider=o.provider??Y,this.model=o.model??W,this.validateInputs()}validateInputs(){if(!D.includes(this.provider))throw new Error(`The provider "${this.provider}" is not supported. Please choose a supported provider: ${T(D)}. If you're using a custom model, you don't need to specify a provider.`);if(typeof this.model=="string"&&!S[this.provider].includes(this.model)){let e=T(S[this.provider]);throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${e}`)}}async complete(e){let{body:o,options:n}=e,{completionMetadata:r}=o,{headers:i={},customPrompt:s}=n??{},l=F(r),a=s?{...l,...s(r)}:l,p=re(this.provider),m,c=oe(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let d=this.model.config(this.apiKey,a);p=d.endpoint??p,m=d.body??{},c={...c,...d.headers}}else m=te(this.model,this.provider,a);c={...c,...i};try{let d=await v.POST(p,m,{headers:c}),u;if(typeof this.model=="object"&&"transformResponse"in this.model){let f=this.model.transformResponse(d);u={completion:f.text??f.completion}}else u={completion:ne(d,this.provider)};return u}catch(d){return{error:C(d,"COPILOT_COMPLETION_FETCH_ERROR").message,completion:null}}}};var b=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,n=e,r;for(;(r=o.exec(e))!==null;){let i=r[0],s=i.split(`
41
+ `};function $(e){return{system:Ce(e),user:ge(e)}}var te={"claude-3.5-sonnet":8192,"claude-3-opus":4096,"claude-3-haiku":4096,"claude-3-sonnet":4096};var he={createRequestBody:(e,t)=>{let n=e==="o1-preview"||e==="o1-mini"?[{role:"user",content:t.user}]:[{role:"system",content:t.system},{role:"user",content:t.user}];return{model:U(e),temperature:M,messages:n}},createHeaders:e=>({"Content-Type":"application/json",Authorization:`Bearer ${e}`}),parseCompletion:e=>e.choices?.length?e.choices[0].message.content:null},fe={createRequestBody:(e,t)=>({model:U(e),temperature:M,messages:[{role:"system",content:t.system},{role:"user",content:t.user}]}),createHeaders:e=>({"Content-Type":"application/json",Authorization:`Bearer ${e}`}),parseCompletion:e=>e.choices?.length?e.choices[0].message.content:null},xe={createRequestBody:(e,t)=>({model:U(e),temperature:M,system:t.system,messages:[{role:"user",content:t.user}],max_tokens:Ee(e)}),createHeaders:e=>({"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"}),parseCompletion:e=>!e.content||typeof e.content!="string"?null:e.content},V={openai:he,groq:fe,anthropic:xe},oe=(e,t,o)=>V[t].createRequestBody(e,o),ne=(e,t)=>V[t].createHeaders(e),re=(e,t)=>V[t].parseCompletion(e),U=e=>G[e],ie=e=>J[e],Ee=e=>te[e]||4096;var j=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??Y,this.validateInputs()}validateInputs(){if(!D.includes(this.provider))throw new Error(`The provider "${this.provider}" is not supported. Please choose a supported provider: ${T(D)}. 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 t=T(B[this.provider]);throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${t}`)}}async complete(t){let{body:o,options:n}=t,{completionMetadata:r}=o,{headers:i={},customPrompt:l}=n??{},s=$(r),a=l?{...s,...l(r)}:s,c=ie(this.provider),d,m=ne(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let u=this.model.config(this.apiKey,a);c=u.endpoint??c,d=u.body??{},m={...m,...u.headers}}else d=oe(this.model,this.provider,a);m={...m,...i};try{let u=await b.POST(c,d,{headers:m}),p;if(typeof this.model=="object"&&"transformResponse"in this.model){let C=this.model.transformResponse(u);p={completion:C.text??C.completion}}else p={completion:re(u,this.provider)};return p}catch(u){return{error:g(u,"COPILOT_COMPLETION_FETCH_ERROR").message,completion:null}}}};var v=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,n=t,r;for(;(r=o.exec(t))!==null;){let i=r[0],l=i.split(`
42
42
  `).slice(1,-1).join(`
43
- `);n=n.replace(i,s)}return n.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
43
+ `);n=n.replace(i,l)}return n.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
44
44
 
45
- `),this}build(){return this.formattedCompletion}};var L=class{constructor(e,o){this.cursorPos=e,this.mdl=o}shouldProvideCompletions(){return!Q(this.cursorPos,this.mdl)}};var _=class _{constructor(){this.cache=[]}getCompletionCache(e,o){return this.cache.filter(n=>this.isCacheItemValid(n,e,o))}addCompletionCache(e){this.cache=[...this.cache.slice(-(_.MAX_CACHE_SIZE-1)),e]}clearCompletionCache(){this.cache=[]}isCacheItemValid(e,o,n){let r=n.getValueInRange(e.range);return h(o,n).startsWith(e.textBeforeCursorInLine)&&this.isPositionValid(e,o,r)}isPositionValid(e,o,n){return e.range.startLineNumber===o.lineNumber&&o.column===e.range.startColumn||e.completion.startsWith(n)&&e.range.startLineNumber===o.lineNumber&&o.column>=e.range.startColumn-n.length&&o.column<=e.range.endColumn}};_.MAX_CACHE_SIZE=10;var A=_;var Ee="application/json",K=async({filename:t,endpoint:e,language:o,technologies:n,externalContext:r,mdl:i,pos:s,maxContextLines:l})=>{try{let{completion:a}=await v.POST(e,{completionMetadata:Pe({filename:t,pos:s,mdl:i,language:o,technologies:n,externalContext:r,maxContextLines:l})},{headers:{"Content-Type":Ee},error:"Error while fetching completion item"});return a}catch(a){return C(a,"FETCH_COMPLETION_ITEM_ERROR"),null}},Pe=({filename:t,pos:e,mdl:o,language:n,technologies:r,externalContext:i,maxContextLines:s})=>{let l=Te(e,o),p=!!i?.length?3:2,m=s?Math.floor(s/p):void 0,c=(x,E,w)=>{let O=x(e,o);return E?q(O,E,w):O},d=(x,E)=>!x||!E?x:x.map(({content:w,...O})=>({...O,content:q(w,E)})),u=c(J,m,{from:"end"}),f=c(z,m),pe=d(i,m);return{filename:t,language:n,technologies:r,externalContext:pe,textBeforeCursor:u,textAfterCursor:f,cursorPosition:e,editorState:{completionMode:l}}},Te=(t,e)=>{let o=H(t,e),n=I(t,e);return o?"insert":n.trim()?"complete":"continue"};function ie(t,e,o){let n=e.getOffsetAt(t),r=e.getValue().slice(n),i=0,s=Math.min(o.length,r.length);for(let p=0;p<s&&o[p]===r[p];p++)i++;let l=n+i,a=e.getPositionAt(l);return{startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:a.lineNumber,endColumn:a.column}}function se(t){return b.create(t).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build()}var g=t=>({items:t,enableForwardStability:!0});var ye=300,Re=600,Oe={onTyping:k(K,ye),onIdle:k(K,Re)},N=new A,Me=async({mdl:t,pos:e,token:o,isCompletionAccepted:n,onShowCompletion:r,options:i})=>{let{trigger:s="onIdle",...l}=i;if(!new L(e,t).shouldProvideCompletions())return g([]);let a=N.getCompletionCache(e,t).map(p=>({insertText:p.completion,range:p.range}));if(a.length>0)return r(),g(a);if(o.isCancellationRequested||n)return g([]);try{let p=s==="onTyping"?"onTyping":"onIdle",m=Oe[p];o.onCancellationRequested(()=>{m.cancel()});let c=await m({...l,text:t.getValue(),mdl:t,pos:e});if(c){let d=se(c),u=ie(e,t,d);return N.addCompletionCache({completion:d,range:{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column},textBeforeCursorInLine:h(e,t)}),r(),g([{insertText:d,range:u}])}}catch(p){if(Ie(p))return g([]);C(p,"FETCH_COMPLETION_ITEM_ERROR")}return g([])},Ie=t=>typeof t=="string"&&(t==="Cancelled"||t==="AbortError")||t instanceof Error&&(t.message==="Cancelled"||t.name==="AbortError"),le=Me;var y=new WeakMap,R=null,ae=(t,e,o)=>{R&&R.deregister();let n=[];y.set(e,{isCompletionAccepted:!1,isCompletionVisible:!1});try{let r=t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(l,a,p,m)=>{let c=y.get(e);if(c)return le({mdl:l,pos:a,token:m,isCompletionAccepted:c.isCompletionAccepted,onShowCompletion:()=>{c.isCompletionVisible=!0},options:o})},freeInlineCompletions:()=>{}});n.push(r);let i=e.onKeyDown(l=>{let a=y.get(e);if(!a)return;let p=l.keyCode===t.KeyCode.Tab||l.keyCode===t.KeyCode.RightArrow&&l.metaKey;a.isCompletionVisible&&p?(a.isCompletionAccepted=!0,a.isCompletionVisible=!1):a.isCompletionAccepted=!1});n.push(i),e.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});let s={deregister:()=>{n.forEach(l=>l.dispose()),N.clearCompletionCache(),y.delete(e),R=null}};return R=s,s}catch(r){return C(r,"REGISTER_COMPLETION_ERROR"),{deregister:()=>{n.forEach(i=>i.dispose()),y.delete(e),R=null}}}},ve=ae;export{j as Copilot,ae as registerCompletion,ve as registerCopilot};
45
+ `),this}build(){return this.formattedCompletion}};var L=class{constructor(t,o){this.cursorPos=t,this.mdl=o}shouldProvideCompletions(){return!ee(this.cursorPos,this.mdl)}};var _=class _{constructor(){this.cache=[]}get(t,o){return this.cache.filter(n=>this.isValidCacheItem(n,t,o))}add(t){let o=[...this.cache.slice(-(_.MAX_CACHE_SIZE-1)),t];this.cache=o}clear(){this.cache=[]}isValidCacheItem(t,o,n){let r=n.getValueInRange(t.range);return f(o,n).startsWith(t.textBeforeCursorInLine)&&this.isPositionValid(t,o,r)}isPositionValid(t,o,n){let{range:r,completion:i}=t,{startLineNumber:l,startColumn:s,endColumn:a}=r,{lineNumber:c,column:d}=o,m=c===l&&d===s,u=i.startsWith(n)&&c===l&&d>=s-n.length&&d<=a+n.length;return m||u}};_.MAX_CACHE_SIZE=10;var A=_;var Pe="application/json",W=async({filename:e,endpoint:t,language:o,technologies:n,externalContext:r,mdl:i,pos:l,maxContextLines:s})=>{try{let{completion:a}=await b.POST(t,{completionMetadata:Te({filename:e,pos:l,mdl:i,language:o,technologies:n,externalContext:r,maxContextLines:s})},{headers:{"Content-Type":Pe},error:"Error while fetching completion item"});return a}catch(a){return g(a,"FETCH_COMPLETION_ITEM_ERROR"),null}},Te=({filename:e,pos:t,mdl:o,language:n,technologies:r,externalContext:i,maxContextLines:l})=>{let s=ye(t,o),c=!!i?.length?3:2,d=l?Math.floor(l/c):void 0,m=(x,E,w)=>{let R=x(t,o);return E?F(R,E,w):R},u=(x,E)=>!x||!E?x:x.map(({content:w,...R})=>({...R,content:F(w,E)})),p=m(z,d,{from:"end"}),C=m(Z,d),S=u(i,d);return{filename:e,language:n,technologies:r,externalContext:S,textBeforeCursor:p,textAfterCursor:C,cursorPosition:t,editorState:{completionMode:s}}},ye=(e,t)=>{let o=q(e,t),n=I(e,t);return o?"insert":n.trim()?"complete":"continue"};var se=(e,t,o)=>{if(!o)return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column};let n=t.getOffsetAt(e),r=t.getValue().substring(n),i=0,l=0,s=0,a=o.length,c=r.length;if(n>=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 d=Math.min(a,c);for(let p=0;p<d&&o[p]===r[p];p++)i++;for(let p=1;p<=d;p++){let C=o.slice(-p),S=r.slice(0,p);C===S&&(l=p)}if(s=Math.max(i,l),s===0)for(let p=1;p<a;p++){let C=o.substring(p);if(r.startsWith(C)){s=a-p;break}}let m=n+s,u=t.getPositionAt(m);return{startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:u.lineNumber,endColumn:u.column}},le=e=>v.create(e).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),h=e=>({items:e,enableForwardStability:!0});var Oe=300,Re=600,Me={onTyping:H(W,Oe),onIdle:H(W,Re)},N=new A,Ie=async({mdl:e,pos:t,token:o,isCompletionAccepted:n,onShowCompletion:r,options:i})=>{let{trigger:l="onIdle",...s}=i;if(!new L(t,e).shouldProvideCompletions())return h([]);let a=N.get(t,e).map(c=>({insertText:c.completion,range:{...c.range,endColumn:t.column}}));if(a.length>0)return r(),h(a);if(o.isCancellationRequested||n)return h([]);try{let c=l==="onTyping"?"onTyping":"onIdle",d=Me[c];o.onCancellationRequested(()=>{d.cancel()});let m=await d({...s,text:e.getValue(),mdl:e,pos:t});if(m){let u=le(m),p=se(t,e,u);return N.add({completion:u,range:p,textBeforeCursorInLine:f(t,e)}),r(),h([{insertText:u,range:p}])}}catch(c){if(be(c))return h([]);g(c,"FETCH_COMPLETION_ITEM_ERROR")}return h([])},be=e=>typeof e=="string"&&(e==="Cancelled"||e==="AbortError")||e instanceof Error&&(e.message==="Cancelled"||e.name==="AbortError"),ae=Ie;var y=new WeakMap,O=null,pe=(e,t,o)=>{O&&O.deregister();let n=[];y.set(t,{isCompletionAccepted:!1,isCompletionVisible:!1}),t.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let r=e.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(s,a,c,d)=>{let m=y.get(t);if(m)return ae({mdl:s,pos:a,token:d,isCompletionAccepted:m.isCompletionAccepted,onShowCompletion:()=>{m.isCompletionVisible=!0},options:o})},freeInlineCompletions:()=>{}});n.push(r);let i=t.onKeyDown(s=>{let a=y.get(t);if(!a)return;let c=s.keyCode===e.KeyCode.Tab||s.keyCode===e.KeyCode.RightArrow&&s.metaKey;a.isCompletionVisible&&c?(a.isCompletionAccepted=!0,a.isCompletionVisible=!1):a.isCompletionAccepted=!1});n.push(i);let l={deregister:()=>{n.forEach(s=>s.dispose()),N.clear(),y.delete(t),O=null}};return O=l,l}catch(r){return g(r,"REGISTER_COMPLETION_ERROR"),{deregister:()=>{n.forEach(i=>i.dispose()),y.delete(t),O=null}}}},ve=pe;export{j as Copilot,pe as registerCompletion,ve as registerCopilot};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monacopilot",
3
- "version": "0.10.4",
3
+ "version": "0.10.5",
4
4
  "description": "AI auto-completion plugin for Monaco Editor",
5
5
  "main": "./build/index.js",
6
6
  "module": "./build/index.mjs",