eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
2 lines • 2.07 kB
JavaScript
import{access}from"node:fs/promises";import{resolveLocalWorkflowWorldDataDirectory}from"#internal/workflow/local-world-data-directory.js";async function readDevSessionEvents(n,r){let i=resolveLocalWorkflowWorldDataDirectory(n);try{await access(i)}catch{return[]}let{createWorld:a}=await import(`#compiled/@workflow/world-local/index.js`),o=await import(`#internal/workflow/runtime.js`),s=a({dataDir:i});o.setWorld(s);let c=[];for(let e of await listRunsOverlappingWindow(s,r)){let t=await drainRunStream(o,s,e.runId);c.push(...parseSessionEventLines(t,e,r))}return c.sort((e,t)=>e.at.localeCompare(t.at))}async function listRunsOverlappingWindow(e,t){let n=[],r;do{let i=await e.runs.list({resolveData:`none`,pagination:r===void 0?{limit:100}:{cursor:r,limit:100}});for(let e of i.data)e.createdAt<=t.to&&e.updatedAt>=t.from&&n.push({runId:e.runId,createdAt:e.createdAt,updatedAt:e.updatedAt});r=i.hasMore&&i.cursor!==null?i.cursor:void 0}while(r!==void 0);return n}async function drainRunStream(e,t,n){let r=``,i=new TextDecoder;try{if(!(await e.listStreams(t,n)).some(e=>e===`user`||e.endsWith(`_user`)))return``;let a=e.getRun(n).getReadable({startIndex:0}).getReader();for(;;){let e=await Promise.race([a.read(),new Promise(e=>{setTimeout(()=>e(`idle`),1e3)})]);if(e===`idle`){await a.cancel();break}if(e.done)break;r+=typeof e.value==`string`?e.value:i.decode(e.value,{stream:!0})}}catch{return``}return r}function parseSessionEventLines(e,t,n){let r=[];for(let i of e.split(`
`)){let e=parseSessionEvent(i);if(e===void 0)continue;let a=e.at??t.createdAt.toISOString();if(a<n.from.toISOString()||a>n.to.toISOString())continue;let o={at:a,source:`event`,runId:t.runId,type:e.type};e.data!==void 0&&(o.data=e.data),r.push(o)}return r}function parseSessionEvent(e){if(e.trim().length!==0)try{let t=JSON.parse(e);if(typeof t!=`object`||!t)return;let{type:n,data:r,meta:i}=t;if(typeof n!=`string`)return;let a=typeof i==`object`&&i&&typeof i.at==`string`?i.at:void 0,o={type:n};return a!==void 0&&(o.at=a),r!==void 0&&(o.data=r),o}catch{return}}export{readDevSessionEvents};