mirror of https://github.com/openclaw/openclaw.git
339 lines
12 KiB
TypeScript
339 lines
12 KiB
TypeScript
import { auditDiscordChannelPermissions } from "../../../extensions/discord/src/audit.js";
|
|
import {
|
|
listDiscordDirectoryGroupsLive,
|
|
listDiscordDirectoryPeersLive,
|
|
} from "../../../extensions/discord/src/directory-live.js";
|
|
import { monitorDiscordProvider } from "../../../extensions/discord/src/monitor.js";
|
|
import { probeDiscord } from "../../../extensions/discord/src/probe.js";
|
|
import { resolveDiscordChannelAllowlist } from "../../../extensions/discord/src/resolve-channels.js";
|
|
import { resolveDiscordUserAllowlist } from "../../../extensions/discord/src/resolve-users.js";
|
|
import {
|
|
createThreadDiscord,
|
|
deleteMessageDiscord,
|
|
editChannelDiscord,
|
|
editMessageDiscord,
|
|
pinMessageDiscord,
|
|
sendDiscordComponentMessage,
|
|
sendMessageDiscord,
|
|
sendPollDiscord,
|
|
sendTypingDiscord,
|
|
unpinMessageDiscord,
|
|
} from "../../../extensions/discord/src/send.js";
|
|
import { monitorIMessageProvider } from "../../../extensions/imessage/src/monitor.js";
|
|
import { probeIMessage } from "../../../extensions/imessage/src/probe.js";
|
|
import { sendMessageIMessage } from "../../../extensions/imessage/src/send.js";
|
|
import { monitorSignalProvider } from "../../../extensions/signal/src/index.js";
|
|
import { probeSignal } from "../../../extensions/signal/src/probe.js";
|
|
import { sendMessageSignal } from "../../../extensions/signal/src/send.js";
|
|
import {
|
|
listSlackDirectoryGroupsLive,
|
|
listSlackDirectoryPeersLive,
|
|
} from "../../../extensions/slack/src/directory-live.js";
|
|
import { monitorSlackProvider } from "../../../extensions/slack/src/index.js";
|
|
import { probeSlack } from "../../../extensions/slack/src/probe.js";
|
|
import { resolveSlackChannelAllowlist } from "../../../extensions/slack/src/resolve-channels.js";
|
|
import { resolveSlackUserAllowlist } from "../../../extensions/slack/src/resolve-users.js";
|
|
import { sendMessageSlack } from "../../../extensions/slack/src/send.js";
|
|
import {
|
|
auditTelegramGroupMembership,
|
|
collectTelegramUnmentionedGroupIds,
|
|
} from "../../../extensions/telegram/src/audit.js";
|
|
import { monitorTelegramProvider } from "../../../extensions/telegram/src/monitor.js";
|
|
import { probeTelegram } from "../../../extensions/telegram/src/probe.js";
|
|
import {
|
|
deleteMessageTelegram,
|
|
editMessageReplyMarkupTelegram,
|
|
editMessageTelegram,
|
|
pinMessageTelegram,
|
|
renameForumTopicTelegram,
|
|
sendMessageTelegram,
|
|
sendPollTelegram,
|
|
sendTypingTelegram,
|
|
unpinMessageTelegram,
|
|
} from "../../../extensions/telegram/src/send.js";
|
|
import { resolveTelegramToken } from "../../../extensions/telegram/src/token.js";
|
|
import { resolveEffectiveMessagesConfig, resolveHumanDelayConfig } from "../../agents/identity.js";
|
|
import { handleSlackAction } from "../../agents/tools/slack-actions.js";
|
|
import {
|
|
chunkByNewline,
|
|
chunkMarkdownText,
|
|
chunkMarkdownTextWithMode,
|
|
chunkText,
|
|
chunkTextWithMode,
|
|
resolveChunkMode,
|
|
resolveTextChunkLimit,
|
|
} from "../../auto-reply/chunk.js";
|
|
import {
|
|
hasControlCommand,
|
|
isControlCommandMessage,
|
|
shouldComputeCommandAuthorized,
|
|
} from "../../auto-reply/command-detection.js";
|
|
import { shouldHandleTextCommands } from "../../auto-reply/commands-registry.js";
|
|
import { withReplyDispatcher } from "../../auto-reply/dispatch.js";
|
|
import {
|
|
formatAgentEnvelope,
|
|
formatInboundEnvelope,
|
|
resolveEnvelopeFormatOptions,
|
|
} from "../../auto-reply/envelope.js";
|
|
import {
|
|
createInboundDebouncer,
|
|
resolveInboundDebounceMs,
|
|
} from "../../auto-reply/inbound-debounce.js";
|
|
import { dispatchReplyFromConfig } from "../../auto-reply/reply/dispatch-from-config.js";
|
|
import { finalizeInboundContext } from "../../auto-reply/reply/inbound-context.js";
|
|
import {
|
|
buildMentionRegexes,
|
|
matchesMentionPatterns,
|
|
matchesMentionWithExplicit,
|
|
} from "../../auto-reply/reply/mentions.js";
|
|
import { dispatchReplyWithBufferedBlockDispatcher } from "../../auto-reply/reply/provider-dispatcher.js";
|
|
import { createReplyDispatcherWithTyping } from "../../auto-reply/reply/reply-dispatcher.js";
|
|
import { removeAckReactionAfterReply, shouldAckReaction } from "../../channels/ack-reactions.js";
|
|
import { resolveCommandAuthorizedFromAuthorizers } from "../../channels/command-gating.js";
|
|
import { discordMessageActions } from "../../channels/plugins/actions/discord.js";
|
|
import { signalMessageActions } from "../../channels/plugins/actions/signal.js";
|
|
import { telegramMessageActions } from "../../channels/plugins/actions/telegram.js";
|
|
import { recordInboundSession } from "../../channels/session.js";
|
|
import {
|
|
resolveChannelGroupPolicy,
|
|
resolveChannelGroupRequireMention,
|
|
} from "../../config/group-policy.js";
|
|
import { resolveMarkdownTableMode } from "../../config/markdown-tables.js";
|
|
import {
|
|
readSessionUpdatedAt,
|
|
recordSessionMetaFromInbound,
|
|
resolveStorePath,
|
|
updateLastRoute,
|
|
} from "../../config/sessions.js";
|
|
import { getChannelActivity, recordChannelActivity } from "../../infra/channel-activity.js";
|
|
import {
|
|
listLineAccountIds,
|
|
normalizeAccountId as normalizeLineAccountId,
|
|
resolveDefaultLineAccountId,
|
|
resolveLineAccount,
|
|
} from "../../line/accounts.js";
|
|
import { monitorLineProvider } from "../../line/monitor.js";
|
|
import { probeLineBot } from "../../line/probe.js";
|
|
import {
|
|
createQuickReplyItems,
|
|
pushFlexMessage,
|
|
pushLocationMessage,
|
|
pushMessageLine,
|
|
pushMessagesLine,
|
|
pushTemplateMessage,
|
|
pushTextMessageWithQuickReplies,
|
|
sendMessageLine,
|
|
} from "../../line/send.js";
|
|
import { buildTemplateMessageFromPayload } from "../../line/template-messages.js";
|
|
import { convertMarkdownTables } from "../../markdown/tables.js";
|
|
import { fetchRemoteMedia } from "../../media/fetch.js";
|
|
import { saveMediaBuffer } from "../../media/store.js";
|
|
import { buildPairingReply } from "../../pairing/pairing-messages.js";
|
|
import {
|
|
readChannelAllowFromStore,
|
|
upsertChannelPairingRequest,
|
|
} from "../../pairing/pairing-store.js";
|
|
import { buildAgentSessionKey, resolveAgentRoute } from "../../routing/resolve-route.js";
|
|
import { createDiscordTypingLease } from "./runtime-discord-typing.js";
|
|
import { createTelegramTypingLease } from "./runtime-telegram-typing.js";
|
|
import { createRuntimeWhatsApp } from "./runtime-whatsapp.js";
|
|
import type { PluginRuntime } from "./types.js";
|
|
|
|
export function createRuntimeChannel(): PluginRuntime["channel"] {
|
|
return {
|
|
text: {
|
|
chunkByNewline,
|
|
chunkMarkdownText,
|
|
chunkMarkdownTextWithMode,
|
|
chunkText,
|
|
chunkTextWithMode,
|
|
resolveChunkMode,
|
|
resolveTextChunkLimit,
|
|
hasControlCommand,
|
|
resolveMarkdownTableMode,
|
|
convertMarkdownTables,
|
|
},
|
|
reply: {
|
|
dispatchReplyWithBufferedBlockDispatcher,
|
|
createReplyDispatcherWithTyping,
|
|
resolveEffectiveMessagesConfig,
|
|
resolveHumanDelayConfig,
|
|
dispatchReplyFromConfig,
|
|
withReplyDispatcher,
|
|
finalizeInboundContext,
|
|
formatAgentEnvelope,
|
|
/** @deprecated Prefer `BodyForAgent` + structured user-context blocks (do not build plaintext envelopes for prompts). */
|
|
formatInboundEnvelope,
|
|
resolveEnvelopeFormatOptions,
|
|
},
|
|
routing: {
|
|
buildAgentSessionKey,
|
|
resolveAgentRoute,
|
|
},
|
|
pairing: {
|
|
buildPairingReply,
|
|
readAllowFromStore: ({ channel, accountId, env }) =>
|
|
readChannelAllowFromStore(channel, env, accountId),
|
|
upsertPairingRequest: ({ channel, id, accountId, meta, env, pairingAdapter }) =>
|
|
upsertChannelPairingRequest({
|
|
channel,
|
|
id,
|
|
accountId,
|
|
meta,
|
|
env,
|
|
pairingAdapter,
|
|
}),
|
|
},
|
|
media: {
|
|
fetchRemoteMedia,
|
|
saveMediaBuffer,
|
|
},
|
|
activity: {
|
|
record: recordChannelActivity,
|
|
get: getChannelActivity,
|
|
},
|
|
session: {
|
|
resolveStorePath,
|
|
readSessionUpdatedAt,
|
|
recordSessionMetaFromInbound,
|
|
recordInboundSession,
|
|
updateLastRoute,
|
|
},
|
|
mentions: {
|
|
buildMentionRegexes,
|
|
matchesMentionPatterns,
|
|
matchesMentionWithExplicit,
|
|
},
|
|
reactions: {
|
|
shouldAckReaction,
|
|
removeAckReactionAfterReply,
|
|
},
|
|
groups: {
|
|
resolveGroupPolicy: resolveChannelGroupPolicy,
|
|
resolveRequireMention: resolveChannelGroupRequireMention,
|
|
},
|
|
debounce: {
|
|
createInboundDebouncer,
|
|
resolveInboundDebounceMs,
|
|
},
|
|
commands: {
|
|
resolveCommandAuthorizedFromAuthorizers,
|
|
isControlCommandMessage,
|
|
shouldComputeCommandAuthorized,
|
|
shouldHandleTextCommands,
|
|
},
|
|
discord: {
|
|
messageActions: discordMessageActions,
|
|
auditChannelPermissions: auditDiscordChannelPermissions,
|
|
listDirectoryGroupsLive: listDiscordDirectoryGroupsLive,
|
|
listDirectoryPeersLive: listDiscordDirectoryPeersLive,
|
|
probeDiscord,
|
|
resolveChannelAllowlist: resolveDiscordChannelAllowlist,
|
|
resolveUserAllowlist: resolveDiscordUserAllowlist,
|
|
sendComponentMessage: sendDiscordComponentMessage,
|
|
sendMessageDiscord,
|
|
sendPollDiscord,
|
|
monitorDiscordProvider,
|
|
typing: {
|
|
pulse: sendTypingDiscord,
|
|
start: async ({ channelId, accountId, cfg, intervalMs }) =>
|
|
await createDiscordTypingLease({
|
|
channelId,
|
|
accountId,
|
|
cfg,
|
|
intervalMs,
|
|
pulse: async ({ channelId, accountId, cfg }) =>
|
|
void (await sendTypingDiscord(channelId, {
|
|
accountId,
|
|
cfg,
|
|
})),
|
|
}),
|
|
},
|
|
conversationActions: {
|
|
editMessage: editMessageDiscord,
|
|
deleteMessage: deleteMessageDiscord,
|
|
pinMessage: pinMessageDiscord,
|
|
unpinMessage: unpinMessageDiscord,
|
|
createThread: createThreadDiscord,
|
|
editChannel: editChannelDiscord,
|
|
},
|
|
},
|
|
slack: {
|
|
listDirectoryGroupsLive: listSlackDirectoryGroupsLive,
|
|
listDirectoryPeersLive: listSlackDirectoryPeersLive,
|
|
probeSlack,
|
|
resolveChannelAllowlist: resolveSlackChannelAllowlist,
|
|
resolveUserAllowlist: resolveSlackUserAllowlist,
|
|
sendMessageSlack,
|
|
monitorSlackProvider,
|
|
handleSlackAction,
|
|
},
|
|
telegram: {
|
|
auditGroupMembership: auditTelegramGroupMembership,
|
|
collectUnmentionedGroupIds: collectTelegramUnmentionedGroupIds,
|
|
probeTelegram,
|
|
resolveTelegramToken,
|
|
sendMessageTelegram,
|
|
sendPollTelegram,
|
|
monitorTelegramProvider,
|
|
messageActions: telegramMessageActions,
|
|
typing: {
|
|
pulse: sendTypingTelegram,
|
|
start: async ({ to, accountId, cfg, intervalMs, messageThreadId }) =>
|
|
await createTelegramTypingLease({
|
|
to,
|
|
accountId,
|
|
cfg,
|
|
intervalMs,
|
|
messageThreadId,
|
|
pulse: async ({ to, accountId, cfg, messageThreadId }) =>
|
|
await sendTypingTelegram(to, {
|
|
accountId,
|
|
cfg,
|
|
messageThreadId,
|
|
}),
|
|
}),
|
|
},
|
|
conversationActions: {
|
|
editMessage: editMessageTelegram,
|
|
editReplyMarkup: editMessageReplyMarkupTelegram,
|
|
clearReplyMarkup: async (chatIdInput, messageIdInput, opts = {}) =>
|
|
await editMessageReplyMarkupTelegram(chatIdInput, messageIdInput, [], opts),
|
|
deleteMessage: deleteMessageTelegram,
|
|
renameTopic: renameForumTopicTelegram,
|
|
pinMessage: pinMessageTelegram,
|
|
unpinMessage: unpinMessageTelegram,
|
|
},
|
|
},
|
|
signal: {
|
|
probeSignal,
|
|
sendMessageSignal,
|
|
monitorSignalProvider,
|
|
messageActions: signalMessageActions,
|
|
},
|
|
imessage: {
|
|
monitorIMessageProvider,
|
|
probeIMessage,
|
|
sendMessageIMessage,
|
|
},
|
|
whatsapp: createRuntimeWhatsApp(),
|
|
line: {
|
|
listLineAccountIds,
|
|
resolveDefaultLineAccountId,
|
|
resolveLineAccount,
|
|
normalizeAccountId: normalizeLineAccountId,
|
|
probeLineBot,
|
|
sendMessageLine,
|
|
pushMessageLine,
|
|
pushMessagesLine,
|
|
pushFlexMessage,
|
|
pushTemplateMessage,
|
|
pushLocationMessage,
|
|
pushTextMessageWithQuickReplies,
|
|
createQuickReplyItems,
|
|
buildTemplateMessageFromPayload,
|
|
monitorLineProvider,
|
|
},
|
|
};
|
|
}
|