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(a){let{colors:o,output:s}=a,c=s.isTTY===!0,l=c&&s.columns?s.columns:80,u=Math.max(4,l-(SPINNER_CELLS+3)),d=c?new LiveRegion({write:e=>(s.write(e),!0)}):void 0,f,clip=e=>visibleLength(e)>u?`${clipVisible(e,u-1)}…`:e,spinnerRow=e=>{let t=SPINNER_FRAMES[e.frame%SPINNER_FRAMES.length]??SPINNER_FRAMES[0];return`${o.green(t)} ${e.label}`},previewRow=e=>`${o.green(`│`)} ${o.dim(clip(e))}`;function liveRows(){let e=f?.view;if(e===void 0)return[];let t=e.kind===`spinner`?[o.green(`│`),spinnerRow(e)]:[];return e.preview!==void 0&&t.push(previewRow(e.preview)),t}function commit(e){if(d===void 0){s.write(e);return}d.flush(e.replace(/\n+$/u,``).split(` `),liveRows())}function writeLine(e){commit(formatRailLine(e,o,s))}function settle(e){let n=f;if(n!==void 0&&(n.view?.kind===`spinner`&&n.view.timer!==void 0&&clearInterval(n.view.timer),f=void 0,d!==void 0))if(e&&n.commandLines.length>0){let e=n.commandLines.flatMap(e=>formatRailLine(o.dim(e),o,s).replace(/\n+$/u,``).split(` `));d.flush(e,[])}else d.update([])}return{message(e){settle(!1),writeLine(e),f={commandLines:[],view:{kind:`status`}}},info(e){settle(!1),writeLine(o.dim(e))},success(e){settle(!1),writeLine(o.dim(e))},warning(e){settle(!0),writeLine(o.yellow(e))},error(e){settle(!0),writeLine(o.red(e))},commandOutput(e){if(d===void 0||f===void 0){s.write(formatRailLine(o.dim(e),o,s));return}f.commandLines.push(e),f.view!==void 0&&(f.view.preview=e,d.update(liveRows()))},section(n,r){settle(!1);let i=r.map(e=>formatRailLine(e,o,s)).join(``);commit(`${formatPromptHeader(`submit`,n,{colors:o,leadingRail:`green`})}${i}`)},spinner(e){if(settle(!1),d===void 0)return s.write(`${o.green(`│`)}\n${o.green(SPINNER_STATIC)} ${e}\n`),{stop(){}};let t={kind:`spinner`,frame:0,label:clip(e)},n={commandLines:[],view:t};f=n,d.update(liveRows());let r=setInterval(()=>{f!==n||n.view!==t||(t.frame+=1,d.update(liveRows()))},120);t.timer=r,r.unref?.();let i=!1;return{stop(){i||(i=!0,clearInterval(r),f===n&&(n.view=void 0,d.update([])))}}},settle(){settle(!1)}}}export{SPINNER_FRAMES,SPINNER_FRAME_MS,createRailLog};