monacopilot 0.19.15 → 0.19.17

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.d.mts CHANGED
@@ -81,6 +81,8 @@ interface RegisterCompletionOptions {
81
81
  * The maximum number of lines of code to include in the completion request.
82
82
  * This limits the request size to the model to prevent `429 Too Many Requests` errors
83
83
  * and reduce costs for long code.
84
+ *
85
+ * @default 100
84
86
  */
85
87
  maxContextLines?: number;
86
88
  /**
package/build/index.d.ts CHANGED
@@ -81,6 +81,8 @@ interface RegisterCompletionOptions {
81
81
  * The maximum number of lines of code to include in the completion request.
82
82
  * This limits the request size to the model to prevent `429 Too Many Requests` errors
83
83
  * and reduce costs for long code.
84
+ *
85
+ * @default 100
84
86
  */
85
87
  maxContextLines?: number;
86
88
  /**
package/build/index.js CHANGED
@@ -1,51 +1,28 @@
1
- 'use strict';var core=require('@monacopilot/core');var j=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`;var O=(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==="")?`
1
+ 'use strict';var core=require('@monacopilot/core');var q=n=>!n||n.length===0?"":n.length===1?n[0]:`${n.slice(0,-1).join(", ")} and ${n.slice(-1)}`;var w=(n,e,t={})=>{if(e<=0)return "";let o=n.split(`
2
+ `),r=o.length;if(e>=r)return n;if(t.truncateDirection==="keepEnd"){let s=o.slice(-e);return s.every(a=>a==="")?`
3
3
  `.repeat(e):s.join(`
4
- `)}let i=n.slice(0,e);return i.every(s=>s==="")?`
4
+ `)}let i=o.slice(0,e);return i.every(s=>s==="")?`
5
5
  `.repeat(e):i.join(`
6
- `)};var J=t=>!t||t.length===0?"":t.map(({path:e,content:o})=>`
7
- ### Path: ${e}
8
- ${o}`.trim()).join(`
6
+ `)};var N="<|developer_cursor_is_here|>",se={insert:{noun:"insertion",verb:"Insert"},complete:{noun:"completion",verb:"Complete"},continue:{noun:"continuation",verb:"Continue"}},K=n=>{let{technologies:e=[],filename:t,relatedFiles:o,language:r,textBeforeCursor:i="",textAfterCursor:s="",editorState:{completionMode:a}}=n,{noun:c,verb:l}=se[a],u=a==="continue"||a==="complete",m=q([r,...e].filter(C=>typeof C=="string"&&!!C)),d=!o||o.length===0?"":o.map(({path:C,content:S})=>`### ${C}
7
+ ${S}`).join(`
9
8
 
10
- `),q=t=>{let{technologies:e=[],filename:o,relatedFiles:n,language:r,textBeforeCursor:i="",textAfterCursor:s="",editorState:{completionMode:l}}=t,p=j([r,...e].filter(m=>typeof m=="string"&&!!m)),c=`
11
- You are an EXCELLENT predictive code completion assistant.
9
+ `),p=`You are an expert code ${c} assistant. ${l}${u?" the full":""} code naturally as if you were the developer, following their patterns and style. Use ${m||"appropriate"} best practices. Focus on writing concise, accurate code that matches the context perfectly, including proper indentation and formatting to seamlessly integrate with the existing code. Do not include explanations, comments, or backticks.`,g=`${d}
12
10
 
13
- Your goal is to predict and complete the next logical code segment that the developer would write, making their coding experience more efficient and enjoyable.
11
+ File: ${t||"unknown"}
12
+ Mode: ${a}
14
13
 
15
- You should:
16
- 1. Provide complete, functional code segments with full implementation details
17
- 2. Complete entire functions or logical blocks when appropriate
18
- 3. Consider common patterns and best practices
19
- 4. Ensure the output is immediately useful and runnable
20
-
21
- **Context:**
22
- File: ${o||"Untitled"}
23
- Language: ${r||"Undetermined"}
24
- Mode: ${l}
25
- Stack: ${p||"None"}`,d=`
26
- **Related Files:**
27
- ${J(n)}
28
-
29
- **Source:**
14
+ Here is the code context with the ${N} marker indicating where to ${l.toLowerCase()} the code:
30
15
  \`\`\`
31
- ${i}<cursor>${s}
16
+ ${i}${N}${s}
32
17
  \`\`\`
33
18
 
34
- Complete the code at <cursor> position.
35
-
36
- Guidelines:
37
- 1. Start after: "${i.slice(-5)}"
38
- 2. End before: "${s.slice(0,5)}"
39
- 3. Provide complete, working implementations
40
- 4. Follow established patterns
41
- 5. Ensure code is production-ready
42
-
43
- Output ONLY the implementation without additional text or syntax.`;return {system:c,user:d}};var v=class extends core.Copilot{async complete(e){let{body:o,options:n}=e,{customPrompt:r,headers:i}=n??{},{completionMetadata:s}=o,{text:l,raw:p,error:c}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:l,raw:p,error:c}}getDefaultPrompt(e){return q(e)}};var D=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1];var K=(t,e)=>e.getLineContent(t.lineNumber).slice(0,t.column-1),f=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),F=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var M=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 T=class T{constructor(){this.cache=new M(T.MAX_CACHE_SIZE);}get(e,o){return this.cache.getAll().filter(n=>this.isValidCacheItem(n,e,o))}add(e){e.completion.trim()&&this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,o,n){let r=n.getValueInRange(e.range);return !f(o,n).includes(e.textBeforeCursor)||!this.isPartialMatch(r,e.completion)?false:this.isPositionValid(e,o)}isPartialMatch(e,o){return o.startsWith(e)||e.startsWith(o)}isPositionValid(e,o){let{range:n}=e,{startLineNumber:r,startColumn:i,endLineNumber:s,endColumn:l}=n,{lineNumber:p,column:c}=o;return p>=r&&p<=s?p===r&&p===s?c>=i-1&&c<=l+1:p===r?c>=i-1:p===s?c<=l+1:true:false}};T.MAX_CACHE_SIZE=20;var P=T;var I=class{constructor(e,o,n){this.formattedCompletion="";this.currentColumn=0;this.textBeforeCursorInLine="";this.formattedCompletion=e,this.currentColumn=o,this.textBeforeCursorInLine=n;}setCompletion(e){return this.formattedCompletion=e,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}indentByColumn(){let e=this.formattedCompletion.split(`
44
- `);if(e.length<=1||this.textBeforeCursorInLine.trim()!=="")return this;let o=" ".repeat(this.currentColumn-1);return this.formattedCompletion=e[0]+`
45
- `+e.slice(1).map(n=>o+n).join(`
46
- `),this}removeMarkdownCodeBlocks(e){let o=e.split(`
47
- `),n=[],r=false;for(let i=0;i<o.length;i++){let s=o[i],l=s.trim().startsWith("```");if(l&&!r){r=true;continue}if(l&&r){r=false;continue}n.push(s);}return n.join(`
19
+ Provide only the code that should replace the ${N} marker. Ensure it is properly indented and formatted to seamlessly integrate with the existing code. Do not include any additional text, explanations, or syntax highlighting. Your response will be directly inserted in place of the marker.`;return {system:p,user:g}};var v=class extends core.Copilot{async complete(e){let{body:t,options:o}=e,{customPrompt:r,headers:i}=o??{},{completionMetadata:s}=t,{text:a,raw:c,error:l}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:a,raw:c,error:l}}getDefaultPrompt(e){return K(e)}};var U=(n,e)=>e.getLineContent(n.lineNumber)[n.column-1];var $=(n,e)=>e.getLineContent(n.lineNumber).slice(0,n.column-1),f=(n,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:n.lineNumber,endColumn:n.column}),F=(n,e)=>e.getValueInRange({startLineNumber:n.lineNumber,startColumn:n.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var T=class{constructor(e){this.capacity=e;this.head=0;this.tail=0;this.size=0;this.buffer=new Array(e);}enqueue(e){let t;return this.size===this.capacity&&(t=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,t}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 T(P.MAX_CACHE_SIZE);}get(e,t){return this.cache.getAll().filter(o=>this.isValidCacheItem(o,e,t))}add(e){e.completion.trim()&&this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,t,o){let r=e.textBeforeCursor.trim(),i=f(t,o),s=i,a=o.getLineContent(t.lineNumber);if(t.column===a.length+1&&t.lineNumber<o.getLineCount()){let l=o.getLineContent(t.lineNumber+1);s=i+`
20
+ `+l;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let c=o.getValueInRange(e.range);return this.isPartialMatch(c,e.completion)?this.isPositionValid(e,t):false}isPartialMatch(e,t){let o=e.trim(),r=t.trim();return r.startsWith(o)||o.startsWith(r)}isPositionValid(e,t){let{range:o}=e,{startLineNumber:r,startColumn:i,endLineNumber:s,endColumn:a}=o,{lineNumber:c,column:l}=t;return c<r||c>s?false:r===s?l>=i-1&&l<=a+1:c===r?l>=i-1:c===s?l<=a+1:true}};P.MAX_CACHE_SIZE=20;var M=P;var L=class{constructor(e,t,o){this.formattedCompletion="";this.currentColumn=0;this.textBeforeCursorInLine="";this.formattedCompletion=e,this.currentColumn=t,this.textBeforeCursorInLine=o;}setCompletion(e){return this.formattedCompletion=e,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}indentByColumn(){let e=this.formattedCompletion.split(`
21
+ `);if(this.textBeforeCursorInLine.trim()!=="")return this;let t=e[0].trimStart(),o=e[0].length-t.length;return e.length===1?(this.formattedCompletion=t,this):(this.formattedCompletion=t+`
22
+ `+e.slice(1).map(r=>{let i=r.length-r.trimStart().length,s=Math.min(o,i),a=r.slice(s);return " ".repeat(this.currentColumn-1)+a}).join(`
23
+ `),this)}removeMarkdownCodeBlocks(e){let t=e.split(`
24
+ `),o=[],r=false;for(let i=0;i<t.length;i++){let s=t[i],a=s.trim().startsWith("```");if(a&&!r){r=true;continue}if(a&&r){r=false;continue}o.push(s);}return o.join(`
48
25
  `)}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
49
26
 
50
- `),this}build(){return this.formattedCompletion}};var S=class{findOverlaps(e,o,n){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=o.length,s=n.length,l=0,p=0,c=0,d=Math.min(r,i);for(let a=1;a<=d;a++){let C=e.substring(0,a),g=o.slice(-a);C===g&&(c=a);}let m=Math.min(r,s);for(let a=0;a<m&&e[a]===n[a];a++)l++;for(let a=1;a<=m;a++)e.slice(-a)===n.slice(0,a)&&(p=a);let u=Math.max(l,p);if(u===0){for(let a=1;a<r;a++)if(n.startsWith(e.substring(a))){u=r-a;break}}return {startOverlapLength:c,maxOverlapLength:u}}};var A=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new S;}computeInsertionRange(e,o,n){if(!o)return this.createEmptyRange(e);let r=n.getOffsetAt(e),i=n.getValue().substring(0,r),s=n.getValue().substring(r);if(r>=n.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:l,maxOverlapLength:p}=this.textOverlapCalculator.findOverlaps(o,i,s),c=l>0?n.getPositionAt(r-l):e,d=r+p,m=n.getPositionAt(d);return new this.monaco.Range(c.lineNumber,c.column,m.lineNumber,m.column)}computeCacheRange(e,o){let n=e.lineNumber,r=e.column,i=o.split(`
51
- `),s=i.length-1,l=n+s,p=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(n,r,l,p)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var V=async t=>{let{endpoint:e,body:o}=t,{completion:n,error:r}=await core.HTTP.post(e,o,{headers:{"Content-Type":"application/json"},fallbackError:"Error while fetching completion item"});if(r)throw new Error(r);return {completion:n}},$=({pos:t,mdl:e,options:o})=>{let{filename:n,language:r,technologies:i,relatedFiles:s,maxContextLines:l}=o,p=oe(t,e),d=!!s?.length?3:2,m=l?Math.floor(l/d):void 0,u=(y,E,L)=>{let x=y(t,e);return E?O(x,E,L):x},a=(y,E)=>!y||!E?y:y.map(({content:L,...x})=>({...x,content:O(L,E)})),C=u(f,m,{from:"end"}),g=u(F,m),Q=a(s,m);return {filename:n,language:r,technologies:i,relatedFiles:Q,textBeforeCursor:C,textAfterCursor:g,cursorPosition:t,editorState:{completionMode:p}}},oe=(t,e)=>{let o=D(t,e),n=F(t,e);return o?"insert":n.trim()?"complete":"continue"},H=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":false;var z=(t,e=600,o=200)=>{let n=null,r=0,i=null,s=null,l=false,p=(...c)=>{if(l)return Promise.resolve(void 0);i=c;let d=Date.now(),m=d-r;r=d,n&&(clearTimeout(n),n=null);let u=m<o?e:o;return s=new Promise((a,C)=>{n=setTimeout(async()=>{l=true;try{if(i){let g=await t(...i);a(g);}else a(void 0);}catch(g){C(g);}finally{l=false,n=null,i=null;}},u);}),s};return p.cancel=()=>{n&&(clearTimeout(n),n=null),i=null;},p};var h=t=>({items:t,enableForwardStability:true});var w=new P,W=async({monaco:t,mdl:e,pos:o,token:n,isCompletionAccepted:r,options:i})=>{let{trigger:s="onIdle",endpoint:l,enableCaching:p=true,onError:c,requestHandler:d}=i;if(p){let m=w.get(o,e).map(u=>({insertText:u.completion,range:u.range}));if(m.length>0)return h(m)}if(n.isCancellationRequested||r)return h([]);try{let m=z(d??V,...{onTyping:[500,100],onIdle:[600,400],onDemand:[0,0]}[s]);n.onCancellationRequested(()=>{m.cancel();});let u=$({pos:o,mdl:e,options:i}),{completion:a}=await m({endpoint:l,body:{completionMetadata:u}});if(a){let C=new I(a,o.column,K(o,e)).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().indentByColumn().build(),g=new A(t);return p&&w.add({completion:C,range:g.computeCacheRange(o,C),textBeforeCursor:f(o,e)}),h([{insertText:C,range:g.computeInsertionRange(o,C,e)}])}}catch(m){if(H(m))return h([]);c?c(m):core.logger.warn("Cannot provide completion",m);}return h([])};var B=new WeakMap,R=t=>B.get(t),_=(t,e)=>{B.set(t,e);},k=t=>{B.delete(t);},Y=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var G=(t,e,o)=>{let n=R(e);return n?t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(r,i,s,l)=>{if(!(o.trigger==="onDemand"&&!n.isExplicitlyTriggered))return W({monaco:t,mdl:r,pos:i,token:l,isCompletionAccepted:n.isCompletionAccepted,options:o})},handleItemDidShow:(r,i,s)=>{n.isExplicitlyTriggered=false,n.hasRejectedCurrentCompletion=false,!n.isCompletionAccepted&&(n.isCompletionVisible=true,o.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null},U=t=>{let e=R(t);if(!e){core.logger.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{});};var se={TAB:(t,e)=>e.keyCode===t.KeyCode.Tab,CMD_RIGHT_ARROW:(t,e)=>e.keyCode===t.KeyCode.RightArrow&&e.metaKey},N=class{constructor(e,o,n){this.monaco=e;this.state=o;this.options=n;}handleKeyEvent(e){let o={monaco:this.monaco,event:e,state:this.state,options:this.options};this.handleCompletionAcceptance(o),this.handleCompletionRejection(o);}handleCompletionAcceptance(e){return e.state.isCompletionVisible&&this.isAcceptanceKey(e.event)?(e.options.onCompletionAccepted?.(),e.state.isCompletionAccepted=true,e.state.isCompletionVisible=false,true):(e.state.isCompletionAccepted=false,false)}handleCompletionRejection(e){return this.shouldRejectCompletion(e)?(e.options.onCompletionRejected?.(),e.state.hasRejectedCurrentCompletion=true,true):false}shouldRejectCompletion(e){return e.state.isCompletionVisible&&!e.state.hasRejectedCurrentCompletion&&!e.state.isCompletionAccepted&&!this.isAcceptanceKey(e.event)}isAcceptanceKey(e){return Object.values(se).some(o=>o(this.monaco,e))}},X=(t,e,o,n)=>{let r=new N(t,o,n);return e.onKeyDown(i=>r.handleKeyEvent(i))};var b=null,le=(t,e,o)=>{b&&b.deregister();let n=[];_(e,Y()),e.updateOptions({inlineSuggest:{enabled:true,mode:"subwordSmart"}});try{let r=R(e);if(!r)return core.logger.warn("Completion is not registered properly. State not found."),ae();let i=G(t,e,o);i&&n.push(i);let s=X(t,e,r,o);n.push(s);let l={deregister:()=>{n.forEach(p=>p.dispose()),w.clear(),k(e),b=null;},trigger:()=>U(e)};return b=l,l}catch(r){return o.onError?o.onError(r):core.logger.report(r),{deregister:()=>{n.forEach(i=>i.dispose()),k(e),b=null;},trigger:()=>{}}}},ae=()=>({deregister:()=>{},trigger:()=>{}});var it=v;exports.CompletionCopilot=v;exports.Copilot=it;exports.registerCompletion=le;
27
+ `),this}build(){return this.formattedCompletion}};var I=class{findOverlaps(e,t,o){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=t.length,s=o.length,a=0,c=0,l=0,u=Math.min(r,i);for(let p=1;p<=u;p++){let g=e.substring(0,p),C=t.slice(-p);g===C&&(l=p);}let m=Math.min(r,s);for(let p=0;p<m&&e[p]===o[p];p++)a++;for(let p=1;p<=m;p++)e.slice(-p)===o.slice(0,p)&&(c=p);let d=Math.max(a,c);if(d===0){for(let p=1;p<r;p++)if(o.startsWith(e.substring(p))){d=r-p;break}}return {startOverlapLength:l,maxOverlapLength:d}}};var A=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new I;}computeInsertionRange(e,t,o){if(!t)return this.createEmptyRange(e);let r=o.getOffsetAt(e),i=o.getValue().substring(0,r),s=o.getValue().substring(r);if(r>=o.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:a,maxOverlapLength:c}=this.textOverlapCalculator.findOverlaps(t,i,s),l=a>0?o.getPositionAt(r-a):e,u=r+c,m=o.getPositionAt(u);return new this.monaco.Range(l.lineNumber,l.column,m.lineNumber,m.column)}computeCacheRange(e,t){let o=e.lineNumber,r=e.column,i=t.split(`
28
+ `),s=i.length-1,a=o+s,c=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(o,r,a,c)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var H=100,z=true,G="onIdle",W=120,X=400,Y=0;var Z=async n=>{let{endpoint:e,body:t}=n,o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!o.ok)throw new Error("Error while fetching completion item");let{completion:r,error:i}=await o.json();if(i)throw new Error(i);return {completion:r}},J=({pos:n,mdl:e,options:t})=>{let{filename:o,language:r,technologies:i,relatedFiles:s,maxContextLines:a=H}=t,c=le(n,e),u=s&&s.length>0?3:2,m=a?Math.floor(a/u):void 0,d=(y,E,D)=>{let R=y(n,e);return E?w(R,E,D):R},p=(y,E)=>!y||!E?y:y.map(({content:D,...R})=>({...R,content:w(D,E)})),g=d(f,m,{truncateDirection:"keepEnd"}),C=d(F,m,{truncateDirection:"keepStart"}),S=p(s,m);return {filename:o,language:r,technologies:i,relatedFiles:S,textBeforeCursor:g,textAfterCursor:C,cursorPosition:n,editorState:{completionMode:c}}},le=(n,e)=>{let t=U(n,e),o=F(n,e);return t?"insert":o.trim()?"complete":"continue"};var Q=(n,e=300)=>{let t=null,o=null,r=(...i)=>{if(o)return o.args=i,o.promise;let s,a,c=new Promise((l,u)=>{s=l,a=u;});return o={args:i,promise:c,resolve:s,reject:a},t&&(clearTimeout(t),t=null),t=setTimeout(async()=>{let l=o;if(l){o=null,t=null;try{let u=await n(...l.args);l.resolve(u);}catch(u){l.reject(u);}}},e),c};return r.cancel=()=>{t&&(clearTimeout(t),t=null),o&&(o.reject(new Error("Cancelled")),o=null);},r};var ee=n=>typeof n=="string"?n==="Cancelled"||n==="AbortError":n instanceof Error?n.message==="Cancelled"||n.name==="AbortError":false;var h=n=>({items:n,enableForwardStability:true});var O=new M,te=async({monaco:n,mdl:e,pos:t,token:o,isCompletionAccepted:r,options:i})=>{let{trigger:s=G,endpoint:a,enableCaching:c=z,onError:l,requestHandler:u}=i;if(c){let m=O.get(t,e).map(d=>({insertText:d.completion,range:d.range}));if(m.length>0)return h(m)}if(o.isCancellationRequested||r)return h([]);try{let m=Q(u??Z,{onTyping:W,onIdle:X,onDemand:Y}[s]);o.onCancellationRequested(()=>{m.cancel();});let d=J({pos:t,mdl:e,options:i}),{completion:p}=await m({endpoint:a,body:{completionMetadata:d}});if(p){let g=new L(p,t.column,$(t,e)).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().indentByColumn().build(),C=new A(n);return c&&O.add({completion:g,range:C.computeCacheRange(t,g),textBeforeCursor:f(t,e)}),h([{insertText:g,range:C.computeInsertionRange(t,g,e)}])}}catch(m){if(ee(m))return h([]);l?l(m):core.logger.warn("Cannot provide completion",m);}return h([])};var _=new WeakMap,x=n=>_.get(n),oe=(n,e)=>{_.set(n,e);},k=n=>{_.delete(n);},ne=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var re=(n,e,t)=>{let o=x(e);return o?n.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(r,i,s,a)=>{if(!(t.trigger==="onDemand"&&!o.isExplicitlyTriggered))return te({monaco:n,mdl:r,pos:i,token:a,isCompletionAccepted:o.isCompletionAccepted,options:t})},handleItemDidShow:(r,i,s)=>{o.isExplicitlyTriggered=false,o.hasRejectedCurrentCompletion=false,!o.isCompletionAccepted&&(o.isCompletionVisible=true,t.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null};var ce={TAB:(n,e)=>e.keyCode===n.KeyCode.Tab,CMD_RIGHT_ARROW:(n,e)=>e.keyCode===n.KeyCode.RightArrow&&e.metaKey},B=class{constructor(e,t,o){this.monaco=e;this.state=t;this.options=o;}handleKeyEvent(e){let t={monaco:this.monaco,event:e,state:this.state,options:this.options};this.handleCompletionAcceptance(t),this.handleCompletionRejection(t);}handleCompletionAcceptance(e){return e.state.isCompletionVisible&&this.isAcceptanceKey(e.event)?(e.options.onCompletionAccepted?.(),e.state.isCompletionAccepted=true,e.state.isCompletionVisible=false,true):(e.state.isCompletionAccepted=false,false)}handleCompletionRejection(e){return this.shouldRejectCompletion(e)?(e.options.onCompletionRejected?.(),e.state.hasRejectedCurrentCompletion=true,true):false}shouldRejectCompletion(e){return e.state.isCompletionVisible&&!e.state.hasRejectedCurrentCompletion&&!e.state.isCompletionAccepted&&!this.isAcceptanceKey(e.event)}isAcceptanceKey(e){return Object.values(ce).some(t=>t(this.monaco,e))}},ie=(n,e,t,o)=>{let r=new B(n,t,o);return e.onKeyDown(i=>r.handleKeyEvent(i))};var b=null,me=(n,e,t)=>{b&&b.deregister();let o=[];oe(e,ne()),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=x(e);if(!r)return core.logger.warn("Completion is not registered properly. State not found."),de();let i=re(n,e,t);i&&o.push(i);let s=ie(n,e,r,t);o.push(s);let a={deregister:()=>{o.forEach(c=>c.dispose()),O.clear(),k(e),b=null;},trigger:()=>ue(e)};return b=a,a}catch(r){return t.onError?t.onError(r):core.logger.report(r),{deregister:()=>{o.forEach(i=>i.dispose()),k(e),b=null;},trigger:()=>{}}}},ue=n=>{let e=x(n);if(!e){core.logger.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,n.trigger("keyboard","editor.action.inlineSuggest.trigger",{});},de=()=>({deregister:()=>{},trigger:()=>{}});var gt=v;exports.CompletionCopilot=v;exports.Copilot=gt;exports.registerCompletion=me;
package/build/index.mjs CHANGED
@@ -1,51 +1,28 @@
1
- import {Copilot,logger,HTTP}from'@monacopilot/core';var j=t=>!t||t.length===0?"":t.length===1?t[0]:`${t.slice(0,-1).join(", ")} and ${t.slice(-1)}`;var O=(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==="")?`
1
+ import {Copilot,logger}from'@monacopilot/core';var q=n=>!n||n.length===0?"":n.length===1?n[0]:`${n.slice(0,-1).join(", ")} and ${n.slice(-1)}`;var w=(n,e,t={})=>{if(e<=0)return "";let o=n.split(`
2
+ `),r=o.length;if(e>=r)return n;if(t.truncateDirection==="keepEnd"){let s=o.slice(-e);return s.every(a=>a==="")?`
3
3
  `.repeat(e):s.join(`
4
- `)}let i=n.slice(0,e);return i.every(s=>s==="")?`
4
+ `)}let i=o.slice(0,e);return i.every(s=>s==="")?`
5
5
  `.repeat(e):i.join(`
6
- `)};var J=t=>!t||t.length===0?"":t.map(({path:e,content:o})=>`
7
- ### Path: ${e}
8
- ${o}`.trim()).join(`
6
+ `)};var N="<|developer_cursor_is_here|>",se={insert:{noun:"insertion",verb:"Insert"},complete:{noun:"completion",verb:"Complete"},continue:{noun:"continuation",verb:"Continue"}},K=n=>{let{technologies:e=[],filename:t,relatedFiles:o,language:r,textBeforeCursor:i="",textAfterCursor:s="",editorState:{completionMode:a}}=n,{noun:c,verb:l}=se[a],u=a==="continue"||a==="complete",m=q([r,...e].filter(C=>typeof C=="string"&&!!C)),d=!o||o.length===0?"":o.map(({path:C,content:S})=>`### ${C}
7
+ ${S}`).join(`
9
8
 
10
- `),q=t=>{let{technologies:e=[],filename:o,relatedFiles:n,language:r,textBeforeCursor:i="",textAfterCursor:s="",editorState:{completionMode:l}}=t,p=j([r,...e].filter(m=>typeof m=="string"&&!!m)),c=`
11
- You are an EXCELLENT predictive code completion assistant.
9
+ `),p=`You are an expert code ${c} assistant. ${l}${u?" the full":""} code naturally as if you were the developer, following their patterns and style. Use ${m||"appropriate"} best practices. Focus on writing concise, accurate code that matches the context perfectly, including proper indentation and formatting to seamlessly integrate with the existing code. Do not include explanations, comments, or backticks.`,g=`${d}
12
10
 
13
- Your goal is to predict and complete the next logical code segment that the developer would write, making their coding experience more efficient and enjoyable.
11
+ File: ${t||"unknown"}
12
+ Mode: ${a}
14
13
 
15
- You should:
16
- 1. Provide complete, functional code segments with full implementation details
17
- 2. Complete entire functions or logical blocks when appropriate
18
- 3. Consider common patterns and best practices
19
- 4. Ensure the output is immediately useful and runnable
20
-
21
- **Context:**
22
- File: ${o||"Untitled"}
23
- Language: ${r||"Undetermined"}
24
- Mode: ${l}
25
- Stack: ${p||"None"}`,d=`
26
- **Related Files:**
27
- ${J(n)}
28
-
29
- **Source:**
14
+ Here is the code context with the ${N} marker indicating where to ${l.toLowerCase()} the code:
30
15
  \`\`\`
31
- ${i}<cursor>${s}
16
+ ${i}${N}${s}
32
17
  \`\`\`
33
18
 
34
- Complete the code at <cursor> position.
35
-
36
- Guidelines:
37
- 1. Start after: "${i.slice(-5)}"
38
- 2. End before: "${s.slice(0,5)}"
39
- 3. Provide complete, working implementations
40
- 4. Follow established patterns
41
- 5. Ensure code is production-ready
42
-
43
- Output ONLY the implementation without additional text or syntax.`;return {system:c,user:d}};var v=class extends Copilot{async complete(e){let{body:o,options:n}=e,{customPrompt:r,headers:i}=n??{},{completionMetadata:s}=o,{text:l,raw:p,error:c}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:l,raw:p,error:c}}getDefaultPrompt(e){return q(e)}};var D=(t,e)=>e.getLineContent(t.lineNumber)[t.column-1];var K=(t,e)=>e.getLineContent(t.lineNumber).slice(0,t.column-1),f=(t,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),F=(t,e)=>e.getValueInRange({startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var M=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 T=class T{constructor(){this.cache=new M(T.MAX_CACHE_SIZE);}get(e,o){return this.cache.getAll().filter(n=>this.isValidCacheItem(n,e,o))}add(e){e.completion.trim()&&this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,o,n){let r=n.getValueInRange(e.range);return !f(o,n).includes(e.textBeforeCursor)||!this.isPartialMatch(r,e.completion)?false:this.isPositionValid(e,o)}isPartialMatch(e,o){return o.startsWith(e)||e.startsWith(o)}isPositionValid(e,o){let{range:n}=e,{startLineNumber:r,startColumn:i,endLineNumber:s,endColumn:l}=n,{lineNumber:p,column:c}=o;return p>=r&&p<=s?p===r&&p===s?c>=i-1&&c<=l+1:p===r?c>=i-1:p===s?c<=l+1:true:false}};T.MAX_CACHE_SIZE=20;var P=T;var I=class{constructor(e,o,n){this.formattedCompletion="";this.currentColumn=0;this.textBeforeCursorInLine="";this.formattedCompletion=e,this.currentColumn=o,this.textBeforeCursorInLine=n;}setCompletion(e){return this.formattedCompletion=e,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}indentByColumn(){let e=this.formattedCompletion.split(`
44
- `);if(e.length<=1||this.textBeforeCursorInLine.trim()!=="")return this;let o=" ".repeat(this.currentColumn-1);return this.formattedCompletion=e[0]+`
45
- `+e.slice(1).map(n=>o+n).join(`
46
- `),this}removeMarkdownCodeBlocks(e){let o=e.split(`
47
- `),n=[],r=false;for(let i=0;i<o.length;i++){let s=o[i],l=s.trim().startsWith("```");if(l&&!r){r=true;continue}if(l&&r){r=false;continue}n.push(s);}return n.join(`
19
+ Provide only the code that should replace the ${N} marker. Ensure it is properly indented and formatted to seamlessly integrate with the existing code. Do not include any additional text, explanations, or syntax highlighting. Your response will be directly inserted in place of the marker.`;return {system:p,user:g}};var v=class extends Copilot{async complete(e){let{body:t,options:o}=e,{customPrompt:r,headers:i}=o??{},{completionMetadata:s}=t,{text:a,raw:c,error:l}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:a,raw:c,error:l}}getDefaultPrompt(e){return K(e)}};var U=(n,e)=>e.getLineContent(n.lineNumber)[n.column-1];var $=(n,e)=>e.getLineContent(n.lineNumber).slice(0,n.column-1),f=(n,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:n.lineNumber,endColumn:n.column}),F=(n,e)=>e.getValueInRange({startLineNumber:n.lineNumber,startColumn:n.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())});var T=class{constructor(e){this.capacity=e;this.head=0;this.tail=0;this.size=0;this.buffer=new Array(e);}enqueue(e){let t;return this.size===this.capacity&&(t=this.dequeue()),this.buffer[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.size++,t}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 T(P.MAX_CACHE_SIZE);}get(e,t){return this.cache.getAll().filter(o=>this.isValidCacheItem(o,e,t))}add(e){e.completion.trim()&&this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,t,o){let r=e.textBeforeCursor.trim(),i=f(t,o),s=i,a=o.getLineContent(t.lineNumber);if(t.column===a.length+1&&t.lineNumber<o.getLineCount()){let l=o.getLineContent(t.lineNumber+1);s=i+`
20
+ `+l;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let c=o.getValueInRange(e.range);return this.isPartialMatch(c,e.completion)?this.isPositionValid(e,t):false}isPartialMatch(e,t){let o=e.trim(),r=t.trim();return r.startsWith(o)||o.startsWith(r)}isPositionValid(e,t){let{range:o}=e,{startLineNumber:r,startColumn:i,endLineNumber:s,endColumn:a}=o,{lineNumber:c,column:l}=t;return c<r||c>s?false:r===s?l>=i-1&&l<=a+1:c===r?l>=i-1:c===s?l<=a+1:true}};P.MAX_CACHE_SIZE=20;var M=P;var L=class{constructor(e,t,o){this.formattedCompletion="";this.currentColumn=0;this.textBeforeCursorInLine="";this.formattedCompletion=e,this.currentColumn=t,this.textBeforeCursorInLine=o;}setCompletion(e){return this.formattedCompletion=e,this}removeInvalidLineBreaks(){return this.formattedCompletion=this.formattedCompletion.trimEnd(),this}removeMarkdownCodeSyntax(){return this.formattedCompletion=this.removeMarkdownCodeBlocks(this.formattedCompletion),this}indentByColumn(){let e=this.formattedCompletion.split(`
21
+ `);if(this.textBeforeCursorInLine.trim()!=="")return this;let t=e[0].trimStart(),o=e[0].length-t.length;return e.length===1?(this.formattedCompletion=t,this):(this.formattedCompletion=t+`
22
+ `+e.slice(1).map(r=>{let i=r.length-r.trimStart().length,s=Math.min(o,i),a=r.slice(s);return " ".repeat(this.currentColumn-1)+a}).join(`
23
+ `),this)}removeMarkdownCodeBlocks(e){let t=e.split(`
24
+ `),o=[],r=false;for(let i=0;i<t.length;i++){let s=t[i],a=s.trim().startsWith("```");if(a&&!r){r=true;continue}if(a&&r){r=false;continue}o.push(s);}return o.join(`
48
25
  `)}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
49
26
 
50
- `),this}build(){return this.formattedCompletion}};var S=class{findOverlaps(e,o,n){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=o.length,s=n.length,l=0,p=0,c=0,d=Math.min(r,i);for(let a=1;a<=d;a++){let C=e.substring(0,a),g=o.slice(-a);C===g&&(c=a);}let m=Math.min(r,s);for(let a=0;a<m&&e[a]===n[a];a++)l++;for(let a=1;a<=m;a++)e.slice(-a)===n.slice(0,a)&&(p=a);let u=Math.max(l,p);if(u===0){for(let a=1;a<r;a++)if(n.startsWith(e.substring(a))){u=r-a;break}}return {startOverlapLength:c,maxOverlapLength:u}}};var A=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new S;}computeInsertionRange(e,o,n){if(!o)return this.createEmptyRange(e);let r=n.getOffsetAt(e),i=n.getValue().substring(0,r),s=n.getValue().substring(r);if(r>=n.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:l,maxOverlapLength:p}=this.textOverlapCalculator.findOverlaps(o,i,s),c=l>0?n.getPositionAt(r-l):e,d=r+p,m=n.getPositionAt(d);return new this.monaco.Range(c.lineNumber,c.column,m.lineNumber,m.column)}computeCacheRange(e,o){let n=e.lineNumber,r=e.column,i=o.split(`
51
- `),s=i.length-1,l=n+s,p=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(n,r,l,p)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var V=async t=>{let{endpoint:e,body:o}=t,{completion:n,error:r}=await HTTP.post(e,o,{headers:{"Content-Type":"application/json"},fallbackError:"Error while fetching completion item"});if(r)throw new Error(r);return {completion:n}},$=({pos:t,mdl:e,options:o})=>{let{filename:n,language:r,technologies:i,relatedFiles:s,maxContextLines:l}=o,p=oe(t,e),d=!!s?.length?3:2,m=l?Math.floor(l/d):void 0,u=(y,E,L)=>{let x=y(t,e);return E?O(x,E,L):x},a=(y,E)=>!y||!E?y:y.map(({content:L,...x})=>({...x,content:O(L,E)})),C=u(f,m,{from:"end"}),g=u(F,m),Q=a(s,m);return {filename:n,language:r,technologies:i,relatedFiles:Q,textBeforeCursor:C,textAfterCursor:g,cursorPosition:t,editorState:{completionMode:p}}},oe=(t,e)=>{let o=D(t,e),n=F(t,e);return o?"insert":n.trim()?"complete":"continue"},H=t=>typeof t=="string"?t==="Cancelled"||t==="AbortError":t instanceof Error?t.message==="Cancelled"||t.name==="AbortError":false;var z=(t,e=600,o=200)=>{let n=null,r=0,i=null,s=null,l=false,p=(...c)=>{if(l)return Promise.resolve(void 0);i=c;let d=Date.now(),m=d-r;r=d,n&&(clearTimeout(n),n=null);let u=m<o?e:o;return s=new Promise((a,C)=>{n=setTimeout(async()=>{l=true;try{if(i){let g=await t(...i);a(g);}else a(void 0);}catch(g){C(g);}finally{l=false,n=null,i=null;}},u);}),s};return p.cancel=()=>{n&&(clearTimeout(n),n=null),i=null;},p};var h=t=>({items:t,enableForwardStability:true});var w=new P,W=async({monaco:t,mdl:e,pos:o,token:n,isCompletionAccepted:r,options:i})=>{let{trigger:s="onIdle",endpoint:l,enableCaching:p=true,onError:c,requestHandler:d}=i;if(p){let m=w.get(o,e).map(u=>({insertText:u.completion,range:u.range}));if(m.length>0)return h(m)}if(n.isCancellationRequested||r)return h([]);try{let m=z(d??V,...{onTyping:[500,100],onIdle:[600,400],onDemand:[0,0]}[s]);n.onCancellationRequested(()=>{m.cancel();});let u=$({pos:o,mdl:e,options:i}),{completion:a}=await m({endpoint:l,body:{completionMetadata:u}});if(a){let C=new I(a,o.column,K(o,e)).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().indentByColumn().build(),g=new A(t);return p&&w.add({completion:C,range:g.computeCacheRange(o,C),textBeforeCursor:f(o,e)}),h([{insertText:C,range:g.computeInsertionRange(o,C,e)}])}}catch(m){if(H(m))return h([]);c?c(m):logger.warn("Cannot provide completion",m);}return h([])};var B=new WeakMap,R=t=>B.get(t),_=(t,e)=>{B.set(t,e);},k=t=>{B.delete(t);},Y=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var G=(t,e,o)=>{let n=R(e);return n?t.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(r,i,s,l)=>{if(!(o.trigger==="onDemand"&&!n.isExplicitlyTriggered))return W({monaco:t,mdl:r,pos:i,token:l,isCompletionAccepted:n.isCompletionAccepted,options:o})},handleItemDidShow:(r,i,s)=>{n.isExplicitlyTriggered=false,n.hasRejectedCurrentCompletion=false,!n.isCompletionAccepted&&(n.isCompletionVisible=true,o.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null},U=t=>{let e=R(t);if(!e){logger.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,t.trigger("keyboard","editor.action.inlineSuggest.trigger",{});};var se={TAB:(t,e)=>e.keyCode===t.KeyCode.Tab,CMD_RIGHT_ARROW:(t,e)=>e.keyCode===t.KeyCode.RightArrow&&e.metaKey},N=class{constructor(e,o,n){this.monaco=e;this.state=o;this.options=n;}handleKeyEvent(e){let o={monaco:this.monaco,event:e,state:this.state,options:this.options};this.handleCompletionAcceptance(o),this.handleCompletionRejection(o);}handleCompletionAcceptance(e){return e.state.isCompletionVisible&&this.isAcceptanceKey(e.event)?(e.options.onCompletionAccepted?.(),e.state.isCompletionAccepted=true,e.state.isCompletionVisible=false,true):(e.state.isCompletionAccepted=false,false)}handleCompletionRejection(e){return this.shouldRejectCompletion(e)?(e.options.onCompletionRejected?.(),e.state.hasRejectedCurrentCompletion=true,true):false}shouldRejectCompletion(e){return e.state.isCompletionVisible&&!e.state.hasRejectedCurrentCompletion&&!e.state.isCompletionAccepted&&!this.isAcceptanceKey(e.event)}isAcceptanceKey(e){return Object.values(se).some(o=>o(this.monaco,e))}},X=(t,e,o,n)=>{let r=new N(t,o,n);return e.onKeyDown(i=>r.handleKeyEvent(i))};var b=null,le=(t,e,o)=>{b&&b.deregister();let n=[];_(e,Y()),e.updateOptions({inlineSuggest:{enabled:true,mode:"subwordSmart"}});try{let r=R(e);if(!r)return logger.warn("Completion is not registered properly. State not found."),ae();let i=G(t,e,o);i&&n.push(i);let s=X(t,e,r,o);n.push(s);let l={deregister:()=>{n.forEach(p=>p.dispose()),w.clear(),k(e),b=null;},trigger:()=>U(e)};return b=l,l}catch(r){return o.onError?o.onError(r):logger.report(r),{deregister:()=>{n.forEach(i=>i.dispose()),k(e),b=null;},trigger:()=>{}}}},ae=()=>({deregister:()=>{},trigger:()=>{}});var it=v;export{v as CompletionCopilot,it as Copilot,le as registerCompletion};
27
+ `),this}build(){return this.formattedCompletion}};var I=class{findOverlaps(e,t,o){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=t.length,s=o.length,a=0,c=0,l=0,u=Math.min(r,i);for(let p=1;p<=u;p++){let g=e.substring(0,p),C=t.slice(-p);g===C&&(l=p);}let m=Math.min(r,s);for(let p=0;p<m&&e[p]===o[p];p++)a++;for(let p=1;p<=m;p++)e.slice(-p)===o.slice(0,p)&&(c=p);let d=Math.max(a,c);if(d===0){for(let p=1;p<r;p++)if(o.startsWith(e.substring(p))){d=r-p;break}}return {startOverlapLength:l,maxOverlapLength:d}}};var A=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new I;}computeInsertionRange(e,t,o){if(!t)return this.createEmptyRange(e);let r=o.getOffsetAt(e),i=o.getValue().substring(0,r),s=o.getValue().substring(r);if(r>=o.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:a,maxOverlapLength:c}=this.textOverlapCalculator.findOverlaps(t,i,s),l=a>0?o.getPositionAt(r-a):e,u=r+c,m=o.getPositionAt(u);return new this.monaco.Range(l.lineNumber,l.column,m.lineNumber,m.column)}computeCacheRange(e,t){let o=e.lineNumber,r=e.column,i=t.split(`
28
+ `),s=i.length-1,a=o+s,c=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(o,r,a,c)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var H=100,z=true,G="onIdle",W=120,X=400,Y=0;var Z=async n=>{let{endpoint:e,body:t}=n,o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!o.ok)throw new Error("Error while fetching completion item");let{completion:r,error:i}=await o.json();if(i)throw new Error(i);return {completion:r}},J=({pos:n,mdl:e,options:t})=>{let{filename:o,language:r,technologies:i,relatedFiles:s,maxContextLines:a=H}=t,c=le(n,e),u=s&&s.length>0?3:2,m=a?Math.floor(a/u):void 0,d=(y,E,D)=>{let R=y(n,e);return E?w(R,E,D):R},p=(y,E)=>!y||!E?y:y.map(({content:D,...R})=>({...R,content:w(D,E)})),g=d(f,m,{truncateDirection:"keepEnd"}),C=d(F,m,{truncateDirection:"keepStart"}),S=p(s,m);return {filename:o,language:r,technologies:i,relatedFiles:S,textBeforeCursor:g,textAfterCursor:C,cursorPosition:n,editorState:{completionMode:c}}},le=(n,e)=>{let t=U(n,e),o=F(n,e);return t?"insert":o.trim()?"complete":"continue"};var Q=(n,e=300)=>{let t=null,o=null,r=(...i)=>{if(o)return o.args=i,o.promise;let s,a,c=new Promise((l,u)=>{s=l,a=u;});return o={args:i,promise:c,resolve:s,reject:a},t&&(clearTimeout(t),t=null),t=setTimeout(async()=>{let l=o;if(l){o=null,t=null;try{let u=await n(...l.args);l.resolve(u);}catch(u){l.reject(u);}}},e),c};return r.cancel=()=>{t&&(clearTimeout(t),t=null),o&&(o.reject(new Error("Cancelled")),o=null);},r};var ee=n=>typeof n=="string"?n==="Cancelled"||n==="AbortError":n instanceof Error?n.message==="Cancelled"||n.name==="AbortError":false;var h=n=>({items:n,enableForwardStability:true});var O=new M,te=async({monaco:n,mdl:e,pos:t,token:o,isCompletionAccepted:r,options:i})=>{let{trigger:s=G,endpoint:a,enableCaching:c=z,onError:l,requestHandler:u}=i;if(c){let m=O.get(t,e).map(d=>({insertText:d.completion,range:d.range}));if(m.length>0)return h(m)}if(o.isCancellationRequested||r)return h([]);try{let m=Q(u??Z,{onTyping:W,onIdle:X,onDemand:Y}[s]);o.onCancellationRequested(()=>{m.cancel();});let d=J({pos:t,mdl:e,options:i}),{completion:p}=await m({endpoint:a,body:{completionMetadata:d}});if(p){let g=new L(p,t.column,$(t,e)).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().indentByColumn().build(),C=new A(n);return c&&O.add({completion:g,range:C.computeCacheRange(t,g),textBeforeCursor:f(t,e)}),h([{insertText:g,range:C.computeInsertionRange(t,g,e)}])}}catch(m){if(ee(m))return h([]);l?l(m):logger.warn("Cannot provide completion",m);}return h([])};var _=new WeakMap,x=n=>_.get(n),oe=(n,e)=>{_.set(n,e);},k=n=>{_.delete(n);},ne=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var re=(n,e,t)=>{let o=x(e);return o?n.languages.registerInlineCompletionsProvider(t.language,{provideInlineCompletions:(r,i,s,a)=>{if(!(t.trigger==="onDemand"&&!o.isExplicitlyTriggered))return te({monaco:n,mdl:r,pos:i,token:a,isCompletionAccepted:o.isCompletionAccepted,options:t})},handleItemDidShow:(r,i,s)=>{o.isExplicitlyTriggered=false,o.hasRejectedCurrentCompletion=false,!o.isCompletionAccepted&&(o.isCompletionVisible=true,t.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null};var ce={TAB:(n,e)=>e.keyCode===n.KeyCode.Tab,CMD_RIGHT_ARROW:(n,e)=>e.keyCode===n.KeyCode.RightArrow&&e.metaKey},B=class{constructor(e,t,o){this.monaco=e;this.state=t;this.options=o;}handleKeyEvent(e){let t={monaco:this.monaco,event:e,state:this.state,options:this.options};this.handleCompletionAcceptance(t),this.handleCompletionRejection(t);}handleCompletionAcceptance(e){return e.state.isCompletionVisible&&this.isAcceptanceKey(e.event)?(e.options.onCompletionAccepted?.(),e.state.isCompletionAccepted=true,e.state.isCompletionVisible=false,true):(e.state.isCompletionAccepted=false,false)}handleCompletionRejection(e){return this.shouldRejectCompletion(e)?(e.options.onCompletionRejected?.(),e.state.hasRejectedCurrentCompletion=true,true):false}shouldRejectCompletion(e){return e.state.isCompletionVisible&&!e.state.hasRejectedCurrentCompletion&&!e.state.isCompletionAccepted&&!this.isAcceptanceKey(e.event)}isAcceptanceKey(e){return Object.values(ce).some(t=>t(this.monaco,e))}},ie=(n,e,t,o)=>{let r=new B(n,t,o);return e.onKeyDown(i=>r.handleKeyEvent(i))};var b=null,me=(n,e,t)=>{b&&b.deregister();let o=[];oe(e,ne()),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=x(e);if(!r)return logger.warn("Completion is not registered properly. State not found."),de();let i=re(n,e,t);i&&o.push(i);let s=ie(n,e,r,t);o.push(s);let a={deregister:()=>{o.forEach(c=>c.dispose()),O.clear(),k(e),b=null;},trigger:()=>ue(e)};return b=a,a}catch(r){return t.onError?t.onError(r):logger.report(r),{deregister:()=>{o.forEach(i=>i.dispose()),k(e),b=null;},trigger:()=>{}}}},ue=n=>{let e=x(n);if(!e){logger.warn("Completion is not registered. Use `registerCompletion` to register completion first.");return}e.isExplicitlyTriggered=true,n.trigger("keyboard","editor.action.inlineSuggest.trigger",{});},de=()=>({deregister:()=>{},trigger:()=>{}});var gt=v;export{v as CompletionCopilot,gt as Copilot,me as registerCompletion};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monacopilot",
3
- "version": "0.19.15",
3
+ "version": "0.19.17",
4
4
  "description": "AI auto-completion plugin for Monaco Editor",
5
5
  "main": "./build/index.js",
6
6
  "module": "./build/index.mjs",
@@ -37,7 +37,7 @@
37
37
  "license": "MIT",
38
38
  "author": "Arshad Yaseen <m@arshadyaseen.com> (https://arshadyaseen.com)",
39
39
  "dependencies": {
40
- "@monacopilot/core": "0.19.15"
40
+ "@monacopilot/core": "0.19.17"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "monaco-editor": ">=0.41.0"