eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 14.7 kB
JavaScript
import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{contextStorage}from"#context/container.js";import{AuthKey,CapabilitiesKey,ChannelDeliveryKey,HandleEventKey,ModeKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicToolRuntimeRevisionKey,TurnDeliveryIdsKey,TurnTaskDeliveryKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,createTurnStartedEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{coalesceTurnInputs}from"#harness/messages.js";import{emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{dispatchDynamicSubagentEvent,refreshDynamicSessionSubagentsForRuntimeRevision}from"#context/dynamic-subagent-lifecycle.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{readRetainedBackgroundToolResult,runBackgroundStep}from"#execution/tasks/parent/tool-execution.js";import{preserveSerializedBackgroundTaskObservabilityState}from"#shared/serialized-observability-state.js";import*as agentTraceState from"#tracing/agent-trace-context-store.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{activeTurnId}from"#harness/active-turn-id.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowTaskCallIds,isWorkflowTaskInterrupt}from"#harness/workflow-task-state.js";import{deferMismatchedInlineTurnStep}from"#execution/accepted-delivery-deployment.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{derivePendingState}from"#execution/pending-turn-state.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{dispatchDynamicToolEvent,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{observeSessionActivity}from"#execution/session-activity-projection.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";import{getTurnUsageState,takeSessionUsageDelta,toUsage}from"#harness/turn-tag-state.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{dispatchDynamicInstructionEvent,drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchMemoryLifecycleEvent}from"#context/memory-event-lifecycle.js";import{RuntimeActionSettlementTimesKey}from"#harness/runtime-action-settlement-state.js";import{matchAuthorizationCallbacks}from"#execution/authorization-callback-match.js";import{forwardTaskEventToSessionCallback}from"#execution/task-event-callback.js";import{resolveEffectiveOutputSchema}from"#execution/effective-output-schema.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{getBackgroundTaskDelivery,markBackgroundTaskStepInput,resolveInitiatingTaskContext,resolveTaskDeliveryContext}from"#tasks/delivery-context.js";import{prepareWorkflowPreambleTrace}from"#execution/workflow-trace-context.js";import{createExecutionHistoryView}from"#execution/history-view.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";import{bindDynamicConnections}from"#execution/dynamic-connections.js";import{runModelCallBatch}from"#execution/model-call-batching.js";import{createCancelledModelCallBatchResult}from"#execution/cancelled-model-call-batch.js";import*as activityCohort from"#execution/activity-cohort.js";function channelDeliveryErrorCode(e){if(typeof e==`object`&&e&&`code`in e){let t=e.code;if(typeof t==`string`&&t.length>0)return t}return`CHANNEL_DELIVERY_FAILED`}async function turnStep(e){"use step";let t=deferMismatchedInlineTurnStep(e);if(t!==void 0)return t;let n=e,r=await readDurableSession(n.sessionState),i=await deserializeContext(n.serializedContext);e.input?.kind===`deliver`&&i.set(TurnTaskDeliveryKey,`none`);let a=i.require(ChannelKey),o=i.require(BundleKey),s=resolveEffectiveAgentRuntime(o,i);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&i.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let c=getPendingAuthorization(r.state),l;if(c&&n.input?.kind===`deliver`){let{matches:e,remainingPayloads:t}=matchAuthorizationCallbacks(c,n.input.payloads);if(n={...n,input:{...n.input,payloads:t}},e.length>0){let a=activityCohort.restoreAuthorizationActivity({ctx:i,matches:e,pending:c}),o=e.map(e=>e.result);i.set(PendingAuthorizationResultKey,o),r={...r,state:clearPendingAuthorization(r.state,a)},l=e,t.length===0&&(n={...n,input:void 0})}}n.input?.kind===`deliver`&&n.input.auth!==void 0&&i.set(AuthKey,n.input.auth??null);let u=getBackgroundTaskDelivery(n.input),d=hydrateDurableSession({compactionOverrides:{thresholdPercent:s.thresholdPercent},durable:r,turnAgent:s.turnAgent}),f=createExecutionHistoryView(d),p=bindSessionInstrumentation({agentName:s.turnAgent.id,ctx:i,rootSessionId:d.rootSessionId??d.sessionId,sessionId:d.sessionId}),m=getHarnessEmissionState(d.state);e.input?.kind===`deliver`&&e.input.payloads.some(e=>e.message!==void 0)?i.set(TurnDeliveryIdsKey,e.input.deliveryMetadata?.map(e=>e.deliveryId)??[]):!m.sessionStarted&&i.get(ChannelDeliveryKey)!==void 0&&i.set(TurnDeliveryIdsKey,[i.require(ChannelDeliveryKey).deliveryId]),e.input?.kind===`deliver`&&await contextStorage.run(i,()=>p?.instrumentChannelDelivery({agentName:o.turnAgent.id,ctx:i,delivery:e.input,rootSessionId:d.rootSessionId??d.sessionId,sequence:m.sequence,sessionId:d.sessionId,turnId:activeTurnId(m)}));let failChannelDeliveries=async e=>{await contextStorage.run(i,()=>p?.instrumentChannelDelivery({ctx:i,error:e,errorCode:channelDeliveryErrorCode(e),includeTurn:!1,outcome:`failed`})),await p?.flush()},h=buildAdapterContext(a,i),g;if(n.input?.kind===`deliver`){let e=[];try{for(let t of n.input.payloads){let n=a.deliver?await a.deliver(t,h):defaultDeliverResult(t);n!=null&&e.push(u===void 0?n:markBackgroundTaskStepInput(n))}}catch(e){throw await failChannelDeliveries(e),e}g=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else n.input?.kind===`runtime-action-result`&&(n.input.acceptedAtMsByCallId!==void 0&&i.set(RuntimeActionSettlementTimesKey,n.input.acceptedAtMsByCallId),g={runtimeActionResults:n.input.results});let _;if(g!==void 0&&u!==void 0){let e=resolveTaskDeliveryContext({state:r.state,taskDeliveryId:u.taskDeliveryId});e!==void 0&&(i.set(TurnTaskDeliveryKey,e.phase),_=e.rootTurnId,g={...g,context:[...g.context??[],e.context]})}activityCohort.updateActivityRootForDelivery({activeTurnId:activeTurnId(m),ctx:i,delivery:e.input?.kind===`deliver`?e.input:void 0,sessionState:r.state,taskRootTurnId:_});let v=i.get(TurnTaskDeliveryKey);if(v===`none`||v===`initiating`){let e=resolveInitiatingTaskContext({state:r.state,turnId:activeTurnId(m)});e!==void 0&&i.set(TurnTaskDeliveryKey,e.phase)}if(n.input?.kind===`deliver`){let e={...a,state:{...h.state}};setChannelContext(i,e)}if(n.input?.kind===`deliver`&&g===void 0){await contextStorage.run(i,()=>p?.instrumentChannelDelivery({ctx:i,includeTurn:!1,outcome:`completed`})),await p?.flush();let e=reconcileSessionContinuationToken(i,d),t=serializeContext(i),r=e===d?n.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:r}}let y=o.hookRegistry,b=bindDynamicConnections(i,o.resolvedAgent),x=o.resolvedAgent.dynamicInstructionsResolvers??[],S=o.resolvedAgent.dynamicSkillResolvers??[],C=o.subagentRegistry.dynamicResolvers??[],w=o.resolvedAgent.dynamicToolResolvers??[],T={...o.graph.root,turnAgent:s.turnAgent},E=buildRuntimeIdentity(T);try{let e=process.env.VERCEL_DEPLOYMENT_ID?.trim(),t=e?`deployment:${e}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(o.compiledArtifactsSource);if(!m.sessionStarted)i.set(SessionDynamicSubagentRuntimeRevisionKey,t),i.set(SessionDynamicToolRuntimeRevisionKey,t);else{let e=createSessionStartedEvent({runtime:E});await Promise.all([refreshDynamicSessionSubagentsForRuntimeRevision({ctx:i,resolvers:C,event:e,messages:f.initial.messages,runtimeRevision:t}),refreshDynamicSessionToolsForRuntimeRevision({ctx:i,resolvers:w,event:e,messages:f.initial.messages,runtimeRevision:t})]),await rebindMissingCompiledDynamicToolCallbacks({ctx:i,event:createTurnStartedEvent({sequence:m.sequence,turnId:activeTurnId(m)}),messages:f.initial.messages,resolvers:w})}}catch(e){throw await failChannelDeliveries(e),e}let D=n.parentWritable.getWriter(),emit=async e=>{let t=await callAdapterEventHandler(a,e,h);setChannelContext(i,{...a,state:{...h.state}});let n=stampMessageStreamEvent(t,i.get(TurnDeliveryIdsKey));return await D.write(encodeMessageStreamEvent(n)),n},handleEvent=async(e,t)=>{activityCohort.updateActivityBlockers(i,e);let r=await forwardTaskEventToSessionCallback(i,e)?stampMessageStreamEvent(e,i.get(TurnDeliveryIdsKey)):await emit(e),a=await dispatchMemoryLifecycleEvent({abortSignal:n.abortSignal,appRoot:T.agent?.metadata?.appRoot??``,ctx:i,event:e,instrumentation:p?.memory,memories:T.agent?.memories??[],messages:t,nodeId:o.nodeId??`__root__`});observeSessionActivity({ctx:i,event:r,sessionId:d.sessionId}),await dispatchStreamEventHooks({ctx:i,registry:y,event:r}),r.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:i,dynamicModel:s.turnAgent.dynamicModel,event:r,messages:a,scope:{moduleMap:o.moduleMap,nodeId:o.nodeId}}),await b.dispatch(r),await dispatchDynamicSubagentEvent({ctx:i,resolvers:C,event:r,messages:a}),await dispatchDynamicToolEvent({ctx:i,resolvers:w,event:r,messages:a}),await dispatchDynamicSkillEvent({ctx:i,resolvers:S,event:r,messages:a}),await dispatchDynamicInstructionEvent({ctx:i,resolvers:x,event:r,messages:a})},O=i.require(ModeKey),k=o.resolvedAgent.config?.experimental?.workflow?.modelCallsPerStep??1,A=i.get(CapabilitiesKey),runHarnessStep=async(e,t)=>{let r=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:s.thresholdPercent},session:e,turnAgent:s.turnAgent}),i=r;return createExecutionNodeStep({abortSignal:n.abortSignal,capabilities:A,clearOnly:n.input?.kind===`clear`,compactOnly:n.input?.kind===`compact`,createRuntime:createWorkflowRuntime,handleEvent,historyProjector:f.projector,historyView:f.prepare(i),instrumentation:p,mode:O,modelResolutionScope:{moduleMap:o.moduleMap,nodeId:o.nodeId},node:T,workflowMaxSubagents:r.workflowMaxSubagents})(i,t)},j,M;try{throwIfTurnAborted(n.abortSignal),M=await runModelCallBatch({initialInput:g,initialSession:d,modelCallsPerStep:k,runStep:async({firstCall:e,session:t,stepInput:r})=>{let a=await runBackgroundStep(i,t,async t=>{i.setVirtualContext(HandleEventKey,handleEvent);let n=e?resolveEffectiveOutputSchema({agentOutputSchema:s.turnAgent.outputSchema,input:g,mode:O,session:t}):t;if(await b.rehydrate(getHarnessEmissionState(n.state),E,isHarnessBetweenTurns(n)),e&&l){let e=getHarnessEmissionState(n.state);if(isHarnessBetweenTurns(n)){prepareDynamicInstructionPreamble(i,f.messages(n));let t=[],r=await prepareWorkflowPreambleTrace({emissionState:e,instrumentation:p});try{e=await emitTurnPreamble(handleEvent,{},e,E,r)}finally{t=drainDynamicInstructionUserMessages(i),n={...n,history:[...n.history,...t]}}n=setHarnessEmissionState(n,e)}for(let{authorization:t,result:n}of l){let r=c?.challenges.find(e=>e.attemptId===n.attemptId)?.candidateId;await handleEvent(createAuthorizationCompletedEvent({attemptId:n.attemptId,authorization:t,candidateId:r,name:n.name,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}}return runHarnessStep(n,r)});return throwIfTurnAborted(n.abortSignal),j={result:a,serializedContext:serializeContext(i)},a}})}catch(e){if(!isTurnCancellation(e)&&n.abortSignal?.aborted!==!0)throw await failChannelDeliveries(e),e;D.releaseLock();let t=readRetainedBackgroundToolResult(i);return p?.rememberBackgroundTasks(t?.backgroundTasks??[]),createCancelledModelCallBatchResult({beforeBatchContext:n.serializedContext,checkpoint:j,ctx:i,initialSession:d,stepInput:g})}p?.rememberBackgroundTasks(M.backgroundTasks??[]);let N=reconcileSessionContinuationToken(i,M.session);agentTraceState.pruneAgentTraceState(i,N.sessionId,N.state);let P=serializeContext(i);M={...M,session:N};let F=createDurableSessionState({session:M.session}),I=M.backgroundTasks===void 0||M.backgroundTaskSession===void 0?{}:{backgroundTaskContext:preserveSerializedBackgroundTaskObservabilityState(n.serializedContext,P,M.backgroundTasks),backgroundTaskState:createDurableSessionState({session:M.backgroundTaskSession}),backgroundTasks:M.backgroundTasks};if(M.next!==null&&typeof M.next==`object`&&`done`in M.next){if(O===`task`&&hasPendingInputBatch(M.session.state))throw D.releaseLock(),Error(`Task mode cannot complete while input requests remain pending.`);await D.close();let e=getTurnUsageState(M.session.state)?.session;return{action:`done`,...I,output:M.next.output,isError:M.next.isError,serializedContext:P,sessionState:F,usage:e===void 0?void 0:toUsage(e),usageDelta:takeSessionUsageDelta(M.session).delta}}if(M.next===null){D.releaseLock();let e=getPendingWorkflowInterrupt(M.session.state);if(e!==void 0&&isWorkflowTaskInterrupt(e.interrupt))return{action:`dispatch-workflow-tasks`,...I,pendingTaskCallIds:getWorkflowTaskCallIds(e.interrupt),serializedContext:P,sessionState:F};let t=derivePendingState(M.session);if(M.settledTurn!==void 0){let{delta:e,session:n}=takeSessionUsageDelta(M.session);return{action:`park`,...I,...t,serializedContext:P,sessionState:createDurableSessionState({session:n}),settled:{output:M.settledTurn.output,isError:M.settledTurn.isError,usage:e}}}return{action:`park`,...I,...t,serializedContext:P,sessionState:F}}return D.releaseLock(),{action:`continue`,...I,serializedContext:P,sessionState:F}}export{turnStep};