eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 3.15 kB
JavaScript
import{mkdir}from"node:fs/promises";import{join,resolve}from"node:path";import{resolveEveProjectContext}from"#internal/project-context.js";import{createServiceConfigRecord}from"#internal/vercel/vercel-services-config.js";import{createEveHomeRouteSrc,createEveServiceName,createEveServiceRouteSrc}from"#internal/vercel/eve-service-contribution.js";import{assembleEveVercelServices}from"#internal/vercel/assemble-eve-services.js";import{quoteVercelShellArgument,toVercelRelativePath}from"#internal/vercel/build-command.js";import{resolveEveBinaryPath}from"#shared/resolve-eve-binary.js";function toInternalConfig(e){return e}function assertComposableConfig(e,t){if(e.experimentalServices!==void 0||e.experimentalServicesV2!==void 0)throw Error(`withEve cannot compose experimentalServices or experimentalServicesV2. Remove the obsolete field and define authored services under services.`);let n=toInternalConfig(e),r=createServiceConfigRecord(n.services);for(let n of t){let t=JSON.stringify(n??`the default agent`),i=createEveServiceName(n);if(Object.hasOwn(r,i)||n===void 0&&Object.values(r).some(e=>e.framework===`eve`))throw Error(`Vercel service key ${JSON.stringify(i)} conflicts with the service generated for eve agent ${t}. Remove or rename the authored service; withEve owns this key.`);let a=n===void 0?``:`/eve/${n}`,o=[createEveServiceRouteSrc(a),createEveHomeRouteSrc(a)].filter(e=>e!==void 0);for(let n of o)if(e.routes?.some(e=>e.src===n))throw Error(`Vercel route ${JSON.stringify(n)} conflicts with the route generated for eve agent ${t}. Remove the authored route; withEve adds it automatically.`)}}async function withEve(e,t={}){let n=resolve(t.root??process.cwd()),r=await resolveEveProjectContext(n);if(r.kind===`workspace-member`||t.root!==void 0&&r.environmentRoot!==n)throw Error(`withEve must run at an eve project root; received ${n}.`);let i=r.environmentRoot,a=r.kind===`standalone`?[{appRoot:r.appRoot,name:void 0,publicRoutePrefix:``,workspaceMember:!1}]:r.workspace.members.map(e=>({appRoot:e.appRoot,name:e.name,publicRoutePrefix:`/eve/${e.name}`,workspaceMember:!0}));if(a.length===0)throw Error(`withEve found no workspace agents under ${join(i,`agents`)}. Add an agent or remove withEve from vercel.ts.`);let o=a.map(e=>e.name),s=new Set(o.map(createEveServiceName));assertComposableConfig(e,o);let c=join(i,`.vercel`,`output`),l=toInternalConfig(e),u=assembleEveVercelServices({agents:a.map(e=>({agent:{appRoot:e.appRoot,buildCommand:`node ${quoteVercelShellArgument(toVercelRelativePath(e.appRoot,resolveEveBinaryPath(e.appRoot)))} build`,devCommand:`node ${quoteVercelShellArgument(toVercelRelativePath(e.appRoot,resolveEveBinaryPath(e.appRoot)))} dev --no-ui`,name:e.name,publicRoutePrefix:e.publicRoutePrefix,workspaceMember:e.workspaceMember},target:{hostOutputDirectory:c,projectRoot:i}})),routes:l.routes,services:createServiceConfigRecord(l.services)});await Promise.all(u.rootDirectories.map(e=>mkdir(e,{recursive:!0})));let d=Object.fromEntries(Object.entries(u.services).map(([e,t])=>{if(!s.has(e))return[e,t];let{routePrefix:n,...r}=t;return[e,r]}));return{...e,routes:u.routes,services:d}}export{withEve};