eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 1.45 kB
JavaScript
import{MemoryDocumentConflictError}from"#public/memory/file/backend.js";import{BlobPreconditionFailedError,get,put}from"#compiled/@vercel/blob/index.js";function vercelBlob(e={}){let t=normalizePrefix(e.prefix??`eve/memory/file`),n={oidcToken:e.oidcToken,storeId:e.storeId,token:e.token},read=async e=>{let r=await get(pathname(t,e.key),{...n,abortSignal:e.signal,access:`private`,headers:{"accept-encoding":`identity`},useCache:!1});if(r===null)return null;if(r.statusCode!==200||r.stream===null)throw Error(`Vercel Blob returned ${r.statusCode} without a memory document.`);return{content:await new Response(r.stream).text(),version:r.blob.etag}};return{read,async write(e){try{let r=await put(pathname(t,e.key),e.content,{...n,abortSignal:e.signal,access:`private`,addRandomSuffix:!1,allowOverwrite:e.expectedVersion!==null,contentType:`text/markdown; charset=utf-8`,ifMatch:e.expectedVersion??void 0});return{content:e.content,version:r.etag}}catch(t){if(t instanceof BlobPreconditionFailedError)throw new MemoryDocumentConflictError(e.key);if(e.expectedVersion===null)try{if(await read(e)!==null)throw new MemoryDocumentConflictError(e.key)}catch(e){if(MemoryDocumentConflictError.is(e))throw e}throw t}}}}function normalizePrefix(e){let t=e.replace(/^\/+|\/+$/g,``);if(t.length===0)throw TypeError(`Vercel Blob memory prefix cannot be empty.`);return t}function pathname(e,t){return`${e}/${encodeURIComponent(t)}/MEMORY.md`}export{vercelBlob};