eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
4 lines • 3.24 kB
JavaScript
import{readDevSessionEvents}from"./logs-events.js";import{readFile,readdir,stat}from"node:fs/promises";import{basename,join}from"node:path";const LOG_DIRECTORY_SEGMENTS=[`.eve`,`logs`],LOG_DISPLAY_DIRECTORY=LOG_DIRECTORY_SEGMENTS.join(`/`),LOG_ID_PATTERN=/^dev-(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}\.\d{3}Z)-\d+\.log$/;async function listDevDiagnosticLogs(e){let t=join(e,...LOG_DIRECTORY_SEGMENTS),n;try{n=await readdir(t)}catch(e){if(e.code===`ENOENT`)return[];throw e}let r=n.filter(e=>LOG_ID_PATTERN.test(e)).sort().reverse();return Promise.all(r.map(async e=>{let n=join(t,e);return{id:e.slice(0,-4),path:n,startedAt:parseStartedAt(e),sizeBytes:(await stat(n)).size}}))}function parseStartedAt(e){let t=LOG_ID_PATTERN.exec(e);if(t===null)return;let n=t[1].replace(/T(\d{2})-(\d{2})-(\d{2})/,`T$1:$2:$3`),r=new Date(n);return Number.isNaN(r.getTime())?void 0:r}function resolveDevDiagnosticLog(e,t){let n=basename(t.replaceAll(`\\`,`/`)),r=n.endsWith(`.log`)?n.slice(0,-4):n,i=e.find(e=>e.id===r);if(i!==void 0)return i;let a=e.filter(e=>e.id.startsWith(r)||e.id.startsWith(`dev-${r}`));if(a.length===1)return a[0];throw a.length===0?Error(`No diagnostic log matches "${t}". Run \`eve logs ls\` to see available logs.`):Error([`"${t}" matches ${a.length} diagnostic logs:`,...a.map(e=>` ${e.id}`),`Pass a longer prefix or the full id.`].join(`
`))}async function runLogsShowCommand(e,t,n,r={}){let i=await listDevDiagnosticLogs(t);if(i.length===0){let t=`No dev diagnostic logs found under ${LOG_DISPLAY_DIRECTORY}.`;if(n!==void 0)throw Error(t);e.log(t);return}let a=n===void 0?i[0]:resolveDevDiagnosticLog(i,n),o=await readFile(a.path,`utf8`);if(r.events===!0){let e=eventWindowForLog(i,a,r.now??(()=>new Date)),n=await(r.readEvents??readDevSessionEvents)(t,e);n.length>0&&(o=mergeLogWithEvents(o,n))}if(r.dump!==!0){e.log(o.trimEnd());return}let s=a.path.slice(0,-4)+`.dump`,c;try{c=await readFile(s,`utf8`)}catch(e){if(e.code!==`ENOENT`)throw e}if(c===void 0){e.log(o.trimEnd());return}e.log(`${c.trimEnd()}\n${o.trimEnd()}`)}function eventWindowForLog(e,t,n){let r=e.findIndex(e=>e.id===t.id),i=r>0?e[r-1].startedAt:void 0;return{from:t.startedAt??new Date(0),to:i??n()}}function mergeLogWithEvents(e,t){let n=[],r=``;for(let t of e.split(`
`))if(t.trim().length!==0){try{let e=JSON.parse(t).at;typeof e==`string`&&(r=e)}catch{}n.push({at:r,line:t})}let i=t.map(e=>({at:e.at,line:JSON.stringify(e)})),a=[],o=0,s=0;for(;o<n.length||s<i.length;){let e=n[o],t=i[s];t===void 0||e!==void 0&&e.at<=t.at?(a.push(e.line),o+=1):(a.push(t.line),s+=1)}return`${a.join(`
`)}\n`}async function runLogsListCommand(e,t,n={}){let r=await listDevDiagnosticLogs(t);if(n.json){let t=r.map(e=>({id:e.id,path:e.path,startedAt:e.startedAt?.toISOString()??null,sizeBytes:e.sizeBytes}));e.log(JSON.stringify(t,null,2));return}if(r.length===0){e.log(`No dev diagnostic logs found under ${LOG_DISPLAY_DIRECTORY}.`);return}for(let t of r){let n=t.startedAt?.toISOString()??`unknown start`;e.log(`${t.id} ${n} ${formatSize(t.sizeBytes)}`)}}function formatSize(e){if(e<1024)return`${e} B`;let t=e/1024;return t<1024?`${t.toFixed(1)} KiB`:`${(t/1024).toFixed(1)} MiB`}export{listDevDiagnosticLogs,resolveDevDiagnosticLog,runLogsListCommand,runLogsShowCommand};