eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 2.47 kB
JavaScript
import{basename,dirname,join,resolve}from"node:path";import{findEveProjectContext}from"#internal/project-context.js";import{getDirectoryEntryType,isDiscoverableAgentRootEntry,isProjectMarkerEntry}from"#discover/filesystem.js";import{DISCOVER_PROJECT_NOT_FOUND,createDiscoverErrorDiagnostic}from"#discover/diagnostics.js";import{createDiskProjectSource}from"#discover/project-source.js";var DiscoveryProjectResolutionError=class extends Error{diagnostic;constructor(e){super(e.message),this.name=`DiscoveryProjectResolutionError`,this.diagnostic=e}};async function resolveDiscoveryProject(e=process.cwd(),t={}){let n=t.source??createDiskProjectSource(),r=await resolveSearchDirectory(n,e),i=r;for(;;){let e=await tryResolveNestedProjectFromAgentDirectory(n,i);if(e!==null)return e;let t=await tryResolveNestedProjectFromAppRoot(n,i);if(t!==null)return t;if(await isFlatAgentRoot(n,i))return{agentRoot:i,appRoot:i,layout:`flat`};let r=dirname(i);if(r===i)break;i=r}throw new DiscoveryProjectResolutionError(createDiscoverErrorDiagnostic({code:DISCOVER_PROJECT_NOT_FOUND,message:`Could not resolve an eve agent root from "${r}".`,sourcePath:r}))}async function resolveSearchDirectory(e,t){let n=resolve(t);return await e.stat(n)===`directory`?n:dirname(n)}async function tryResolveNestedProjectFromAgentDirectory(e,t){if(basename(t)!==`agent`)return null;let n=dirname(t);return await isNestedProjectRoot(e,n)?{agentRoot:t,appRoot:n,layout:`nested`}:null}async function tryResolveNestedProjectFromAppRoot(e,t){if(!await isNestedProjectRoot(e,t))return null;let n=join(t,`agent`);return await directoryExists(e,n)?{agentRoot:n,appRoot:t,layout:`nested`}:null}async function isNestedProjectRoot(e,t){if(await hasProjectMarkers(e,t))return!0;let n=await findEveProjectContext(t,{source:e});return n?.kind===`workspace-member`&&n.member.appRoot===t}async function isFlatAgentRoot(e,t){let n=await readDirectoryEntryTypes(e,t);return Array.from(n.entries()).some(([e,t])=>isDiscoverableAgentRootEntry(e,t))}async function hasProjectMarkers(e,t){let n=await readDirectoryEntryTypes(e,t);return Array.from(n.entries()).some(([e,t])=>isProjectMarkerEntry(e,t))}async function readDirectoryEntryTypes(e,t){if(await e.stat(t)!==`directory`)return new Map;let n=await e.readDirectory(t);return new Map(n.map(e=>[e.name,getDirectoryEntryType(e)]))}async function directoryExists(e,t){return await e.stat(t)===`directory`}export{DiscoveryProjectResolutionError,resolveDiscoveryProject};