UNPKG

eve

Version:

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

1 lines 2.39 kB
import{readFile,readdir,rm,stat,writeFile}from"node:fs/promises";import{join,resolve}from"node:path";import{existsSync}from"node:fs";const DEVELOPMENT_RUNTIME_ARTIFACTS_ACTIVATED_MARKER=`activated`,DEVELOPMENT_RUNTIME_ARTIFACTS_RETIRED_METADATA=`retired.json`;async function recordRetiredDevelopmentRuntimeArtifactsSnapshot(e,t=Date.now()){await writeFile(join(e,DEVELOPMENT_RUNTIME_ARTIFACTS_RETIRED_METADATA),`${JSON.stringify({retiredAt:t})}\n`)}async function pruneDevelopmentRuntimeArtifactsSnapshotDirectory(e){if(e.protectAll)return;let t=e.now??Date.now(),n=Math.max(0,e.gracePeriodMs??18e5),r=Math.max(0,Math.trunc(e.retainCount??5)),i;try{i=await readdir(e.snapshotsDirectory,{withFileTypes:!0})}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}let a=e.activeSnapshotRoot===void 0?void 0:resolve(e.activeSnapshotRoot),o=await Promise.all(i.filter(e=>e.isDirectory()).map(async n=>{let r=join(e.snapshotsDirectory,n.name),i=a===resolve(r),o=existsSync(join(r,DEVELOPMENT_RUNTIME_ARTIFACTS_ACTIVATED_MARKER)),s;if(o&&!i)try{s=await readRetiredAt(r),s===void 0&&(await recordRetiredDevelopmentRuntimeArtifactsSnapshot(r,t),s=t)}catch(e){console.warn(`[eve:dev] failed to read or initialize runtime generation retirement metadata for "${r}": ${String(e)}`)}return{activated:o,active:i,path:r,retiredAt:s,mtimeMs:(await stat(r)).mtimeMs}})),s=new Set(o.flatMap(e=>e.retiredAt===void 0?[]:[{path:e.path,retiredAt:e.retiredAt}]).sort((e,t)=>t.retiredAt-e.retiredAt).slice(0,r).map(e=>e.path)),c=new Set(o.filter(e=>!e.activated).sort((e,t)=>t.mtimeMs-e.mtimeMs).slice(0,r).map(e=>e.path));await Promise.all(o.map(async e=>{e.active||e.activated&&e.retiredAt===void 0||s.has(e.path)||c.has(e.path)||e.retiredAt!==void 0&&t-e.retiredAt<=n||!e.activated&&t-e.mtimeMs<=n||await rm(e.path,{force:!0,recursive:!0})}))}async function readRetiredAt(e){let t;try{t=await readFile(join(e,DEVELOPMENT_RUNTIME_ARTIFACTS_RETIRED_METADATA),`utf8`)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}let n;try{n=JSON.parse(t)}catch{return}if(typeof n==`object`&&n&&!Array.isArray(n)&&`retiredAt`in n&&typeof n.retiredAt==`number`&&Number.isFinite(n.retiredAt)&&n.retiredAt>=0)return n.retiredAt}export{DEVELOPMENT_RUNTIME_ARTIFACTS_ACTIVATED_MARKER,pruneDevelopmentRuntimeArtifactsSnapshotDirectory,recordRetiredDevelopmentRuntimeArtifactsSnapshot};