UNPKG

eve

Version:

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

1 lines 3.26 kB
import{isObject}from"#shared/guards.js";import{join,resolve}from"node:path";import{readFileSync}from"node:fs";import{parseEnv}from"node:util";import{MODEL_CONNECTION_ENV}from"#shared/model-helper.js";import{findEveProjectRoot}from"#internal/eve-project-root.js";import{readProviderSettingsSync}from"#setup/provider-settings.js";const DEVELOPMENT_ENV_FILE_NAMES=[`.env.development.local`,`.env.local`,`.env.development`,`.env`];function isMissingEnvironmentFileError(e){return isObject(e)&&e.code===`ENOENT`}const developmentEnvironmentLoaders=new Map;function getDevelopmentEnvironmentFilePaths(e){return DEVELOPMENT_ENV_FILE_NAMES.map(t=>join(getDevelopmentEnvironmentLoader(e).environmentRoot,t))}async function loadDevelopmentEnvironmentFiles(e){let t=resolve(e);getDevelopmentEnvironmentLoader(t,await findEveProjectRoot(t)).reload()}function stageDevelopmentEnvironmentFiles(e){return getDevelopmentEnvironmentLoader(e).stageReload()}function readDevelopmentEnvironmentHostValues(e){let t={},n=readDevelopmentEnvironmentValues(getDevelopmentEnvironmentLoader(e).environmentRoot),r=new Set(n.keys());for(let e of[...r].sort((e,t)=>e.localeCompare(t)))t[e]=process.env[e]??null;return t}function getDevelopmentEnvironmentLoader(e,t){let n=resolve(e),r=developmentEnvironmentLoaders.get(n);if(r!==void 0&&t===void 0)return r;let i=resolve(t??n);if(r?.environmentRoot===i)return r;let a=createDevelopmentEnvironmentLoader(n,i);return developmentEnvironmentLoaders.set(n,a),a}function createDevelopmentEnvironmentLoader(e,t){let n=new Set(Object.keys(process.env)),r=new Map,stageReload=()=>{let i=new Map(r),a=readDevelopmentEnvironmentValues(t),o=readProviderSettingsSync(e),s=new Set([...r.keys(),...a.keys(),MODEL_CONNECTION_ENV,`EVE_MODEL_TEAM`,`EVE_MODEL_TEAM_NAME`,`EVE_MODEL_KEY_SOURCE`]),c=new Map([...s].map(e=>[e,process.env[e]])),l=!1;o?process.env[MODEL_CONNECTION_ENV]=o.selected:delete process.env[MODEL_CONNECTION_ENV];let u=o?.keySource;return u?process.env.EVE_MODEL_KEY_SOURCE=u:delete process.env.EVE_MODEL_KEY_SOURCE,o?.teamId&&o.teamName?(process.env.EVE_MODEL_TEAM=o.teamId,process.env.EVE_MODEL_TEAM_NAME=o.teamName):(delete process.env.EVE_MODEL_TEAM,delete process.env.EVE_MODEL_TEAM_NAME),applyDevelopmentEnvironmentValues({managedValues:r,nextValues:a,protectedKeys:n}),{commit(){l=!0},rollback(){if(!l){l=!0,r.clear();for(let[e,t]of i)r.set(e,t);for(let[e,t]of c)t===void 0?delete process.env[e]:process.env[e]=t}}}};return{environmentRoot:t,reload(){stageReload().commit()},stageReload}}function applyDevelopmentEnvironmentValues(e){for(let[t,n]of e.managedValues)e.nextValues.has(t)||e.protectedKeys.has(t)||(process.env[t]===n&&delete process.env[t],e.managedValues.delete(t));for(let[t,n]of e.nextValues)e.protectedKeys.has(t)||(process.env[t]=n,e.managedValues.set(t,n))}function readDevelopmentEnvironmentValues(e){let t=new Map;for(let n of[...DEVELOPMENT_ENV_FILE_NAMES].reverse())try{let r=parseEnv(readFileSync(join(e,n),`utf8`));for(let[e,n]of Object.entries(r))n!==void 0&&t.set(e,n)}catch(e){if(!isMissingEnvironmentFileError(e))throw e}return t}export{DEVELOPMENT_ENV_FILE_NAMES,getDevelopmentEnvironmentFilePaths,loadDevelopmentEnvironmentFiles,readDevelopmentEnvironmentHostValues,stageDevelopmentEnvironmentFiles};