monacopilot 0.15.9 → 0.15.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/build/index.js +39 -30
- package/build/index.mjs +38 -29
- package/package.json +1 -1
package/build/index.js
CHANGED
|
@@ -1,54 +1,63 @@
|
|
|
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)}`,
|
|
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 n=t.split(`
|
|
4
4
|
`),r=n.length;if(e>=r)return t;if(o.from==="end"){let i=n.slice(-e);return i.every(l=>l==="")?`
|
|
5
5
|
`.repeat(e):i.join(`
|
|
6
6
|
`)}let s=n.slice(0,e);return s.every(i=>i==="")?`
|
|
7
7
|
`.repeat(e):s.join(`
|
|
8
8
|
`)};var Z=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1],L=(t,e)=>e.getLineContent(t.lineNumber).slice(t.column-1),Q=(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}),ee=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var te=async(t,e,o={})=>{let n=o.timeout??3e4,r=AbortSignal.timeout(n),s=o.signal?AbortSignal.any([r,o.signal]):r,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()},he=(t,e)=>te(t,"GET",e),fe=(t,e,o)=>te(t,"POST",{...o,body:e}),
|
|
9
|
+
${JSON.stringify(d,null,2)}`:"",p=o.fallbackError||"Network request failed";throw new Error(`${p} (${a.status})${m}`)}return a.json()},he=(t,e)=>te(t,"GET",e),fe=(t,e,o)=>te(t,"POST",{...o,body:e}),D={GET:he,POST:fe};var oe=(t,e)=>{let o=L(t,e).trim(),n=Q(t,e).trim();return t.column<=3&&(o!==""||n!=="")};var w=(t,e)=>{let o=null,n=null,r=(...s)=>new Promise((i,l)=>{o&&(clearTimeout(o),n&&n("Cancelled")),n=l,o=setTimeout(()=>{i(t(...s)),n=null;},e);});return r.cancel=()=>{o&&(clearTimeout(o),n&&n("Cancelled"),o=null,n=null);},r};var ye=t=>!t||t.length===0?"":t.map(({path:e,content:o})=>`
|
|
10
10
|
<related_file>
|
|
11
|
-
<
|
|
12
|
-
<
|
|
11
|
+
<filePath>${e}</filePath>
|
|
12
|
+
<fileContent>
|
|
13
13
|
\`\`\`
|
|
14
14
|
${o}
|
|
15
15
|
\`\`\`
|
|
16
|
-
</
|
|
16
|
+
</fileContent>
|
|
17
17
|
</related_file>`.trim()).join(`
|
|
18
18
|
|
|
19
|
-
`)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
- File: ${o||"
|
|
28
|
-
- Language: ${r||"
|
|
29
|
-
- Mode: ${l}
|
|
30
|
-
- Technologies: ${a||"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
${l==="continue"?"-
|
|
37
|
-
|
|
19
|
+
`),ne=t=>{let{technologies:e=[],filename:o,relatedFiles:n,language:r,textBeforeCursor:s="",textAfterCursor:i="",editorState:{completionMode:l}}=t,a=v([r,...e].filter(p=>typeof p=="string"&&!!p)),d=`
|
|
20
|
+
Take your time to reason as an exceptional${a?" "+a:""} code-generating assistant. You must produce solutions that are:
|
|
21
|
+
|
|
22
|
+
1. Scrutinized carefully for syntax, semantics, and relevancy.
|
|
23
|
+
2. Perfectly aligned with the prescribed completion mode and formatting norms.
|
|
24
|
+
3. Free from logical or contextual slip-ups in the final result.
|
|
25
|
+
|
|
26
|
+
Contextual Data:
|
|
27
|
+
- Active File: ${o||"Untitled"}
|
|
28
|
+
- Main Language: ${r||"Undetermined"}
|
|
29
|
+
- Mode of Completion: ${l}
|
|
30
|
+
- Detected Technologies: ${a||"None"}
|
|
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:
|
|
38
46
|
${ye(n)}
|
|
39
47
|
|
|
40
|
-
2.
|
|
48
|
+
2. Existing Source with Cursor:
|
|
41
49
|
\`\`\`
|
|
42
50
|
${s}<cursor>${i}
|
|
43
51
|
\`\`\`
|
|
44
52
|
|
|
45
|
-
|
|
53
|
+
Please craft a minimal yet complete snippet to fill in at <cursor>. Double-check correctness and ensure no syntactic or semantic flaws. Provide only the snippet as final output\u2014no added explanations.
|
|
54
|
+
`;return {system:d,user:m}};var re={"claude-3-5-sonnet":8192,"claude-3-5-haiku":8192,"claude-3-haiku":4096};var Pe={createEndpoint:()=>M.openai,createRequestBody:(t,e)=>{let o=t==="o1-mini";return {model:B(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},Re={createEndpoint:()=>M.groq,createRequestBody:(t,e)=>({model:B(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},xe={createEndpoint:()=>M.anthropic,createRequestBody:(t,e)=>({model:B(t),temperature:A,system:e.system,messages:[{role:"user",content:e.user}],max_tokens:re[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}},Te={createEndpoint:(t,e)=>`${M.google}/${t}:generateContent?key=${e}`,createRequestBody:(t,e)=>({model:B(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:Pe,groq:Re,anthropic:xe,google:Te},ie=(t,e,o)=>S[o].createEndpoint(t,e),se=(t,e,o)=>S[e].createRequestBody(t,o),ae=(t,e)=>S[e].createHeaders(t),le=(t,e)=>S[e].parseCompletion(t),B=t=>Y[t];var Ee="\x1B[91m",pe="\x1B[93m",K="\x1B[0m",W="\x1B[1m",E=t=>{let e;t instanceof Error?e=t.message:typeof t=="string"?e=t:e="An unknown error occurred";let o=`${Ee}${W}[MONACOPILOT ERROR] ${e}${K}`;return console.error(o),{message:e}},ce=t=>{console.warn(`${pe}${W}[MONACOPILOT WARN] ${t}${K}`);};var F=(t,e,o)=>console.warn(`${pe}${W}[MONACOPILOT DEPRECATED] "${t}" is deprecated${o?` in ${o}`:""}. Please use "${e}" instead. It will be removed in a future version.${K}`);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??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:n}=e,{completionMetadata:r}=o,{headers:s={},customPrompt:i}=n??{},l=this.generatePrompt(r,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 n=ne(e);return o?{...n,...o(e)}:n}prepareRequestDetails(e){let o=ie(this.model,this.apiKey,this.provider),n,r=ae(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,n=s.body??{},r={...r,...s.headers};}else n=se(this.model,this.provider,e);return {endpoint:o,requestBody:n,headers:r}}async sendCompletionRequest(e,o,n){return D.POST(e,o,{headers:n})}processCompletionResponse(e){if(typeof this.model=="object"&&"transformResponse"in this.model){let o=this.model.transformResponse(e);return "completion"in o&&F("completion","text","Copilot.options.model.transformResponse"),{completion:o.text??o.completion??null,raw:e}}else return {completion:le(e,this.provider),raw:e}}handleCompletionError(e){return {error:E(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,n=e,r;for(;(r=o.exec(e))!==null;){let s=r[0],i=s.split(`
|
|
46
55
|
`).slice(1,-1).join(`
|
|
47
56
|
`);n=n.replace(s,i);}return n.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
|
|
48
57
|
|
|
49
|
-
`),this}build(){return this.formattedCompletion}};var
|
|
50
|
-
`),i=s.length-1,l=n+i,a=i===0?r+s[0].length:s[i].length+1;return new this.monaco.Range(n,r,l,a)}};var
|
|
58
|
+
`),this}build(){return this.formattedCompletion}};var k=class{constructor(e,o){this.cursorPos=e,this.mdl=o;}shouldProvideCompletions(){return !oe(this.cursorPos,this.mdl)}};var q=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 y=class y{constructor(){this.cache=new q(y.MAX_CACHE_SIZE);}get(e,o){return this.cache.getAll().filter(n=>this.isValidCacheItem(n,e,o))}add(e){this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,o,n){let r=n.getValueInRange(e.range);return T(o,n).startsWith(e.textBeforeCursor)&&this.isPositionValid(e,o,r)}isPositionValid(e,o,n){let{range:r,completion:s}=e,{startLineNumber:i,startColumn:l,endLineNumber:a,endColumn:d}=r,{lineNumber:m,column:p}=o,u=m===i&&p===l;if(i===a)return u||s.startsWith(n)&&m===i&&p>=l-y.LOOK_AROUND&&p<=d+y.LOOK_AROUND;let C=s.startsWith(n)&&m>=i&&m<=a&&(m===i&&p>=l-y.LOOK_AROUND||m===a&&p<=d+y.LOOK_AROUND||m>i&&m<a);return u||C}};y.MAX_CACHE_SIZE=10,y.LOOK_AROUND=10;var _=y;var $=class{constructor(e){this.monaco=e;}computeInsertionRange(e,o,n){if(!o)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let r=n.getOffsetAt(e),s=n.getValue().substring(0,r),i=n.getValue().substring(r),l=0,a=0,d=0,m=0,p=o.length,u=s.length,C=i.length;if(r>=n.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),ge=s.slice(-c);x===ge&&(m=c);}let P=Math.min(p,C);for(let c=0;c<P&&o[c]===i[c];c++)l++;for(let c=1;c<=P;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?n.getPositionAt(r-m):e,g=r+d,h=n.getPositionAt(g);return new this.monaco.Range(f.lineNumber,f.column,h.lineNumber,h.column)}computeCacheRange(e,o){let n=e.lineNumber,r=e.column,s=o.split(`
|
|
59
|
+
`),i=s.length-1,l=n+i,a=i===0?r+s[0].length:s[i].length+1;return new this.monaco.Range(n,r,l,a)}};var Oe="application/json",de=async t=>{let{endpoint:e,body:o}=t,{completion:n,error:r}=await D.POST(e,o,{headers:{"Content-Type":Oe},fallbackError:"Error while fetching completion item"});if(r)throw new Error(r);return {completion:n}},me=({pos:t,mdl:e,options:o})=>{let{filename:n,language:r,technologies:s,relatedFiles:i,maxContextLines:l}=o,a=be(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"}),P=u(ee,p),f=C(i,p);return {filename:n,language:r,technologies:s,relatedFiles:f,textBeforeCursor:b,textAfterCursor:P,cursorPosition:t,editorState:{completionMode:a}}},be=(t,e)=>{let o=Z(t,e),n=L(t,e);return o?"insert":n.trim()?"complete":"continue"};var R=t=>({items:t,enableForwardStability:!0,suppressSuggestions:!0});var G={onTyping:300,onIdle:600,onDemand:0},ve=t=>({onTyping:w(t,G.onTyping),onIdle:w(t,G.onIdle),onDemand:w(t,G.onDemand)}),H=new _,Ie=async({monaco:t,mdl:e,pos:o,token:n,isCompletionAccepted:r,onShowCompletion:s,options:i})=>{let{trigger:l="onIdle",endpoint:a,enableCaching:d=!0,onError:m,requestHandler:p}=i;if(!new k(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(n.isCancellationRequested||r)return R([]);try{let C=ve(p??de)[l];n.onCancellationRequested(()=>{C.cancel();});let b=me({pos:o,mdl:e,options:i}),{completion:P}=await C({endpoint:a,body:{completionMetadata:b}});if(P){let f=N.create(P).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(Ae(u))return R([]);m?m(u):E(u);}return R([])},Ae=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":!1,ue=Ie;var O=new WeakMap,I=null,Ce=(t,e,o)=>{I&&I.deregister();let n=[],r={isCompletionAccepted:!1,isCompletionVisible:!1,isManualTrigger:!1};O.set(e,r),e.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let s=t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(a,d,m,p)=>{let u=O.get(e);if(!(!u||o.trigger==="onDemand"&&!u.isManualTrigger))return ue({monaco:t,mdl:a,pos:d,token:p,isCompletionAccepted:u.isCompletionAccepted,onShowCompletion:()=>{u.isCompletionVisible=!0,u.isManualTrigger=!1;},options:o})},freeInlineCompletions:()=>{}});n.push(s);let i=e.onKeyDown(a=>{let d=O.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;});n.push(i);let l={deregister:()=>{n.forEach(a=>a.dispose()),H.clear(),O.delete(e),I=null;},trigger:()=>Le(e)};return I=l,l}catch(s){return o.onError?o.onError(s):E(s),{deregister:()=>{n.forEach(i=>i.dispose()),O.delete(e),I=null;},trigger:()=>{}}}},Le=t=>{let e=O.get(t);if(!e){ce("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isManualTrigger=!0,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{});},De=(...t)=>(F("registerCopilot","registerCompletion"),Ce(...t));
|
|
51
60
|
|
|
52
|
-
exports.Copilot =
|
|
61
|
+
exports.Copilot = z;
|
|
53
62
|
exports.registerCompletion = Ce;
|
|
54
|
-
exports.registerCopilot =
|
|
63
|
+
exports.registerCopilot = De;
|
package/build/index.mjs
CHANGED
|
@@ -1,50 +1,59 @@
|
|
|
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)}`,
|
|
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 n=t.split(`
|
|
2
2
|
`),r=n.length;if(e>=r)return t;if(o.from==="end"){let i=n.slice(-e);return i.every(l=>l==="")?`
|
|
3
3
|
`.repeat(e):i.join(`
|
|
4
4
|
`)}let s=n.slice(0,e);return s.every(i=>i==="")?`
|
|
5
5
|
`.repeat(e):s.join(`
|
|
6
6
|
`)};var Z=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1],L=(t,e)=>e.getLineContent(t.lineNumber).slice(t.column-1),Q=(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}),ee=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var te=async(t,e,o={})=>{let n=o.timeout??3e4,r=AbortSignal.timeout(n),s=o.signal?AbortSignal.any([r,o.signal]):r,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()},he=(t,e)=>te(t,"GET",e),fe=(t,e,o)=>te(t,"POST",{...o,body:e}),
|
|
7
|
+
${JSON.stringify(d,null,2)}`:"",p=o.fallbackError||"Network request failed";throw new Error(`${p} (${a.status})${m}`)}return a.json()},he=(t,e)=>te(t,"GET",e),fe=(t,e,o)=>te(t,"POST",{...o,body:e}),D={GET:he,POST:fe};var oe=(t,e)=>{let o=L(t,e).trim(),n=Q(t,e).trim();return t.column<=3&&(o!==""||n!=="")};var w=(t,e)=>{let o=null,n=null,r=(...s)=>new Promise((i,l)=>{o&&(clearTimeout(o),n&&n("Cancelled")),n=l,o=setTimeout(()=>{i(t(...s)),n=null;},e);});return r.cancel=()=>{o&&(clearTimeout(o),n&&n("Cancelled"),o=null,n=null);},r};var ye=t=>!t||t.length===0?"":t.map(({path:e,content:o})=>`
|
|
8
8
|
<related_file>
|
|
9
|
-
<
|
|
10
|
-
<
|
|
9
|
+
<filePath>${e}</filePath>
|
|
10
|
+
<fileContent>
|
|
11
11
|
\`\`\`
|
|
12
12
|
${o}
|
|
13
13
|
\`\`\`
|
|
14
|
-
</
|
|
14
|
+
</fileContent>
|
|
15
15
|
</related_file>`.trim()).join(`
|
|
16
16
|
|
|
17
|
-
`)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- File: ${o||"
|
|
26
|
-
- Language: ${r||"
|
|
27
|
-
- Mode: ${l}
|
|
28
|
-
- Technologies: ${a||"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
${l==="continue"?"-
|
|
35
|
-
|
|
17
|
+
`),ne=t=>{let{technologies:e=[],filename:o,relatedFiles:n,language:r,textBeforeCursor:s="",textAfterCursor:i="",editorState:{completionMode:l}}=t,a=v([r,...e].filter(p=>typeof p=="string"&&!!p)),d=`
|
|
18
|
+
Take your time to reason as an exceptional${a?" "+a:""} code-generating assistant. You must produce solutions that are:
|
|
19
|
+
|
|
20
|
+
1. Scrutinized carefully for syntax, semantics, and relevancy.
|
|
21
|
+
2. Perfectly aligned with the prescribed completion mode and formatting norms.
|
|
22
|
+
3. Free from logical or contextual slip-ups in the final result.
|
|
23
|
+
|
|
24
|
+
Contextual Data:
|
|
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:
|
|
36
44
|
${ye(n)}
|
|
37
45
|
|
|
38
|
-
2.
|
|
46
|
+
2. Existing Source with Cursor:
|
|
39
47
|
\`\`\`
|
|
40
48
|
${s}<cursor>${i}
|
|
41
49
|
\`\`\`
|
|
42
50
|
|
|
43
|
-
|
|
51
|
+
Please craft a minimal yet complete snippet to fill in at <cursor>. Double-check correctness and ensure no syntactic or semantic flaws. Provide only the snippet as final output\u2014no added explanations.
|
|
52
|
+
`;return {system:d,user:m}};var re={"claude-3-5-sonnet":8192,"claude-3-5-haiku":8192,"claude-3-haiku":4096};var Pe={createEndpoint:()=>M.openai,createRequestBody:(t,e)=>{let o=t==="o1-mini";return {model:B(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},Re={createEndpoint:()=>M.groq,createRequestBody:(t,e)=>({model:B(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},xe={createEndpoint:()=>M.anthropic,createRequestBody:(t,e)=>({model:B(t),temperature:A,system:e.system,messages:[{role:"user",content:e.user}],max_tokens:re[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}},Te={createEndpoint:(t,e)=>`${M.google}/${t}:generateContent?key=${e}`,createRequestBody:(t,e)=>({model:B(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:Pe,groq:Re,anthropic:xe,google:Te},ie=(t,e,o)=>S[o].createEndpoint(t,e),se=(t,e,o)=>S[e].createRequestBody(t,o),ae=(t,e)=>S[e].createHeaders(t),le=(t,e)=>S[e].parseCompletion(t),B=t=>Y[t];var Ee="\x1B[91m",pe="\x1B[93m",K="\x1B[0m",W="\x1B[1m",E=t=>{let e;t instanceof Error?e=t.message:typeof t=="string"?e=t:e="An unknown error occurred";let o=`${Ee}${W}[MONACOPILOT ERROR] ${e}${K}`;return console.error(o),{message:e}},ce=t=>{console.warn(`${pe}${W}[MONACOPILOT WARN] ${t}${K}`);};var F=(t,e,o)=>console.warn(`${pe}${W}[MONACOPILOT DEPRECATED] "${t}" is deprecated${o?` in ${o}`:""}. Please use "${e}" instead. It will be removed in a future version.${K}`);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??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:n}=e,{completionMetadata:r}=o,{headers:s={},customPrompt:i}=n??{},l=this.generatePrompt(r,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 n=ne(e);return o?{...n,...o(e)}:n}prepareRequestDetails(e){let o=ie(this.model,this.apiKey,this.provider),n,r=ae(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,n=s.body??{},r={...r,...s.headers};}else n=se(this.model,this.provider,e);return {endpoint:o,requestBody:n,headers:r}}async sendCompletionRequest(e,o,n){return D.POST(e,o,{headers:n})}processCompletionResponse(e){if(typeof this.model=="object"&&"transformResponse"in this.model){let o=this.model.transformResponse(e);return "completion"in o&&F("completion","text","Copilot.options.model.transformResponse"),{completion:o.text??o.completion??null,raw:e}}else return {completion:le(e,this.provider),raw:e}}handleCompletionError(e){return {error:E(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,n=e,r;for(;(r=o.exec(e))!==null;){let s=r[0],i=s.split(`
|
|
44
53
|
`).slice(1,-1).join(`
|
|
45
54
|
`);n=n.replace(s,i);}return n.trim()}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
|
|
46
55
|
|
|
47
|
-
`),this}build(){return this.formattedCompletion}};var
|
|
48
|
-
`),i=s.length-1,l=n+i,a=i===0?r+s[0].length:s[i].length+1;return new this.monaco.Range(n,r,l,a)}};var
|
|
56
|
+
`),this}build(){return this.formattedCompletion}};var k=class{constructor(e,o){this.cursorPos=e,this.mdl=o;}shouldProvideCompletions(){return !oe(this.cursorPos,this.mdl)}};var q=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 y=class y{constructor(){this.cache=new q(y.MAX_CACHE_SIZE);}get(e,o){return this.cache.getAll().filter(n=>this.isValidCacheItem(n,e,o))}add(e){this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,o,n){let r=n.getValueInRange(e.range);return T(o,n).startsWith(e.textBeforeCursor)&&this.isPositionValid(e,o,r)}isPositionValid(e,o,n){let{range:r,completion:s}=e,{startLineNumber:i,startColumn:l,endLineNumber:a,endColumn:d}=r,{lineNumber:m,column:p}=o,u=m===i&&p===l;if(i===a)return u||s.startsWith(n)&&m===i&&p>=l-y.LOOK_AROUND&&p<=d+y.LOOK_AROUND;let C=s.startsWith(n)&&m>=i&&m<=a&&(m===i&&p>=l-y.LOOK_AROUND||m===a&&p<=d+y.LOOK_AROUND||m>i&&m<a);return u||C}};y.MAX_CACHE_SIZE=10,y.LOOK_AROUND=10;var _=y;var $=class{constructor(e){this.monaco=e;}computeInsertionRange(e,o,n){if(!o)return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column);let r=n.getOffsetAt(e),s=n.getValue().substring(0,r),i=n.getValue().substring(r),l=0,a=0,d=0,m=0,p=o.length,u=s.length,C=i.length;if(r>=n.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),ge=s.slice(-c);x===ge&&(m=c);}let P=Math.min(p,C);for(let c=0;c<P&&o[c]===i[c];c++)l++;for(let c=1;c<=P;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?n.getPositionAt(r-m):e,g=r+d,h=n.getPositionAt(g);return new this.monaco.Range(f.lineNumber,f.column,h.lineNumber,h.column)}computeCacheRange(e,o){let n=e.lineNumber,r=e.column,s=o.split(`
|
|
57
|
+
`),i=s.length-1,l=n+i,a=i===0?r+s[0].length:s[i].length+1;return new this.monaco.Range(n,r,l,a)}};var Oe="application/json",de=async t=>{let{endpoint:e,body:o}=t,{completion:n,error:r}=await D.POST(e,o,{headers:{"Content-Type":Oe},fallbackError:"Error while fetching completion item"});if(r)throw new Error(r);return {completion:n}},me=({pos:t,mdl:e,options:o})=>{let{filename:n,language:r,technologies:s,relatedFiles:i,maxContextLines:l}=o,a=be(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"}),P=u(ee,p),f=C(i,p);return {filename:n,language:r,technologies:s,relatedFiles:f,textBeforeCursor:b,textAfterCursor:P,cursorPosition:t,editorState:{completionMode:a}}},be=(t,e)=>{let o=Z(t,e),n=L(t,e);return o?"insert":n.trim()?"complete":"continue"};var R=t=>({items:t,enableForwardStability:!0,suppressSuggestions:!0});var G={onTyping:300,onIdle:600,onDemand:0},ve=t=>({onTyping:w(t,G.onTyping),onIdle:w(t,G.onIdle),onDemand:w(t,G.onDemand)}),H=new _,Ie=async({monaco:t,mdl:e,pos:o,token:n,isCompletionAccepted:r,onShowCompletion:s,options:i})=>{let{trigger:l="onIdle",endpoint:a,enableCaching:d=!0,onError:m,requestHandler:p}=i;if(!new k(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(n.isCancellationRequested||r)return R([]);try{let C=ve(p??de)[l];n.onCancellationRequested(()=>{C.cancel();});let b=me({pos:o,mdl:e,options:i}),{completion:P}=await C({endpoint:a,body:{completionMetadata:b}});if(P){let f=N.create(P).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(Ae(u))return R([]);m?m(u):E(u);}return R([])},Ae=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":!1,ue=Ie;var O=new WeakMap,I=null,Ce=(t,e,o)=>{I&&I.deregister();let n=[],r={isCompletionAccepted:!1,isCompletionVisible:!1,isManualTrigger:!1};O.set(e,r),e.updateOptions({inlineSuggest:{enabled:!0,mode:"subwordSmart"}});try{let s=t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(a,d,m,p)=>{let u=O.get(e);if(!(!u||o.trigger==="onDemand"&&!u.isManualTrigger))return ue({monaco:t,mdl:a,pos:d,token:p,isCompletionAccepted:u.isCompletionAccepted,onShowCompletion:()=>{u.isCompletionVisible=!0,u.isManualTrigger=!1;},options:o})},freeInlineCompletions:()=>{}});n.push(s);let i=e.onKeyDown(a=>{let d=O.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;});n.push(i);let l={deregister:()=>{n.forEach(a=>a.dispose()),H.clear(),O.delete(e),I=null;},trigger:()=>Le(e)};return I=l,l}catch(s){return o.onError?o.onError(s):E(s),{deregister:()=>{n.forEach(i=>i.dispose()),O.delete(e),I=null;},trigger:()=>{}}}},Le=t=>{let e=O.get(t);if(!e){ce("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isManualTrigger=!0,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{});},De=(...t)=>(F("registerCopilot","registerCompletion"),Ce(...t));
|
|
49
58
|
|
|
50
|
-
export {
|
|
59
|
+
export { z as Copilot, Ce as registerCompletion, De as registerCopilot };
|