

























@@ -15,7 +15,6 @@ import {
1515} from "openclaw/plugin-sdk/directory-runtime";
1616import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
1717import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
18-import { resolveOutboundSendDep } from "openclaw/plugin-sdk/outbound-runtime";
1918import { sleepWithAbort } from "openclaw/plugin-sdk/runtime-env";
2019import {
2120createComputedAccountStatusAdapter,
@@ -49,16 +48,12 @@ import {
4948resolveDiscordGroupRequireMention,
5049resolveDiscordGroupToolPolicy,
5150} from "./group-policy.js";
52-import { isLikelyDiscordVideoMedia } from "./media-detection.js";
5351import {
5452setThreadBindingIdleTimeoutBySessionKey,
5553setThreadBindingMaxAgeBySessionKey,
5654} from "./monitor/thread-bindings.session-updates.js";
57-import {
58-looksLikeDiscordTargetId,
59-normalizeDiscordMessagingTarget,
60-normalizeDiscordOutboundTarget,
61-} from "./normalize.js";
55+import { looksLikeDiscordTargetId, normalizeDiscordMessagingTarget } from "./normalize.js";
56+import { discordOutbound } from "./outbound-adapter.js";
6257import { resolveDiscordOutboundSessionRoute } from "./outbound-session-route.js";
6358import type { DiscordProbe } from "./probe.js";
6459import { getDiscordRuntime } from "./runtime.js";
@@ -69,8 +64,6 @@ import { createDiscordPluginBase, discordConfigAdapter } from "./shared.js";
6964import { collectDiscordStatusIssues } from "./status-issues.js";
7065import { parseDiscordTarget } from "./target-parsing.js";
716672-type DiscordSendFn = typeof import("./send.js").sendMessageDiscord;
73-7467let discordProviderRuntimePromise:
7568| Promise<typeof import("./monitor/provider.runtime.js")>
7669| undefined;
@@ -145,22 +138,6 @@ function resolveRuntimeDiscordMessageActions() {
145138}
146139}
147140148-function resolveOptionalDiscordRuntime() {
149-try {
150-return getDiscordRuntime();
151-} catch {
152-return null;
153-}
154-}
155-156-async function resolveDiscordSend(deps?: { [channelId: string]: unknown }): Promise<DiscordSendFn> {
157-return (
158-resolveOutboundSendDep<DiscordSendFn>(deps, "discord") ??
159-resolveOptionalDiscordRuntime()?.channel?.discord?.sendMessageDiscord ??
160-(await loadDiscordSendModule()).sendMessageDiscord
161-);
162-}
163-164141const discordMessageActions = {
165142describeMessageTool: (
166143ctx: Parameters<NonNullable<ChannelMessageActionAdapter["describeMessageTool"]>>[0],
@@ -811,84 +788,13 @@ export const discordPlugin: ChannelPlugin<ResolvedDiscordAccount, DiscordProbe>
811788},
812789},
813790outbound: {
814-base: {
815-deliveryMode: "direct",
816-chunker: null,
817-textChunkLimit: 2000,
818-pollMaxOptions: 10,
819-shouldTreatDeliveredTextAsVisible: shouldTreatDiscordDeliveredTextAsVisible,
820-shouldSuppressLocalPayloadPrompt: ({ cfg, accountId, payload }) =>
821-shouldSuppressLocalDiscordExecApprovalPrompt({
822- cfg,
823- accountId,
824- payload,
825-}),
826-resolveTarget: ({ to }) => normalizeDiscordOutboundTarget(to),
827-},
828-attachedResults: {
829-channel: "discord",
830-sendText: async ({ cfg, to, text, accountId, deps, replyToId, threadId, silent }) => {
831-const send = await resolveDiscordSend(deps);
832-return await send(resolveDiscordAttachedOutboundTarget({ to, threadId }), text, {
833-verbose: false,
834- cfg,
835-replyTo: replyToId ?? undefined,
836-accountId: accountId ?? undefined,
837-silent: silent ?? undefined,
838-});
839-},
840-sendMedia: async ({
791+ ...discordOutbound,
792+shouldTreatDeliveredTextAsVisible: shouldTreatDiscordDeliveredTextAsVisible,
793+shouldSuppressLocalPayloadPrompt: ({ cfg, accountId, payload }) =>
794+shouldSuppressLocalDiscordExecApprovalPrompt({
841795 cfg,
842- to,
843- text,
844- mediaUrl,
845- mediaLocalRoots,
846- mediaReadFile,
847796 accountId,
848- deps,
849- replyToId,
850- threadId,
851- silent,
852-}) => {
853-const send = await resolveDiscordSend(deps);
854-const target = resolveDiscordAttachedOutboundTarget({ to, threadId });
855-if (text.trim() && mediaUrl && isLikelyDiscordVideoMedia(mediaUrl)) {
856-await send(target, text, {
857-verbose: false,
858- cfg,
859-replyTo: replyToId ?? undefined,
860-accountId: accountId ?? undefined,
861-silent: silent ?? undefined,
862-});
863-return await send(target, "", {
864-verbose: false,
865- cfg,
866- mediaUrl,
867- mediaLocalRoots,
868- mediaReadFile,
869-accountId: accountId ?? undefined,
870-silent: silent ?? undefined,
871-});
872-}
873-return await send(target, text, {
874-verbose: false,
875- cfg,
876- mediaUrl,
877- mediaLocalRoots,
878- mediaReadFile,
879-replyTo: replyToId ?? undefined,
880-accountId: accountId ?? undefined,
881-silent: silent ?? undefined,
882-});
883-},
884-sendPoll: async ({ cfg, to, poll, accountId, threadId, silent }) =>
885-await (
886-await loadDiscordSendModule()
887-).sendPollDiscord(resolveDiscordAttachedOutboundTarget({ to, threadId }), poll, {
888- cfg,
889-accountId: accountId ?? undefined,
890-silent: silent ?? undefined,
891-}),
892-},
797+ payload,
798+}),
893799},
894800});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。