UNPKG

eve

Version:

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

1 lines 3.71 kB
import{realpath,stat}from"node:fs/promises";import{basename,dirname,join,resolve,sep}from"node:path";import{resolveDiscoveryProject}from"#discover/project.js";import{discoverExtensionMountDeclarations}from"#discover/discover-agent.js";import{buildExtensionPackage,tryReadExtensionBuildConfig}from"#internal/nitro/host/build-extension.js";import{createDiskProjectSource}from"#discover/project-source.js";import{locateExtensionMountPackage}from"#discover/extensions.js";import{isAuthoredSourcePath,resolveDevelopmentSourceRoot}from"#internal/nitro/dev-runtime-source-snapshot.js";import{resolveTsConfigDependencyPaths}from"#internal/application/tsconfig-dependencies.js";async function prepareDevelopmentWorkspaceExtensions(e){let t=resolve(e.appRoot),n=await resolveDiscoveryProject(t),r=createDiskProjectSource(),i=await discoverExtensionMountGraph({agentRoot:n.agentRoot,source:r}),a=await toCanonicalPath(resolveDevelopmentSourceRoot(t)),o=new Map;for(let e of i){let n=await resolveWorkspaceExtension({appRoot:t,agentRoot:e.agentRoot,mount:e.mount,source:r,workspaceSourceRoot:a});n!==void 0&&o.set(n.packageRoot,n)}let s=[...o.values()].sort((e,t)=>e.packageRoot.localeCompare(t.packageRoot)),c=new Map(e.previousExtensions?.map(e=>[e.packageRoot,e])),l=e.changedPaths===void 0?void 0:await Promise.all(e.changedPaths.map(async e=>await toCanonicalPath(e))),u=e.previousExtensions===void 0||l?.length===0;return await Promise.all(s.map(async e=>{let t=c.get(e.packageRoot);(u===!0||t===void 0||!sameBuildInputs(t,e)||l?.some(t=>affectsExtensionBuild(t,e))===!0)&&await buildExtensionPackage(e.packageRoot,e.config)})),s}async function discoverExtensionMountGraph(e){let t=(await discoverExtensionMountDeclarations(e)).mounts.map(t=>({agentRoot:e.agentRoot,mount:t})),n=join(e.agentRoot,`subagents`);if(await e.source.stat(n)!==`directory`)return t;let r=await e.source.readDirectory(n),i=await Promise.all(r.filter(e=>e.isDirectory()).map(async t=>await discoverExtensionMountGraph({agentRoot:join(n,t.name),source:e.source})));return[...t,...i.flat()]}async function resolveWorkspaceExtension(e){let t=await locateExtensionMountPackage({source:e.source,agentRoot:e.agentRoot,appRoot:e.appRoot,mount:e.mount.mountRef,namespace:e.mount.namespace});if(t.location?.authoredSourceRoot===void 0)return;let n=await realpath(t.location.packageRoot).catch(()=>void 0);if(n===void 0||!isAuthoredSourcePath(n,e.workspaceSourceRoot))return;let r=await tryReadExtensionBuildConfig(n);if(r===null||(await stat(r.sourceRoot).catch(()=>void 0))?.isDirectory()!==!0)return;let i=[join(n,`package.json`),join(n,`tsconfig.json`),...await resolveTsConfigDependencyPaths(n)];return{config:r,packageRoot:n,buildConfigPaths:[...new Set(i.map(e=>resolve(e)))].sort((e,t)=>e.localeCompare(t))}}function affectsExtensionBuild(e,t){return isPathInsideOrEqual(e,t.config.sourceRoot)||t.buildConfigPaths.includes(e)}function sameBuildConfig(e,t){return e.sourceRoot===t.sourceRoot&&e.distRoot===t.distRoot&&e.outDir===t.outDir&&e.packageName===t.packageName&&e.shortName===t.shortName&&e.runtimeDependencies.length===t.runtimeDependencies.length&&e.runtimeDependencies.every((e,n)=>e===t.runtimeDependencies[n])}function sameBuildInputs(e,t){return sameBuildConfig(e.config,t.config)&&e.buildConfigPaths.length===t.buildConfigPaths.length&&e.buildConfigPaths.every((e,n)=>e===t.buildConfigPaths[n])}function isPathInsideOrEqual(e,t){let n=resolve(e),r=resolve(t);return n===r||n.startsWith(`${r}${sep}`)}async function toCanonicalPath(e){let t=resolve(e),n=[];for(;;)try{return join(await realpath(t),...n.reverse())}catch{let r=dirname(t);if(r===t)return resolve(e);n.push(basename(t)),t=r}}export{prepareDevelopmentWorkspaceExtensions};