










@@ -2245,6 +2245,79 @@ Second paragraph should still reach the agent after Slack's preview cutoff.`;
22452245expect(prepared.ctxPayload.MentionSource).toBe("implicit_thread");
22462246});
224722472248+it("flags an explicit <@bot> mention as explicit_bot when botUserId is set", async () => {
2249+const slackCtx = createInboundSlackCtx({
2250+cfg: {
2251+channels: {
2252+slack: {
2253+enabled: true,
2254+groupPolicy: "open",
2255+channels: { C0AGENTS: { requireMention: true } },
2256+},
2257+},
2258+} as OpenClawConfig,
2259+defaultRequireMention: true,
2260+});
2261+slackCtx.resolveChannelName = async () => ({ name: "agents", type: "channel" });
2262+slackCtx.resolveUserName = async () => ({ name: "Bek" });
2263+2264+const prepared = await prepareSlackMessage({
2265+ctx: slackCtx,
2266+account: createSlackAccount(),
2267+message: {
2268+type: "message",
2269+channel: "C0AGENTS",
2270+channel_type: "channel",
2271+user: "U_BEK",
2272+text: "<@B1> trying again",
2273+ts: "1779226598.721349",
2274+} as SlackMessageEvent,
2275+opts: { source: "message" },
2276+});
2277+2278+assertPrepared(prepared);
2279+expect(prepared.ctxPayload.ExplicitlyMentionedBot).toBe(true);
2280+expect(prepared.ctxPayload.MentionedUserIds).toEqual(["B1"]);
2281+expect(prepared.ctxPayload.MentionSource).toBe("explicit_bot");
2282+});
2283+2284+it("does not flag explicit_bot when botUserId is empty (auth.test failure mode)", async () => {
2285+const slackCtx = createInboundSlackCtx({
2286+cfg: {
2287+channels: {
2288+slack: {
2289+enabled: true,
2290+groupPolicy: "open",
2291+channels: { C0AGENTS: { requireMention: false } },
2292+},
2293+},
2294+} as OpenClawConfig,
2295+defaultRequireMention: false,
2296+});
2297+(slackCtx as { botUserId: string }).botUserId = "";
2298+slackCtx.resolveChannelName = async () => ({ name: "agents", type: "channel" });
2299+slackCtx.resolveUserName = async () => ({ name: "Bek" });
2300+2301+const prepared = await prepareSlackMessage({
2302+ctx: slackCtx,
2303+account: createSlackAccount(),
2304+message: {
2305+type: "message",
2306+channel: "C0AGENTS",
2307+channel_type: "channel",
2308+user: "U_BEK",
2309+text: "<@B1> trying again",
2310+ts: "1779226598.721349",
2311+} as SlackMessageEvent,
2312+opts: { source: "message" },
2313+});
2314+2315+assertPrepared(prepared);
2316+expect(prepared.ctxPayload.ExplicitlyMentionedBot).toBe(false);
2317+expect(prepared.ctxPayload.MentionedUserIds).toEqual(["B1"]);
2318+expect(prepared.ctxPayload.MentionSource).not.toBe("explicit_bot");
2319+});
2320+22482321it("marks authorized implicit thread control-command wakes as command bypass source", async () => {
22492322const { storePath } = storeFixture.makeTmpStorePath();
22502323const slackCtx = createInboundSlackCtx({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。