mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-31 17:41:49 +00:00
33 lines
1.3 KiB
TypeScript
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;
|
|
}
|