17 lines
1.1 KiB
TypeScript
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})
|