eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 3.85 kB
JavaScript
import{findBlockingWorkflowToolRun,isInboxToolResultFromRecordedWorkflowToolRun}from"#harness/workflow-tool-runs.js";import{cancelAgentInvocationOwnerStep}from"#execution/tools/subagent/task-cancel.js";import{runProxySubagentEventStep}from"#subagents/event-proxy-step.js";import{applyTaskAgentRequest}from"#execution/tools/subagent/task-agent-requests.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{deliverWorkflowAuthorization}from"#execution/tools/workflow/owner.js";import{emitWorkflowToolRunReportStep}from"#execution/tools/workflow/emit-workflow-tool-run-report-step.js";import{releaseAgentInvocationOwnerStep}from"#execution/tools/subagent/invoke-step.js";import{resumeHookStep}from"#execution/tools/workflow/resume-hook-step.js";import{workflowToolRunOutcomeToToolResult,workflowToolRunRequestToInputRequestPayload}from"#execution/tools/workflow/owner-inbox.js";async function handleWorkflowToolRunMessage(e){let{message:t}=e;switch(t.kind){case`outcome`:return await handleWorkflowToolRunOutcome({...e,message:t});case`request`:await handleWorkflowToolRunRequest({...e,message:t});return;case`report`:await emitWorkflowToolRunReportStep({from:t.from,sessionWritable:e.cursor.sessionWritable,update:t.update});return}}async function handleWorkflowToolRunOutcome(e){let{cursor:t,message:n}=e;if(findBlockingWorkflowToolRun(t.sessionState.snapshot.session.state,n.from.callId,n.from.turnId)?.address.runId!==n.from.runId)return;let r=workflowToolRunOutcomeToToolResult(n);await cancelAgentInvocationOwnerStep({ownerId:n.from.runId,serializedContext:t.serializedContext,sessionState:t.sessionState});let i=await releaseAgentInvocationOwnerStep({cancelled:n.result.status===`cancelled`,ownerId:n.from.runId,sessionState:t.sessionState});return await t.apply({serializedContext:t.serializedContext,sessionState:i.sessionState}),isInboxToolResultFromRecordedWorkflowToolRun(t.sessionState.snapshot.session.state,r)?r:void 0}async function handleWorkflowToolRunRequest(e){let{cursor:t,message:n}=e;if(n.request.kind===`agent-invoke`||n.request.kind===`agent-settled`){if(findBlockingWorkflowToolRun(t.sessionState.snapshot.session.state,n.from.callId,n.from.turnId)?.address.runId!==n.from.runId){n.request.kind===`agent-invoke`&&await resumeHookStep(n.replyTo,{kind:`runtime-action-result`,results:[{callId:n.request.invocationId,isError:!0,kind:`subagent-result`,origin:`dispatch`,output:{code:`AGENT_INVOCATION_NOT_ADMITTED`,message:`The workflow tool run no longer owns this agent invocation.`},subagentName:n.request.input.target}]});return}await t.apply(await applyTaskAgentRequest({ownerId:n.from.runId,replyTo:n.replyTo,request:n.request},requestContext(e)));return}if(n.request.kind===`authorization-request`){let e=n.request;await deliverWorkflowAuthorization({...n,request:e},async()=>{await t.apply(await runProxySubagentEventStep({hookPayload:e.event,sessionWritable:t.sessionWritable,serializedContext:t.serializedContext,sessionState:t.sessionState}))});return}await t.apply(await runProxySubagentEventStep({...n.requestCoordinates===void 0?{answerHook:createAnswerHookRoute(n)}:{},hookPayload:workflowToolRunRequestToInputRequestPayload(n),sessionWritable:t.sessionWritable,serializedContext:t.serializedContext,sessionState:t.sessionState}))}function createAnswerHookRoute(e){if(e.request.kind!==`ask`)return{runId:e.from.runId};let{allowFreeform:t,dismissible:n,options:r}=e.request.request;return{question:{...t!==void 0&&{allowFreeform:t},...n!==void 0&&{dismissible:n},...r!==void 0&&{options:[...r]}},runId:e.from.runId}}function requestContext(e){return{callbackBaseUrl:resolveWorkflowCallbackBaseUrl(e.callbackMetadataUrl),sessionWritable:e.cursor.sessionWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState}}export{handleWorkflowToolRunMessage};