monacopilot 1.0.0 → 1.1.1

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
@@ -4,6 +4,7 @@ import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
4
4
 
5
5
  type Monaco = typeof monaco;
6
6
  type StandaloneCodeEditor = monaco.editor.IStandaloneCodeEditor;
7
+ type CursorPosition = monaco.IPosition;
7
8
  type EditorRange = monaco.IRange;
8
9
 
9
10
  type FetchCompletionItemHandler = (params: FetchCompletionItemParams) => Promise<FetchCompletionItemReturn>;
@@ -36,7 +37,7 @@ interface RegisterCompletionOptions {
36
37
  *
37
38
  * @default 'onIdle'
38
39
  */
39
- trigger?: 'onTyping' | 'onIdle' | 'onDemand';
40
+ trigger?: Trigger;
40
41
  /**
41
42
  * The name of the file you are editing. This is used to provide more relevant completions based on the file's purpose.
42
43
  * For example, if you are editing a file named `utils.js`, the completions will be more relevant to utility functions.
@@ -104,7 +105,23 @@ interface RegisterCompletionOptions {
104
105
  * Callback function triggered when a completion is rejected by the user.
105
106
  */
106
107
  onCompletionRejected?: () => void;
108
+ /**
109
+ * Optional function to determine whether a completion should be triggered.
110
+ * This allows for custom logic to control when completions are shown.
111
+ *
112
+ * @param {object} params - Parameters for the trigger decision
113
+ * @param {string} params.text - The current text in the editor
114
+ * @param {CursorPosition} params.position - The current cursor position
115
+ * @param {Trigger} params.triggerType - The type of trigger that initiated the completion
116
+ * @returns {boolean} - Return true to allow the completion, false to prevent it
117
+ */
118
+ triggerIf?: (params: {
119
+ text: string;
120
+ position: CursorPosition;
121
+ triggerType: Trigger;
122
+ }) => boolean;
107
123
  }
124
+ type Trigger = 'onTyping' | 'onIdle' | 'onDemand';
108
125
  interface CompletionRegistration {
109
126
  /**
110
127
  * Triggers the completion.
package/build/index.d.ts CHANGED
@@ -4,6 +4,7 @@ import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
4
4
 
5
5
  type Monaco = typeof monaco;
6
6
  type StandaloneCodeEditor = monaco.editor.IStandaloneCodeEditor;
7
+ type CursorPosition = monaco.IPosition;
7
8
  type EditorRange = monaco.IRange;
8
9
 
9
10
  type FetchCompletionItemHandler = (params: FetchCompletionItemParams) => Promise<FetchCompletionItemReturn>;
@@ -36,7 +37,7 @@ interface RegisterCompletionOptions {
36
37
  *
37
38
  * @default 'onIdle'
38
39
  */
39
- trigger?: 'onTyping' | 'onIdle' | 'onDemand';
40
+ trigger?: Trigger;
40
41
  /**
41
42
  * The name of the file you are editing. This is used to provide more relevant completions based on the file's purpose.
42
43
  * For example, if you are editing a file named `utils.js`, the completions will be more relevant to utility functions.
@@ -104,7 +105,23 @@ interface RegisterCompletionOptions {
104
105
  * Callback function triggered when a completion is rejected by the user.
105
106
  */
106
107
  onCompletionRejected?: () => void;
108
+ /**
109
+ * Optional function to determine whether a completion should be triggered.
110
+ * This allows for custom logic to control when completions are shown.
111
+ *
112
+ * @param {object} params - Parameters for the trigger decision
113
+ * @param {string} params.text - The current text in the editor
114
+ * @param {CursorPosition} params.position - The current cursor position
115
+ * @param {Trigger} params.triggerType - The type of trigger that initiated the completion
116
+ * @returns {boolean} - Return true to allow the completion, false to prevent it
117
+ */
118
+ triggerIf?: (params: {
119
+ text: string;
120
+ position: CursorPosition;
121
+ triggerType: Trigger;
122
+ }) => boolean;
107
123
  }
