UNPKG

eve

Version:

Filesystem-first framework for durable backend AI agents that run anywhere.

1 lines • 3.47 kB
import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,isHookConflictError}from"#execution/hook-ownership.js";import{deliverWorkflowAuthorization}from"#execution/tools/workflow/owner.js";import{workflowToolRunInputRequests}from"#execution/tools/workflow/owner-inbox.js";import{isTerminalTaskStatus,readTaskInputRequestId}from"#tasks/types.js";import{deliverTaskInputResponsesStep,emitTaskActivityStep,notifyTaskParent}from"#execution/tasks/child/notify.js";import{createChannelReader}from"#execution/tools/workflow/owner-channels.js";import{applyTaskTransition}from"#tasks/transitions.js";async function createBackgroundWorkflowOwner(e){let t=createHook({token:e.taskInboxToken}),n=e.initialView,r=0,i=new Map,a=new AbortController;try{await claimHookOwnership(t)}catch(e){if(isHookConflictError(e))return;throw e}return await emitTaskActivityStep({activityObserver:e.activityObserver,view:n}),{kind:`session`,commands:createChannelReader(`commands`,t),signal:a.signal,handleCommand,handleMessage};async function handleCommand(t){if(t.kind===`task-command`){if(t.command.kind===`ready`)return isTerminalTaskStatus(n.status)?(await notifyTaskParent({token:e.parentContinuationToken,view:n}),`stop`):`start`;if(t.command.kind===`reject-dispatch`)return applyTransition(t.command),`stop`}await applyPayload(t)}async function handleMessage(t){if(t.kind===`report`){await handleReport(t);return}if(t.kind===`outcome`){(applyTransition(t)||n.status===`cancelled`)&&await notifyTaskParent({token:e.parentContinuationToken,view:n});return}let r=t,a=r.request.kind;if(a===`agent-invoke`||a===`agent-settled`||a===`authorization-request`){await handleOwnerRequest(r);return}r.requestCoordinates===void 0&&i.set(r.replyTo,{runId:r.from.runId}),applyTransition({kind:`require-input`,inputRequests:workflowToolRunInputRequests(r)})&&await notifyTaskParent({request:r,taskId:n.taskId,token:e.parentContinuationToken})}async function handleReport(t){let i=r++;n.metadata.kind!==`subagent`||isTerminalTaskStatus(n.status)||await notifyTaskParent({token:e.parentContinuationToken,update:{report:t,index:i},view:n})}async function applyPayload(e){let t;if(e.kind===`input-response`)t=n.status===`input_required`?await resolveAnsweredCommand(n,e,i.get(e.childContinuationToken)):void 0;else if(e.kind===`task-command`)t=e.command;else return;t!==void 0&&applyTransition(t)&&t.kind===`cancel`&&a.abort(Error(`Task ${n.taskId} was cancelled.`))}function applyTransition(e){let t=applyTaskTransition(n,e);return t.action===`accepted`&&(n=t.view,!0)}async function handleOwnerRequest(t){let{request:r}=t;if(r.kind===`authorization-request`){await deliverWorkflowAuthorization({...t,request:r},async()=>{let i=r.event.childSessionId===t.from.runId&&r.event.event.type===`authorization.completed`;(!isTerminalTaskStatus(n.status)||i)&&await notifyTaskParent({request:t,taskId:n.taskId,token:e.parentContinuationToken})});return}isTerminalTaskStatus(n.status)||await notifyTaskParent({request:t,taskId:n.taskId,token:e.parentContinuationToken})}}async function resolveAnsweredCommand(e,t,n){if(t.taskId!==e.taskId)return;let r=new Set(e.inputRequests.flatMap(e=>{let t=readTaskInputRequestId(e);return t===void 0?[]:[t]})),i=t.inputResponses.map(e=>e.requestId).filter(e=>r.has(e));if(i.length!==0)return await deliverTaskInputResponsesStep({answer:t,answerHook:n,requestIds:i})===`delivered`?{kind:`answered`,requestIds:i}:void 0}export{createBackgroundWorkflowOwner};