






























@@ -26,7 +26,7 @@ import { recordInboundSession } from "openclaw/plugin-sdk/conversation-runtime";
2626import {
2727hasFinalInboundReplyDispatch,
2828recordChannelBotPairLoopAndCheckSuppression,
29-runInboundReplyTurn,
29+runPreparedInboundReplyTurn,
3030} from "openclaw/plugin-sdk/inbound-reply-dispatch";
3131import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/markdown-table-runtime";
3232import { getAgentScopedMediaLocalRoots } from "openclaw/plugin-sdk/media-runtime";
@@ -631,184 +631,169 @@ export async function processDiscordMessage(
631631await settleDispatchBeforeStart();
632632return;
633633}
634-const preparedResult = await runInboundReplyTurn({
634+const preparedResult = await runPreparedInboundReplyTurn({
635635channel: "discord",
636636accountId: route.accountId,
637-raw: ctx,
638-adapter: {
639-ingest: () => ({
640-id: message.id,
641-timestamp: message.timestamp ? Date.parse(message.timestamp) : undefined,
642-rawText: text,
643-textForAgent: ctxPayload.BodyForAgent,
644-textForCommands: ctxPayload.CommandBody,
645-raw: message,
646-}),
647-resolveTurn: () => ({
648-channel: "discord",
649-accountId: route.accountId,
650-routeSessionKey: persistedSessionKey,
651-storePath: turn.storePath,
652- ctxPayload,
653- recordInboundSession,
654-record: turn.record,
655-history: {
656-isGroup: isGuildMessage,
657-historyKey: messageChannelId,
658-historyMap: guildHistories,
659-limit: historyLimit,
660-},
661-onPreDispatchFailure: settleDispatchBeforeStart,
662-runDispatch: async () => {
663-return await dispatchInboundMessage({
664-ctx: ctxPayload,
665- cfg,
666- dispatcher,
667-replyOptions: {
668- ...replyOptions,
669- abortSignal,
670-skillFilter: channelConfig?.skills,
671- sourceReplyDeliveryMode,
672-disableBlockStreaming: sourceRepliesAreToolOnly
673- ? true
674- : (draftPreview.disableBlockStreamingForDraft ??
675-(typeof resolvedBlockStreamingEnabled === "boolean"
676- ? !resolvedBlockStreamingEnabled
677- : undefined)),
678-onPartialReply: draftPreview.draftStream
679- ? (payload) => draftPreview.updateFromPartial(payload.text)
680- : undefined,
681-onAssistantMessageStart: draftPreview.draftStream
682- ? () => draftPreview.handleAssistantMessageBoundary()
683- : undefined,
684-onReasoningEnd: draftPreview.draftStream
685- ? () => draftPreview.handleAssistantMessageBoundary()
686- : undefined,
687- onModelSelected,
688-suppressDefaultToolProgressMessages:
689-draftPreview.suppressDefaultToolProgressMessages ? true : undefined,
690-onReasoningStream: async (payload) => {
691-await statusReactions.setThinking();
692-const formattedText = payload?.text
693- ? formatReasoningMessage(payload.text)
694- : undefined;
695-await draftPreview.pushReasoningProgress(formattedText);
696-},
697-onToolStart: async (payload) => {
698-if (isProcessAborted(abortSignal)) {
699-return;
700-}
701-await maybeBindStatusReactionsToToolReaction(payload);
702-await statusReactions.setTool(payload.name);
703-await draftPreview.pushToolProgress(
704-buildChannelProgressDraftLineForEntry(
705-discordConfig,
706-{
707-event: "tool",
708-name: payload.name,
709-phase: payload.phase,
710-args: payload.args,
711-},
712-payload.detailMode ? { detailMode: payload.detailMode } : undefined,
713-),
714-{ toolName: payload.name },
715-);
716-},
717-onItemEvent: async (payload) => {
718-await draftPreview.pushToolProgress(
719-buildChannelProgressDraftLineForEntry(discordConfig, {
720-event: "item",
721-itemId: payload.itemId,
722-itemKind: payload.kind,
723-title: payload.title,
724-name: payload.name,
725-phase: payload.phase,
726-status: payload.status,
727-summary: payload.summary,
728-progressText: payload.progressText,
729-meta: payload.meta,
730-}),
731-);
732-},
733-onPlanUpdate: async (payload) => {
734-if (payload.phase !== "update") {
735-return;
736-}
737-await draftPreview.pushToolProgress(
738-buildChannelProgressDraftLine({
739-event: "plan",
740-phase: payload.phase,
741-title: payload.title,
742-explanation: payload.explanation,
743-steps: payload.steps,
744-}),
745-);
746-},
747-onApprovalEvent: async (payload) => {
748-if (payload.phase !== "requested") {
749-return;
750-}
751-await draftPreview.pushToolProgress(
752-buildChannelProgressDraftLine({
753-event: "approval",
754-phase: payload.phase,
755-title: payload.title,
756-command: payload.command,
757-reason: payload.reason,
758-message: payload.message,
759-}),
760-);
761-},
762-onCommandOutput: async (payload) => {
763-if (payload.phase !== "end") {
764-return;
765-}
766-await draftPreview.pushToolProgress(
767-buildChannelProgressDraftLine({
768-event: "command-output",
769-phase: payload.phase,
770-title: payload.title,
771-name: payload.name,
772-status: payload.status,
773-exitCode: payload.exitCode,
774-}),
775-);
776-},
777-onPatchSummary: async (payload) => {
778-if (payload.phase !== "end") {
779-return;
780-}
781-await draftPreview.pushToolProgress(
782-buildChannelProgressDraftLine({
783-event: "patch",
784-phase: payload.phase,
785-title: payload.title,
786-name: payload.name,
787-added: payload.added,
788-modified: payload.modified,
789-deleted: payload.deleted,
790-summary: payload.summary,
791-}),
792-);
793-},
794-onCompactionStart: async () => {
795-if (isProcessAborted(abortSignal)) {
796-return;
797-}
798-await statusReactions.setCompacting();
799-},
800-onCompactionEnd: async () => {
801-if (isProcessAborted(abortSignal)) {
802-return;
803-}
804-statusReactions.cancelPending();
805-await statusReactions.setThinking();
806-},
807-},
808-});
637+routeSessionKey: persistedSessionKey,
638+storePath: turn.storePath,
639+ ctxPayload,
640+ recordInboundSession,
641+record: turn.record,
642+history: {
643+isGroup: isGuildMessage,
644+historyKey: messageChannelId,
645+historyMap: guildHistories,
646+limit: historyLimit,
647+},
648+onPreDispatchFailure: settleDispatchBeforeStart,
649+runDispatch: async () =>
650+await dispatchInboundMessage({
651+ctx: ctxPayload,
652+ cfg,
653+ dispatcher,
654+replyOptions: {
655+ ...replyOptions,
656+ abortSignal,
657+skillFilter: channelConfig?.skills,
658+ sourceReplyDeliveryMode,
659+disableBlockStreaming: sourceRepliesAreToolOnly
660+ ? true
661+ : (draftPreview.disableBlockStreamingForDraft ??
662+(typeof resolvedBlockStreamingEnabled === "boolean"
663+ ? !resolvedBlockStreamingEnabled
664+ : undefined)),
665+onPartialReply: draftPreview.draftStream
666+ ? (payload) => draftPreview.updateFromPartial(payload.text)
667+ : undefined,
668+onAssistantMessageStart: draftPreview.draftStream
669+ ? () => draftPreview.handleAssistantMessageBoundary()
670+ : undefined,
671+onReasoningEnd: draftPreview.draftStream
672+ ? () => draftPreview.handleAssistantMessageBoundary()
673+ : undefined,
674+ onModelSelected,
675+suppressDefaultToolProgressMessages: draftPreview.suppressDefaultToolProgressMessages
676+ ? true
677+ : undefined,
678+onReasoningStream: async (payload) => {
679+await statusReactions.setThinking();
680+const formattedText = payload?.text
681+ ? formatReasoningMessage(payload.text)
682+ : undefined;
683+await draftPreview.pushReasoningProgress(formattedText);
684+},
685+onToolStart: async (payload) => {
686+if (isProcessAborted(abortSignal)) {
687+return;
688+}
689+await maybeBindStatusReactionsToToolReaction(payload);
690+await statusReactions.setTool(payload.name);
691+await draftPreview.pushToolProgress(
692+buildChannelProgressDraftLineForEntry(
693+discordConfig,
694+{
695+event: "tool",
696+name: payload.name,
697+phase: payload.phase,
698+args: payload.args,
699+},
700+payload.detailMode ? { detailMode: payload.detailMode } : undefined,
701+),
702+{ toolName: payload.name },
703+);
704+},
705+onItemEvent: async (payload) => {
706+await draftPreview.pushToolProgress(
707+buildChannelProgressDraftLineForEntry(discordConfig, {
708+event: "item",
709+itemId: payload.itemId,
710+itemKind: payload.kind,
711+title: payload.title,
712+name: payload.name,
713+phase: payload.phase,
714+status: payload.status,
715+summary: payload.summary,
716+progressText: payload.progressText,
717+meta: payload.meta,
718+}),
719+);
720+},
721+onPlanUpdate: async (payload) => {
722+if (payload.phase !== "update") {
723+return;
724+}
725+await draftPreview.pushToolProgress(
726+buildChannelProgressDraftLine({
727+event: "plan",
728+phase: payload.phase,
729+title: payload.title,
730+explanation: payload.explanation,
731+steps: payload.steps,
732+}),
733+);
734+},
735+onApprovalEvent: async (payload) => {
736+if (payload.phase !== "requested") {
737+return;
738+}
739+await draftPreview.pushToolProgress(
740+buildChannelProgressDraftLine({
741+event: "approval",
742+phase: payload.phase,
743+title: payload.title,
744+command: payload.command,
745+reason: payload.reason,
746+message: payload.message,
747+}),
748+);
749+},
750+onCommandOutput: async (payload) => {
751+if (payload.phase !== "end") {
752+return;
753+}
754+await draftPreview.pushToolProgress(
755+buildChannelProgressDraftLine({
756+event: "command-output",
757+phase: payload.phase,
758+title: payload.title,
759+name: payload.name,
760+status: payload.status,
761+exitCode: payload.exitCode,
762+}),
763+);
764+},
765+onPatchSummary: async (payload) => {
766+if (payload.phase !== "end") {
767+return;
768+}
769+await draftPreview.pushToolProgress(
770+buildChannelProgressDraftLine({
771+event: "patch",
772+phase: payload.phase,
773+title: payload.title,
774+name: payload.name,
775+added: payload.added,
776+modified: payload.modified,
777+deleted: payload.deleted,
778+summary: payload.summary,
779+}),
780+);
781+},
782+onCompactionStart: async () => {
783+if (isProcessAborted(abortSignal)) {
784+return;
785+}
786+await statusReactions.setCompacting();
787+},
788+onCompactionEnd: async () => {
789+if (isProcessAborted(abortSignal)) {
790+return;
791+}
792+statusReactions.cancelPending();
793+await statusReactions.setThinking();
794+},
809795},
810796}),
811-},
812797});
813798if (!preparedResult.dispatched) {
814799return;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。