UNPKG

eve

Version:

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

1 lines 3.63 kB
import{createHash}from"node:crypto";import{EVE_ROUTE_PREFIX}from"#protocol/routes.js";import{join}from"node:path";import{EVE_INTERNAL_AGENT_WORKSPACE_MEMBER_ENV,EVE_INTERNAL_BUILD_OUTPUT_DIRECTORY_ENV,EVE_INTERNAL_HOST_BUILD_OUTPUT_DIRECTORY_ENV}from"#internal/application/build-output-environment.js";import{EVE_PUBLIC_ROUTE_PREFIX_ENV,normalizePublicRoutePrefix}from"#shared/public-route-prefix.js";import{quoteVercelShellArgument,toVercelRelativePath}from"#internal/vercel/build-command.js";import{MAX_VERCEL_SERVICE_NAME_LENGTH,assertValidVercelServiceName,isValidVercelServiceName}from"#internal/vercel/vercel-service-name.js";function createServiceNameHash(e){return[...createHash(`sha256`).update(e).digest().subarray(0,10)].map(e=>String.fromCharCode(97+e%26)).join(``)}function createEveServiceName(e){if(e===void 0)return`eve`;let t=`eve-${e}`;if(isValidVercelServiceName(t))return t;let n=createServiceNameHash(e),r=e.replace(/[^a-z_-]+/g,`-`).replace(/^[^a-z]+|[^a-z]+$/g,``)||`agent`,i=MAX_VERCEL_SERVICE_NAME_LENGTH-5-n.length,a=`eve-${r.slice(0,i).replace(/[^a-z]+$/g,``)||`agent`}-${n}`;return assertValidVercelServiceName(a,`Generated eve service name`),a}function escapeVercelRouteLiteral(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function createEveServiceRouteSrc(e){return e.length===0?`^${EVE_ROUTE_PREFIX}/(.*)$`:`^${escapeVercelRouteLiteral(e.startsWith(`/`)?e:`/${e}`)}${EVE_ROUTE_PREFIX}/(.*)$`}function createEveRequestPathRoute(e){return{src:e,transforms:[{args:`${EVE_ROUTE_PREFIX}/$1`,op:`set`,type:`request.path`}]}}function createEveHomeRouteSrc(e){return e.length===0?void 0:`^${escapeVercelRouteLiteral(e.startsWith(`/`)?e:`/${e}`)}/?$`}function createEveHomePathRoute(e){let t=createEveHomeRouteSrc(e);return t===void 0?void 0:{src:t,transforms:[{args:`/`,op:`set`,type:`request.path`}]}}function createEvePublicRoute(e,t){return{destination:{service:e,type:`service`},src:t}}function createIsolatedBuild(e){let t=join(e.projectRoot,`.eve/vercel-services`,e.serviceName),n=join(t,`.vercel`,`output`),r=normalizePublicRoutePrefix(e.agent.publicRoutePrefix),i=r===void 0?``:` && export ${EVE_PUBLIC_ROUTE_PREFIX_ENV}=${quoteVercelShellArgument(r)}`,a=e.agent.workspaceMember===!0?` && export ${EVE_INTERNAL_AGENT_WORKSPACE_MEMBER_ENV}=1`:``;return{buildCommand:`cd ${quoteVercelShellArgument(toVercelRelativePath(t,e.agent.appRoot))} && export ${EVE_INTERNAL_BUILD_OUTPUT_DIRECTORY_ENV}=${quoteVercelShellArgument(toVercelRelativePath(e.agent.appRoot,n))} && export ${EVE_INTERNAL_HOST_BUILD_OUTPUT_DIRECTORY_ENV}=${quoteVercelShellArgument(toVercelRelativePath(e.agent.appRoot,e.hostOutputDirectory))}${i}${a} && ${e.agent.buildCommand}`,root:toVercelRelativePath(e.projectRoot,t),rootDirectory:t}}function compileEveVercelService(e){let t=createEveServiceName(e.agent.name),n=createEveServiceRouteSrc(e.agent.publicRoutePrefix),r=e.agent.workspaceMember===!0?createEveHomeRouteSrc(e.agent.publicRoutePrefix):void 0,i=e.agent.workspaceMember===!0?createEveHomePathRoute(e.agent.publicRoutePrefix):void 0,a=createIsolatedBuild({agent:e.agent,hostOutputDirectory:e.target.hostOutputDirectory,projectRoot:e.target.projectRoot,serviceName:t});return{homeRouteSrc:r,rootDirectory:a.rootDirectory,routeSrc:n,service:{buildCommand:a.buildCommand,framework:`eve`,root:a.root,routes:[...i===void 0?[]:[i],createEveRequestPathRoute(n)],...e.agent.publicRoutePrefix.length>0?{routePrefix:e.agent.publicRoutePrefix}:{}},serviceName:t}}export{compileEveVercelService,createEveHomePathRoute,createEveHomeRouteSrc,createEvePublicRoute,createEveRequestPathRoute,createEveServiceName,createEveServiceRouteSrc};