eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 3.63 kB
JavaScript
import{createHash}from"node:crypto";import{lstat,mkdir,readFile,readdir,readlink,writeFile}from"node:fs/promises";import{join,relative,sep}from"node:path";import{existsSync}from"node:fs";import{COMPILED_AGENT_MANIFEST_KIND,ROOT_COMPILED_AGENT_NODE_ID}from"#compiler/manifest.js";import{serializeCompiledManifestForFingerprint}from"#internal/compiled-manifest-fingerprint.js";const MATERIALIZED_MODULES_DIRECTORY=`authored-modules`,MATERIALIZED_MODULES_INDEX=`authored-modules.json`;async function writeMaterializedAuthoredModules(e){let t=join(e.runtimeAppRoot,`.eve`,`compile`),n=await readCompiledManifest(join(t,`compiled-agent-manifest.json`)),r=join(t,MATERIALIZED_MODULES_DIRECTORY),i=createHash(`sha256`);await mkdir(r,{recursive:!0}),i.update(`manifest\0`).update(serializeCompiledManifestForFingerprint({manifest:n,runtimeAppRoot:e.runtimeAppRoot})).update(`\0`);let a=createMaterializedModuleFileName(ROOT_COMPILED_AGENT_NODE_ID,`module-map`,e.prepared.moduleMapCode),o=join(MATERIALIZED_MODULES_DIRECTORY,a);await writeFile(join(r,a),e.prepared.moduleMapCode),i.update(`module-map\0`).update(e.prepared.moduleMapCode).update(`\0`);let materializeInstrumentationModule=async(e,t)=>{let n=createMaterializedModuleFileName(ROOT_COMPILED_AGENT_NODE_ID,`instrumentation:${e}`,t);return await writeFile(join(r,n),t),i.update(`instrumentation:${e}\0`).update(t).update(`\0`),join(MATERIALIZED_MODULES_DIRECTORY,n)},s;if(e.prepared.instrumentation!==void 0){let t={};for(let[n,r]of Object.entries(e.prepared.instrumentation.moduleCodeBySlot))t[n]=await materializeInstrumentationModule(n,r);s={kind:`directory`,modulePathsBySlot:t}}await hashDirectoryIfPresent({fingerprint:i,path:join(t,`workspace-resources`),root:join(t,`workspace-resources`)});let c={fingerprint:i.digest(`hex`),moduleMap:o,version:3};return s!==void 0&&(c.instrumentation=s),await writeFile(join(t,MATERIALIZED_MODULES_INDEX),`${JSON.stringify(c)}\n`),c}async function readMaterializedAuthoredModuleIndex(e){let t=join(e,`.eve`,`compile`,MATERIALIZED_MODULES_INDEX);if(!existsSync(t))return;let n=JSON.parse(await readFile(t,`utf8`));if(n.version!==3||typeof n.fingerprint!=`string`||n.fingerprint.length===0||typeof n.moduleMap!=`string`||n.moduleMap.length===0||!isMaterializedInstrumentation(n.instrumentation))throw Error(`Invalid materialized authored module index at "${t}".`);return n}function isMaterializedInstrumentation(e){if(e===void 0)return!0;if(typeof e!=`object`||!e)return!1;let t=e;if(t.kind===`file`)return typeof t.modulePath==`string`;if(t.kind===`directory`){let e=t.modulePathsBySlot;return typeof e==`object`&&!!e&&Object.values(e).every(e=>typeof e==`string`)}return!1}async function readCompiledManifest(e){let t=JSON.parse(await readFile(e,`utf8`));if(t.kind!==COMPILED_AGENT_MANIFEST_KIND)throw Error(`Invalid compiled agent manifest at "${e}".`);return t}function createMaterializedModuleFileName(e,t,n){return`${createHash(`sha256`).update(e).update(`\0`).update(t).update(`\0`).update(n).digest(`hex`)}.mjs`}async function hashDirectoryIfPresent(e){if(!existsSync(e.path))return;let t=await lstat(e.path),n=toPortablePath(relative(e.root,e.path));if(t.isSymbolicLink()){e.fingerprint.update(n).update(`\0link\0`).update(await readlink(e.path)).update(`\0`);return}if(t.isDirectory()){for(let t of(await readdir(e.path)).sort())await hashDirectoryIfPresent({...e,path:join(e.path,t)});return}t.isFile()&&e.fingerprint.update(n).update(`\0file\0`).update(await readFile(e.path)).update(`\0`)}function toPortablePath(e){return e.split(sep).join(`/`)}export{readMaterializedAuthoredModuleIndex,writeMaterializedAuthoredModules};