import { buildMessagingTarget, ensureTargetId, parseMentionPrefixOrAtUserTarget, requireTargetKind, type MessagingTarget, type MessagingTargetKind, type MessagingTargetParseOptions, } from "openclaw/plugin-sdk/channel-targets"; export type SlackTargetKind = MessagingTargetKind; export type SlackTarget = MessagingTarget; type SlackTargetParseOptions = MessagingTargetParseOptions; export function parseSlackTarget( raw: string, options: SlackTargetParseOptions = {}, ): SlackTarget | undefined { const trimmed = raw.trim(); if (!trimmed) { return undefined; } const userTarget = parseMentionPrefixOrAtUserTarget({ raw: trimmed, mentionPattern: /^<@([A-Z0-9]+)>$/i, prefixes: [ { prefix: "user:", kind: "user" }, { prefix: "channel:", kind: "channel" }, { prefix: "slack:", kind: "user" }, ], atUserPattern: /^[A-Z0-9]+$/i, atUserErrorMessage: "Slack DMs require a user id (use user: or <@id>)", }); if (userTarget) { return userTarget; } if (trimmed.startsWith("#")) { const candidate = trimmed.slice(1).trim(); const id = ensureTargetId({ candidate, pattern: /^[A-Z0-9]+$/i, errorMessage: "Slack channels require a channel id (use channel:)", }); return buildMessagingTarget("channel", id, trimmed); } if (options.defaultKind) { return buildMessagingTarget(options.defaultKind, trimmed, trimmed); } return buildMessagingTarget("channel", trimmed, trimmed); } export function resolveSlackChannelId(raw: string): string { const target = parseSlackTarget(raw, { defaultKind: "channel" }); return requireTargetKind({ platform: "Slack", target, kind: "channel" }); } export function normalizeSlackMessagingTarget(raw: string): string | undefined { return parseSlackTarget(raw, { defaultKind: "channel" })?.normalized; } export function looksLikeSlackTargetId(raw: string): boolean { const trimmed = raw.trim(); if (!trimmed) { return false; } if (/^<@([A-Z0-9]+)>$/i.test(trimmed)) { return true; } if (/^(user|channel):/i.test(trimmed)) { return true; } if (/^slack:/i.test(trimmed)) { return true; } if (/^[@#]/.test(trimmed)) { return true; } return /^[CUWGD][A-Z0-9]{8,}$/i.test(trimmed); }