diff --git a/src/auto-reply/dispatch.ts b/src/auto-reply/dispatch.ts new file mode 100644 index 000000000..8b1626c3d --- /dev/null +++ b/src/auto-reply/dispatch.ts @@ -0,0 +1,77 @@ +import type { ClawdbotConfig } from "../config/config.js"; +import type { FinalizedMsgContext, MsgContext } from "./templating.js"; +import type { GetReplyOptions } from "./types.js"; +import { finalizeInboundContext } from "./reply/inbound-context.js"; +import type { DispatchFromConfigResult } from "./reply/dispatch-from-config.js"; +import { dispatchReplyFromConfig } from "./reply/dispatch-from-config.js"; +import { + createReplyDispatcher, + createReplyDispatcherWithTyping, + type ReplyDispatcher, + type ReplyDispatcherOptions, + type ReplyDispatcherWithTypingOptions, +} from "./reply/reply-dispatcher.js"; + +export type DispatchInboundResult = DispatchFromConfigResult; + +export async function dispatchInboundMessage(params: { + ctx: MsgContext | FinalizedMsgContext; + cfg: ClawdbotConfig; + dispatcher: ReplyDispatcher; + replyOptions?: Omit; + replyResolver?: typeof import("./reply.js").getReplyFromConfig; +}): Promise { + const finalized = finalizeInboundContext(params.ctx); + return await dispatchReplyFromConfig({ + ctx: finalized, + cfg: params.cfg, + dispatcher: params.dispatcher, + replyOptions: params.replyOptions, + replyResolver: params.replyResolver, + }); +} + +export async function dispatchInboundMessageWithBufferedDispatcher(params: { + ctx: MsgContext | FinalizedMsgContext; + cfg: ClawdbotConfig; + dispatcherOptions: ReplyDispatcherWithTypingOptions; + replyOptions?: Omit; + replyResolver?: typeof import("./reply.js").getReplyFromConfig; +}): Promise { + const { dispatcher, replyOptions, markDispatchIdle } = createReplyDispatcherWithTyping( + params.dispatcherOptions, + ); + + const result = await dispatchInboundMessage({ + ctx: params.ctx, + cfg: params.cfg, + dispatcher, + replyResolver: params.replyResolver, + replyOptions: { + ...params.replyOptions, + ...replyOptions, + }, + }); + + markDispatchIdle(); + return result; +} + +export async function dispatchInboundMessageWithDispatcher(params: { + ctx: MsgContext | FinalizedMsgContext; + cfg: ClawdbotConfig; + dispatcherOptions: ReplyDispatcherOptions; + replyOptions?: Omit; + replyResolver?: typeof import("./reply.js").getReplyFromConfig; +}): Promise { + const dispatcher = createReplyDispatcher(params.dispatcherOptions); + const result = await dispatchInboundMessage({ + ctx: params.ctx, + cfg: params.cfg, + dispatcher, + replyResolver: params.replyResolver, + replyOptions: params.replyOptions, + }); + await dispatcher.waitForIdle(); + return result; +}