eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 10.4 kB
JavaScript
import{attachClientContext,readClientContext}from"#internal/client-context.js";import{sessionCommandHookToken}from"#execution/session-command-token.js";import{SESSION_INBOX_CONTEXT_KEY,SESSION_INBOX_WIRE_VERSION}from"#execution/wire/session-inbox-contract.js";import{getWorkflowMetadata,getWritable}from"#compiled/@workflow/core/index.js";import{isHookConflictError}from"#execution/hook-ownership.js";import{readChannelRequestId,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{SessionStateCursor}from"#execution/session-state-cursor.js";import{fireSessionCallbackStep}from"#subagents/callback-step.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{cancelDescendantTurnsStep}from"#execution/cancel-descendant-turns-step.js";import{bindTurnCallerContextStep,notifyCancelledTaskCallerStep,notifyDelegatedParentStep,notifyTurnCallerStep,resolveInitialTurnCallerStep}from"#subagents/parent-notification.js";import{createDelegatedSubagentErrorResult}from"#subagents/parent-result.js";import{terminateChildSessionsStep}from"#execution/terminate-child-sessions-step.js";import{createSafeOuterWorkflowError,hasDelegatedCallerContext,resolveCallerForCrash}from"#execution/workflow-entry-crash.js";import{nextTurnDelivery}from"#execution/parked-delivery-wait.js";import{rebaseTaskAgentHandleMutations}from"#subagents/handles/rebase.js";import{dispatchAndAwaitTurn}from"#execution/turn-dispatch.js";import{createSessionStep}from"#execution/create-session-step.js";import{settleCancelledTurnStep}from"#execution/settle-cancelled-turn-step.js";import{emitTerminalSessionFailureStep}from"#execution/terminal-session-failure-step.js";import{finalizeDone,finalizeExpiredSession}from"#execution/workflow-entry-finalization.js";import{createSessionCommandInbox}from"#execution/session-command-inbox.js";import{DEFAULT_SESSION_TIMEOUT_MS}from"#execution/session-timeout.js";import{createSessionTimeoutControl}from"#execution/session-timeout-control.js";import{settleContinuationConflictStep}from"#execution/continuation-conflict-step.js";async function workflowEntry(e){"use workflow";let{workflowRunId:t,workflowStartedAt:n}=getWorkflowMetadata(),r=e.serializedContext[`eve.continuationToken`]||``,i=e.serializedContext[`eve.mode`],a=e.serializedContext[`eve.capabilities`],o=e.serializedContext[`eve.bundle`];e.serializedContext[`eve.sessionId`]=t,e.serializedContext[SESSION_INBOX_CONTEXT_KEY]={sessionId:t,version:SESSION_INBOX_WIRE_VERSION};let s=getWritable(),c={caller:void 0,callerResolved:!1,lastSessionState:void 0,serializedContext:e.serializedContext,terminalEmitted:!1};try{let l=readRootSessionId(e.serializedContext),u=e.serializedContext[`eve.dynamicSubagentAgentConfig`],d=createSessionCommandInbox(),f=sessionCommandHookToken(t),p=`${t}:auth`,m,h;try{let[g,_,v,y]=await Promise.allSettled([createSessionStep({compiledArtifactsSource:o.source,continuationToken:r,dynamicSubagentAgentConfig:u,inheritedLimits:e.limits,nodeId:o.nodeId,outputSchema:e.input.outputSchema,rootSessionId:l,sessionId:t,taskId:e.taskId}),d.claimStable(f),d.claimAuthorization(p),d.rekeyContinuation(r)]);if(g.status===`rejected`)throw g.reason;if(_.status===`rejected`)throw _.reason;if(v.status===`rejected`)throw v.reason;if(y.status===`rejected`){if(isHookConflictError(y.reason))return(e.activityCollectorRunId!==void 0||e.continuationConflictCommand!==void 0)&&await settleContinuationConflictStep({activityCollectorRunId:e.activityCollectorRunId,command:e.continuationConflictCommand,continuationToken:r,ownerSessionId:typeof y.reason.conflictingRunId==`string`?y.reason.conflictingRunId:void 0}),{output:``};throw y.reason}m=g.value.state,c.lastSessionState=m,c.caller=hasDelegatedCallerContext(e.serializedContext)?await resolveInitialTurnCallerStep({serializedContext:e.serializedContext}):void 0,c.callerResolved=!0,h=await runDriverLoop({capabilities:a,commandInbox:d,driverWritable:s,initialInput:{deliveryMetadata:e.serializedContext[`eve.channelDelivery`]===void 0?void 0:[{...e.serializedContext[`eve.channelDelivery`],payloadIndex:0}],kind:`deliver`,payloads:[attachClientContext({message:e.input.message,context:e.input.context,outputSchema:e.input.outputSchema},readClientContext(e.input))],requestId:readChannelRequestId(e.serializedContext)},crashCleanupState:c,mode:i,retention:e.retention,serializedContext:e.serializedContext,sessionState:m,sessionTimeoutDeadline:e.sessionTimeoutMs===!1?void 0:new Date(n.getTime()+(e.sessionTimeoutMs??DEFAULT_SESSION_TIMEOUT_MS)),stableCommandToken:f})}finally{await d.dispose()}return h.kind===`result`?h.result:await finalizeExpiredSession({caller:c.caller,driverWritable:s,mode:i,serializedContext:h.serializedContext,sessionState:h.sessionState,terminalState:c})}catch(e){let n=c.terminalEmitted;throw!c.terminalEmitted&&c.lastSessionState!==void 0&&await terminateChildSessionsStep({serializedContext:c.serializedContext,sessionState:c.lastSessionState}),c.terminalEmitted||=(await emitTerminalSessionFailureStep({error:normalizeSerializableError(e),parentWritable:s,serializedContext:c.serializedContext,turnId:c.turnId}),!0),n||(i===`task`?(await fireSessionCallbackStep({error:normalizeSerializableError(e),serializedContext:c.serializedContext,status:`failed`}),await notifyDelegatedParentStep({result:createDelegatedSubagentErrorResult(c.serializedContext,e),serializedContext:c.serializedContext})):(c.caller!==void 0||!c.callerResolved)&&await notifyTurnCallerStep({caller:await resolveCallerForCrash(c,c.serializedContext),lifecycle:`terminal`,sessionId:t,settled:{isError:!0,output:e}})),createSafeOuterWorkflowError()}}async function runDriverLoop(e){let t=e.commandInbox,n=new Map,nextParkedActivity=async r=>{let l=new Set(r.expectedAttemptIds);for(let e of n.keys())l.has(e)||n.delete(e);for(;;){if(l.size>0&&[...l].every(e=>n.has(e))){let e=[...l].map(e=>n.get(e));return n.clear(),{kind:`authorization-resume`,payloads:e}}let r=await nextTurnDelivery({awaitAuthorizationCallbacks:l.size>0,bufferedDeliveries:i,bufferedSessionControls:a,cancelledTaskIds:o,commandInbox:t,deferDeliveries:e.mode===`task`&&l.size>0,driverWritable:e.driverWritable,seenTaskDeliveries:s,stateCursor:c});if(r.kind!==`authorization`)return r;for(let e of r.payloads){let t=e.authorizationCallback;typeof t?.attemptId==`string`&&l.has(t.attemptId)&&!n.has(t.attemptId)&&n.set(t.attemptId,e)}if(r.closed){let e=[...n.values()];return n.clear(),{kind:`authorization-resume`,payloads:e}}}},r=0,nextTurnControlToken=()=>`${e.sessionState.sessionId}:turn-control:${String(r++)}`,i=[],a=[],o=new Set,s=new Set,c=new SessionStateCursor({serializedContext:e.serializedContext,sessionState:e.sessionState}),l=e.sessionTimeoutDeadline===void 0?void 0:createSessionTimeoutControl({deadline:e.sessionTimeoutDeadline,token:e.stableCommandToken}),u,runTurn=async n=>{let l=c.sessionState,d=e.crashCleanupState.caller;d?.taskId!==void 0&&s.add(d.taskId);let f=d===void 0?c.serializedContext:await bindTurnCallerContextStep({caller:d,serializedContext:c.serializedContext});e.crashCleanupState.turnId=`turn_${String(r)}`;let p=await dispatchAndAwaitTurn({bufferedDeliveries:i,bufferedSessionControls:a,cancelledTaskIds:o,capabilities:e.capabilities,commandInbox:t,controlToken:nextTurnControlToken(),delivery:n,mode:e.mode,parentWritable:e.driverWritable,retention:e.retention,serializedContext:f,seenTaskDeliveries:s,sessionState:c.sessionState,stateCursor:c});await u?.(),u=p.dispose;let m=c.sessionState===l?p.action:rebaseTaskAgentHandleMutations(p.action,c.sessionState,l);return c.adoptState(m),e.crashCleanupState.lastSessionState=c.sessionState,e.crashCleanupState.serializedContext=c.serializedContext,m};try{await l?.start();let n=await runTurn(e.initialInput);for(;;){if(n.kind===`done`)return{kind:`result`,result:await finalizeDone({action:n,caller:e.crashCleanupState.caller,mode:e.mode,terminalState:e.crashCleanupState})};if(n.kind!==`park`)throw Error(`Driver received unexpected turn action "${n.kind}".`);if(n.cancelled===!0){let t=await settleCancelledTurnStep({parentWritable:e.driverWritable,serializedContext:c.serializedContext,sessionState:c.sessionState});c.adoptState(t),e.crashCleanupState.serializedContext=c.serializedContext;let n={caller:e.crashCleanupState.caller,sessionId:c.sessionState.sessionId};await notifyCancelledTaskCallerStep(t.usage===void 0?n:{...n,usage:t.usage}),e.crashCleanupState.lastSessionState=c.sessionState}c.sessionState.continuationToken&&await t.rekeyContinuation(c.sessionState.continuationToken);let r=n.settled;n.cancelled!==!0&&r!==void 0?(e.crashCleanupState.caller!==void 0&&await notifyTurnCallerStep({caller:e.crashCleanupState.caller,lifecycle:`parked`,sessionId:c.sessionState.sessionId,settled:r}),e.crashCleanupState.caller=void 0):n.cancelled===!0&&(e.crashCleanupState.caller=void 0);let i=await nextParkedActivity({expectedAttemptIds:n.authorizationAttemptIds??[]});if(e.crashCleanupState.lastSessionState=c.sessionState,i.kind===`authorization-resume`){n=await runTurn({kind:`deliver`,payloads:i.payloads});continue}if(i.kind===`expired`)return{kind:`expired`,serializedContext:c.serializedContext,sessionState:c.sessionState};if(i.kind===`reset`)return{kind:`result`,result:await finalizeExpiredSession({caller:e.crashCleanupState.caller,driverWritable:e.driverWritable,mode:e.mode,serializedContext:c.serializedContext,sessionState:c.sessionState,terminalState:e.crashCleanupState})};if(i.kind===`clear`||i.kind===`compact`){n=await runTurn({kind:i.kind});continue}if(i.kind===`closed`)return{kind:`result`,result:await finalizeExpiredSession({caller:e.crashCleanupState.caller,driverWritable:e.driverWritable,mode:e.mode,serializedContext:c.serializedContext,sessionState:c.sessionState,terminalState:e.crashCleanupState})};if(i.kind===`cancel-turn`){await cancelDescendantTurnsStep({serializedContext:c.serializedContext,sessionState:c.sessionState});let t=await settleCancelledTurnStep({parentWritable:e.driverWritable,serializedContext:c.serializedContext,sessionState:c.sessionState});c.adoptState(t),e.crashCleanupState.serializedContext=c.serializedContext,n={...n,settled:void 0},e.crashCleanupState.caller=void 0,e.crashCleanupState.lastSessionState=c.sessionState;continue}i.delivery.caller!==void 0&&(e.crashCleanupState.caller=i.delivery.caller),n=await runTurn(i.delivery)}}finally{await u?.(),await l?.dispose()}}workflowEntry.workflowId=`workflow//eve//workflowEntry`;export{workflowEntry};