eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 5.54 kB
JavaScript
import{activeTurnId}from"#harness/active-turn-id.js";import{readAcceptedDeploymentId}from"#execution/accepted-delivery-deployment.js";import{cancelAllIndexedSessionTasksStep}from"#execution/cancel-indexed-session-tasks-step.js";import{reportDroppedWirePayloadStep}from"#execution/report-dropped-wire-payload-step.js";import{SessionStateCursor}from"#execution/session-state-cursor.js";import{SessionInboxWireError,sessionInboxWire}from"#execution/wire/session-inbox-wire.js";import{turnStep}from"#execution/workflow-steps.js";import{TurnCancelledError}from"#harness/turn-cancellation.js";async function runInlineTurn(e){let t=readAcceptedDeploymentId(e.delivery);if(t===void 0)return{kind:`child`};let n=e.stateCursor??new SessionStateCursor({serializedContext:e.serializedContext,sessionState:e.sessionState}),r=new InlineTurnControl({bufferedDeliveries:e.bufferedDeliveries,bufferedSessionControls:e.bufferedSessionControls,cancelledTaskIds:e.cancelledTaskIds,commandInbox:e.commandInbox,expectedTurnId:activeTurnId(e.sessionState.emissionState),seenTaskDeliveries:e.seenTaskDeliveries,stateCursor:n}),i=e.delivery;for(;;){let a={serializedContext:n.serializedContext,sessionState:n.sessionState},o=await r.waitForStep(turnStep({abortSignal:r.signal,acceptedDeploymentId:t,input:i,parentWritable:e.parentWritable,serializedContext:n.serializedContext,sessionState:n.sessionState}));if(o.requiresChildDispatch===!0)return{initialCancellation:r.initialCancellation,kind:`child`};let s={beforeStep:a,result:o};if(r.initialCancellation!==void 0||o.action===`cancelled`||(o.backgroundTasks?.length??0)>0)return continueOutcome(r,s);if(o.action===`done`)return{action:{isError:o.isError,kind:`done`,output:o.output??``,serializedContext:o.serializedContext,sessionState:o.sessionState,usage:o.usage,usageDelta:o.usageDelta},kind:`result`};if(o.action===`dispatch-workflow-tasks`||o.action===`park`&&o.pendingCoordinationCallIds!==void 0)return continueOutcome(r,s);if(o.action===`park`)return o.hasPendingAuthorization||o.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`?{action:{authorizationAttemptIds:o.authorizationAttemptIds,authorizationNames:o.authorizationNames,kind:`park`,serializedContext:o.serializedContext,sessionState:o.sessionState,settled:o.settled},kind:`result`}:continueOutcome(r,s);let c=n.sessionState.continuationToken;n.adoptState(o),n.sessionState.continuationToken!==``&&n.sessionState.continuationToken!==c&&await e.commandInbox.rekeyContinuation(n.sessionState.continuationToken),i=void 0}}function continueOutcome(e,t){return{initialCancellation:e.initialCancellation,initialStep:t,kind:`continue`}}var InlineTurnControl=class{bufferedDeliveries;bufferedSessionControls;cancelledTaskIds;commandInbox;controller=new AbortController;expectedTurnId;seenTaskDeliveries;stateCursor;cancellation;constructor(e){this.bufferedDeliveries=e.bufferedDeliveries,this.bufferedSessionControls=e.bufferedSessionControls,this.cancelledTaskIds=e.cancelledTaskIds??new Set,this.commandInbox=e.commandInbox,this.expectedTurnId=e.expectedTurnId,this.seenTaskDeliveries=e.seenTaskDeliveries??new Set,this.stateCursor=e.stateCursor}get initialCancellation(){return this.cancellation}get signal(){return this.controller.signal}async waitForStep(e){let t=e.then(e=>({kind:`step`,result:e}));for(;;){let e=await Promise.race([t,this.commandInbox.next().then(e=>({kind:`command`,result:e}))]);if(e.kind===`step`)return e.result;if(e.result.done)throw Error(`Session command inbox closed before the inline turn step settled.`);this.commandInbox.consumeNext(),await this.handle(e.result.value)}}abort(e){this.controller.signal.aborted||(this.cancellation=e,this.controller.abort(new TurnCancelledError))}acceptTaskDelivery(e){let t=e.taskDeliveryId??e.caller?.taskId;return t===void 0?!0:this.originatesFromCancelledTask(t)||this.seenTaskDeliveries.has(t)?!1:(this.seenTaskDeliveries.add(t),!0)}async handle(e){if(e.kind===`runtime-action-result`)return;let t;try{t=sessionInboxWire.decode(e)}catch(e){if(!(e instanceof SessionInboxWireError))throw e;await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`});return}if(t.kind===`deliver`){if(!this.acceptTaskDelivery(t))return;this.bufferedDeliveries.push(t),t.turnPolicy===`steer`&&deliveryHasMessage(t)&&this.abort({});return}if(t.kind===`clear`||t.kind===`compact`){this.bufferedSessionControls.push(t.kind);return}if(t.kind===`session-timeout`){this.bufferedSessionControls.push(`expired`);return}if(t.kind===`reset`){this.bufferedSessionControls.push(`reset`),this.abort({});return}if(t.kind===`cancel`){`tasks`in t&&t.tasks===!0&&await cancelAllIndexedSessionTasksStep({serializedContext:this.stateCursor.serializedContext,sessionState:this.stateCursor.sessionState}),t.taskId!==void 0&&this.discardTaskDeliveries(t.taskId);let e=t.taskId!==void 0&&t.turnId!==void 0&&t.turnId!==this.expectedTurnId?void 0:t.turnId;if(e===void 0||e===this.expectedTurnId){let n=e===void 0?{tasks:t.tasks}:{tasks:t.tasks,turnId:e};this.abort(n)}}}discardTaskDeliveries(e){this.cancelledTaskIds.add(e);let t=this.bufferedDeliveries.filter(e=>!this.shouldDiscard(e));this.bufferedDeliveries.splice(0,this.bufferedDeliveries.length,...t)}originatesFromCancelledTask(e){return[...this.cancelledTaskIds].some(t=>e===t||e.startsWith(`${t}:`))}shouldDiscard(e){let t=e.taskDeliveryId??e.caller?.taskId;return t!==void 0&&this.originatesFromCancelledTask(t)}};function deliveryHasMessage(e){return e.payloads.some(e=>e.message!==void 0)}export{runInlineTurn};