eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 4.12 kB
JavaScript
import{join}from"node:path";import{createDiscoverErrorDiagnostic}from"#discover/diagnostics.js";import{normalizeLogicalPath}from"#discover/filesystem.js";import{createModuleSourceRef,createPathDerivedSourceId}from"#discover/manifest.js";import{DISCOVER_MODULE_SLOT_COLLISION,DISCOVER_SANDBOX_DIRECTORY_INVALID,readSortedDirectoryEntries}from"#discover/grammar.js";import{collectFlatSlotCandidates,collectNamedSlotCandidates}from"#discover/slots.js";const SANDBOX_DIRECTORY_NAME=`sandbox`,SANDBOX_WORKSPACE_DIRECTORY_NAME=`workspace`,SANDBOX_DEFINITION_BASE_NAME=`sandbox`,DISCOVER_SANDBOX_WORKSPACE_SKILLS_RESERVED=`discover/sandbox-workspace-skills-reserved`,DISCOVER_SANDBOX_FOLDER_EMPTY=`discover/sandbox-folder-empty`;async function discoverSandboxSource(o){let s=[],c=o.rootEntries.find(e=>e.name===SANDBOX_DIRECTORY_NAME);if(c===void 0)return discoverRootSandboxModule({diagnostics:s,rootEntries:o.rootEntries,rootPath:o.rootPath});let l=join(o.rootPath,SANDBOX_DIRECTORY_NAME);if(!c.isDirectory())return s.push(createDiscoverErrorDiagnostic({code:DISCOVER_SANDBOX_DIRECTORY_INVALID,message:`Expected "${l}" to be the sandbox folder.`,sourcePath:l})),{diagnostics:s,sandbox:null,sandboxWorkspace:null};let u=await readSortedDirectoryEntries(o.source,l),d=collectFolderSandboxModuleCandidates(u),f=u.find(e=>e.name===SANDBOX_WORKSPACE_DIRECTORY_NAME&&e.isDirectory());if(d.length>1)return s.push(createDiscoverErrorDiagnostic({code:DISCOVER_MODULE_SLOT_COLLISION,message:`Found multiple sandbox definition modules inside "${normalizeLogicalPath(SANDBOX_DIRECTORY_NAME)}": `+d.map(e=>`"${e}"`).join(`, `),sourcePath:l})),{diagnostics:s,sandbox:null,sandboxWorkspace:null};let[p]=d,m=p!==void 0,h=f!==void 0;if(!m&&!h)return s.push(createDiscoverErrorDiagnostic({code:DISCOVER_SANDBOX_FOLDER_EMPTY,message:`Sandbox folder "sandbox/" contains neither a "sandbox.<ext>" definition nor a "workspace/" subdirectory. Add one or the other, or remove the folder.`,sourcePath:l})),{diagnostics:s,sandbox:null,sandboxWorkspace:null};let g=null;m&&(g=createModuleSourceRef({logicalPath:join(SANDBOX_DIRECTORY_NAME,p)}));let _=null;if(h){let t=join(l,SANDBOX_WORKSPACE_DIRECTORY_NAME),r=normalizeLogicalPath(join(SANDBOX_DIRECTORY_NAME,SANDBOX_WORKSPACE_DIRECTORY_NAME)),a=await checkWorkspaceSkillsReservation(o.source,t);a===null?_={logicalPath:r,rootEntries:await collectWorkspaceRootEntries(o.source,t),sourceId:createPathDerivedSourceId(r),sourcePath:t}:s.push(a)}return{diagnostics:s,sandbox:g,sandboxWorkspace:_}}function discoverRootSandboxModule(e){let n=collectFlatSlotCandidates(e.rootEntries,{moduleBaseName:SANDBOX_DEFINITION_BASE_NAME});if(n.moduleFileNames.length>1)return e.diagnostics.push(createDiscoverErrorDiagnostic({code:DISCOVER_MODULE_SLOT_COLLISION,message:`Found multiple top-level sandbox definition modules: `+n.moduleFileNames.map(e=>`"${e}"`).join(`, `),sourcePath:e.rootPath})),{diagnostics:e.diagnostics,sandbox:null,sandboxWorkspace:null};let[i]=n.moduleFileNames;return i===void 0?{diagnostics:e.diagnostics,sandbox:null,sandboxWorkspace:null}:{diagnostics:e.diagnostics,sandbox:createModuleSourceRef({logicalPath:i}),sandboxWorkspace:null}}function collectFolderSandboxModuleCandidates(e){let t=e.filter(e=>e.isFile()),n=[];for(let e of collectNamedSlotCandidates(t,{allowMarkdown:!1,allowModules:!0}))e.slotName===SANDBOX_DEFINITION_BASE_NAME&&n.push(...e.moduleFileNames);return n}async function collectWorkspaceRootEntries(e,t){let n=await readSortedDirectoryEntries(e,t),r=[];for(let e of n){if(e.isDirectory()){r.push(`${e.name}/`);continue}e.isFile()&&r.push(e.name)}return r}async function checkWorkspaceSkillsReservation(n,r){return(await readSortedDirectoryEntries(n,r)).find(e=>e.name===`skills`)===void 0?null:createDiscoverErrorDiagnostic({code:DISCOVER_SANDBOX_WORKSPACE_SKILLS_RESERVED,message:`"sandbox/workspace/skills/" is reserved for the framework skill discovery. Move skill files under "agent/skills/" instead, or rename the subtree.`,sourcePath:join(r,`skills`)})}export{DISCOVER_SANDBOX_FOLDER_EMPTY,DISCOVER_SANDBOX_WORKSPACE_SKILLS_RESERVED,discoverSandboxSource};