Files
openclaw/extensions/slack/src/reply-blocks.ts
2026-05-17 14:18:23 +01:00

33 lines
1.3 KiB
TypeScript

import type { ReplyPayload } from "openclaw/plugin-sdk/reply-runtime";
import { parseSlackBlocksInput, SLACK_MAX_BLOCKS } from "./blocks-input.js";
import {
buildSlackInteractiveBlocks,
buildSlackPresentationBlocks,
resolveSlackInteractiveBlockOffsets,
type SlackBlock,
} from "./blocks-render.js";
export function resolveSlackReplyBlocks(payload: ReplyPayload): SlackBlock[] | undefined {
const slackData = payload.channelData?.slack;
let channelBlocks: SlackBlock[] = [];
if (slackData && typeof slackData === "object" && !Array.isArray(slackData)) {
channelBlocks =
(parseSlackBlocksInput((slackData as { blocks?: unknown }).blocks) as SlackBlock[]) ?? [];
}
const presentationBlocks = buildSlackPresentationBlocks(
payload.presentation,
resolveSlackInteractiveBlockOffsets(channelBlocks),
);
const interactiveBlocks = buildSlackInteractiveBlocks(
payload.interactive,
resolveSlackInteractiveBlockOffsets([...channelBlocks, ...presentationBlocks]),
);
const blocks = [...channelBlocks, ...presentationBlocks, ...interactiveBlocks];
if (blocks.length > SLACK_MAX_BLOCKS) {
throw new Error(
`Slack blocks cannot exceed ${SLACK_MAX_BLOCKS} items after interactive render`,
);
}
return blocks.length > 0 ? blocks : undefined;
}