UNPKG

eve

Version:

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

1 lines 4.89 kB
import{jsonValuesEqual}from"#shared/json.js";import{coalesceDeliveries}from"#harness/messages.js";import{cancelAllIndexedSessionTasksStep}from"#execution/cancel-indexed-session-tasks-step.js";import{reportDroppedWirePayloadStep}from"#execution/report-dropped-wire-payload-step.js";import{SessionInboxWireError,sessionInboxWire}from"#execution/wire/session-inbox-wire.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{getSessionTaskCohorts}from"#tasks/session-task-cohorts.js";async function nextTurnDelivery(e){if(e.awaitAuthorizationCallbacks!==!0)return await awaitNextTurnDelivery(e);e.commandInbox.setAuthorizationWindow(!0);try{return await awaitNextTurnDelivery(e)}finally{e.commandInbox.setAuthorizationWindow(!1)}}async function awaitNextTurnDelivery(e){let t=e.cancelledTaskIds??new Set,n=e.seenTaskDeliveries??new Set;for(;;){let r=await waitForNextSessionAction({bufferedDeliveries:e.bufferedDeliveries,bufferedSessionControls:e.bufferedSessionControls,cancelledTaskIds:t,commandInbox:e.commandInbox,deferDeliveries:e.deferDeliveries,seenTaskDeliveries:n,stateCursor:e.stateCursor});if(r.kind===`authorization`)return r;if(r.kind!==`delivery`)return{kind:r.kind};let i=r.delivery;if(i===null)return{kind:`closed`};let a=await routeDeliverToChildren({delivery:i,parentWritable:e.driverWritable,serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState});if(e.stateCursor.adoptState(a),a.kind===`cancel-turn`)return{kind:`cancel-turn`};if(a.remainder!==void 0)return{delivery:a.remainder,kind:`turn`}}}async function waitForNextSessionAction(e){let t=e.bufferedSessionControls.shift();if(t!==void 0)return{kind:t};for(;;){if(e.deferDeliveries!==!0&&!e.commandInbox.hasReadyAuthorization()){let t=takeBufferedTurnDelivery(e.bufferedDeliveries,getSessionTaskCohorts(e.stateCursor.sessionState.snapshot?.session.state),e.cancelledTaskIds);if(t!==void 0)return{delivery:t,kind:`delivery`}}let{result:t,source:n}=await e.commandInbox.nextWithSource();if(e.commandInbox.consumeNext(),n===`authorization`)return t.done?{closed:!0,kind:`authorization`,payloads:[]}:{closed:!1,kind:`authorization`,payloads:t.value.kind===`deliver`?t.value.payloads:[]};if(t.done)return{delivery:null,kind:`delivery`};if(t.value.kind===`runtime-action-result`)continue;let r;try{r=sessionInboxWire.decode(t.value)}catch(e){if(!(e instanceof SessionInboxWireError))throw e;await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`});continue}if(r.kind===`session-timeout`)return{kind:`expired`};if(r.kind===`clear`||r.kind===`compact`||r.kind===`reset`)return{kind:r.kind};if(r.kind===`cancel`){if(`tasks`in r&&r.tasks===!0&&await cancelAllIndexedSessionTasksStep({serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState}),r.taskId!==void 0){e.cancelledTaskIds.add(r.taskId);let t=e.bufferedDeliveries.filter(t=>!isCancelledTaskDelivery(t,e.cancelledTaskIds));e.bufferedDeliveries.splice(0,e.bufferedDeliveries.length,...t)}continue}let i=r.taskDeliveryId??r.caller?.taskId;if(!(i!==void 0&&isCancelledTaskDeliveryId(i,e.cancelledTaskIds))){if(i!==void 0){if(e.seenTaskDeliveries.has(i))continue;e.seenTaskDeliveries.add(i)}e.bufferedDeliveries.push(r)}}}function isCancelledTaskDelivery(e,t){let n=e.taskDeliveryId??e.caller?.taskId;return n!==void 0&&isCancelledTaskDeliveryId(n,t)}function isCancelledTaskDeliveryId(e,t){return[...t].some(t=>e===t||e.startsWith(`${t}:`))}function takeBufferedTurnDelivery(e,t,n){let r=e.filter(e=>!isCancelledTaskDelivery(e,n));e.splice(0,e.length,...r);let i=new Set(e.flatMap(e=>{let t=completionTaskId(e);return t===void 0?[]:[t]})),a=new Set;for(let[e,r]of t)!r.settled&&!i.has(e)&&!n.has(e)&&a.add(r.cohortId);let o=e.findIndex(e=>{let n=completionCohort(e,t);return n===void 0||!a.has(n)});if(o<0)return;let s=completionCohort(e[o],t);if(s!==void 0){let n=e.findLastIndex(e=>completionCohort(e,t)===s),r=e.findIndex((e,r)=>r>o&&r<n&&completionCohort(e,t)===void 0);r>=0&&(o=r)}let c=e.splice(o,1)[0],l=completionCohort(c,t);if(l!==void 0){let n=e.filter(e=>completionCohort(e,t)===l),r=e.filter(e=>completionCohort(e,t)!==l);return e.splice(0,e.length,...r),coalesceDeliveries([c,...n])}let u=c.auth!=null&&c.auth.principalType!==`anonymous`,d=[c],f=c.caller;for(;e.length>o;){let t=e[o];if(t===void 0||c.taskDeliveryId!==void 0||t.taskDeliveryId!==void 0||!u||!jsonValuesEqual(c.auth,t.auth)||f!==void 0&&t.caller!==void 0)break;let n=e.splice(o,1)[0];if(n===void 0)throw Error(`Buffered turn delivery disappeared while partitioning.`);d.push(n),f??=n.caller}return coalesceDeliveries(d)}function completionCohort(e,t){let n=completionTaskId(e);return n===void 0?void 0:t.get(n)?.cohortId}function completionTaskId(e){if(e.caller===void 0&&e.taskDeliveryId?.endsWith(`:ready:completed`))return e.taskDeliveryId.slice(0,-16)}export{nextTurnDelivery};