




















@@ -1,13 +1,15 @@
11import type { AckReactionHandle } from "openclaw/plugin-sdk/channel-feedback";
2+import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
23import type { getReplyFromConfig } from "openclaw/plugin-sdk/reply-runtime";
34import type { MsgContext } from "openclaw/plugin-sdk/reply-runtime";
45import { resolveAgentRoute } from "openclaw/plugin-sdk/routing";
56import { buildGroupHistoryKey } from "openclaw/plugin-sdk/routing";
67import { logVerbose } from "openclaw/plugin-sdk/runtime-env";
8+import { resolveWhatsAppAccount } from "../../accounts.js";
79import { resolveWhatsAppGroupSessionRoute } from "../../group-session-key.js";
810import { getPrimaryIdentityId, getSenderIdentity } from "../../identity.js";
911import { normalizeE164 } from "../../text-runtime.js";
10-import { getRuntimeConfig } from "../config.runtime.js";
12+import { buildMentionConfig } from "../mentions.js";
1113import type { MentionConfig } from "../mentions.js";
1214import type { WebInboundMsg } from "../types.js";
1315import { maybeSendAckReaction } from "./ack-reaction.js";
@@ -20,7 +22,8 @@ import { resolvePeerId } from "./peer.js";
2022import { processMessage } from "./process-message.js";
21232224export function createWebOnMessageHandler(params: {
23-cfg: ReturnType<typeof getRuntimeConfig>;
25+cfg: OpenClawConfig;
26+loadConfig?: () => OpenClawConfig;
2427verbose: boolean;
2528connectionId: string;
2629maxMediaBytes: number;
@@ -35,6 +38,7 @@ export function createWebOnMessageHandler(params: {
3538account: { authDir?: string; accountId?: string; selfChatMode?: boolean };
3639}) {
3740const processForRoute = async (
41+cfg: OpenClawConfig,
3842msg: WebInboundMsg,
3943route: ReturnType<typeof resolveAgentRoute>,
4044groupHistoryKey: string,
@@ -47,7 +51,7 @@ export function createWebOnMessageHandler(params: {
4751},
4852) => {
4953const processParams: Parameters<typeof processMessage>[0] = {
50-cfg: params.cfg,
54+ cfg,
5155 msg,
5256 route,
5357 groupHistoryKey,
@@ -83,11 +87,11 @@ export function createWebOnMessageHandler(params: {
8387};
84888589return async (msg: WebInboundMsg) => {
90+const cfg = params.loadConfig?.() ?? params.cfg;
8691const conversationId = msg.conversationId ?? msg.from;
8792const peerId = resolvePeerId(msg);
88-// Fresh config for bindings lookup; other routing inputs are payload-derived.
8993const baseRoute = resolveAgentRoute({
90-cfg: getRuntimeConfig(),
94+ cfg,
9195channel: "whatsapp",
9296accountId: msg.accountId,
9397peer: {
@@ -106,6 +110,11 @@ export function createWebOnMessageHandler(params: {
106110 peerId,
107111})
108112 : route.sessionKey;
113+const account = resolveWhatsAppAccount({
114+ cfg,
115+accountId: route.accountId ?? msg.accountId ?? params.account.accountId,
116+});
117+const baseMentionConfig = buildMentionConfig(cfg);
109118110119// Same-phone mode logging retained
111120if (msg.from === msg.to) {
@@ -142,7 +151,7 @@ export function createWebOnMessageHandler(params: {
142151return;
143152}
144153ackReaction = await maybeSendAckReaction({
145-cfg: params.cfg,
154+ cfg,
146155 msg,
147156agentId: route.agentId,
148157sessionKey: route.sessionKey,
@@ -170,7 +179,7 @@ export function createWebOnMessageHandler(params: {
170179OriginatingTo: conversationId,
171180AccountId: route.accountId,
172181},
173-cfg: params.cfg,
182+ cfg,
174183})) ?? null;
175184} catch {
176185// Non-fatal: store null so per-agent retries are suppressed.
@@ -197,7 +206,7 @@ export function createWebOnMessageHandler(params: {
197206OriginatingTo: conversationId,
198207} satisfies MsgContext;
199208updateLastRouteInBackground({
200-cfg: params.cfg,
209+ cfg,
201210backgroundTasks: params.backgroundTasks,
202211storeAgentId: route.agentId,
203212sessionKey: route.sessionKey,
@@ -209,16 +218,16 @@ export function createWebOnMessageHandler(params: {
209218});
210219211220let gating = await applyGroupGating({
212-cfg: params.cfg,
221+ cfg,
213222 msg,
214223deferMissingMention: hasAudioBody && Boolean(msg.mediaPath),
215224 conversationId,
216225 groupHistoryKey,
217226agentId: route.agentId,
218227sessionKey: route.sessionKey,
219-baseMentionConfig: params.baseMentionConfig,
220-authDir: params.account.authDir,
221-selfChatMode: params.account.selfChatMode,
228+ baseMentionConfig,
229+authDir: account.authDir,
230+selfChatMode: account.selfChatMode,
222231groupHistories: params.groupHistories,
223232groupHistoryLimit: params.groupHistoryLimit,
224233groupMemberNames: params.groupMemberNames,
@@ -232,7 +241,7 @@ export function createWebOnMessageHandler(params: {
232241) {
233242await runAudioPreflightOnce();
234243gating = await applyGroupGating({
235-cfg: params.cfg,
244+ cfg,
236245 msg,
237246 ...(typeof preflightAudioTranscript === "string"
238247 ? { mentionText: preflightAudioTranscript }
@@ -241,9 +250,9 @@ export function createWebOnMessageHandler(params: {
241250 groupHistoryKey,
242251agentId: route.agentId,
243252sessionKey: route.sessionKey,
244-baseMentionConfig: params.baseMentionConfig,
245-authDir: params.account.authDir,
246-selfChatMode: params.account.selfChatMode,
253+ baseMentionConfig,
254+authDir: account.authDir,
255+selfChatMode: account.selfChatMode,
247256groupHistories: params.groupHistories,
248257groupHistoryLimit: params.groupHistoryLimit,
249258groupMemberNames: params.groupMemberNames,
@@ -271,7 +280,7 @@ export function createWebOnMessageHandler(params: {
271280// Does not bypass group mention/activation gating above.
272281if (
273282await maybeBroadcastMessage({
274-cfg: params.cfg,
283+ cfg,
275284 msg,
276285 peerId,
277286 route,
@@ -283,13 +292,13 @@ export function createWebOnMessageHandler(params: {
283292// per-agent checks during broadcast fan-out.
284293 ...(ackAlreadySent && msg.chatType !== "group" ? { ackAlreadySent: true } : {}),
285294 ...(ackReaction && msg.chatType !== "group" ? { ackReaction } : {}),
286-processMessage: (m, r, k, opts) => processForRoute(m, r, k, opts),
295+processMessage: (m, r, k, opts) => processForRoute(cfg, m, r, k, opts),
287296})
288297) {
289298return;
290299}
291300292-await processForRoute(msg, route, groupHistoryKey, {
301+await processForRoute(cfg, msg, route, groupHistoryKey, {
293302 ...(preflightAudioTranscript !== undefined ? { preflightAudioTranscript } : {}),
294303 ...(ackAlreadySent ? { ackAlreadySent: true } : {}),
295304 ...(ackReaction ? { ackReaction } : {}),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。