eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 2.38 kB
JavaScript
import{jsonValuesEqual}from"#shared/json.js";import{isTerminalTaskStatus,readTaskInputRequestId}from"#tasks/types.js";function terminalView(e,t,n){let r=`usage`in t?t.usage:void 0,i={executor:e.executor,metadata:e.metadata,taskId:e.taskId};switch(r!==void 0&&(i.usage=r),n.status){case`completed`:return{...i,lastOutput:n.lastOutput,status:`completed`};case`failed`:return{...i,lastOutput:n.lastOutput,status:`failed`};case`cancelled`:return{...i,status:`cancelled`}}}function applyTaskTransition(e,t){if(t.kind===`bind`){let n=e.executor?.binding;return n!==void 0&&n.kind===t.executor.kind&&jsonValuesEqual(n.data,t.executor.data)?{action:`noop`,view:e}:n===void 0?{action:`accepted`,view:{...e,executor:{...e.executor,binding:t.executor}}}:{action:`rejected`,reason:`Task "${e.taskId}" already has an executor binding.`,view:e}}if(isTerminalTaskStatus(e.status))return t.kind===`cancel`&&e.status===`cancelled`?{action:`noop`,view:e}:{action:`rejected`,reason:`Task "${e.taskId}" is already ${e.status}; "${t.kind}" cannot change a terminal task.`,view:e};switch(t.kind){case`complete`:return{action:`accepted`,view:terminalView(e,t,{lastOutput:{data:t.data,type:`result`},status:`completed`})};case`fail`:case`reject-dispatch`:return{action:`accepted`,view:terminalView(e,t,{lastOutput:{data:t.data,type:`error`},status:`failed`})};case`cancel`:return{action:`accepted`,view:terminalView(e,t,{status:`cancelled`})};case`require-input`:return isValidInputRequestBatch(t.inputRequests)?{action:`accepted`,view:{inputRequests:t.inputRequests,executor:e.executor,metadata:e.metadata,status:`input_required`,taskId:e.taskId}}:{action:`rejected`,reason:`Task "${e.taskId}" received an invalid input request batch.`,view:e};case`ready`:return{action:`accepted`,view:e};case`answered`:{if(e.status!==`input_required`)return{action:`noop`,view:e};let n=new Set(t.requestIds),r=e.inputRequests.filter(e=>{let t=readTaskInputRequestId(e);return t===void 0||!n.has(t)});return r.length===e.inputRequests.length?{action:`noop`,view:e}:r.length>0?{action:`accepted`,view:{...e,inputRequests:r}}:{action:`accepted`,view:{executor:e.executor,metadata:e.metadata,status:`working`,taskId:e.taskId}}}}}function isValidInputRequestBatch(e){if(e.length===0)return!1;let t=e.map(readTaskInputRequestId);return t.every(e=>e!==void 0&&e.length>0)&&new Set(t).size===t.length}export{applyTaskTransition};