eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 3.23 kB
JavaScript
import{join}from"node:path";import{normalizeLogicalPath}from"#discover/filesystem.js";import{createDiscoverErrorDiagnostic}from"#discover/diagnostics.js";import{createConnectionSourceRef}from"#discover/manifest.js";import{DISCOVER_MODULE_SLOT_COLLISION,createConnectionNameDiagnostic,createModuleSlotCollisionDiagnostic,readSortedDirectoryEntries}from"#discover/grammar.js";import{collectNamedSlotCandidates}from"#discover/slots.js";const DISCOVER_CONNECTIONS_DIRECTORY_INVALID=`discover/connections-directory-invalid`,DISCOVER_CONNECTION_FILE_FOLDER_COLLISION=`discover/connection-file-folder-collision`,DISCOVER_CONNECTION_FOLDER_EMPTY=`discover/connection-folder-empty`;async function discoverConnectionSources(e){let t=`connections`,n=join(e.rootPath,t),r=e.rootEntries.find(e=>e.name===t);if(r===void 0)return{connections:[],diagnostics:[]};if(!r.isDirectory())return{connections:[],diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_CONNECTIONS_DIRECTORY_INVALID,message:`Expected "${n}" to be a directory of authored connections.`,sourcePath:n})]};let i=await readSortedDirectoryEntries(e.source,n),a=[],o=[],s=new Set;for(let e of collectNamedSlotCandidates(i,{allowMarkdown:!1,allowModules:!0})){let r=normalizeLogicalPath(join(t,e.slotName));if(e.moduleFileNames.length>1){s.add(e.slotName),o.push(createModuleSlotCollisionDiagnostic(n,r,e.moduleFileNames));continue}let[i]=e.moduleFileNames;if(i===void 0)continue;s.add(e.slotName);let c=createConnectionNameDiagnostic(e.slotName,join(n,i));if(c!==null){o.push(c);continue}a.push(createConnectionSourceRef({connectionName:e.slotName,logicalPath:join(t,i)}))}for(let r of i){if(!r.isDirectory())continue;let i=r.name,c=join(n,i);if(s.has(i)){o.push(createDiscoverErrorDiagnostic({code:DISCOVER_CONNECTION_FILE_FOLDER_COLLISION,message:`Connection "${i}" is defined twice. Found both file-form "connections/${i}.ts" and folder-form "connections/${i}/". Use one form, not both.`,sourcePath:c}));let e=a.findIndex(e=>e.connectionName===i);e!==-1&&a.splice(e,1);continue}let l=createConnectionNameDiagnostic(i,c);if(l!==null){o.push(l);continue}let u=collectFolderConnectionModuleCandidates(await readSortedDirectoryEntries(e.source,c));if(u.length>1){o.push(createDiscoverErrorDiagnostic({code:DISCOVER_MODULE_SLOT_COLLISION,message:`Found multiple connection definition modules inside "${normalizeLogicalPath(join(t,i))}": `+u.map(e=>`"${e}"`).join(`, `),sourcePath:c}));continue}let[d]=u;if(d===void 0){o.push(createDiscoverErrorDiagnostic({code:DISCOVER_CONNECTION_FOLDER_EMPTY,message:`Connection folder "connections/${i}/" contains no "connection.ts" definition. Add "connections/${i}/connection.ts" or use the file form "connections/${i}.ts".`,sourcePath:c}));continue}a.push(createConnectionSourceRef({connectionName:i,logicalPath:join(t,i,d)}))}return{connections:a,diagnostics:o}}function collectFolderConnectionModuleCandidates(e){let t=e.filter(e=>e.isFile()),n=[];for(let e of collectNamedSlotCandidates(t,{allowMarkdown:!1,allowModules:!0}))e.slotName===`connection`&&n.push(...e.moduleFileNames);return n}export{DISCOVER_CONNECTIONS_DIRECTORY_INVALID,DISCOVER_CONNECTION_FILE_FOLDER_COLLISION,DISCOVER_CONNECTION_FOLDER_EMPTY,discoverConnectionSources};