eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 3.74 kB
JavaScript
import{callAdapterEventHandler}from"#channel/adapter.js";import{ModeKey}from"#context/keys.js";import{encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{emitTurnEpilogue,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{hydrateDurableSession}from"#execution/session.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{withContextScope}from"#context/run-step.js";import{upsertProxyInputRequests}from"#harness/proxy-input-requests.js";import{emitProxiedInputRequest}from"#subagents/hitl-proxy.js";import{setChannelContext}from"#execution/channel-context.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";async function runProxySubagentEventStep(e){"use step";let t=await readDurableSession(e.sessionState),n=await deserializeContext(e.serializedContext);return emitProxiedSubagentEvent({answerHook:e.answerHook,ctx:n,durableSession:t,hookPayload:e.hookPayload,parentWritable:e.parentWritable})}async function emitRecordedTaskInputRequestStep(e){"use step";let t=await readDurableSession(e.sessionState);return await emitProxiedSubagentEvent({ctx:await deserializeContext(e.serializedContext),durableSession:t,hookPayload:{callId:e.request.taskId,childContinuationToken:e.request.replyTo,childSessionId:e.request.taskId,event:{requests:e.request.requests??[e.request.request],sequence:e.request.sequence,stepIndex:e.request.stepIndex,turnId:e.request.turnId},kind:`subagent-input-request`,subagentName:e.request.taskId},parentWritable:e.parentWritable,recordProxyInputRequests:!1})}async function emitProxiedSubagentEvent(e){let{ctx:t}=e,n=t.require(ChannelKey),r=t.require(BundleKey),i=resolveEffectiveAgentRuntime(r,t),a=hydrateDurableSession({compactionOverrides:{thresholdPercent:i.thresholdPercent},durable:e.durableSession,turnAgent:i.turnAgent}),o=buildAdapterContext(n,t),s=e.parentWritable.getWriter(),c,l;try{let emit=async e=>{let t=await callAdapterEventHandler(n,e,o);await s.write(encodeMessageStreamEvent(stampMessageStreamEvent(t)))},r=await withContextScope(t,a,async n=>{if(e.hookPayload.kind===`subagent-authorization-event`)return await emit(e.hookPayload.event),{result:void 0,session:await closeStandaloneAuthorizationEvent({emit,eventType:e.hookPayload.event.type,mode:t.require(ModeKey),session:n})};let r=await emitProxiedInputRequest({emit,hookPayload:e.hookPayload,mode:t.require(ModeKey),session:n});return{result:r.entries,session:r.session}});c=r.result,l=r.session}finally{s.releaseLock()}if(setChannelContext(t,{...n,state:{...o.state}}),e.recordProxyInputRequests!==!1&&c!==void 0&&e.hookPayload.kind===`subagent-input-request`){let t=e.answerHook;l=upsertProxyInputRequests({entries:t===void 0?c:c.map(([e,n])=>[e,{...n,answerHook:t}]),forChildContinuationToken:e.hookPayload.childContinuationToken,session:l})}let u=reconcileSessionContinuationToken(t,l);return{serializedContext:serializeContext(t),sessionState:createDurableSessionState({session:u})}}async function closeStandaloneAuthorizationEvent(e){if(e.mode!==`conversation`||e.eventType!==`authorization.required`&&e.eventType!==`authorization.completed`)return e.session;let t=getHarnessEmissionState(e.session.state),n=await emitTurnEpilogue(e.emit,t,e.mode);return setHarnessEmissionState(e.session,n)}export{emitProxiedSubagentEvent,emitRecordedTaskInputRequestStep,runProxySubagentEventStep};