eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
6 lines • 4.67 kB
JavaScript
import{inputTextWidth,offsetAtVisibleColumn}from"./terminal-text.js";import{graphemeBoundaryAtOrAfter,graphemes,nextGraphemeBoundary,previousGraphemeBoundary}from"#shared/text-boundaries.js";const EMPTY_LINE={text:``,cursor:0};function lineOf(e){return{text:e,cursor:e.length}}function maskLine(e){return{text:`•`.repeat(graphemes(e.text).length),cursor:graphemes(e.text.slice(0,e.cursor)).length}}function insert(e,t){if(t.length===0)return e;let r=e.text.slice(0,e.cursor)+t+e.text.slice(e.cursor);return{text:r,cursor:graphemeBoundaryAtOrAfter(r,e.cursor+t.length)}}function backspace(e){if(e.cursor===0)return e;let t=previousGraphemeBoundary(e.text,e.cursor),r=e.text.slice(0,t)+e.text.slice(e.cursor);return{text:r,cursor:graphemeBoundaryAtOrAfter(r,t)}}function deleteForward(e){if(e.cursor>=e.text.length)return e;let t=nextGraphemeBoundary(e.text,e.cursor),r=e.text.slice(0,e.cursor)+e.text.slice(t);return{text:r,cursor:graphemeBoundaryAtOrAfter(r,e.cursor)}}function moveLeft(e){return e.cursor===0?e:{text:e.text,cursor:previousGraphemeBoundary(e.text,e.cursor)}}function moveRight(e){return e.cursor>=e.text.length?e:{text:e.text,cursor:nextGraphemeBoundary(e.text,e.cursor)}}function moveHome(e){let t=logicalLineStart(e.text,e.cursor);return e.cursor===t?e:{text:e.text,cursor:t}}function moveEnd(e){let t=logicalLineEnd(e.text,e.cursor);return e.cursor===t?e:{text:e.text,cursor:t}}function killToEnd(e){let t=logicalLineEnd(e.text,e.cursor);return e.cursor>=t?e:{text:e.text.slice(0,e.cursor)+e.text.slice(t),cursor:e.cursor}}function killToStart(e){let t=logicalLineStart(e.text,e.cursor);return e.cursor<=t?e:{text:e.text.slice(0,t)+e.text.slice(e.cursor),cursor:t}}function deleteWord(e){if(e.cursor===0)return e;let t=logicalLineStart(e.text,e.cursor),r=e.cursor;for(;r>t;){let t=previousGraphemeBoundary(e.text,r);if(!isWhitespace(e.text.slice(t,r)))break;r=t}for(;r>t;){let t=previousGraphemeBoundary(e.text,r);if(isWhitespace(e.text.slice(t,r)))break;r=t}let i=e.text.slice(0,r)+e.text.slice(e.cursor);return{text:i,cursor:graphemeBoundaryAtOrAfter(i,r)}}function logicalLineStart(e,t){return t===0?0:e.lastIndexOf(`
`,t-1)+1}function logicalLineEnd(e,t){let n=e.indexOf(`
`,t);return n===-1?e.length:n}function applyLineEditorKey(e,t,n){let r=n?.multiline??!1;switch(t.type){case`text`:return insert(e,r?t.value:t.value.replaceAll(`
`,` `));case`newline`:return r?insert(e,`
`):void 0;case`backspace`:return backspace(e);case`delete`:return deleteForward(e);case`left`:return moveLeft(e);case`right`:return moveRight(e);case`home`:case`ctrl-a`:return moveHome(e);case`end`:case`ctrl-e`:return moveEnd(e);case`ctrl-k`:return killToEnd(e);case`ctrl-u`:return killToStart(e);case`ctrl-w`:return deleteWord(e);default:return}}function isWhitespace(e){return/^\s+$/u.test(e)}function visibleLine(t,n,i=`…`){let a=Math.max(1,n),{text:o,cursor:s}=t,c=graphemes(o),l=c.findIndex(e=>e.start===s),u=l===-1?c.length:l,d=c[u]?.text??``;if(inputTextWidth(o)<=a)return{before:o.slice(0,s),under:d,after:o.slice(s+d.length)};let f=u,p=u+ +(d.length>0),windowWidth=(t,n)=>{let r=c[t]?.start??o.length,a=c[n]?.start??o.length;return inputTextWidth(o.slice(r,a))+(t>0?inputTextWidth(i):0)+(n<c.length?inputTextWidth(i):0)},m=!0;for(;;){let e=f>0&&windowWidth(f-1,p)<=a,t=p<c.length&&windowWidth(f,p+1)<=a;if(!e&&!t)break;m&&e||!t?--f:p+=1,m=!m}let h=c[f]?.start??o.length,g=c[p]?.start??o.length;return{before:`${f>0?i:``}${o.slice(h,s)}`,under:d,after:`${o.slice(s+d.length,g)}${p<c.length?i:``}`}}function layoutPromptInput(e){let t=[],n=0,r=0,i=0;for(let a of e.text.split(`
`))e.cursor>=i&&e.cursor<=i+a.length&&(n=t.length,r=e.cursor-i),t.push({text:a,start:i}),i+=a.length+1;return{rows:t,caretRow:n,caretOffset:r}}function movePromptLine(n,r){let i=layoutPromptInput(n),a=r===`up`?i.caretRow-1:i.caretRow+1;if(a<0||a>=i.rows.length)return;let o=i.rows[i.caretRow],s=i.rows[a],c=inputTextWidth(o.text.slice(0,i.caretOffset));return{text:n.text,cursor:s.start+offsetAtVisibleColumn(s.text,c)}}var PromptHistory=class{#e=[];#t=0;#n=``;add(e){if(e.trim().length!==0){if(this.#e.at(-1)===e){this.#r();return}this.#e.push(e),this.#r()}}begin(e){this.#t=this.#e.length,this.#n=e}previous(e){if(this.#e.length!==0&&(this.#t===this.#e.length&&(this.#n=e),this.#t!==0))return--this.#t,this.#e[this.#t]}next(){if(!(this.#t>=this.#e.length))return this.#t+=1,this.#t===this.#e.length?this.#n:this.#e[this.#t]}#r(){this.#t=this.#e.length,this.#n=``}};export{EMPTY_LINE,PromptHistory,applyLineEditorKey,backspace,deleteForward,deleteWord,insert,killToEnd,killToStart,layoutPromptInput,lineOf,maskLine,moveEnd,moveHome,moveLeft,movePromptLine,moveRight,visibleLine};