monacopilot 0.15.10 → 0.15.11
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 +26 -43
- package/build/index.mjs +22 -39
- package/package.json +1 -1
package/build/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var V=["groq","openai","anthropic","google"],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-haiku":"claude-3-haiku-20240307","claude-3-5-haiku":"claude-3-5-haiku-20241022","o1-mini":"o1-mini","gemini-1.5-flash-8b":"gemini-1.5-flash-8b","gemini-1.5-flash":"gemini-1.5-flash","gemini-1.5-pro":"gemini-1.5-pro"},j={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-mini"],anthropic:["claude-3-5-sonnet","claude-3-haiku","claude-3-5-haiku"],google:["gemini-1.5-flash-8b","gemini-1.5-pro","gemini-1.5-flash"]},X="anthropic",J="claude-3-5-haiku",M={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages",google:"https://generativelanguage.googleapis.com/v1beta/models"},A=.1;var v=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`,U=(t,e,o={})=>{if(e<=0)return "";let
|
|
4
|
-
`),r
|
|
3
|
+
var V=["groq","openai","anthropic","google"],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-haiku":"claude-3-haiku-20240307","claude-3-5-haiku":"claude-3-5-haiku-20241022","o1-mini":"o1-mini","gemini-1.5-flash-8b":"gemini-1.5-flash-8b","gemini-1.5-flash":"gemini-1.5-flash","gemini-1.5-pro":"gemini-1.5-pro"},j={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-mini"],anthropic:["claude-3-5-sonnet","claude-3-haiku","claude-3-5-haiku"],google:["gemini-1.5-flash-8b","gemini-1.5-pro","gemini-1.5-flash"]},X="anthropic",J="claude-3-5-haiku",M={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages",google:"https://generativelanguage.googleapis.com/v1beta/models"},A=.1;var v=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`,Z=t=>t.charAt(0).toUpperCase()+t.slice(1),U=(t,e,o={})=>{if(e<=0)return "";let r=t.split(`
|
|
4
|
+
`),n=r.length;if(e>=n)return t;if(o.from==="end"){let i=r.slice(-e);return i.every(l=>l==="")?`
|
|
5
5
|
`.repeat(e):i.join(`
|
|
6
|
-
`)}let s=
|
|
6
|
+
`)}let s=r.slice(0,e);return s.every(i=>i==="")?`
|
|
7
7
|
`.repeat(e):s.join(`
|
|
8
|
-
`)};var
|
|
9
|
-
${JSON.stringify(d,null,2)}`:"",p=o.fallbackError||"Network request failed";throw new Error(`${p} (${a.status})${m}`)}return a.json()},
|
|
8
|
+
`)};var Q=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1],L=(t,e)=>e.getLineContent(t.lineNumber).slice(t.column-1),ee=(t,e)=>e.getLineContent(t.lineNumber).slice(0,t.column-1),T=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),te=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var oe=async(t,e,o={})=>{let r=o.timeout??3e4,n=AbortSignal.timeout(r),s=o.signal?AbortSignal.any([n,o.signal]):n,i={"Content-Type":"application/json",...o.headers},l=e==="POST"&&o.body?JSON.stringify(o.body):void 0,a=await fetch(t,{method:e,headers:i,body:l,signal:s});if(!a.ok){let d=await a.json().catch(()=>null),m=d?`
|
|
9
|
+
${JSON.stringify(d,null,2)}`:"",p=o.fallbackError||"Network request failed";throw new Error(`${p} (${a.status})${m}`)}return a.json()},fe=(t,e)=>oe(t,"GET",e),Pe=(t,e,o)=>oe(t,"POST",{...o,body:e}),D={GET:fe,POST:Pe};var re=(t,e)=>{let o=L(t,e).trim(),r=ee(t,e).trim();return t.column<=3&&(o!==""||r!=="")};var w=(t,e)=>{let o=null,r=null,n=(...s)=>new Promise((i,l)=>{o&&(clearTimeout(o),r&&r("Cancelled")),r=l,o=setTimeout(()=>{i(t(...s)),r=null;},e);});return n.cancel=()=>{o&&(clearTimeout(o),r&&r("Cancelled"),o=null,r=null);},n};var ye=t=>!t||t.length===0?"":t.map(({path:e,content:o})=>`
|
|
10
10
|
<related_file>
|
|
11
11
|
<filePath>${e}</filePath>
|
|
12
12
|
<fileContent>
|
|
@@ -16,48 +16,31 @@ ${o}
|
|
|
16
16
|
</fileContent>
|
|
17
17
|
</related_file>`.trim()).join(`
|
|
18
18
|
|
|
19
|
-
`),ne=t=>{let{technologies:e=[],filename:o,relatedFiles:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
Execution Directives:
|
|
33
|
-
- Insert the code snippet exactly at the specified cursor mark, omitting any superfluous commentary.
|
|
34
|
-
- If other files are relevant, incorporate details from them cautiously.
|
|
35
|
-
- Respect the completion mode rules for ${l}:
|
|
36
|
-
${l==="continue"?"- Expand from the cursor, upholding continuity in the surrounding code.":l==="insert"?`- Place the snippet precisely at the cursor location (marked by <cursor>).
|
|
37
|
-
- Only output the exact code to be inserted, without surrounding code.
|
|
38
|
-
- Example:
|
|
39
|
-
Input: const num = Math.random(); console.log(<cursor>);
|
|
40
|
-
Correct: num
|
|
41
|
-
Incorrect: \`num\` or console.log(num)`:"- Extend the existing code flow without deviating from its logic."}
|
|
42
|
-
`,m=`
|
|
43
|
-
Below is all the context you have:
|
|
44
|
-
|
|
45
|
-
1. Related Files in Workspace:
|
|
46
|
-
${ye(n)}
|
|
47
|
-
|
|
48
|
-
2. Existing Source with Cursor:
|
|
19
|
+
`),ne=t=>{let{technologies:e=[],filename:o,relatedFiles:r,language:n,textBeforeCursor:s="",textAfterCursor:i="",editorState:{completionMode:l}}=t,a=v([n,...e].filter(p=>typeof p=="string"&&!!p)),d=`
|
|
20
|
+
You are a code completion assistant.
|
|
21
|
+
|
|
22
|
+
Context:
|
|
23
|
+
File: ${o||"Untitled"}
|
|
24
|
+
Language: ${n||"Undetermined"}
|
|
25
|
+
Mode: ${l}
|
|
26
|
+
Stack: ${a||"None"}`,m=`
|
|
27
|
+
Related Files:
|
|
28
|
+
${ye(r)}
|
|
29
|
+
|
|
30
|
+
Source:
|
|
49
31
|
\`\`\`
|
|
50
32
|
${s}<cursor>${i}
|
|
51
33
|
\`\`\`
|
|
52
34
|
|
|
53
|
-
|
|
54
|
-
|
|
35
|
+
${Z(l)} the code at <cursor>.
|
|
36
|
+
|
|
37
|
+
Output only the raw code to be inserted at the cursor location without any additional text or comments.`;return {system:d,user:m}};var ie={"claude-3-5-sonnet":8192,"claude-3-5-haiku":8192,"claude-3-haiku":4096};var Re={createEndpoint:()=>M.openai,createRequestBody:(t,e)=>{let o=t==="o1-mini";return {model:F(t),...!o&&{temperature:A},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={createEndpoint:()=>M.groq,createRequestBody:(t,e)=>({model:F(t),temperature:A,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={createEndpoint:()=>M.anthropic,createRequestBody:(t,e)=>({model:F(t),temperature:A,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=>{if(!t.content||!Array.isArray(t.content)||!t.content.length)return null;let e=t.content[0];return !e||typeof e!="object"?null:"text"in e&&typeof e.text=="string"?e.text:null}},Oe={createEndpoint:(t,e)=>`${M.google}/${t}:generateContent?key=${e}`,createRequestBody:(t,e)=>({model:F(t),system_instruction:{parts:{text:e.system}},contents:[{parts:{text:e.user}}]}),createHeaders:()=>({"Content-Type":"application/json"}),parseCompletion:t=>{if(!t.candidates?.length||!t.candidates[0]?.content||!t.candidates[0].content?.parts?.length)return null;let e=t.candidates[0].content;return "text"in e.parts[0]&&typeof e.parts[0].text=="string"?e.parts[0].text:null}},S={openai:Re,groq:xe,anthropic:Te,google:Oe},se=(t,e,o)=>S[o].createEndpoint(t,e),ae=(t,e,o)=>S[e].createRequestBody(t,o),le=(t,e)=>S[e].createHeaders(t),pe=(t,e)=>S[e].parseCompletion(t),F=t=>Y[t];var Ee="\x1B[91m",ce="\x1B[93m",K="\x1B[0m",z="\x1B[1m",O=t=>{let e;t instanceof Error?e=t.message:typeof t=="string"?e=t:e="An unknown error occurred";let o=`${Ee}${z}[MONACOPILOT ERROR] ${e}${K}`;return console.error(o),{message:e}},de=t=>{console.warn(`${ce}${z}[MONACOPILOT WARN] ${t}${K}`);};var B=(t,e,o)=>console.warn(`${ce}${z}[MONACOPILOT DEPRECATED] "${t}" is deprecated${o?` in ${o}`:""}. Please use "${e}" instead. It will be removed in a future version.${K}`);var W=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??J,this.validateInputs();}validateInputs(){if(!V.includes(this.provider))throw new Error(`Unsupported provider "${this.provider}". Please choose from: ${v(V)}. For custom models, provider specification is not needed.`);if(typeof this.model=="string"&&!j[this.provider].includes(this.model))throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${v(j[this.provider])}`)}async complete(e){let{body:o,options:r}=e,{completionMetadata:n}=o,{headers:s={},customPrompt:i}=r??{},l=this.generatePrompt(n,i),{endpoint:a,requestBody:d,headers:m}=this.prepareRequestDetails(l);try{let p=await this.sendCompletionRequest(a,d,{...m,...s});return this.processCompletionResponse(p)}catch(p){return this.handleCompletionError(p)}}generatePrompt(e,o){let r=ne(e);return o?{...r,...o(e)}:r}prepareRequestDetails(e){let o=se(this.model,this.apiKey,this.provider),r,n=le(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let s=this.model.config(this.apiKey,e);o=s.endpoint??o,r=s.body??{},n={...n,...s.headers};}else r=ae(this.model,this.provider,e);return {endpoint:o,requestBody:r,headers:n}}async sendCompletionRequest(e,o,r){return D.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&&B("completion","text","Copilot.options.model.transformResponse"),{completion:o.text??o.completion??null,raw:e}}else return {completion:pe(e,this.provider),raw:e}}handleCompletionError(e){return {error:O(e).message,completion:null}}};var N=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 s=n[0],i=s.split(`
|
|
55
38
|
`).slice(1,-1).join(`
|
|
56
|
-
`);
|
|
39
|
+
`);r=r.replace(s,i);}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
|
|
57
40
|
|
|
58
|
-
`),this}build(){return this.formattedCompletion}};var
|
|
59
|
-
`),i=s.length-1,l=
|
|
41
|
+
`),this}build(){return this.formattedCompletion}};var q=class{constructor(e,o){this.cursorPos=e,this.mdl=o;}shouldProvideCompletions(){return !re(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 P=class P{constructor(){this.cache=new k(P.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 T(o,r).startsWith(e.textBeforeCursor)&&this.isPositionValid(e,o,n)}isPositionValid(e,o,r){let{range:n,completion:s}=e,{startLineNumber:i,startColumn:l,endLineNumber:a,endColumn:d}=n,{lineNumber:m,column:p}=o,u=m===i&&p===l;if(i===a)return u||s.startsWith(r)&&m===i&&p>=l-P.LOOK_AROUND&&p<=d+P.LOOK_AROUND;let C=s.startsWith(r)&&m>=i&&m<=a&&(m===i&&p>=l-P.LOOK_AROUND||m===a&&p<=d+P.LOOK_AROUND||m>i&&m<a);return u||C}};P.MAX_CACHE_SIZE=10,P.LOOK_AROUND=10;var _=P;var $=class{constructor(e){this.monaco=e;}computeInsertionRange(e,o,r){if(!o)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let n=r.getOffsetAt(e),s=r.getValue().substring(0,n),i=r.getValue().substring(n),l=0,a=0,d=0,m=0,p=o.length,u=s.length,C=i.length;if(n>=r.getValue().length)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);if(C===0)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let b=Math.min(p,u);for(let c=1;c<=b;c++){let x=o.substring(0,c),he=s.slice(-c);x===he&&(m=c);}let y=Math.min(p,C);for(let c=0;c<y&&o[c]===i[c];c++)l++;for(let c=1;c<=y;c++)o.slice(-c)===i.slice(0,c)&&(a=c);if(d=Math.max(l,a),d===0){for(let c=1;c<p;c++)if(i.startsWith(o.substring(c))){d=p-c;break}}let f=m>0?r.getPositionAt(n-m):e,g=n+d,h=r.getPositionAt(g);return new this.monaco.Range(f.lineNumber,f.column,h.lineNumber,h.column)}computeCacheRange(e,o){let r=e.lineNumber,n=e.column,s=o.split(`
|
|
42
|
+
`),i=s.length-1,l=r+i,a=i===0?n+s[0].length:s[i].length+1;return new this.monaco.Range(r,n,l,a)}};var be="application/json",me=async t=>{let{endpoint:e,body:o}=t,{completion:r,error:n}=await D.POST(e,o,{headers:{"Content-Type":be},fallbackError:"Error while fetching completion item"});if(n)throw new Error(n);return {completion:r}},ue=({pos:t,mdl:e,options:o})=>{let{filename:r,language:n,technologies:s,relatedFiles:i,maxContextLines:l}=o,a=Me(t,e),m=!!i?.length?3:2,p=l?Math.floor(l/m):void 0,u=(g,h,c)=>{let x=g(t,e);return h?U(x,h,c):x},C=(g,h)=>!g||!h?g:g.map(({content:c,...x})=>({...x,content:U(c,h)})),b=u(T,p,{from:"end"}),y=u(te,p),f=C(i,p);return {filename:r,language:n,technologies:s,relatedFiles:f,textBeforeCursor:b,textAfterCursor:y,cursorPosition:t,editorState:{completionMode:a}}},Me=(t,e)=>{let o=Q(t,e),r=L(t,e);return o?"insert":r.trim()?"complete":"continue"};var R=t=>({items:t,enableForwardStability:!0,suppressSuggestions:!0});var G={onTyping:300,onIdle:600,onDemand:0},Ie=t=>({onTyping:w(t,G.onTyping),onIdle:w(t,G.onIdle),onDemand:w(t,G.onDemand)}),H=new _,Ae=async({monaco:t,mdl:e,pos:o,token:r,isCompletionAccepted:n,onShowCompletion:s,options:i})=>{let{trigger:l="onIdle",endpoint:a,enableCaching:d=!0,onError:m,requestHandler:p}=i;if(!new q(o,e).shouldProvideCompletions())return R([]);if(d){let u=H.get(o,e).map(C=>({insertText:C.completion,range:C.range}));if(u.length>0)return s(),R(u)}if(r.isCancellationRequested||n)return R([]);try{let C=Ie(p??me)[l];r.onCancellationRequested(()=>{C.cancel();});let b=ue({pos:o,mdl:e,options:i}),{completion:y}=await C({endpoint:a,body:{completionMetadata:b}});if(y){let f=N.create(y).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),g=new $(t),h=g.computeInsertionRange(o,f,e),c=g.computeCacheRange(o,f);return d&&H.add({completion:f,range:c,textBeforeCursor:T(o,e)}),s(),R([{insertText:f,range:h}])}}catch(u){if(Le(u))return R([]);m?m(u):O(u);}return R([])},Le=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":!1,Ce=Ae;var E=new WeakMap,I=null,ge=(t,e,o)=>{I&&I.deregister();let r=[],n={isCompletionAccepted:!1,isCompletionVisible:!1,isManualTrigger:!1};E.set(e,n),e.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let s=t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(a,d,m,p)=>{let u=E.get(e);if(!(!u||o.trigger==="onDemand"&&!u.isManualTrigger))return Ce({monaco:t,mdl:a,pos:d,token:p,isCompletionAccepted:u.isCompletionAccepted,onShowCompletion:()=>{u.isCompletionVisible=!0,u.isManualTrigger=!1;},options:o})},freeInlineCompletions:()=>{}});r.push(s);let i=e.onKeyDown(a=>{let d=E.get(e);if(!d)return;let m=a.keyCode===t.KeyCode.Tab||a.keyCode===t.KeyCode.RightArrow&&a.metaKey;d.isCompletionVisible&&m?(d.isCompletionAccepted=!0,d.isCompletionVisible=!1):d.isCompletionAccepted=!1;});r.push(i);let l={deregister:()=>{r.forEach(a=>a.dispose()),H.clear(),E.delete(e),I=null;},trigger:()=>De(e)};return I=l,l}catch(s){return o.onError?o.onError(s):O(s),{deregister:()=>{r.forEach(i=>i.dispose()),E.delete(e),I=null;},trigger:()=>{}}}},De=t=>{let e=E.get(t);if(!e){de("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isManualTrigger=!0,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{});},we=(...t)=>(B("registerCopilot","registerCompletion"),ge(...t));
|
|
60
43
|
|
|
61
|
-
exports.Copilot =
|
|
62
|
-
exports.registerCompletion =
|
|
63
|
-
exports.registerCopilot =
|
|
44
|
+
exports.Copilot = W;
|
|
45
|
+
exports.registerCompletion = ge;
|
|
46
|
+
exports.registerCopilot = we;
|
package/build/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
var V=["groq","openai","anthropic","google"],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-haiku":"claude-3-haiku-20240307","claude-3-5-haiku":"claude-3-5-haiku-20241022","o1-mini":"o1-mini","gemini-1.5-flash-8b":"gemini-1.5-flash-8b","gemini-1.5-flash":"gemini-1.5-flash","gemini-1.5-pro":"gemini-1.5-pro"},j={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-mini"],anthropic:["claude-3-5-sonnet","claude-3-haiku","claude-3-5-haiku"],google:["gemini-1.5-flash-8b","gemini-1.5-pro","gemini-1.5-flash"]},X="anthropic",J="claude-3-5-haiku",M={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages",google:"https://generativelanguage.googleapis.com/v1beta/models"},A=.1;var v=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`,U=(t,e,o={})=>{if(e<=0)return "";let
|
|
2
|
-
`),r
|
|
1
|
+
var V=["groq","openai","anthropic","google"],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-haiku":"claude-3-haiku-20240307","claude-3-5-haiku":"claude-3-5-haiku-20241022","o1-mini":"o1-mini","gemini-1.5-flash-8b":"gemini-1.5-flash-8b","gemini-1.5-flash":"gemini-1.5-flash","gemini-1.5-pro":"gemini-1.5-pro"},j={groq:["llama-3-70b"],openai:["gpt-4o","gpt-4o-mini","o1-mini"],anthropic:["claude-3-5-sonnet","claude-3-haiku","claude-3-5-haiku"],google:["gemini-1.5-flash-8b","gemini-1.5-pro","gemini-1.5-flash"]},X="anthropic",J="claude-3-5-haiku",M={groq:"https://api.groq.com/openai/v1/chat/completions",openai:"https://api.openai.com/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages",google:"https://generativelanguage.googleapis.com/v1beta/models"},A=.1;var v=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`,Z=t=>t.charAt(0).toUpperCase()+t.slice(1),U=(t,e,o={})=>{if(e<=0)return "";let r=t.split(`
|
|
2
|
+
`),n=r.length;if(e>=n)return t;if(o.from==="end"){let i=r.slice(-e);return i.every(l=>l==="")?`
|
|
3
3
|
`.repeat(e):i.join(`
|
|
4
|
-
`)}let s=
|
|
4
|
+
`)}let s=r.slice(0,e);return s.every(i=>i==="")?`
|
|
5
5
|
`.repeat(e):s.join(`
|
|
6
|
-
`)};var
|
|
7
|
-
${JSON.stringify(d,null,2)}`:"",p=o.fallbackError||"Network request failed";throw new Error(`${p} (${a.status})${m}`)}return a.json()},
|
|
6
|
+
`)};var Q=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1],L=(t,e)=>e.getLineContent(t.lineNumber).slice(t.column-1),ee=(t,e)=>e.getLineContent(t.lineNumber).slice(0,t.column-1),T=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),te=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var oe=async(t,e,o={})=>{let r=o.timeout??3e4,n=AbortSignal.timeout(r),s=o.signal?AbortSignal.any([n,o.signal]):n,i={"Content-Type":"application/json",...o.headers},l=e==="POST"&&o.body?JSON.stringify(o.body):void 0,a=await fetch(t,{method:e,headers:i,body:l,signal:s});if(!a.ok){let d=await a.json().catch(()=>null),m=d?`
|
|
7
|
+
${JSON.stringify(d,null,2)}`:"",p=o.fallbackError||"Network request failed";throw new Error(`${p} (${a.status})${m}`)}return a.json()},fe=(t,e)=>oe(t,"GET",e),Pe=(t,e,o)=>oe(t,"POST",{...o,body:e}),D={GET:fe,POST:Pe};var re=(t,e)=>{let o=L(t,e).trim(),r=ee(t,e).trim();return t.column<=3&&(o!==""||r!=="")};var w=(t,e)=>{let o=null,r=null,n=(...s)=>new Promise((i,l)=>{o&&(clearTimeout(o),r&&r("Cancelled")),r=l,o=setTimeout(()=>{i(t(...s)),r=null;},e);});return n.cancel=()=>{o&&(clearTimeout(o),r&&r("Cancelled"),o=null,r=null);},n};var ye=t=>!t||t.length===0?"":t.map(({path:e,content:o})=>`
|
|
8
8
|
<related_file>
|
|
9
9
|
<filePath>${e}</filePath>
|
|
10
10
|
<fileContent>
|
|
@@ -14,46 +14,29 @@ ${o}
|
|
|
14
14
|
</fileContent>
|
|
15
15
|
</related_file>`.trim()).join(`
|
|
16
16
|
|
|
17
|
-
`),ne=t=>{let{technologies:e=[],filename:o,relatedFiles:
|
|
18
|
-
|
|
17
|
+
`),ne=t=>{let{technologies:e=[],filename:o,relatedFiles:r,language:n,textBeforeCursor:s="",textAfterCursor:i="",editorState:{completionMode:l}}=t,a=v([n,...e].filter(p=>typeof p=="string"&&!!p)),d=`
|
|
18
|
+
You are a code completion assistant.
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
Context:
|
|
21
|
+
File: ${o||"Untitled"}
|
|
22
|
+
Language: ${n||"Undetermined"}
|
|
23
|
+
Mode: ${l}
|
|
24
|
+
Stack: ${a||"None"}`,m=`
|
|
25
|
+
Related Files:
|
|
26
|
+
${ye(r)}
|
|
23
27
|
|
|
24
|
-
|
|
25
|
-
- Active File: ${o||"Untitled"}
|
|
26
|
-
- Main Language: ${r||"Undetermined"}
|
|
27
|
-
- Mode of Completion: ${l}
|
|
28
|
-
- Detected Technologies: ${a||"None"}
|
|
29
|
-
|
|
30
|
-
Execution Directives:
|
|
31
|
-
- Insert the code snippet exactly at the specified cursor mark, omitting any superfluous commentary.
|
|
32
|
-
- If other files are relevant, incorporate details from them cautiously.
|
|
33
|
-
- Respect the completion mode rules for ${l}:
|
|
34
|
-
${l==="continue"?"- Expand from the cursor, upholding continuity in the surrounding code.":l==="insert"?`- Place the snippet precisely at the cursor location (marked by <cursor>).
|
|
35
|
-
- Only output the exact code to be inserted, without surrounding code.
|
|
36
|
-
- Example:
|
|
37
|
-
Input: const num = Math.random(); console.log(<cursor>);
|
|
38
|
-
Correct: num
|
|
39
|
-
Incorrect: \`num\` or console.log(num)`:"- Extend the existing code flow without deviating from its logic."}
|
|
40
|
-
`,m=`
|
|
41
|
-
Below is all the context you have:
|
|
42
|
-
|
|
43
|
-
1. Related Files in Workspace:
|
|
44
|
-
${ye(n)}
|
|
45
|
-
|
|
46
|
-
2. Existing Source with Cursor:
|
|
28
|
+
Source:
|
|
47
29
|
\`\`\`
|
|
48
30
|
${s}<cursor>${i}
|
|
49
31
|
\`\`\`
|
|
50
32
|
|
|
51
|
-
|
|
52
|
-
|
|
33
|
+
${Z(l)} the code at <cursor>.
|
|
34
|
+
|
|
35
|
+
Output only the raw code to be inserted at the cursor location without any additional text or comments.`;return {system:d,user:m}};var ie={"claude-3-5-sonnet":8192,"claude-3-5-haiku":8192,"claude-3-haiku":4096};var Re={createEndpoint:()=>M.openai,createRequestBody:(t,e)=>{let o=t==="o1-mini";return {model:F(t),...!o&&{temperature:A},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={createEndpoint:()=>M.groq,createRequestBody:(t,e)=>({model:F(t),temperature:A,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={createEndpoint:()=>M.anthropic,createRequestBody:(t,e)=>({model:F(t),temperature:A,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=>{if(!t.content||!Array.isArray(t.content)||!t.content.length)return null;let e=t.content[0];return !e||typeof e!="object"?null:"text"in e&&typeof e.text=="string"?e.text:null}},Oe={createEndpoint:(t,e)=>`${M.google}/${t}:generateContent?key=${e}`,createRequestBody:(t,e)=>({model:F(t),system_instruction:{parts:{text:e.system}},contents:[{parts:{text:e.user}}]}),createHeaders:()=>({"Content-Type":"application/json"}),parseCompletion:t=>{if(!t.candidates?.length||!t.candidates[0]?.content||!t.candidates[0].content?.parts?.length)return null;let e=t.candidates[0].content;return "text"in e.parts[0]&&typeof e.parts[0].text=="string"?e.parts[0].text:null}},S={openai:Re,groq:xe,anthropic:Te,google:Oe},se=(t,e,o)=>S[o].createEndpoint(t,e),ae=(t,e,o)=>S[e].createRequestBody(t,o),le=(t,e)=>S[e].createHeaders(t),pe=(t,e)=>S[e].parseCompletion(t),F=t=>Y[t];var Ee="\x1B[91m",ce="\x1B[93m",K="\x1B[0m",z="\x1B[1m",O=t=>{let e;t instanceof Error?e=t.message:typeof t=="string"?e=t:e="An unknown error occurred";let o=`${Ee}${z}[MONACOPILOT ERROR] ${e}${K}`;return console.error(o),{message:e}},de=t=>{console.warn(`${ce}${z}[MONACOPILOT WARN] ${t}${K}`);};var B=(t,e,o)=>console.warn(`${ce}${z}[MONACOPILOT DEPRECATED] "${t}" is deprecated${o?` in ${o}`:""}. Please use "${e}" instead. It will be removed in a future version.${K}`);var W=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??J,this.validateInputs();}validateInputs(){if(!V.includes(this.provider))throw new Error(`Unsupported provider "${this.provider}". Please choose from: ${v(V)}. For custom models, provider specification is not needed.`);if(typeof this.model=="string"&&!j[this.provider].includes(this.model))throw new Error(`Model "${this.model}" is not supported by the "${this.provider}" provider. Supported models: ${v(j[this.provider])}`)}async complete(e){let{body:o,options:r}=e,{completionMetadata:n}=o,{headers:s={},customPrompt:i}=r??{},l=this.generatePrompt(n,i),{endpoint:a,requestBody:d,headers:m}=this.prepareRequestDetails(l);try{let p=await this.sendCompletionRequest(a,d,{...m,...s});return this.processCompletionResponse(p)}catch(p){return this.handleCompletionError(p)}}generatePrompt(e,o){let r=ne(e);return o?{...r,...o(e)}:r}prepareRequestDetails(e){let o=se(this.model,this.apiKey,this.provider),r,n=le(this.apiKey,this.provider);if(typeof this.model=="object"&&"config"in this.model){let s=this.model.config(this.apiKey,e);o=s.endpoint??o,r=s.body??{},n={...n,...s.headers};}else r=ae(this.model,this.provider,e);return {endpoint:o,requestBody:r,headers:n}}async sendCompletionRequest(e,o,r){return D.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&&B("completion","text","Copilot.options.model.transformResponse"),{completion:o.text??o.completion??null,raw:e}}else return {completion:pe(e,this.provider),raw:e}}handleCompletionError(e){return {error:O(e).message,completion:null}}};var N=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 s=n[0],i=s.split(`
|
|
53
36
|
`).slice(1,-1).join(`
|
|
54
|
-
`);
|
|
37
|
+
`);r=r.replace(s,i);}return r.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
|
|
55
38
|
|
|
56
|
-
`),this}build(){return this.formattedCompletion}};var
|
|
57
|
-
`),i=s.length-1,l=
|
|
39
|
+
`),this}build(){return this.formattedCompletion}};var q=class{constructor(e,o){this.cursorPos=e,this.mdl=o;}shouldProvideCompletions(){return !re(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 P=class P{constructor(){this.cache=new k(P.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 T(o,r).startsWith(e.textBeforeCursor)&&this.isPositionValid(e,o,n)}isPositionValid(e,o,r){let{range:n,completion:s}=e,{startLineNumber:i,startColumn:l,endLineNumber:a,endColumn:d}=n,{lineNumber:m,column:p}=o,u=m===i&&p===l;if(i===a)return u||s.startsWith(r)&&m===i&&p>=l-P.LOOK_AROUND&&p<=d+P.LOOK_AROUND;let C=s.startsWith(r)&&m>=i&&m<=a&&(m===i&&p>=l-P.LOOK_AROUND||m===a&&p<=d+P.LOOK_AROUND||m>i&&m<a);return u||C}};P.MAX_CACHE_SIZE=10,P.LOOK_AROUND=10;var _=P;var $=class{constructor(e){this.monaco=e;}computeInsertionRange(e,o,r){if(!o)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let n=r.getOffsetAt(e),s=r.getValue().substring(0,n),i=r.getValue().substring(n),l=0,a=0,d=0,m=0,p=o.length,u=s.length,C=i.length;if(n>=r.getValue().length)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);if(C===0)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let b=Math.min(p,u);for(let c=1;c<=b;c++){let x=o.substring(0,c),he=s.slice(-c);x===he&&(m=c);}let y=Math.min(p,C);for(let c=0;c<y&&o[c]===i[c];c++)l++;for(let c=1;c<=y;c++)o.slice(-c)===i.slice(0,c)&&(a=c);if(d=Math.max(l,a),d===0){for(let c=1;c<p;c++)if(i.startsWith(o.substring(c))){d=p-c;break}}let f=m>0?r.getPositionAt(n-m):e,g=n+d,h=r.getPositionAt(g);return new this.monaco.Range(f.lineNumber,f.column,h.lineNumber,h.column)}computeCacheRange(e,o){let r=e.lineNumber,n=e.column,s=o.split(`
|
|
40
|
+
`),i=s.length-1,l=r+i,a=i===0?n+s[0].length:s[i].length+1;return new this.monaco.Range(r,n,l,a)}};var be="application/json",me=async t=>{let{endpoint:e,body:o}=t,{completion:r,error:n}=await D.POST(e,o,{headers:{"Content-Type":be},fallbackError:"Error while fetching completion item"});if(n)throw new Error(n);return {completion:r}},ue=({pos:t,mdl:e,options:o})=>{let{filename:r,language:n,technologies:s,relatedFiles:i,maxContextLines:l}=o,a=Me(t,e),m=!!i?.length?3:2,p=l?Math.floor(l/m):void 0,u=(g,h,c)=>{let x=g(t,e);return h?U(x,h,c):x},C=(g,h)=>!g||!h?g:g.map(({content:c,...x})=>({...x,content:U(c,h)})),b=u(T,p,{from:"end"}),y=u(te,p),f=C(i,p);return {filename:r,language:n,technologies:s,relatedFiles:f,textBeforeCursor:b,textAfterCursor:y,cursorPosition:t,editorState:{completionMode:a}}},Me=(t,e)=>{let o=Q(t,e),r=L(t,e);return o?"insert":r.trim()?"complete":"continue"};var R=t=>({items:t,enableForwardStability:!0,suppressSuggestions:!0});var G={onTyping:300,onIdle:600,onDemand:0},Ie=t=>({onTyping:w(t,G.onTyping),onIdle:w(t,G.onIdle),onDemand:w(t,G.onDemand)}),H=new _,Ae=async({monaco:t,mdl:e,pos:o,token:r,isCompletionAccepted:n,onShowCompletion:s,options:i})=>{let{trigger:l="onIdle",endpoint:a,enableCaching:d=!0,onError:m,requestHandler:p}=i;if(!new q(o,e).shouldProvideCompletions())return R([]);if(d){let u=H.get(o,e).map(C=>({insertText:C.completion,range:C.range}));if(u.length>0)return s(),R(u)}if(r.isCancellationRequested||n)return R([]);try{let C=Ie(p??me)[l];r.onCancellationRequested(()=>{C.cancel();});let b=ue({pos:o,mdl:e,options:i}),{completion:y}=await C({endpoint:a,body:{completionMetadata:b}});if(y){let f=N.create(y).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),g=new $(t),h=g.computeInsertionRange(o,f,e),c=g.computeCacheRange(o,f);return d&&H.add({completion:f,range:c,textBeforeCursor:T(o,e)}),s(),R([{insertText:f,range:h}])}}catch(u){if(Le(u))return R([]);m?m(u):O(u);}return R([])},Le=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":!1,Ce=Ae;var E=new WeakMap,I=null,ge=(t,e,o)=>{I&&I.deregister();let r=[],n={isCompletionAccepted:!1,isCompletionVisible:!1,isManualTrigger:!1};E.set(e,n),e.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let s=t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(a,d,m,p)=>{let u=E.get(e);if(!(!u||o.trigger==="onDemand"&&!u.isManualTrigger))return Ce({monaco:t,mdl:a,pos:d,token:p,isCompletionAccepted:u.isCompletionAccepted,onShowCompletion:()=>{u.isCompletionVisible=!0,u.isManualTrigger=!1;},options:o})},freeInlineCompletions:()=>{}});r.push(s);let i=e.onKeyDown(a=>{let d=E.get(e);if(!d)return;let m=a.keyCode===t.KeyCode.Tab||a.keyCode===t.KeyCode.RightArrow&&a.metaKey;d.isCompletionVisible&&m?(d.isCompletionAccepted=!0,d.isCompletionVisible=!1):d.isCompletionAccepted=!1;});r.push(i);let l={deregister:()=>{r.forEach(a=>a.dispose()),H.clear(),E.delete(e),I=null;},trigger:()=>De(e)};return I=l,l}catch(s){return o.onError?o.onError(s):O(s),{deregister:()=>{r.forEach(i=>i.dispose()),E.delete(e),I=null;},trigger:()=>{}}}},De=t=>{let e=E.get(t);if(!e){de("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isManualTrigger=!0,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{});},we=(...t)=>(B("registerCopilot","registerCompletion"),ge(...t));
|
|
58
41
|
|
|
59
|
-
export {
|
|
42
|
+
export { W as Copilot, ge as registerCompletion, we as registerCopilot };
|