124
+ type Trigger = 'onTyping' | 'onIdle' | 'onDemand';
108
125
  interface CompletionRegistration {
109
126
  /**
110
127
  * Triggers the completion.
package/build/index.js CHANGED
@@ -1,21 +1,21 @@
1
- 'use strict';var core=require('@monacopilot/core');var k=n=>!n||n.length===0?"":n.length===1?n[0]:`${n.slice(0,-1).join(", ")} and ${n.slice(-1)}`;var D=(n,e,o={})=>{if(e<=0)return "";let t=n.split(`
2
- `),r=t.length;if(e>=r)return n;if(o.truncateDirection==="keepEnd"){let s=t.slice(-e);return s.every(a=>a==="")?`
1
+ 'use strict';var core=require('@monacopilot/core');var B=n=>!n||n.length===0?"":n.length===1?n[0]:`${n.slice(0,-1).join(", ")} and ${n.slice(-1)}`;var N=(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=t.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 oe="<|developer_cursor_is_here|>",B=n=>({instruction:ne(),context:re(n),fileContent:ie(n)}),ne=()=>"You are an expert code assistant completing code in an editor. Provide concise, accurate code that seamlessly integrates with the existing context.",re=n=>{let{technologies:e=[],filename:o,relatedFiles:t=[],language:r}=n,i=k([r,...e].filter(l=>!!l)),s=t.length===0?"":t.map(({path:l,content:p})=>`### ${l}
6
+ `)};var ne="<|developer_cursor_is_here|>",j=n=>({instruction:re(),context:ie(n),fileContent:se(n)}),re=()=>"You are an expert code assistant completing code in an editor. Provide concise, accurate code that seamlessly integrates with the existing context.",ie=n=>{let{technologies:e=[],filename:t,relatedFiles:o=[],language:r}=n,i=B([r,...e].filter(l=>!!l)),s=o.length===0?"":o.map(({path:l,content:p})=>`### ${l}
7
7
  ${p}`).join(`
8
8
 
9
- `),a=[i?`Technology stack: ${i}`:"",`File: ${o||"unknown"}`].filter(Boolean).join(`
9
+ `),a=[i?`Technology stack: ${i}`:"",`File: ${t||"unknown"}`].filter(Boolean).join(`
10
10
  `);return `${s?`${s}
11
11
 
12
- `:""}${a}`},ie=n=>{let{textBeforeCursor:e,textAfterCursor:o}=n;return `**Current code:**
12
+ `:""}${a}`},se=n=>{let{textBeforeCursor:e,textAfterCursor:t}=n;return `**Current code:**
13
13
  \`\`\`
14
- ${e}${oe}${o}
15
- \`\`\``};var v=class extends core.Copilot{async complete(e){let{body:o,options:t}=e,{customPrompt:r,headers:i}=t??{},{completionMetadata:s}=o,{text:a,raw:l,error:p}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:a,raw:l,error:p}}getDefaultPrompt(e){return B(e)}};var f=(n,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:n.lineNumber,endColumn:n.column}),j=(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 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 T(P.MAX_CACHE_SIZE);}get(e,o){return this.cache.getAll().filter(t=>this.isValidCacheItem(t,e,o))}add(e){e.completion.trim()&&this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,o,t){let r=e.textBeforeCursor.trim(),i=f(o,t),s=i,a=t.getLineContent(o.lineNumber);if(o.column===a.length+1&&o.lineNumber<t.getLineCount()){let p=t.getLineContent(o.lineNumber+1);s=i+`
16
- `+p;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let l=t.getValueInRange(e.range);return this.isPartialMatch(l,e.completion)?this.isPositionValid(e,o):false}isPartialMatch(e,o){let t=e.trim(),r=o.trim();return r.startsWith(t)||t.startsWith(r)}isPositionValid(e,o){let{range:t}=e,{startLineNumber:r,startColumn:i,endLineNumber:s,endColumn:a}=t,{lineNumber:l,column:p}=o;return l<r||l>s?false:r===s?p>=i-1&&p<=a+1:l===r?p>=i-1:l===s?p<=a+1:true}};P.MAX_CACHE_SIZE=20;var M=P;var L=class{constructor(e){this.formattedCompletion="";this.formattedCompletion=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=e.split(`
17
- `),t=[],r=false;for(let i=0;i<o.length;i++){let s=o[i],a=s.trim().startsWith("```");if(a&&!r){r=true;continue}if(a&&r){r=false;continue}t.push(s);}return t.join(`
14
+ ${e}${ne}${t}
15
+ \`\`\``};var T=class extends core.Copilot{async complete(e){let{body:t,options:o}=e,{customPrompt:r,headers:i}=o??{},{completionMetadata:s}=t,{text:a,raw:l,error:p}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:a,raw:l,error:p}}getDefaultPrompt(e){return j(e)}};var K=100,U=true,v="onIdle",V=120,H=400,$=0;var f=(n,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:n.lineNumber,endColumn:n.column}),z=(n,e)=>e.getValueInRange({startLineNumber:n.lineNumber,startColumn:n.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),G=n=>n.getValue();var P=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 L=class L{constructor(){this.cache=new P(L.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 p=o.getLineContent(t.lineNumber+1);s=i+`
16
+ `+p;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let l=o.getValueInRange(e.range);return this.isPartialMatch(l,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:l,column:p}=t;return l<r||l>s?false:r===s?p>=i-1&&p<=a+1:l===r?p>=i-1:l===s?p<=a+1:true}};L.MAX_CACHE_SIZE=20;var M=L;var I=class{constructor(e){this.formattedCompletion="";this.formattedCompletion=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 t=e.split(`
17
+ `),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(`
18
18
  `)}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
19
19
 
20
- `),this}build(){return this.formattedCompletion}};var O=class{findOverlaps(e,o,t){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=o.length,s=t.length,a=0,l=0,p=0,d=Math.min(r,i);for(let c=1;c<=d;c++){let C=e.substring(0,c),g=o.slice(-c);C===g&&(p=c);}let m=Math.min(r,s);for(let c=0;c<m&&e[c]===t[c];c++)a++;for(let c=1;c<=m;c++)e.slice(-c)===t.slice(0,c)&&(l=c);let u=Math.max(a,l);if(u===0){for(let c=1;c<r;c++)if(t.startsWith(e.substring(c))){u=r-c;break}}return {startOverlapLength:p,maxOverlapLength:u}}};var A=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new O;}computeInsertionRange(e,o,t){if(!o)return this.createEmptyRange(e);let r=t.getOffsetAt(e),i=t.getValue().substring(0,r),s=t.getValue().substring(r);if(r>=t.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:a,maxOverlapLength:l}=this.textOverlapCalculator.findOverlaps(o,i,s),p=a>0?t.getPositionAt(r-a):e,d=r+l,m=t.getPositionAt(d);return new this.monaco.Range(p.lineNumber,p.column,m.lineNumber,m.column)}computeCacheRange(e,o){let t=e.lineNumber,r=e.column,i=o.split(`
21
- `),s=i.length-1,a=t+s,l=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(t,r,a,l)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var K=100,U=true,V="onIdle",H=120,$=400,z=0;var G=async n=>{let{endpoint:e,body:o}=n,t=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});if(!t.ok)throw new Error(`Error while fetching completion item: ${t.statusText}`);let{completion:r,error:i}=await t.json();if(i)throw new Error(i);return {completion:r}},W=({pos:n,mdl:e,options:o})=>{let{filename:t,language:r,technologies:i,relatedFiles:s,maxContextLines:a=K}=o,p=s&&s.length>0?3:2,d=a?Math.floor(a/p):void 0,m=(E,y,S)=>{let b=E(n,e);return y?D(b,y,S):b},u=(E,y)=>!E||!y?E:E.map(({content:S,...b})=>({...b,content:D(S,y)})),c=m(f,d,{truncateDirection:"keepEnd"}),C=m(j,d,{truncateDirection:"keepStart"}),g=u(s,d);return {filename:t,language:r,technologies:i,relatedFiles:g,textBeforeCursor:c,textAfterCursor:C,cursorPosition:n}};var X=(n,e=300)=>{let o=null,t=null,r=(...i)=>{if(t)return t.args=i,t.promise;let s,a,l=new Promise((p,d)=>{s=p,a=d;});return t={args:i,promise:l,resolve:s,reject:a},o&&(clearTimeout(o),o=null),o=setTimeout(async()=>{let p=t;if(p){t=null,o=null;try{let d=await n(...p.args);p.resolve(d);}catch(d){p.reject(d);}}},e),l};return r.cancel=()=>{o&&(clearTimeout(o),o=null),t&&(t.reject(new Error("Cancelled")),t=null);},r};var Y=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 I=new M,Z=async({monaco:n,mdl:e,pos:o,token:t,isCompletionAccepted:r,options:i})=>{let{trigger:s=V,endpoint:a,enableCaching:l=U,onError:p,requestHandler:d}=i;if(l&&!r){let m=I.get(o,e).map(u=>({insertText:u.completion,range:u.range}));if(m.length>0)return h(m)}if(t.isCancellationRequested)return h([]);try{let m=X(d??G,{onTyping:H,onIdle:$,onDemand:z}[s]);t.onCancellationRequested(()=>{m.cancel();});let u=W({pos:o,mdl:e,options:i}),{completion:c}=await m({endpoint:a,body:{completionMetadata:u}});if(c){let C=new L(c).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),g=new A(n);return l&&I.add({completion:C,range:g.computeCacheRange(o,C),textBeforeCursor:f(o,e)}),h([{insertText:C,range:g.computeInsertionRange(o,C,e)}])}}catch(m){if(Y(m))return h([]);p?p(m):core.logger.warn("Cannot provide completion",m);}return h([])};var N=new WeakMap,x=n=>N.get(n),J=(n,e)=>{N.set(n,e);},w=n=>{N.delete(n);},Q=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var ee=(n,e,o)=>{let t=x(e);return t?n.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(r,i,s,a)=>{if(!(o.trigger==="onDemand"&&!t.isExplicitlyTriggered))return Z({monaco:n,mdl:r,pos:i,token:a,isCompletionAccepted:t.isCompletionAccepted,options:o})},handleItemDidShow:(r,i,s)=>{t.isExplicitlyTriggered=false,t.hasRejectedCurrentCompletion=false,!t.isCompletionAccepted&&(t.isCompletionVisible=true,o.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null};var le={TAB:(n,e)=>e.keyCode===n.KeyCode.Tab,CMD_RIGHT_ARROW:(n,e)=>e.keyCode===n.KeyCode.RightArrow&&e.metaKey},F=class{constructor(e,o,t){this.monaco=e;this.state=o;this.options=t;}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(le).some(o=>o(this.monaco,e))}},te=(n,e,o,t)=>{let r=new F(n,o,t);return e.onKeyDown(i=>r.handleKeyEvent(i))};var R=null,pe=(n,e,o)=>{R&&R.deregister();let t=[];J(e,Q()),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=x(e);if(!r)return core.logger.warn("Completion is not registered properly. State not found."),me();let i=ee(n,e,o);i&&t.push(i);let s=te(n,e,r,o);t.push(s);let a={deregister:()=>{t.forEach(l=>l.dispose()),I.clear(),w(e),R=null;},trigger:()=>ce(e)};return R=a,a}catch(r){return o.onError?o.onError(r):core.logger.report(r),{deregister:()=>{t.forEach(i=>i.dispose()),w(e),R=null;},trigger:()=>{}}}},ce=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",{});},me=()=>({deregister:()=>{},trigger:()=>{}});var ut=v;exports.CompletionCopilot=v;exports.Copilot=ut;exports.registerCompletion=pe;
20
+ `),this}build(){return this.formattedCompletion}};var O=class{findOverlaps(e,t,o){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=t.length,s=o.length,a=0,l=0,p=0,d=Math.min(r,i);for(let c=1;c<=d;c++){let C=e.substring(0,c),g=t.slice(-c);C===g&&(p=c);}let m=Math.min(r,s);for(let c=0;c<m&&e[c]===o[c];c++)a++;for(let c=1;c<=m;c++)e.slice(-c)===o.slice(0,c)&&(l=c);let u=Math.max(a,l);if(u===0){for(let c=1;c<r;c++)if(o.startsWith(e.substring(c))){u=r-c;break}}return {startOverlapLength:p,maxOverlapLength:u}}};var A=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new O;}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:l}=this.textOverlapCalculator.findOverlaps(t,i,s),p=a>0?o.getPositionAt(r-a):e,d=r+l,m=o.getPositionAt(d);return new this.monaco.Range(p.lineNumber,p.column,m.lineNumber,m.column)}computeCacheRange(e,t){let o=e.lineNumber,r=e.column,i=t.split(`
21
+ `),s=i.length-1,a=o+s,l=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(o,r,a,l)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var W=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: ${o.statusText}`);let{completion:r,error:i}=await o.json();if(i)throw new Error(i);return {completion:r}},X=({pos:n,mdl:e,options:t})=>{let{filename:o,language:r,technologies:i,relatedFiles:s,maxContextLines:a=K}=t,p=s&&s.length>0?3:2,d=a?Math.floor(a/p):void 0,m=(E,y,D)=>{let b=E(n,e);return y?N(b,y,D):b},u=(E,y)=>!E||!y?E:E.map(({content:D,...b})=>({...b,content:N(D,y)})),c=m(f,d,{truncateDirection:"keepEnd"}),C=m(z,d,{truncateDirection:"keepStart"}),g=u(s,d);return {filename:o,language:r,technologies:i,relatedFiles:g,textBeforeCursor:c,textAfterCursor:C,cursorPosition:n}};var Y=(n,e=300)=>{let t=null,o=null,r=(...i)=>{if(o)return o.args=i,o.promise;let s,a,l=new Promise((p,d)=>{s=p,a=d;});return o={args:i,promise:l,resolve:s,reject:a},t&&(clearTimeout(t),t=null),t=setTimeout(async()=>{let p=o;if(p){o=null,t=null;try{let d=await n(...p.args);p.resolve(d);}catch(d){p.reject(d);}}},e),l};return r.cancel=()=>{t&&(clearTimeout(t),t=null),o&&(o.reject(new Error("Cancelled")),o=null);},r};var Z=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 S=new M,J=async({monaco:n,mdl:e,pos:t,token:o,isCompletionAccepted:r,options:i})=>{let{trigger:s=v,endpoint:a,enableCaching:l=U,onError:p,requestHandler:d}=i;if(l&&!r){let m=S.get(t,e).map(u=>({insertText:u.completion,range:u.range}));if(m.length>0)return h(m)}if(o.isCancellationRequested)return h([]);try{let m=Y(d??W,{onTyping:V,onIdle:H,onDemand:$}[s]);o.onCancellationRequested(()=>{m.cancel();});let u=X({pos:t,mdl:e,options:i}),{completion:c}=await m({endpoint:a,body:{completionMetadata:u}});if(c){let C=new I(c).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),g=new A(n);return l&&S.add({completion:C,range:g.computeCacheRange(t,C),textBeforeCursor:f(t,e)}),h([{insertText:C,range:g.computeInsertionRange(t,C,e)}])}}catch(m){if(Z(m))return h([]);p?p(m):core.logger.warn("Cannot provide completion",m);}return h([])};var w=new WeakMap,x=n=>w.get(n),Q=(n,e)=>{w.set(n,e);},F=n=>{w.delete(n);},ee=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var te=(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||t.triggerIf&&!t.triggerIf({text:G(e),position:i,triggerType:t.trigger??v})))return J({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 pe={TAB:(n,e)=>e.keyCode===n.KeyCode.Tab,CMD_RIGHT_ARROW:(n,e)=>e.keyCode===n.KeyCode.RightArrow&&e.metaKey},_=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(pe).some(t=>t(this.monaco,e))}},oe=(n,e,t,o)=>{let r=new _(n,t,o);return e.onKeyDown(i=>r.handleKeyEvent(i))};var R=null,ce=(n,e,t)=>{R&&R.deregister();let o=[];Q(e,ee()),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=te(n,e,t);i&&o.push(i);let s=oe(n,e,r,t);o.push(s);let a={deregister:()=>{o.forEach(l=>l.dispose()),S.clear(),F(e),R=null;},trigger:()=>me(e)};return R=a,a}catch(r){return t.onError?t.onError(r):core.logger.report(r),{deregister:()=>{o.forEach(i=>i.dispose()),F(e),R=null;},trigger:()=>{}}}},me=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 ft=T;exports.CompletionCopilot=T;exports.Copilot=ft;exports.registerCompletion=ce;
package/build/index.mjs CHANGED
@@ -1,21 +1,21 @@
1
- import {Copilot,logger}from'@monacopilot/core';var k=n=>!n||n.length===0?"":n.length===1?n[0]:`${n.slice(0,-1).join(", ")} and ${n.slice(-1)}`;var D=(n,e,o={})=>{if(e<=0)return "";let t=n.split(`
2
- `),r=t.length;if(e>=r)return n;if(o.truncateDirection==="keepEnd"){let s=t.slice(-e);return s.every(a=>a==="")?`
1
+ import {Copilot,logger}from'@monacopilot/core';var B=n=>!n||n.length===0?"":n.length===1?n[0]:`${n.slice(0,-1).join(", ")} and ${n.slice(-1)}`;var N=(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=t.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 oe="<|developer_cursor_is_here|>",B=n=>({instruction:ne(),context:re(n),fileContent:ie(n)}),ne=()=>"You are an expert code assistant completing code in an editor. Provide concise, accurate code that seamlessly integrates with the existing context.",re=n=>{let{technologies:e=[],filename:o,relatedFiles:t=[],language:r}=n,i=k([r,...e].filter(l=>!!l)),s=t.length===0?"":t.map(({path:l,content:p})=>`### ${l}
6
+ `)};var ne="<|developer_cursor_is_here|>",j=n=>({instruction:re(),context:ie(n),fileContent:se(n)}),re=()=>"You are an expert code assistant completing code in an editor. Provide concise, accurate code that seamlessly integrates with the existing context.",ie=n=>{let{technologies:e=[],filename:t,relatedFiles:o=[],language:r}=n,i=B([r,...e].filter(l=>!!l)),s=o.length===0?"":o.map(({path:l,content:p})=>`### ${l}
7
7
  ${p}`).join(`
8
8
 
9
- `),a=[i?`Technology stack: ${i}`:"",`File: ${o||"unknown"}`].filter(Boolean).join(`
9
+ `),a=[i?`Technology stack: ${i}`:"",`File: ${t||"unknown"}`].filter(Boolean).join(`
10
10
  `);return `${s?`${s}
11
11
 
12
- `:""}${a}`},ie=n=>{let{textBeforeCursor:e,textAfterCursor:o}=n;return `**Current code:**
12
+ `:""}${a}`},se=n=>{let{textBeforeCursor:e,textAfterCursor:t}=n;return `**Current code:**
13
13
  \`\`\`
14
- ${e}${oe}${o}
15
- \`\`\``};var v=class extends Copilot{async complete(e){let{body:o,options:t}=e,{customPrompt:r,headers:i}=t??{},{completionMetadata:s}=o,{text:a,raw:l,error:p}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:a,raw:l,error:p}}getDefaultPrompt(e){return B(e)}};var f=(n,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:n.lineNumber,endColumn:n.column}),j=(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 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 T(P.MAX_CACHE_SIZE);}get(e,o){return this.cache.getAll().filter(t=>this.isValidCacheItem(t,e,o))}add(e){e.completion.trim()&&this.cache.enqueue(e);}clear(){this.cache.clear();}isValidCacheItem(e,o,t){let r=e.textBeforeCursor.trim(),i=f(o,t),s=i,a=t.getLineContent(o.lineNumber);if(o.column===a.length+1&&o.lineNumber<t.getLineCount()){let p=t.getLineContent(o.lineNumber+1);s=i+`
16
- `+p;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let l=t.getValueInRange(e.range);return this.isPartialMatch(l,e.completion)?this.isPositionValid(e,o):false}isPartialMatch(e,o){let t=e.trim(),r=o.trim();return r.startsWith(t)||t.startsWith(r)}isPositionValid(e,o){let{range:t}=e,{startLineNumber:r,startColumn:i,endLineNumber:s,endColumn:a}=t,{lineNumber:l,column:p}=o;return l<r||l>s?false:r===s?p>=i-1&&p<=a+1:l===r?p>=i-1:l===s?p<=a+1:true}};P.MAX_CACHE_SIZE=20;var M=P;var L=class{constructor(e){this.formattedCompletion="";this.formattedCompletion=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=e.split(`
17
- `),t=[],r=false;for(let i=0;i<o.length;i++){let s=o[i],a=s.trim().startsWith("```");if(a&&!r){r=true;continue}if(a&&r){r=false;continue}t.push(s);}return t.join(`
14
+ ${e}${ne}${t}
15
+ \`\`\``};var T=class extends Copilot{async complete(e){let{body:t,options:o}=e,{customPrompt:r,headers:i}=o??{},{completionMetadata:s}=t,{text:a,raw:l,error:p}=await this.makeAIRequest(s,{customPrompt:r,customHeaders:i});return {completion:a,raw:l,error:p}}getDefaultPrompt(e){return j(e)}};var K=100,U=true,v="onIdle",V=120,H=400,$=0;var f=(n,e)=>e.getValueInRange({startLineNumber:1,startColumn:1,endLineNumber:n.lineNumber,endColumn:n.column}),z=(n,e)=>e.getValueInRange({startLineNumber:n.lineNumber,startColumn:n.column,endLineNumber:e.getLineCount(),endColumn:e.getLineMaxColumn(e.getLineCount())}),G=n=>n.getValue();var P=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 L=class L{constructor(){this.cache=new P(L.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 p=o.getLineContent(t.lineNumber+1);s=i+`
16
+ `+p;}if(!(s.trim().includes(r)||r.includes(s.trim())))return false;let l=o.getValueInRange(e.range);return this.isPartialMatch(l,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:l,column:p}=t;return l<r||l>s?false:r===s?p>=i-1&&p<=a+1:l===r?p>=i-1:l===s?p<=a+1:true}};L.MAX_CACHE_SIZE=20;var M=L;var I=class{constructor(e){this.formattedCompletion="";this.formattedCompletion=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 t=e.split(`
17
+ `),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(`
18
18
  `)}removeExcessiveNewlines(){return this.formattedCompletion=this.formattedCompletion.replace(/\n{3,}/g,`
19
19
 
20
- `),this}build(){return this.formattedCompletion}};var O=class{findOverlaps(e,o,t){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=o.length,s=t.length,a=0,l=0,p=0,d=Math.min(r,i);for(let c=1;c<=d;c++){let C=e.substring(0,c),g=o.slice(-c);C===g&&(p=c);}let m=Math.min(r,s);for(let c=0;c<m&&e[c]===t[c];c++)a++;for(let c=1;c<=m;c++)e.slice(-c)===t.slice(0,c)&&(l=c);let u=Math.max(a,l);if(u===0){for(let c=1;c<r;c++)if(t.startsWith(e.substring(c))){u=r-c;break}}return {startOverlapLength:p,maxOverlapLength:u}}};var A=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new O;}computeInsertionRange(e,o,t){if(!o)return this.createEmptyRange(e);let r=t.getOffsetAt(e),i=t.getValue().substring(0,r),s=t.getValue().substring(r);if(r>=t.getValue().length)return this.createEmptyRange(e);if(s.length===0)return this.createEmptyRange(e);let{startOverlapLength:a,maxOverlapLength:l}=this.textOverlapCalculator.findOverlaps(o,i,s),p=a>0?t.getPositionAt(r-a):e,d=r+l,m=t.getPositionAt(d);return new this.monaco.Range(p.lineNumber,p.column,m.lineNumber,m.column)}computeCacheRange(e,o){let t=e.lineNumber,r=e.column,i=o.split(`
21
- `),s=i.length-1,a=t+s,l=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(t,r,a,l)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var K=100,U=true,V="onIdle",H=120,$=400,z=0;var G=async n=>{let{endpoint:e,body:o}=n,t=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});if(!t.ok)throw new Error(`Error while fetching completion item: ${t.statusText}`);let{completion:r,error:i}=await t.json();if(i)throw new Error(i);return {completion:r}},W=({pos:n,mdl:e,options:o})=>{let{filename:t,language:r,technologies:i,relatedFiles:s,maxContextLines:a=K}=o,p=s&&s.length>0?3:2,d=a?Math.floor(a/p):void 0,m=(E,y,S)=>{let b=E(n,e);return y?D(b,y,S):b},u=(E,y)=>!E||!y?E:E.map(({content:S,...b})=>({...b,content:D(S,y)})),c=m(f,d,{truncateDirection:"keepEnd"}),C=m(j,d,{truncateDirection:"keepStart"}),g=u(s,d);return {filename:t,language:r,technologies:i,relatedFiles:g,textBeforeCursor:c,textAfterCursor:C,cursorPosition:n}};var X=(n,e=300)=>{let o=null,t=null,r=(...i)=>{if(t)return t.args=i,t.promise;let s,a,l=new Promise((p,d)=>{s=p,a=d;});return t={args:i,promise:l,resolve:s,reject:a},o&&(clearTimeout(o),o=null),o=setTimeout(async()=>{let p=t;if(p){t=null,o=null;try{let d=await n(...p.args);p.resolve(d);}catch(d){p.reject(d);}}},e),l};return r.cancel=()=>{o&&(clearTimeout(o),o=null),t&&(t.reject(new Error("Cancelled")),t=null);},r};var Y=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 I=new M,Z=async({monaco:n,mdl:e,pos:o,token:t,isCompletionAccepted:r,options:i})=>{let{trigger:s=V,endpoint:a,enableCaching:l=U,onError:p,requestHandler:d}=i;if(l&&!r){let m=I.get(o,e).map(u=>({insertText:u.completion,range:u.range}));if(m.length>0)return h(m)}if(t.isCancellationRequested)return h([]);try{let m=X(d??G,{onTyping:H,onIdle:$,onDemand:z}[s]);t.onCancellationRequested(()=>{m.cancel();});let u=W({pos:o,mdl:e,options:i}),{completion:c}=await m({endpoint:a,body:{completionMetadata:u}});if(c){let C=new L(c).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),g=new A(n);return l&&I.add({completion:C,range:g.computeCacheRange(o,C),textBeforeCursor:f(o,e)}),h([{insertText:C,range:g.computeInsertionRange(o,C,e)}])}}catch(m){if(Y(m))return h([]);p?p(m):logger.warn("Cannot provide completion",m);}return h([])};var N=new WeakMap,x=n=>N.get(n),J=(n,e)=>{N.set(n,e);},w=n=>{N.delete(n);},Q=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var ee=(n,e,o)=>{let t=x(e);return t?n.languages.registerInlineCompletionsProvider(o.language,{provideInlineCompletions:(r,i,s,a)=>{if(!(o.trigger==="onDemand"&&!t.isExplicitlyTriggered))return Z({monaco:n,mdl:r,pos:i,token:a,isCompletionAccepted:t.isCompletionAccepted,options:o})},handleItemDidShow:(r,i,s)=>{t.isExplicitlyTriggered=false,t.hasRejectedCurrentCompletion=false,!t.isCompletionAccepted&&(t.isCompletionVisible=true,o.onCompletionShown?.(s,i.range));},freeInlineCompletions:()=>{}}):null};var le={TAB:(n,e)=>e.keyCode===n.KeyCode.Tab,CMD_RIGHT_ARROW:(n,e)=>e.keyCode===n.KeyCode.RightArrow&&e.metaKey},F=class{constructor(e,o,t){this.monaco=e;this.state=o;this.options=t;}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(le).some(o=>o(this.monaco,e))}},te=(n,e,o,t)=>{let r=new F(n,o,t);return e.onKeyDown(i=>r.handleKeyEvent(i))};var R=null,pe=(n,e,o)=>{R&&R.deregister();let t=[];J(e,Q()),e.updateOptions({inlineSuggest:{enabled:true}});try{let r=x(e);if(!r)return logger.warn("Completion is not registered properly. State not found."),me();let i=ee(n,e,o);i&&t.push(i);let s=te(n,e,r,o);t.push(s);let a={deregister:()=>{t.forEach(l=>l.dispose()),I.clear(),w(e),R=null;},trigger:()=>ce(e)};return R=a,a}catch(r){return o.onError?o.onError(r):logger.report(r),{deregister:()=>{t.forEach(i=>i.dispose()),w(e),R=null;},trigger:()=>{}}}},ce=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",{});},me=()=>({deregister:()=>{},trigger:()=>{}});var ut=v;export{v as CompletionCopilot,ut as Copilot,pe as registerCompletion};
20
+ `),this}build(){return this.formattedCompletion}};var O=class{findOverlaps(e,t,o){if(!e)return {startOverlapLength:0,maxOverlapLength:0};let r=e.length,i=t.length,s=o.length,a=0,l=0,p=0,d=Math.min(r,i);for(let c=1;c<=d;c++){let C=e.substring(0,c),g=t.slice(-c);C===g&&(p=c);}let m=Math.min(r,s);for(let c=0;c<m&&e[c]===o[c];c++)a++;for(let c=1;c<=m;c++)e.slice(-c)===o.slice(0,c)&&(l=c);let u=Math.max(a,l);if(u===0){for(let c=1;c<r;c++)if(o.startsWith(e.substring(c))){u=r-c;break}}return {startOverlapLength:p,maxOverlapLength:u}}};var A=class{constructor(e){this.monaco=e;this.textOverlapCalculator=new O;}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:l}=this.textOverlapCalculator.findOverlaps(t,i,s),p=a>0?o.getPositionAt(r-a):e,d=r+l,m=o.getPositionAt(d);return new this.monaco.Range(p.lineNumber,p.column,m.lineNumber,m.column)}computeCacheRange(e,t){let o=e.lineNumber,r=e.column,i=t.split(`
21
+ `),s=i.length-1,a=o+s,l=s===0?r+i[0].length:i[s].length+1;return new this.monaco.Range(o,r,a,l)}createEmptyRange(e){return new this.monaco.Range(e.lineNumber,e.column,e.lineNumber,e.column)}};var W=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: ${o.statusText}`);let{completion:r,error:i}=await o.json();if(i)throw new Error(i);return {completion:r}},X=({pos:n,mdl:e,options:t})=>{let{filename:o,language:r,technologies:i,relatedFiles:s,maxContextLines:a=K}=t,p=s&&s.length>0?3:2,d=a?Math.floor(a/p):void 0,m=(E,y,D)=>{let b=E(n,e);return y?N(b,y,D):b},u=(E,y)=>!E||!y?E:E.map(({content:D,...b})=>({...b,content:N(D,y)})),c=m(f,d,{truncateDirection:"keepEnd"}),C=m(z,d,{truncateDirection:"keepStart"}),g=u(s,d);return {filename:o,language:r,technologies:i,relatedFiles:g,textBeforeCursor:c,textAfterCursor:C,cursorPosition:n}};var Y=(n,e=300)=>{let t=null,o=null,r=(...i)=>{if(o)return o.args=i,o.promise;let s,a,l=new Promise((p,d)=>{s=p,a=d;});return o={args:i,promise:l,resolve:s,reject:a},t&&(clearTimeout(t),t=null),t=setTimeout(async()=>{let p=o;if(p){o=null,t=null;try{let d=await n(...p.args);p.resolve(d);}catch(d){p.reject(d);}}},e),l};return r.cancel=()=>{t&&(clearTimeout(t),t=null),o&&(o.reject(new Error("Cancelled")),o=null);},r};var Z=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 S=new M,J=async({monaco:n,mdl:e,pos:t,token:o,isCompletionAccepted:r,options:i})=>{let{trigger:s=v,endpoint:a,enableCaching:l=U,onError:p,requestHandler:d}=i;if(l&&!r){let m=S.get(t,e).map(u=>({insertText:u.completion,range:u.range}));if(m.length>0)return h(m)}if(o.isCancellationRequested)return h([]);try{let m=Y(d??W,{onTyping:V,onIdle:H,onDemand:$}[s]);o.onCancellationRequested(()=>{m.cancel();});let u=X({pos:t,mdl:e,options:i}),{completion:c}=await m({endpoint:a,body:{completionMetadata:u}});if(c){let C=new I(c).removeMarkdownCodeSyntax().removeExcessiveNewlines().removeInvalidLineBreaks().build(),g=new A(n);return l&&S.add({completion:C,range:g.computeCacheRange(t,C),textBeforeCursor:f(t,e)}),h([{insertText:C,range:g.computeInsertionRange(t,C,e)}])}}catch(m){if(Z(m))return h([]);p?p(m):logger.warn("Cannot provide completion",m);}return h([])};var w=new WeakMap,x=n=>w.get(n),Q=(n,e)=>{w.set(n,e);},F=n=>{w.delete(n);},ee=()=>({isCompletionAccepted:false,isCompletionVisible:false,isExplicitlyTriggered:false,hasRejectedCurrentCompletion:false});var te=(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||t.triggerIf&&!t.triggerIf({text:G(e),position:i,triggerType:t.trigger??v})))return J({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 pe={TAB:(n,e)=>e.keyCode===n.KeyCode.Tab,CMD_RIGHT_ARROW:(n,e)=>e.keyCode===n.KeyCode.RightArrow&&e.metaKey},_=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(pe).some(t=>t(this.monaco,e))}},oe=(n,e,t,o)=>{let r=new _(n,t,o);return e.onKeyDown(i=>r.handleKeyEvent(i))};var R=null,ce=(n,e,t)=>{R&&R.deregister();let o=[];Q(e,ee()),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=te(n,e,t);i&&o.push(i);let s=oe(n,e,r,t);o.push(s);let a={deregister:()=>{o.forEach(l=>l.dispose()),S.clear(),F(e),R=null;},trigger:()=>me(e)};return R=a,a}catch(r){return t.onError?t.onError(r):logger.report(r),{deregister:()=>{o.forEach(i=>i.dispose()),F(e),R=null;},trigger:()=>{}}}},me=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 ft=T;export{T as CompletionCopilot,ft as Copilot,ce as registerCompletion};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monacopilot",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
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": "1.0.0"
40
+ "@monacopilot/core": "1.1.1"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "monaco-editor": ">=0.41.0"