Files
sausage/extensions/dream/delivery.ts
T

17 lines
1.1 KiB
TypeScript

/** Durable dream inputs and passive notes, admitted once per request ID. */
import { defineTask } from '@earendil-works/pi-durable'
const terminal = {status:'terminal',outcome:{status:'completed',result:null}} as const
export const deliverTask = (host:any) => defineTask<any,{phase:'submit'},null>({
name:'dream.deliver', version:1, initial:()=>({phase:'submit'}),
phases:{submit:async(task,runtime,ctx)=>{
const {to,type,requestId,kind,data,content}=task.input
const target=(await host.harness().conversation(to,ctx))!
await target.submit(type==='input'
? {type,requestId,content,entry:{kind,data},whenBusy:'followUp'}
: {type,requestId,entry:{kind,data,model:[{role:'user',content,timestamp:Date.now()}]}},ctx)
await runtime.commit(()=>terminal,ctx)
}},
abort:(_task,runtime,ctx)=>runtime.commit(()=>({status:'terminal',outcome:{status:'aborted'}}),ctx),
})
export const deliver = (host:any,tx:any,to:number,delivery:any) => tx.createTask(deliverTask(host),{to,...delivery},{conversationId:to,ownership:{kind:'conversation'},background:true})