Files
openclaw/src/plugin-sdk/channel-reply-pipeline.ts
2026-04-04 00:10:16 +01:00

60 lines
2.0 KiB
TypeScript

import type { ReplyPayload } from "../auto-reply/types.js";
import { getChannelPlugin, normalizeChannelId } from "../channels/plugins/index.js";
import {
createReplyPrefixContext,
createReplyPrefixOptions,
type ReplyPrefixContextBundle,
type ReplyPrefixOptions,
} from "../channels/reply-prefix.js";
import {
createTypingCallbacks,
type CreateTypingCallbacksParams,
type TypingCallbacks,
} from "../channels/typing.js";
export type ReplyPrefixContext = ReplyPrefixContextBundle["prefixContext"];
export type { ReplyPrefixContextBundle, ReplyPrefixOptions };
export type { CreateTypingCallbacksParams, TypingCallbacks };
export { createReplyPrefixContext, createReplyPrefixOptions, createTypingCallbacks };
export type ChannelReplyPipeline = ReplyPrefixOptions & {
typingCallbacks?: TypingCallbacks;
transformReplyPayload?: (payload: ReplyPayload) => ReplyPayload | null;
};
export function createChannelReplyPipeline(params: {
cfg: Parameters<typeof createReplyPrefixOptions>[0]["cfg"];
agentId: string;
channel?: string;
accountId?: string;
typing?: CreateTypingCallbacksParams;
typingCallbacks?: TypingCallbacks;
}): ChannelReplyPipeline {
const channelId = params.channel
? (normalizeChannelId(params.channel) ?? params.channel)
: undefined;
const plugin = channelId ? getChannelPlugin(channelId) : undefined;
const transformReplyPayload = plugin?.messaging?.transformReplyPayload
? (payload: ReplyPayload) =>
plugin.messaging?.transformReplyPayload?.({
payload,
cfg: params.cfg,
accountId: params.accountId,
}) ?? payload
: undefined;
return {
...createReplyPrefixOptions({
cfg: params.cfg,
agentId: params.agentId,
channel: params.channel,
accountId: params.accountId,
}),
...(transformReplyPayload ? { transformReplyPayload } : {}),
...(params.typingCallbacks
? { typingCallbacks: params.typingCallbacks }
: params.typing
? { typingCallbacks: createTypingCallbacks(params.typing) }
: {}),
};
}