UNPKG

eve

Version:

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

1 lines 2.99 kB
const MAX_PENDING_DELTA_CHARACTERS=65536;function createOrderedStreamEmitter(e,t={}){let n=t.maxPendingEvents??64;if(!Number.isInteger(n)||n<1)throw RangeError(`maxPendingEvents must be a positive integer.`);let r=[],i=new Set,a=new Set,o=!1,s=0,c=0,l,u=!1,d=!1,f=new AbortController,throwIfFailed=()=>{if(u)throw l},settleIdleWaiters=()=>{for(let e of a)e();a.clear()},hasCapacity=()=>c<n&&s<MAX_PENDING_DELTA_CHARACTERS,settleCapacityWaiters=()=>{if(hasCapacity()){for(let e of i)e();i.clear()}},pump=async()=>{if(!(d||u)){for(d=!0;r.length>0;){let t=r.shift();if(t===void 0)break;s-=t.deltaCharacters,c-=t.sourceEvents,settleCapacityWaiters();try{await e(materializeEvent(t),t.messages)}catch(e){u||(l=e,u=!0,f.abort(e)),r.length=0,s=0,c=0,settleCapacityWaiters();break}}d=!1,settleIdleWaiters()}},waitForIdle=async()=>{if(!d&&r.length===0){throwIfFailed();return}await new Promise(e=>{a.add(e)}),throwIfFailed()},waitForCapacity=async()=>{hasCapacity()||(await new Promise(e=>{i.add(e)}),throwIfFailed())};return{async closeAndDrain(){o=!0,pump(),await waitForIdle()},async emit(e,t){if(throwIfFailed(),o)throw TypeError(`Cannot emit after the ordered stream emitter has closed.`);let i=r.length-1,a=r[i],l=appendDelta(e);a===void 0||!mergeAdjacentEmissions(a,e,t)?r.push({deltaCharacters:l?.length??0,event:e,messages:t,sourceEvents:1}):(a.deltaCharacters+=l?.length??0,a.sourceEvents+=1),s+=l?.length??0,c+=1,pump(),(c>=n||s>=MAX_PENDING_DELTA_CHARACTERS)&&await waitForCapacity(),throwIfFailed()},failureSignal:f.signal}}function mergeAdjacentEmissions(e,t,n){let r=appendKey(e.event),i=appendKey(t);return r!==void 0||i!==void 0?r===void 0||r!==i||!isAppendEvent(e.event)||!isAppendEvent(t)||!sameCoordinates(e.event,t)?!1:(e.deltaParts??=[appendDelta(e.event)],e.deltaParts.push(appendDelta(t)),e.event=t,e.messages=n,!0):e.event.type===`action.partial`&&t.type===`action.partial`&&e.event.data.result.callId===t.data.result.callId&&(e.event=t,e.messages=n,!0)}function appendKey(e){switch(e.type){case`message.appended`:case`reasoning.appended`:return e.type;case`action.input.appended`:return`${e.type}:${e.data.callId}`;default:return}}function isAppendEvent(e){return appendKey(e)!==void 0}function appendDelta(e){switch(e.type){case`message.appended`:return e.data.messageDelta;case`reasoning.appended`:return e.data.reasoningDelta;case`action.input.appended`:return e.data.inputTextDelta;default:return}}function materializeEvent(e){return e.deltaParts===void 0?e.event:e.event.type===`message.appended`?{...e.event,data:{...e.event.data,messageDelta:e.deltaParts.join(``)}}:e.event.type===`reasoning.appended`?{...e.event,data:{...e.event.data,reasoningDelta:e.deltaParts.join(``)}}:e.event.type===`action.input.appended`?{...e.event,data:{...e.event.data,inputTextDelta:e.deltaParts.join(``)}}:e.event}function sameCoordinates(e,t){return e.data.sequence===t.data.sequence&&e.data.stepIndex===t.data.stepIndex&&e.data.turnId===t.data.turnId}export{createOrderedStreamEmitter};