eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 3.47 kB
JavaScript
import{toErrorMessage}from"#shared/errors.js";import{randomUUID}from"node:crypto";import{EVE_DEVELOPMENT_SANDBOX_METADATA_PATH_TAG,EVE_DEVELOPMENT_SANDBOX_RUN_ID_TAG}from"#execution/sandbox/development-run.js";import{createDockerCli}from"#execution/sandbox/bindings/docker-cli.js";import{DOCKER_SANDBOX_LABEL,stopDockerContainerIfRunning}from"#execution/sandbox/bindings/docker-container.js";import{DOCKER_BACKEND_NAME}from"#execution/sandbox/bindings/docker.js";import{MICROSANDBOX_BACKEND_NAME}from"#execution/sandbox/bindings/microsandbox.js";import{MICROSANDBOX_METADATA_VERSION,readSessionMetadata,writeSessionMetadata}from"#execution/sandbox/bindings/microsandbox-metadata.js";import{createProviderName,loadMicrosandboxWithoutInstall,removeSnapshotIfExists,stopAndSnapshotMicrosandboxSandbox}from"#execution/sandbox/bindings/microsandbox-runtime.js";async function stopDevelopmentSandboxResources(t){let n=t.backendNames===void 0?null:new Set(t.backendNames),r=[];(n===null||n.has(DOCKER_BACKEND_NAME))&&r.push(stopDevelopmentDockerResources(t.devRunId)),(n===null||n.has(MICROSANDBOX_BACKEND_NAME))&&r.push(stopDevelopmentMicrosandboxResources(t.devRunId,t.log));let i=await Promise.allSettled(r);for(let n of i)n.status===`rejected`&&t.log?.(`failed to stop development sandbox resources: ${toErrorMessage(n.reason)}`)}async function stopDevelopmentDockerResources(e){let t=createDockerCli(),n=[`label=${DOCKER_SANDBOX_LABEL}=1`,`label=${DOCKER_SANDBOX_LABEL}.tag.${EVE_DEVELOPMENT_SANDBOX_RUN_ID_TAG}=${e}`],s=await t.run([`ps`,`-q`,...n.flatMap(e=>[`--filter`,e])]);if(s.exitCode!==0)return;let c=s.stdout.trim().split(/\s+/u).filter(Boolean);await Promise.all(c.map(e=>stopDockerContainerIfRunning(t,e)))}async function stopDevelopmentMicrosandboxResources(e,i){let a=await loadMicrosandboxWithoutInstall();if(a===null)return;let o=await a.Sandbox.listWith({labels:{"eve.backend":`microsandbox`,[EVE_DEVELOPMENT_SANDBOX_RUN_ID_TAG]:e}});await Promise.all(o.filter(e=>e.status===`running`||e.status===`draining`).map(async e=>{let r=getMicrosandboxLabel(e.configJson,EVE_DEVELOPMENT_SANDBOX_METADATA_PATH_TAG);if(r===void 0){await(await a.Sandbox.get(e.name)).stopWithTimeout(1e4).catch(()=>{});return}let o=await readSessionMetadata(r);if(o===null||o.sandboxName!==e.name){await(await a.Sandbox.get(e.name)).stopWithTimeout(1e4).catch(()=>{});return}i?.(`snapshotting development microsandbox session "${e.name}" before shutdown`);let s=o.stateSnapshotName,c=createProviderName(`eve-sbx-state`,`${o.sandboxName}:${randomUUID()}`);await stopAndSnapshotMicrosandboxSandbox(a,e.name,c),await writeSessionMetadata(r,{networkPolicy:o.networkPolicy,optionsHash:o.optionsHash,sandboxName:o.sandboxName,stateSnapshotName:c,version:MICROSANDBOX_METADATA_VERSION}),s!==void 0&&await removeSnapshotIfExists(a,s)}))}function getMicrosandboxLabel(e,t){let n;try{n=JSON.parse(e)}catch{return}return findLabel(n,t)}function findLabel(e,t){if(!isRecord(e))return;let n=e[t];if(typeof n==`string`)return n;let r=e.labels;if(isRecord(r)&&typeof r[t]==`string`)return r[t];if(typeof e.labelsJson==`string`){let n=parseJsonRecord(e.labelsJson);if(n!==null&&typeof n[t]==`string`)return n[t]}for(let n of Object.values(e)){let e=findLabel(n,t);if(e!==void 0)return e}}function parseJsonRecord(e){try{let t=JSON.parse(e);return isRecord(t)?t:null}catch{return null}}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{stopDevelopmentSandboxResources};