UNPKG

eve

Version:

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

1 lines 1.93 kB
import{EveAgentStore,attachEveAgentStore,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),[a,o]=useState(0),s=e.prewarm??!1;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 c=t.current;c.setCallbacks({onError:e.onError,onEvent:e.onEvent,onFinish:e.onFinish,onSessionChange:e.onSessionChange,prepareSend:e.prepareSend});let l=useCallback(e=>c.subscribe(e),[c]),u=useSyncExternalStore(l,()=>c.snapshot,()=>c.snapshot);useEffect(()=>{let e=setTimeout(()=>attachEveAgentStore(c),0);return()=>{clearTimeout(e),detachEveAgentStore(c)}},[c]),useEffect(()=>{if(!s)return;let e=setTimeout(()=>void c.prewarm().catch(()=>{}),0);return()=>clearTimeout(e)},[a,s,c]),useEffect(()=>{if(!n.current)return;let e=!0,finish=()=>{e&&i(!1)},t=setTimeout(()=>void c.resume().then(finish,finish),0);return()=>{e=!1,clearTimeout(t)}},[c]);let d=useCallback(()=>c.cancel(),[c]),f=useCallback(()=>{c.reset(),o(e=>e+1)},[c]),p=useCallback(()=>c.prewarm(),[c]),m=useCallback(()=>c.resume(),[c]),h=useCallback((e,t)=>c.send({...t,message:e}),[c]),g=useCallback((e,t)=>c.send({...t,inputResponses:e}),[c]),_=r&&u.status===`ready`?{...u,status:`resuming`}:u;return useMemo(()=>({..._,cancel:d,prewarm:p,reset:f,respond:g,resume:m,send:h}),[d,p,f,g,m,h,_])}export{useEveAgent};