UNPKG

eve

Version:

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

1 lines 2.36 kB
import{isLogLevelEnabled}from"#internal/logging.js";import pc from"#compiled/picocolors/index.js";import{sanitizeForTerminal}from"#cli/ui/output.js";import{sliceVisible,visibleLength}from"#cli/ui/terminal-text.js";import{LiveRegion}from"#cli/ui/live-region.js";import{PROGRESS_PULSE_DURATION_MS,PROGRESS_PULSE_GLYPH,PROGRESS_PULSE_SEQUENCE}from"#cli/ui/progress-pulse.js";function validatePulseSequence(e){if(e.length!==8&&e.length!==16)throw RangeError(`Pulse sequence must contain 8 or 16 steps.`);if(/[^01]/u.test(e))throw RangeError(`Pulse sequence steps must be "0" or "1".`)}function pulseStepDurationMs(e,t){let n=Math.round(e*PROGRESS_PULSE_DURATION_MS/t);return Math.round((e+1)*PROGRESS_PULSE_DURATION_MS/t)-n}function sanitizeProgressText(e){return sanitizeForTerminal(e).replaceAll(/\s+/gu,` `).trim()}function fitProgressText(e,t){return t<=0?``:visibleLength(e)<=t?e:t===1?`…`:`${sliceVisible(e,t-1)}…`}function renderProgressRow(e,t,n,r){let i=n!==``,a=`${e} ${t}${i?``:`...`}`,o=Math.max(0,(r??80)-1),s=visibleLength(a);if(s>=o){let t=fitProgressText(a,o);return t.startsWith(e)?`${pc.green(e)}${t.slice(e.length)}`:t}let c=i?fitProgressText(` ${n}`,o-s):``,l=c===``?``:pc.dim(c);return`${pc.green(e)}${a.slice(e.length)}${l}`}function startCliLiveRow(e,t={}){let n=t.output??process.stdout,r=t.pulseSequence??PROGRESS_PULSE_SEQUENCE;validatePulseSequence(r);let i=t.animate!==!1&&n.isTTY===!0&&!isLogLevelEnabled(`debug`),a=i?new LiveRegion({write:e=>(n.write(e),!0)}):void 0,o=0,s=r[0]===`1`,c,l=!1,u=!1,d,f=Date.now(),p=0,m=!1,h,paint=()=>{if(c===void 0||a===void 0)return;let e=renderProgressRow(s?PROGRESS_PULSE_GLYPH:` `,c.message,t.elapsed?[c.detail,`${p}s`].filter(Boolean).join(` · `):c.detail,n.columns);a.update([e]),l=!0},schedulePulseStep=()=>{h=setTimeout(()=>{if(m)return;o=(o+1)%r.length;let e=r[o]===`1`,n=Math.floor((Date.now()-f)/1e3);(e!==s||t.elapsed&&n!==p)&&(s=e,p=n,paint()),schedulePulseStep()},pulseStepDurationMs(o,r.length)),h.unref?.()};return{update(n,r=``){if(m)return;let a=sanitizeProgressText(n);if(c?.message!==a&&(f=Date.now(),p=0),c={detail:sanitizeProgressText(r),message:a},!i){(!u||t.logPhases&&d!==c.message)&&(e.log(`${c.message}...`),u=!0,d=c.message);return}paint(),h===void 0&&schedulePulseStep()},stop(){m||(m=!0,h!==void 0&&clearTimeout(h),a!==void 0&&l&&a.clear())}}}export{startCliLiveRow};