UNPKG

eve

Version:

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

1 lines • 5.28 kB
import{jsonValuesEqual}from"#shared/json.js";import{coalesceDeliveries}from"#harness/messages.js";var SessionInputQueue=class{entries=[];cancelledTaskIds=new Set;seenTaskDeliveryIds=new Set;nextSequence=0;get pendingCount(){return this.entries.length}enqueueDelivery(e){let t=taskDeliveryId(e);if(t!==void 0){let n=terminalTaskId(e),r=n===void 0?t:`${n}:ready`;if(this.seenTaskDeliveryIds.has(r)||this.isCancelledTaskDelivery(t))return;this.seenTaskDeliveryIds.add(r)}let n={delivery:e,sequence:this.nextSequence++};return this.entries.push({...n,kind:`delivery`}),n}rememberTask(e){this.seenTaskDeliveryIds.add(e)}isTaskCancelled(e){return this.cancelledTaskIds.has(e)}enqueueControl(e){this.entries.push({control:e,kind:`control`,sequence:this.nextSequence++})}enqueueAuthorization(e){for(let t of e){let e=authorizationAttemptId(t);e!==void 0&&(this.entries.some(t=>t.kind===`authorization`&&t.attemptId===e)||this.entries.push({attemptId:e,kind:`authorization`,payload:t,sequence:this.nextSequence++}))}}delivery(e){return this.entries.find(t=>t.kind===`delivery`&&t.sequence===e)?.delivery}taskDeliveries(){return this.entries.filter(e=>e.kind===`delivery`&&e.delivery.payloads.some(e=>e.task!==void 0))}replaceDelivery(e,t){let n=this.entries.findIndex(t=>t.kind===`delivery`&&t.sequence===e);if(!(n<0)){if(t===void 0){this.entries.splice(n,1);return}this.entries[n]={delivery:t,kind:`delivery`,sequence:e}}}cancelTask(e){this.cancelledTaskIds.add(e),this.retain(t=>t.kind!==`delivery`||!isTaskDelivery(t.delivery,t=>t===e||t.startsWith(`${e}:`)))}takeSteering(e,t){let n=this.entries.filter(n=>n.kind===`delivery`&&e.has(n.sequence)&&isSteeringDelivery(n.delivery,t));if(n.length!==0)return this.retain(e=>e.kind!==`delivery`||!n.includes(e)),{delivery:combine(n),handoffEligible:!1,kind:`turn`,sequences:n.map(({sequence:e})=>e)}}takeNext(e,t){let n=t?.expectedAttemptIds??new Set;if(this.retain(e=>e.kind!==`authorization`||n.has(e.attemptId)),n.size>0){let e=new Map(this.entries.flatMap(e=>e.kind===`authorization`?[[e.attemptId,e.payload]]:[]));if([...n].every(t=>e.has(t)))return this.retain(e=>e.kind!==`authorization`),{kind:`authorization-resume`,payloads:[...n].map(t=>e.get(t))}}let r=this.nextActionableIndex(e,t?.deferDeliveries===!0,t?.taskDeliveryPolicy??`cohort`);if(!(r<0))return this.takeSelectionAt(r,e,t?.freshSequence)}nextActionableIndex(e,t,n){let r=new Set;for(let[t,n]of e)!this.seenTaskDeliveryIds.has(`${t}:ready`)&&!this.cancelledTaskIds.has(t)&&r.add(n);return this.entries.findIndex(i=>{if(i.kind===`control`)return!0;if(i.kind===`authorization`||t)return!1;let a=terminalCohort(i.delivery,e);return n===`auto`||a===void 0||!r.has(a)})}takeSelectionAt(e,t,n){let r=this.entries[e];if(r.kind!==`delivery`)return this.entries.splice(e,1),r.kind===`control`?{control:r.control,kind:`control`}:{kind:`authorization-resume`,payloads:[r.payload]};let i=terminalCohort(r.delivery,t);if(i!==void 0){let r=this.entries.findLastIndex(e=>e.kind===`delivery`&&terminalCohort(e.delivery,t)===i),a=this.entries.findIndex((n,i)=>i>e&&i<r&&(n.kind!==`delivery`||terminalCohort(n.delivery,t)===void 0));if(a>=0)return this.takeSelectionAt(a,t,n)}let a=this.entries.splice(e,1)[0];if(a.kind!==`delivery`)throw Error(`Selected a non-delivery entry as a turn.`);let o=[a],s=terminalCohort(a.delivery,t);if(s!==void 0){let e=this.entries.filter(e=>e.kind===`delivery`&&terminalCohort(e.delivery,t)===s);o.push(...e),this.retain(e=>e.kind!==`delivery`||terminalCohort(e.delivery,t)!==s)}else{let t=a.delivery.auth!=null&&a.delivery.auth.principalType!==`anonymous`,n=a.delivery.caller;for(;this.entries.length>e;){let r=this.entries[e];if(r?.kind!==`delivery`||a.delivery.taskDeliveryId!==void 0||r.delivery.taskDeliveryId!==void 0||!t||!jsonValuesEqual(a.delivery.auth,r.delivery.auth)||n!==void 0&&r.delivery.caller!==void 0)break;o.push(this.entries.splice(e,1)[0]),n??=r.delivery.caller}}let c=o.map(({sequence:e})=>e),l=combine(o);return{delivery:l,handoffEligible:c.length===1&&c[0]===n&&l.caller===void 0&&taskDeliveryId(l)===void 0&&this.entries.length===0,kind:`turn`,sequences:c}}isCancelledTaskDelivery(e){for(let t of this.cancelledTaskIds)if(e===t||e.startsWith(`${t}:`))return!0;return!1}retain(e){let t=this.entries.filter(e);this.entries.splice(0,this.entries.length,...t)}};function isSteeringDelivery(e,t){return e.taskDeliveryId===void 0&&(e.turnPolicy??`steer`)===`steer`&&(e.caller===void 0||e.caller.callId===t)}function combine(e){if(e.length===1)return e[0].delivery;let t=e.map(({delivery:e})=>e),n=t.flatMap(e=>e.taskDeliveryIds??(e.taskDeliveryId===void 0?[]:[e.taskDeliveryId]));return{...coalesceDeliveries(t),taskDeliveryIds:n.length>0?n:void 0}}function authorizationAttemptId(e){let t=e.authorizationCallback;return typeof t?.attemptId==`string`?t.attemptId:void 0}function taskDeliveryId(e){return e.taskDeliveryId??e.caller?.taskId}function isTaskDelivery(e,t){let n=taskDeliveryId(e);return n!==void 0&&t(n)}function terminalCohort(e,t){let n=terminalTaskId(e);return n===void 0?void 0:t.get(n)}function terminalTaskId(e){if(e.caller===void 0)for(let t of[`completed`,`failed`,`cancelled`]){let n=`:ready:${t}`;if(e.taskDeliveryId?.endsWith(n))return e.taskDeliveryId.slice(0,-n.length)}}export{SessionInputQueue,isSteeringDelivery};