Files
sausage/extensions/messages/notice.ts
T

49 lines
1.5 KiB
TypeScript

/** Passive context for the standing agent about a branch's questions to the user. */
import { defineTask } from '@earendil-works/pi-durable'
import type { ConversationId } from '@earendil-works/pi-durable'
import type { Host as ExtensionHost } from '../../host/js/extensions.ts'
export const notice = (host: Pick<ExtensionHost, 'harness'>) =>
defineTask<
{
to: number
kind: 'board.asked' | 'board.answered'
data: {
message: number
from: number
call?: string
summary?: string
dismissed?: boolean
/** the standing agent settled it for the user. */
via?: { conversation: number; entry?: number }
}
content: string
},
{ phase: 'submit' },
null
>({
name: 'board.notice',
version: 1,
initial: () => ({ phase: 'submit' }),
phases: {
submit: async (task, runtime, ctx) => {
const { to, kind, data, content } = task.input
const target = (await host.harness().conversation(to as ConversationId, ctx))!
await target.submit(
{
type: 'write',
requestId: `${kind}:${data.message}`,
entry: { kind, data, model: [{ role: 'user', content, timestamp: Date.now() }] },
},
ctx,
)
await runtime.commit(
() => ({ status: 'terminal', outcome: { status: 'completed', result: null } }),
ctx,
)
},
},
abort: (_task, runtime, ctx) =>
runtime.commit(() => ({ status: 'terminal', outcome: { status: 'aborted' } }), ctx),
})