


























@@ -1,11 +1,11 @@
11import {
2+buildChannelTurnContext,
23formatInboundEnvelope,
34resolveEnvelopeFormatOptions,
45} from "openclaw/plugin-sdk/channel-inbound";
56import { resolveChannelContextVisibilityMode } from "openclaw/plugin-sdk/context-visibility-runtime";
67import { resolvePinnedMainDmOwnerFromAllowlist } from "openclaw/plugin-sdk/conversation-runtime";
78import { isDangerousNameMatchingEnabled } from "openclaw/plugin-sdk/dangerous-name-runtime";
8-import { finalizeInboundContext } from "openclaw/plugin-sdk/reply-dispatch-runtime";
99import { createChannelHistoryWindow } from "openclaw/plugin-sdk/reply-history";
1010import { buildAgentSessionKey, resolveThreadSessionKeys } from "openclaw/plugin-sdk/routing";
1111import { danger, logVerbose, shouldLogVerbose } from "openclaw/plugin-sdk/runtime-env";
@@ -22,7 +22,6 @@ import {
2222} from "./inbound-context.js";
2323import type { DiscordMessagePreflightContext } from "./message-handler.preflight.js";
2424import {
25-buildDiscordMediaPayload,
2625resolveReferencedReplyMediaList,
2726resolveDiscordMessageText,
2827type DiscordMediaInfo,
@@ -263,7 +262,6 @@ export async function buildDiscordMessageProcessContext(params: {
263262parentSessionKey = undefined;
264263}
265264}
266-const mediaPayload = buildDiscordMediaPayload(mediaListForContext);
267265const preflightAudioIndex =
268266preflightAudioTranscript === undefined
269267 ? -1
@@ -329,59 +327,102 @@ export async function buildDiscordMessageProcessContext(params: {
329327sessionKey: effectiveSessionKey,
330328});
331329332-const ctxPayload = finalizeInboundContext({
333-Body: combinedBody,
334-BodyForAgent: preflightAudioTranscript ?? baseText ?? text,
335-InboundHistory: inboundHistory,
336-RawBody: preflightAudioTranscript ?? baseText,
337-CommandBody: preflightAudioTranscript ?? baseText,
338- ...(preflightAudioTranscript !== undefined ? { Transcript: preflightAudioTranscript } : {}),
339-From: effectiveFrom,
340-To: effectiveTo,
341-SessionKey: effectiveSessionKey,
342-AccountId: route.accountId,
343-ChatType: isDirectMessage ? "direct" : "channel",
344-ConversationLabel: fromLabel,
345-SenderName: senderName,
346-SenderId: sender.id,
347-SenderUsername: senderUsername,
348-SenderTag: sender.tag,
349-GroupSubject: groupSubject,
350-GroupChannel: groupChannel,
351-MemberRoleIds: memberRoleIds,
352-UntrustedContext: untrustedContext,
353-GroupSystemPrompt: isGuildMessage ? groupSystemPrompt : undefined,
354-GroupSpace: isGuildMessage ? (guildInfo?.id ?? guildSlug) || undefined : undefined,
355-OwnerAllowFrom: ownerAllowFrom,
356-Provider: "discord" as const,
357-Surface: "discord" as const,
358-WasMentioned: ctx.effectiveWasMentioned,
359-MessageSid: canonicalMessageId ?? message.id,
360- ...(canonicalMessageId && canonicalMessageId !== message.id
361- ? { MessageSidFull: message.id }
362- : {}),
363-ReplyToId: filteredReplyContext?.id,
364-ReplyToBody: filteredReplyContext?.body,
365-ReplyToSender: filteredReplyContext?.sender,
366-ParentSessionKey: autoThreadContext?.ParentSessionKey ?? threadKeys.parentSessionKey,
367-ModelParentSessionKey:
368-autoThreadContext?.ModelParentSessionKey ?? modelParentSessionKey ?? undefined,
369-MessageThreadId: threadChannel?.id ?? autoThreadContext?.createdThreadId ?? undefined,
370-ThreadStarterBody: !effectivePreviousTimestamp ? threadStarterBody : undefined,
371-ThreadLabel: threadLabel,
372-Timestamp: resolveTimestampMs(message.timestamp),
373- ...mediaPayload,
374- ...(preflightAudioIndex >= 0 ? { MediaTranscribedIndexes: [preflightAudioIndex] } : {}),
375-CommandAuthorized: commandAuthorized,
376-CommandTurn: {
330+const ctxPayload = buildChannelTurnContext({
331+channel: "discord",
332+provider: "discord",
333+surface: "discord",
334+accountId: route.accountId,
335+messageId: canonicalMessageId ?? message.id,
336+messageIdFull: canonicalMessageId && canonicalMessageId !== message.id ? message.id : undefined,
337+timestamp: resolveTimestampMs(message.timestamp),
338+from: effectiveFrom,
339+sender: {
340+id: sender.id,
341+name: senderName,
342+username: senderUsername,
343+tag: sender.tag,
344+roles: memberRoleIds,
345+displayLabel: senderLabel,
346+},
347+conversation: {
348+kind: isDirectMessage ? "direct" : "channel",
349+id: messageChannelId,
350+label: fromLabel,
351+spaceId: isGuildMessage ? (guildInfo?.id ?? guildSlug) || undefined : undefined,
352+threadId: threadChannel?.id ?? autoThreadContext?.createdThreadId ?? undefined,
353+routePeer: {
354+kind: isDirectMessage ? "direct" : "channel",
355+id: isDirectMessage ? author.id : messageChannelId,
356+},
357+},
358+route: {
359+agentId: route.agentId,
360+accountId: route.accountId,
361+routeSessionKey: route.sessionKey,
362+dispatchSessionKey: effectiveSessionKey,
363+parentSessionKey: autoThreadContext?.ParentSessionKey ?? threadKeys.parentSessionKey,
364+modelParentSessionKey:
365+autoThreadContext?.ModelParentSessionKey ?? modelParentSessionKey ?? undefined,
366+},
367+reply: {
368+to: effectiveTo,
369+ originatingTo,
370+},
371+message: {
372+body: combinedBody,
373+rawBody: preflightAudioTranscript ?? baseText,
374+bodyForAgent: preflightAudioTranscript ?? baseText ?? text,
375+commandBody: preflightAudioTranscript ?? baseText,
376+envelopeFrom: fromLabel,
377+ inboundHistory,
378+},
379+access: {
380+mentions: {
381+canDetectMention: ctx.canDetectMention,
382+wasMentioned: ctx.effectiveWasMentioned,
383+hasAnyMention: ctx.hasAnyMention,
384+requireMention: ctx.shouldRequireMention,
385+effectiveWasMentioned: ctx.effectiveWasMentioned,
386+},
387+commands: {
388+authorized: commandAuthorized,
389+allowTextCommands: ctx.allowTextCommands,
390+useAccessGroups: false,
391+authorizers: [],
392+},
393+},
394+commandTurn: {
377395kind: "text-slash" as const,
378396source: "text" as const,
379397authorized: commandAuthorized,
380398body: preflightAudioTranscript ?? baseText,
381399},
382-CommandSource: "text" as const,
383-OriginatingChannel: "discord" as const,
384-OriginatingTo: originatingTo,
400+media: mediaListForContext.map((media, index) => ({
401+path: media.path,
402+contentType: media.contentType,
403+transcribed: index === preflightAudioIndex,
404+})),
405+supplemental: {
406+quote: filteredReplyContext
407+ ? {
408+id: filteredReplyContext.id,
409+body: filteredReplyContext.body,
410+sender: filteredReplyContext.sender,
411+}
412+ : undefined,
413+thread: {
414+starterBody: !effectivePreviousTimestamp ? threadStarterBody : undefined,
415+label: threadLabel,
416+},
417+groupSystemPrompt: isGuildMessage ? groupSystemPrompt : undefined,
418+},
419+extra: {
420+ ...(preflightAudioTranscript !== undefined ? { Transcript: preflightAudioTranscript } : {}),
421+GroupSubject: groupSubject,
422+GroupChannel: groupChannel,
423+UntrustedContext: untrustedContext,
424+OwnerAllowFrom: ownerAllowFrom,
425+},
385426});
386427const persistedSessionKey = ctxPayload.SessionKey ?? route.sessionKey;
387428此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。