eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 2.2 kB
JavaScript
import{dirname,isAbsolute,join,relative,resolve}from"node:path";import{assertValidPublicAgentName}from"#internal/agent-name.js";import{getDirectoryEntryType,isDiscoverableAgentRootEntry}from"#discover/filesystem.js";import{findEveProjectRoot}from"#internal/eve-project-root.js";import{createDiskProjectSource}from"#discover/project-source.js";function containsPath(e,t){let n=relative(e,t);return n===``||!n.startsWith(`..`)&&!isAbsolute(n)}async function hasFlatAgentRoot(e,t){return(await t.readDirectory(e)).some(e=>isDiscoverableAgentRootEntry(e.name,getDirectoryEntryType(e)))}async function isWorkspaceOwnedAgentRoot(e,t){return await t.stat(join(e,`package.json`))===`file`?!1:await t.stat(join(e,`agent`))===`directory`||hasFlatAgentRoot(e,t)}async function resolveWorkspace(e,t){let n=join(e,`agents`),r=(await t.readDirectory(n)).filter(e=>e.isDirectory()&&!e.name.startsWith(`.`)).sort((e,t)=>e.name.localeCompare(t.name)),i=[];for(let e of r){let r=join(n,e.name);await isWorkspaceOwnedAgentRoot(r,t)&&(assertValidPublicAgentName(e.name,`Agent workspace member`),i.push({appRoot:r,name:e.name}))}return{members:i,root:e}}async function findEveProjectContext(e,t={}){let n=t.source??createDiskProjectSource(),r=resolve(e),i=await n.stat(r)===`directory`?r:dirname(r),a=await findEveProjectRoot(i,{source:n});if(a===void 0)return;let o=await n.stat(join(a,`agent`))===`directory`,s=await n.stat(join(a,`agents`))===`directory`;if(o)return{appRoot:a,environmentRoot:a,kind:`standalone`};if(s){let e=await resolveWorkspace(a,n);if(e.members.length>0){let t=e.members.find(e=>containsPath(e.appRoot,i));return t===void 0?{workspace:e,environmentRoot:e.root,kind:`workspace`}:{workspace:e,environmentRoot:e.root,kind:`workspace-member`,member:t}}}if(await hasFlatAgentRoot(a,n))return{appRoot:a,environmentRoot:a,kind:`standalone`};if(s)return{workspace:{members:[],root:a},environmentRoot:a,kind:`workspace`};throw Error(`Invalid eve project at ${a}: found no agent files.`)}async function resolveEveProjectContext(e,t={}){let n=await findEveProjectContext(e,t);if(n===void 0)throw Error(`No eve project contains ${resolve(e)}.`);return n}export{findEveProjectContext,resolveEveProjectContext};