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{createDiscoverErrorDiagnostic}from"#discover/diagnostics.js";import{normalizeLogicalPath}from"#discover/filesystem.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(c){let l=`connections`,u=join(c.rootPath,l),d=c.rootEntries.find(e=>e.name===l);if(d===void 0)return{connections:[],diagnostics:[]};if(!d.isDirectory())return{connections:[],diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_CONNECTIONS_DIRECTORY_INVALID,message:`Expected "${u}" to be a directory of authored connections.`,sourcePath:u})]};let f=await readSortedDirectoryEntries(c.source,u),p=[],m=[],h=new Set;for(let t of collectNamedSlotCandidates(f,{allowMarkdown:!1,allowModules:!0})){let r=normalizeLogicalPath(join(l,t.slotName));if(t.moduleFileNames.length>1){h.add(t.slotName),m.push(createModuleSlotCollisionDiagnostic(u,r,t.moduleFileNames));continue}let[a]=t.moduleFileNames;if(a===void 0)continue;h.add(t.slotName);let o=createConnectionNameDiagnostic(t.slotName,join(u,a));if(o!==null){m.push(o);continue}p.push(createConnectionSourceRef({connectionName:t.slotName,logicalPath:join(l,a)}))}for(let i of f){if(!i.isDirectory())continue;let o=i.name,s=join(u,o);if(h.has(o)){m.push(createDiscoverErrorDiagnostic({code:DISCOVER_CONNECTION_FILE_FOLDER_COLLISION,message:`Connection "${o}" is defined twice. Found both file-form "connections/${o}.ts" and folder-form "connections/${o}/". Use one form, not both.`,sourcePath:s}));let e=p.findIndex(e=>e.connectionName===o);e!==-1&&p.splice(e,1);continue}let d=createConnectionNameDiagnostic(o,s);if(d!==null){m.push(d);continue}let f=collectFolderConnectionModuleCandidates(await readSortedDirectoryEntries(c.source,s));if(f.length>1){m.push(createDiscoverErrorDiagnostic({code:DISCOVER_MODULE_SLOT_COLLISION,message:`Found multiple connection definition modules inside "${normalizeLogicalPath(join(l,o))}": `+f.map(e=>`"${e}"`).join(`, `),sourcePath:s}));continue}let[g]=f;if(g===void 0){m.push(createDiscoverErrorDiagnostic({code:DISCOVER_CONNECTION_FOLDER_EMPTY,message:`Connection folder "connections/${o}/" contains no "connection.ts" definition. Add "connections/${o}/connection.ts" or use the file form "connections/${o}.ts".`,sourcePath:s}));continue}p.push(createConnectionSourceRef({connectionName:o,logicalPath:join(l,o,g)}))}return{connections:p,diagnostics:m}}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};