eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 3.96 kB
JavaScript
import{createLogger}from"#internal/logging.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{deserializeContext}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{executeTaskControlAction}from"#execution/tasks/parent/dispatch.js";import{cancelBackgroundAgentTask}from"#execution/tools/subagent/task-cancel.js";import{setPendingCoordinationBatch}from"#harness/coordination.js";import{prepareCoordinationDispatch}from"#execution/coordination-dispatch-shared.js";import{startWorkflowTask}from"#execution/tools/workflow/start.js";import{getPendingWorkflowInterrupt,setPendingWorkflowUsedCalls}from"#harness/workflow-interrupt-state.js";import{planWorkflowSubagentDispatch}from"#harness/workflow-subagent-limit.js";import{buildWorkflowTasksFromInterrupt}from"#harness/workflow-task-state.js";const workflowTaskLog=createLogger(`execution.dispatch-workflow-tasks`);async function dispatchCoordinationStep(e){"use step";let t=e.action===`dispatch-workflow-tasks`?await normalizeWorkflowTaskInterrupt(e):{results:[],sessionState:e.sessionState},n=await prepareCoordinationDispatch({serializedContext:e.serializedContext,sessionState:t.sessionState});if(n===void 0)return{results:t.results,sessionState:t.sessionState,pendingTasks:[]};let{batch:r,session:i}=n,a=i,o=[],s=[];for(let t of n.plan){if(t.kind===`workflow-task`){let i=await startWorkflowTask({auth:n.auth,batchEvent:r.event,initiatorAuth:n.initiatorAuth,owner:e.workflowToolRunOwner,parentSession:n.parentSession,session:a,task:t.task});a=i.session,i.result!==void 0&&o.push(i.result);continue}if(t.kind===`task-control`){let e=await executeTaskControlAction({action:t.action,cancelOwnedWork:cancelBackgroundAgentTask,serializedContext:n.serializedContext,session:a});a=e.session,e.pendingTask!==void 0&&s.push(e.pendingTask),o.push(e.result);continue}}return{results:[...o,...t.results],sessionState:a===i?n.sessionState:createDurableSessionState({session:a}),pendingTasks:s}}async function normalizeWorkflowTaskInterrupt(e){let t=await readDurableSession(e.sessionState),n=getPendingWorkflowInterrupt(t.state);if(n===void 0)return{results:[],sessionState:e.sessionState};let r=buildWorkflowTasksFromInterrupt(n.interrupt);if(r.length===0)return{results:[],sessionState:e.sessionState};let i=await deserializeContext(e.serializedContext),a=i.require(BundleKey),o=resolveEffectiveAgentRuntime(a,i),s=planWorkflowSubagentDispatch({tasks:r,maxSubagents:t.workflowMaxSubagents,usedCalls:n.usedCalls}),c=s.blocked.map(e=>(workflowTaskLog.warn(`workflow subagent limit reached; blocking delegated call`,{callId:e.callId,maxSubagents:s.maxSubagents,subagentName:getWorkflowTaskName(e),usedCalls:s.usedCalls}),createWorkflowSubagentLimitResult({action:e,plan:s})));if(s.allowed.length===0)return{results:c,sessionState:e.sessionState};let l=hydrateDurableSession({compactionOverrides:{thresholdPercent:o.thresholdPercent},durable:t,turnAgent:o.turnAgent}),u=setPendingWorkflowUsedCalls({session:l,usedCalls:n.usedCalls+s.allowed.filter(e=>e.resultKind===`subagent`).length}),d=setPendingCoordinationBatch({runtimeActions:[],tasks:s.allowed,event:{sequence:0,stepIndex:0,turnId:`workflow-dispatch`},responseMessages:[],session:u});return{results:c,sessionState:createDurableSessionState({session:d})}}function createWorkflowSubagentLimitResult(e){let t=getWorkflowTaskName(e.action);return{callId:e.action.callId,isError:!0,kind:`subagent-result`,origin:`dispatch`,output:{code:`WORKFLOW_SUBAGENT_LIMIT_REACHED`,maxSubagents:e.plan.maxSubagents,message:`Workflow subagent limit reached (${String(e.plan.maxSubagents)}); "${t}" was not called.`},subagentName:t}}function getWorkflowTaskName(e){return e.resultKind===`subagent`?e.toolName:e.kind}export{dispatchCoordinationStep};