UNPKG

eve

Version:

Filesystem-first framework for durable backend AI agents that run anywhere.

3 lines 2.68 kB
import{formatPromptHeader,formatRailLine}from"./prompt-ui.js";import{clipVisible,visibleLength}from"#cli/ui/terminal-text.js";import{LiveRegion}from"#cli/ui/live-region.js";const SPINNER_FRAMES=[`⠨`,`⠸`,`⢸`,`⢺`,`⢾`,`⢿`,`⢾`,`⢼`,`⢸`,`⠸`,`⠨`,`⠪`,`⠮`,`⠯`,`⢯`,`⢿`,`⠿`,`⠾`,`⠺`,`⠪`],SPINNER_CELLS=[...SPINNER_FRAMES[0]].length;function dotCount(e){let t=0;for(let n of e){let e=(n.codePointAt(0)??10240)-10240;for(;e>0;)t+=e&1,e>>=1}return t}const SPINNER_STATIC=SPINNER_FRAMES.reduce((e,t)=>dotCount(t)>dotCount(e)?t:e),SPINNER_FRAME_MS=120;function createRailLog(e){let{colors:t,output:n}=e,r=n.isTTY===!0,i=r&&n.columns?n.columns:80,a=Math.max(4,i-(SPINNER_CELLS+3)),o=r?new LiveRegion({write:e=>(n.write(e),!0)}):void 0,s,clip=e=>visibleLength(e)>a?`${clipVisible(e,a-1)}…`:e,spinnerRow=e=>{let n=SPINNER_FRAMES[e.frame%SPINNER_FRAMES.length]??SPINNER_FRAMES[0];return`${t.green(n)} ${e.label}`},previewRow=e=>`${t.green(`│`)} ${t.dim(clip(e))}`;function liveRows(){let e=s?.view;if(e===void 0)return[];let n=e.kind===`spinner`?[t.green(`│`),spinnerRow(e)]:[];return e.preview!==void 0&&n.push(previewRow(e.preview)),n}function commit(e){if(o===void 0){n.write(e);return}o.flush(e.replace(/\n+$/u,``).split(` `),liveRows())}function writeLine(e){commit(formatRailLine(e,t,n))}function settle(e){let r=s;if(r!==void 0&&(r.view?.kind===`spinner`&&r.view.timer!==void 0&&clearInterval(r.view.timer),s=void 0,o!==void 0)){if(e&&r.commandLines.length>0){let e=r.commandLines.flatMap(e=>formatRailLine(t.dim(e),t,n).replace(/\n+$/u,``).split(` `));o.flush(e,[])}else o.update([])}}return{message(e){settle(!1),writeLine(e),s={commandLines:[],view:{kind:`status`}}},info(e){settle(!1),writeLine(t.dim(e))},success(e){settle(!1),writeLine(t.dim(e))},warning(e){settle(!0),writeLine(t.yellow(e))},error(e){settle(!0),writeLine(t.red(e))},commandOutput(e){if(o===void 0||s===void 0){n.write(formatRailLine(t.dim(e),t,n));return}s.commandLines.push(e),s.view!==void 0&&(s.view.preview=e,o.update(liveRows()))},section(e,r){settle(!1);let i=r.map(e=>formatRailLine(e,t,n)).join(``);commit(`${formatPromptHeader(`submit`,e,{colors:t,leadingRail:`green`})}${i}`)},spinner(e){if(settle(!1),o===void 0)return n.write(`${t.green(`│`)}\n${t.green(SPINNER_STATIC)} ${e}\n`),{stop(){}};let r={kind:`spinner`,frame:0,label:clip(e)},i={commandLines:[],view:r};s=i,o.update(liveRows());let a=setInterval(()=>{s===i&&i.view===r&&(r.frame+=1,o.update(liveRows()))},120);r.timer=a,a.unref?.();let c=!1;return{stop(){c||(c=!0,clearInterval(a),s===i&&(i.view=void 0,o.update([])))}}},settle(){settle(!1)}}}export{SPINNER_FRAMES,SPINNER_FRAME_MS,createRailLog};