eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 1.63 kB
JavaScript
import{EveAgentStore,detachEveAgentStore}from"#client/eve-agent-store.js";import{defaultMessageReducer}from"#client/message-reducer.js";import{useCallback,useEffect,useMemo,useRef,useState,useSyncExternalStore}from"react";import{resolveEveAgentHost}from"#client/agent-host.js";function useEveAgent(e={}){let t=useRef(void 0),n=useRef(e.resume??!1),[r,i]=useState(n.current);if(!t.current){if(n.current&&e.initialSession===void 0&&e.session===void 0)throw Error(`useEveAgent({ resume: true }) requires initialSession or session.`);let r=e.reducer??defaultMessageReducer();t.current=new EveAgentStore({auth:e.auth,headers:e.headers,host:resolveEveAgentHost({agent:e.agent,host:e.host}),initialEvents:e.initialEvents,initialSession:e.initialSession,optimistic:e.optimistic,reducer:r,session:e.session})}let a=t.current;a.setCallbacks({onError:e.onError,onEvent:e.onEvent,onFinish:e.onFinish,onSessionChange:e.onSessionChange,prepareSend:e.prepareSend});let o=useCallback(e=>a.subscribe(e),[a]),s=useSyncExternalStore(o,()=>a.snapshot,()=>a.snapshot);useEffect(()=>()=>detachEveAgentStore(a),[a]),useEffect(()=>{if(!n.current)return;let e=!0,finish=()=>{e&&i(!1)},t=setTimeout(()=>void a.resume().then(finish,finish),0);return()=>{e=!1,clearTimeout(t)}},[a]);let c=useCallback(()=>a.cancel(),[a]),l=useCallback(()=>a.reset(),[a]),u=useCallback(()=>a.resume(),[a]),d=useCallback((e,t)=>a.send({...t,message:e}),[a]),f=useCallback((e,t)=>a.send({...t,inputResponses:e}),[a]),p=r&&s.status===`ready`?{...s,status:`resuming`}:s;return useMemo(()=>({...p,cancel:c,reset:l,respond:f,resume:u,send:d}),[c,l,f,u,d,p])}export{useEveAgent};