UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

160 lines (159 loc) 6.87 kB
import { a as normalizeLowercaseStringOrEmpty, c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js"; import "./string-coerce-runtime-CEGJWkQ_.js"; import { n as createApproverRestrictedNativeApprovalCapability } from "./approval-delivery-helpers-IkWw0ui8.js"; import { n as createLazyChannelApprovalNativeRuntimeAdapter } from "./approval-handler-adapter-runtime-DLWtIqHq.js"; import { n as resolveApprovalRequestSessionConversation } from "./exec-approval-session-target-DfDihhuU.js"; import { n as createChannelApproverDmTargetResolver, r as createChannelNativeOriginTargetResolver } from "./approval-native-helpers-WitYuyrm.js"; import "./approval-native-runtime-BeD_vgZw.js"; import { r as listDiscordAccountIds, s as resolveDiscordAccount } from "./accounts-BI_6uJlY.js"; import { i as isDiscordExecApprovalClientEnabled, n as getDiscordExecApprovalApprovers, r as isDiscordExecApprovalApprover, t as shouldHandleDiscordApprovalRequest } from "./approval-shared-CvDEtoxb.js"; //#region extensions/discord/src/approval-native.ts function extractDiscordSessionKind(sessionKey) { if (!sessionKey) return null; const match = sessionKey.match(/discord:(?:[^:]+:)?(channel|group|dm|direct):/); if (!match) return null; const raw = match[1]; if (raw === "direct") return "dm"; return raw; } function normalizeDiscordOriginChannelId(value) { if (!value) return null; const trimmed = value.trim(); if (!trimmed) return null; const prefixed = trimmed.match(/^(?:channel|group):(\d+)$/i); if (prefixed) return prefixed[1]; return /^\d+$/.test(trimmed) ? trimmed : null; } function normalizeDiscordThreadId(value) { if (typeof value === "number") return Number.isFinite(value) ? String(value) : void 0; if (typeof value !== "string") return; const normalized = value.trim(); return /^\d+$/.test(normalized) ? normalized : void 0; } function createDiscordOriginTargetResolver(configOverride) { return createChannelNativeOriginTargetResolver({ channel: "discord", shouldHandleRequest: ({ cfg, accountId, request }) => shouldHandleDiscordApprovalRequest({ cfg, accountId, request, configOverride }), resolveTurnSourceTarget: (request) => { const sessionConversation = resolveApprovalRequestSessionConversation({ request, channel: "discord", bundledFallback: false }); const sessionKind = extractDiscordSessionKind(normalizeOptionalString(request.request.sessionKey) ?? null); const turnSourceChannel = normalizeLowercaseStringOrEmpty(request.request.turnSourceChannel); const rawTurnSourceTo = normalizeOptionalString(request.request.turnSourceTo) ?? ""; const turnSourceTo = normalizeDiscordOriginChannelId(rawTurnSourceTo); const threadId = normalizeDiscordThreadId(request.request.turnSourceThreadId) ?? normalizeDiscordThreadId(sessionConversation?.threadId) ?? void 0; const hasExplicitOriginTarget = /^(?:channel|group):/i.test(rawTurnSourceTo); if (turnSourceChannel !== "discord" || !turnSourceTo || sessionKind === "dm") return null; return hasExplicitOriginTarget || sessionKind === "channel" || sessionKind === "group" ? { to: turnSourceTo, threadId } : null; }, resolveSessionTarget: (sessionTarget, request) => { const sessionConversation = resolveApprovalRequestSessionConversation({ request, channel: "discord", bundledFallback: false }); if (extractDiscordSessionKind(request.request.sessionKey?.trim() || null) === "dm") return null; const targetTo = normalizeDiscordOriginChannelId(sessionTarget.to); return targetTo ? { to: targetTo, threadId: normalizeDiscordThreadId(sessionTarget.threadId) ?? normalizeDiscordThreadId(sessionConversation?.threadId) ?? void 0 } : null; }, resolveFallbackTarget: (request) => { const sessionConversation = resolveApprovalRequestSessionConversation({ request, channel: "discord", bundledFallback: false }); if (extractDiscordSessionKind(request.request.sessionKey?.trim() || null) === "dm") return null; const fallbackChannelId = normalizeDiscordOriginChannelId(sessionConversation?.id); return fallbackChannelId ? { to: fallbackChannelId, threadId: normalizeDiscordThreadId(sessionConversation?.threadId) ?? void 0 } : null; } }); } function createDiscordApproverDmTargetResolver(configOverride) { return createChannelApproverDmTargetResolver({ shouldHandleRequest: ({ cfg, accountId, request }) => shouldHandleDiscordApprovalRequest({ cfg, accountId, request, configOverride }), resolveApprovers: ({ cfg, accountId }) => getDiscordExecApprovalApprovers({ cfg, accountId, configOverride }), mapApprover: (approver) => ({ to: approver }) }); } function createDiscordApprovalCapability(configOverride) { return createApproverRestrictedNativeApprovalCapability({ channel: "discord", channelLabel: "Discord", describeExecApprovalSetup: ({ accountId }) => { const prefix = accountId && accountId !== "default" ? `channels.discord.accounts.${accountId}` : "channels.discord"; return `Approve it from the Web UI or terminal UI for now. Discord supports native exec approvals for this account. Configure \`${prefix}.execApprovals.approvers\` or \`commands.ownerAllowFrom\`; set \`${prefix}.execApprovals.enabled\` to \`auto\` or \`true\`.`; }, listAccountIds: listDiscordAccountIds, hasApprovers: ({ cfg, accountId }) => getDiscordExecApprovalApprovers({ cfg, accountId, configOverride }).length > 0, isExecAuthorizedSender: ({ cfg, accountId, senderId }) => isDiscordExecApprovalApprover({ cfg, accountId, senderId, configOverride }), isNativeDeliveryEnabled: ({ cfg, accountId }) => isDiscordExecApprovalClientEnabled({ cfg, accountId, configOverride }), resolveNativeDeliveryMode: ({ cfg, accountId }) => configOverride?.target ?? resolveDiscordAccount({ cfg, accountId }).config.execApprovals?.target ?? "dm", resolveOriginTarget: createDiscordOriginTargetResolver(configOverride), resolveApproverDmTargets: createDiscordApproverDmTargetResolver(configOverride), notifyOriginWhenDmOnly: true, nativeRuntime: createLazyChannelApprovalNativeRuntimeAdapter({ eventKinds: ["exec", "plugin"], isConfigured: ({ cfg, accountId }) => isDiscordExecApprovalClientEnabled({ cfg, accountId, configOverride }), shouldHandle: ({ cfg, accountId, request }) => shouldHandleDiscordApprovalRequest({ cfg, accountId, request, configOverride }), load: async () => (await import("./approval-handler.runtime.js")).discordApprovalNativeRuntime }) }); } let cachedDiscordApprovalCapability; function getDiscordApprovalCapability() { cachedDiscordApprovalCapability ??= createDiscordApprovalCapability(); return cachedDiscordApprovalCapability; } //#endregion export { getDiscordApprovalCapability as t };