UNPKG

eve

Version:

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

1 lines 2.53 kB
import{readFile,readdir,stat}from"node:fs/promises";import{posix,sep}from"node:path";function createDiskProjectSource(){return{kind:`disk`,async readDirectory(e){return await readdir(e,{withFileTypes:!0})},async readTextFile(e){return await readFile(e,`utf8`)},async stat(e){try{let t=await stat(e);return t.isDirectory()?`directory`:t.isFile()?`file`:`other`}catch{return`missing`}}}}function createMemoryProjectSource(e){let t=new Map,n=new Map;function registerDirectory(e){let t=n.get(e);return t===void 0&&(t=new Map,n.set(e,t)),t}function registerChildOfDirectory(e,t,n){if(registerDirectory(e).get(t)===`file`&&n===`directory`)throw TypeError(`MemoryProjectSource: path "${posix.join(e,t)}" registered as both a file and a directory.`);registerDirectory(e).set(t,n)}for(let[n,r]of Object.entries(e.files)){let e=normalizeToPosix(n),i=typeof r==`string`?r:r.content;t.set(e,i);let a=splitPosixPath(e);if(a.length===0)throw TypeError(`MemoryProjectSource: cannot register root path "${n}" as a file.`);let o=a[a.length-1];if(o===void 0)throw TypeError(`MemoryProjectSource: empty file name in "${n}".`);let s=`/`;for(let e=0;e<a.length-1;e+=1){let t=a[e];t!==void 0&&(registerChildOfDirectory(s,t,`directory`),s=s===`/`?`/${t}`:`${s}/${t}`)}registerChildOfDirectory(s,o,`file`)}for(let t of e.directories??[]){let e=normalizeToPosix(t),n=splitPosixPath(e);registerDirectory(e);let r=`/`;for(let e=0;e<n.length;e+=1){let t=n[e];t!==void 0&&(registerChildOfDirectory(r,t,`directory`),r=r===`/`?`/${t}`:`${r}/${t}`)}}return{kind:`memory`,async readDirectory(t){let r=normalizeToPosix(t),i=n.get(r);if(i===void 0)throw Error(`MemoryProjectSource: directory "${t}" does not exist${e.rootDir===void 0?``:` (root: ${e.rootDir})`}.`);return[...i.entries()].map(([e,t])=>createMemoryEntry(e,t))},async readTextFile(n){let r=normalizeToPosix(n),i=t.get(r);if(i===void 0)throw Error(`MemoryProjectSource: file "${n}" does not exist${e.rootDir===void 0?``:` (root: ${e.rootDir})`}.`);return i},async stat(e){let r=normalizeToPosix(e);return t.has(r)?`file`:n.has(r)?`directory`:`missing`}}}function createMemoryEntry(e,t){return{name:e,isDirectory(){return t===`directory`},isFile(){return t===`file`}}}function normalizeToPosix(e){let t=sep===`/`?e:e.replaceAll(sep,`/`);if(t.length===0)return`/`;let n=t.replace(/^[A-Za-z]:/,``),r=n.startsWith(`/`)?n:`/${n}`;return posix.normalize(r).replace(/\/+$/,``)||`/`}function splitPosixPath(e){return e.split(`/`).filter(e=>e.length>0)}export{createDiskProjectSource,createMemoryProjectSource};