11import {
2+ buildChannelTurnContext ,
23 formatInboundEnvelope ,
34 resolveEnvelopeFormatOptions ,
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 ,
2625 resolveReferencedReplyMediaList ,
2726 resolveDiscordMessageText ,
2827 type DiscordMediaInfo ,
@@ -263,7 +262,6 @@ export async function buildDiscordMessageProcessContext(params: {
263262 parentSessionKey = undefined ;
264263 }
265264 }
266- const mediaPayload = buildDiscordMediaPayload ( mediaListForContext ) ;
267265 const preflightAudioIndex =
268266 preflightAudioTranscript === undefined
269267 ? - 1
@@ -329,59 +327,102 @@ export async function buildDiscordMessageProcessContext(params: {
329327 sessionKey : effectiveSessionKey ,
330328 } ) ;
331329
332- 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 : {
377395 kind : "text-slash" as const ,
378396 source : "text" as const ,
379397 authorized : commandAuthorized ,
380398 body : 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 } ) ;
386427 const persistedSessionKey = ctxPayload . SessionKey ?? route . sessionKey ;
387428
0 commit comments