eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 4.57 kB
JavaScript
import{createEveTaskInputRoutePath}from"#protocol/routes.js";import{createLogger}from"#internal/logging.js";import{isInputRequest}from"#shared/input.js";import{contextStorage}from"#context/container.js";import{ActivityObserverKey}from"#context/keys.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{readDurableSession,replaceDurableSessionSnapshot}from"#execution/durable-session-store.js";import{findBackgroundWorkflowToolRun,readWorkflowTaskView,recordWorkflowTaskView}from"#harness/workflow-tool-runs.js";import{getAgentHandleStore}from"#subagents/handles/store.js";import{clearProxyInputRequestsForTask,createTaskInputRequestId,upsertProxyInputRequestState}from"#harness/proxy-input-requests.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";import{createRemoteTaskInputCallbackUrl}from"#execution/workflow-callback-url.js";import{submitActivity}from"#execution/submit-activity.js";import{applyTaskAgentHandleCommand}from"#subagents/handles/transitions.js";import{createTaskInputCapabilityToken}from"#execution/task-input-capability.js";import{projectTaskActivity}from"#execution/tasks/child/notify.js";const log=createLogger(`execution.tasks.parent`);async function recordTaskInputRequestStep(e){"use step";let t=readDurableSession(e.sessionState),n=findBackgroundWorkflowToolRun(t.state,e.request.taskId),r=e.request.requests??[e.request.request];if(n===void 0||r.length===0||!r.every(isInputRequest)||readWorkflowTaskView(n.task)!==void 0)return{accepted:!1,sessionState:e.sessionState};let i=r.map(t=>({...t,requestId:createTaskInputRequestId(e.request.taskId,t.requestId)})),a=getAgentHandleStore(t.state)?.handles.find(t=>t.phase===`claimed`&&t.ownerId===e.request.taskId),o=a?.phase===`claimed`&&a.address.kind===`agent/remote`?createRemoteTaskInputCallbackUrl(a.address.url,createEveTaskInputRoutePath(createTaskInputCapabilityToken(e.request.replyTo))):void 0,s=r.map((t,n)=>{let r=i[n],a={childContinuationToken:e.request.replyTo,childRequestId:t.requestId,kind:t.kind,taskId:e.request.taskId};return o!==void 0&&(a.childResponseUrl=o),[r.requestId,a]}),c=upsertProxyInputRequestState({entries:s,forChildContinuationToken:e.request.replyTo,state:t.state});return{accepted:!0,request:e.request.requests===void 0?{...e.request,request:i[0]}:{...e.request,request:void 0,requests:i},sessionState:replaceDurableSessionSnapshot({session:{...t,state:c},state:e.sessionState})}}async function recordTerminalTaskViewsStep(e){"use step";let t=readDurableSession(e.sessionState),n=t,r=[],i=[];for(let t of e.views){let e=findBackgroundWorkflowToolRun(n.state,t.taskId);if(e===void 0)continue;let a=recordWorkflowTaskView(n.state,t);a!==n.state&&(n={...n,state:a},e.task.metadata.kind===`subagent`&&t.status===`completed`&&i.push({type:`subagent.completed`,data:{callId:e.callId,subagentName:e.toolName,output:typeof t.lastOutput.data==`string`?t.lastOutput.data:JSON.stringify(t.lastOutput.data)}})),r.push(readWorkflowTaskView(e.task)??t),n=clearProxyInputRequestsForTask(n,t.taskId),n=applyTaskAgentHandleCommand(n,{kind:`release-owner`,ownerId:t.taskId}).session}return{serializedContext:await settleBackgroundTaskActions({serializedContext:e.serializedContext,session:n,views:r}),sessionState:n===t?e.sessionState:replaceDurableSessionSnapshot({session:n,state:e.sessionState}),views:r,subagentCompletions:i}}async function settleBackgroundTaskActions(e){if(e.views.length===0)return e.serializedContext;try{let t=await deserializeContext(e.serializedContext),n=t.get(ActivityObserverKey),r=new Date().toISOString(),i=e.views.flatMap(t=>{let i=findBackgroundWorkflowToolRun(e.session.state,t.taskId);return projectTaskActivity({activityObserver:n===void 0?void 0:{sink:n.sink,workIdentity:i?.task.activityWorkIdentity},settledAt:r,view:t})});await submitActivity({events:i,sink:n?.sink});let a=t.get(BundleKey);if(a===void 0)return e.serializedContext;let o=bindSessionInstrumentation({agentName:a.turnAgent.id,ctx:t,rootSessionId:e.session.rootSessionId??e.session.sessionId,sessionId:e.session.sessionId});if(o===void 0)return e.serializedContext;try{await contextStorage.run(t,()=>o.publishBackgroundTaskSettlements({acceptedAtMs:Date.now(),views:e.views}))}finally{await o.flush()}return serializeContext(t)}catch(t){return log.warn(`failed to settle background task instrumentation`,{error:t,sessionId:e.session.sessionId,taskIds:e.views.map(e=>e.taskId)}),e.serializedContext}}export{recordTaskInputRequestStep,recordTerminalTaskViewsStep};