UNPKG

eve

Version:

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

1 lines 1.89 kB
import{resolveSandboxSkillReadPaths}from"#shared/skill-paths.js";const FRONTMATTER_PATTERN=/^---\r?\n[\s\S]*?\r?\n---\r?\n?/;function assertSafeSkillId(e){if(e.length===0||e.trim()!==e||e.startsWith(`.`)||e.includes(`/`)||e.includes(`\\`)||e.includes(`..`)||/^[A-Za-z]:/.test(e))throw Error(`Expected skill id to be a non-empty safe path segment without whitespace, separators, "." prefix, or "..".`)}async function loadSkillFromSandbox(n,r,i=[]){assertSafeSkillId(r);let a=await requireSandboxSession(n),o=await resolveSandboxSkillReadPaths({name:r,relativePath:`SKILL.md`,sandbox:a});for(let e of o){let n=await a.readTextFile({path:e});if(n!==null)return n.replace(FRONTMATTER_PATTERN,``)}let s=i.length>0?` Available skills: ${i.join(`, `)}.`:``;throw Error(`No skill named "${r}" at ${o[0]}.${s}`)}function createSandboxSkillHandle(t,n){return assertSafeSkillId(n),{name:n,file(r){return assertSafeSkillRelativePath(r),{async bytes(){let i=await requireSandboxSession(t),a=await resolveSandboxSkillReadPaths({name:n,relativePath:r,sandbox:i});for(let e of a){let t=await i.readBinaryFile({path:e});if(t!==null)return t}throw Error(`Skill file not found: ${a[0]}`)},async text(){let i=await requireSandboxSession(t),a=await resolveSandboxSkillReadPaths({name:n,relativePath:r,sandbox:i});for(let e of a){let t=await i.readTextFile({path:e});if(t!==null)return t}throw Error(`Skill file not found: ${a[0]}`)}}}}}function assertSafeSkillRelativePath(e){if(e.length===0||e.startsWith(`/`)||e.includes(`\\`)||e.split(`/`).some(e=>e.length===0||e===`.`||e===`..`))throw Error(`Expected skill file path to be a relative path inside the skill directory.`)}async function requireSandboxSession(e){let t=await e.get();if(t===null)throw Error(`The sandbox is not available in the current authored runtime context.`);return t}export{assertSafeSkillId,createSandboxSkillHandle,loadSkillFromSandbox};