






























@@ -1,4 +1,5 @@
11import { formatInboundEnvelope } from "openclaw/plugin-sdk/channel-inbound";
2+import { runTasksWithConcurrency } from "openclaw/plugin-sdk/concurrency-runtime";
23import type { ContextVisibilityMode } from "openclaw/plugin-sdk/config-types";
34import { logVerbose } from "openclaw/plugin-sdk/runtime-env";
45import {
@@ -29,6 +30,8 @@ type SlackThreadContextData = {
2930threadStarterMedia: SlackMediaResult[] | null;
3031};
313233+const SLACK_THREAD_CONTEXT_USER_LOOKUP_CONCURRENCY = 4;
34+3235function isSlackThreadContextSenderAllowed(params: {
3336allowFromLower: string[];
3437allowNameMatching: boolean;
@@ -50,6 +53,38 @@ function isSlackThreadContextSenderAllowed(params: {
5053}).allowed;
5154}
525556+async function resolveSlackThreadUserMap(params: {
57+ctx: SlackMonitorContext;
58+messages: SlackThreadStarter[];
59+}): Promise<Map<string, { name?: string }>> {
60+const uniqueUserIds: string[] = [];
61+const seen = new Set<string>();
62+for (const item of params.messages) {
63+if (!item.userId || seen.has(item.userId)) {
64+continue;
65+}
66+seen.add(item.userId);
67+uniqueUserIds.push(item.userId);
68+}
69+const userMap = new Map<string, { name?: string }>();
70+if (uniqueUserIds.length === 0) {
71+return userMap;
72+}
73+const { results } = await runTasksWithConcurrency({
74+tasks: uniqueUserIds.map((id) => async () => {
75+const user = await params.ctx.resolveUserName(id);
76+return user ? { id, user } : null;
77+}),
78+limit: SLACK_THREAD_CONTEXT_USER_LOOKUP_CONCURRENCY,
79+});
80+for (const result of results) {
81+if (result) {
82+userMap.set(result.id, result.user);
83+}
84+}
85+return userMap;
86+}
87+5388export async function resolveSlackThreadContextData(params: {
5489ctx: SlackMonitorContext;
5590account: ResolvedSlackAccount;
@@ -92,7 +127,7 @@ export async function resolveSlackThreadContextData(params: {
9212793128const starter = params.threadStarter;
94129const starterSenderName =
95-params.allowNameMatching && starter?.userId
130+params.allowNameMatching && params.allowFromLower.length > 0 && starter?.userId
96131 ? (await params.ctx.resolveUserName(starter.userId))?.name
97132 : undefined;
98133const starterIsCurrentBot = Boolean(
@@ -174,39 +209,37 @@ export async function resolveSlackThreadContextData(params: {
174209const omittedCurrentBotHistoryCount =
175210threadHistory.length - threadHistoryWithoutCurrentBot.length;
176211177-const uniqueUserIds = [
178- ...new Set(
179-threadHistoryWithoutCurrentBot
180-.map((item) => item.userId)
181-.filter((id): id is string => Boolean(id)),
182-),
183-];
184-const userMap = new Map<string, { name?: string }>();
185-await Promise.all(
186-uniqueUserIds.map(async (id) => {
187-const user = await params.ctx.resolveUserName(id);
188-if (user) {
189-userMap.set(id, user);
190-}
191-}),
192-);
193-212+const userMapForFilter =
213+params.contextVisibilityMode !== "all" &&
214+params.allowNameMatching &&
215+params.allowFromLower.length > 0
216+ ? await resolveSlackThreadUserMap({
217+ctx: params.ctx,
218+messages: threadHistoryWithoutCurrentBot,
219+})
220+ : new Map<string, { name?: string }>();
194221const { items: filteredThreadHistory, omitted: omittedHistoryCount } =
195-filterSupplementalContextItems({
196-items: threadHistoryWithoutCurrentBot,
197-mode: params.contextVisibilityMode,
198-kind: "thread",
199-isSenderAllowed: (historyMsg) => {
200-const msgUser = historyMsg.userId ? userMap.get(historyMsg.userId) : null;
201-return isSlackThreadContextSenderAllowed({
202-allowFromLower: params.allowFromLower,
203-allowNameMatching: params.allowNameMatching,
204-userId: historyMsg.userId,
205-userName: msgUser?.name,
206-botId: historyMsg.botId,
222+params.contextVisibilityMode === "all"
223+ ? { items: threadHistoryWithoutCurrentBot, omitted: 0 }
224+ : filterSupplementalContextItems({
225+items: threadHistoryWithoutCurrentBot,
226+mode: params.contextVisibilityMode,
227+kind: "thread",
228+isSenderAllowed: (historyMsg) => {
229+const msgUser = historyMsg.userId ? userMapForFilter.get(historyMsg.userId) : null;
230+return isSlackThreadContextSenderAllowed({
231+allowFromLower: params.allowFromLower,
232+allowNameMatching: params.allowNameMatching,
233+userId: historyMsg.userId,
234+userName: msgUser?.name,
235+botId: historyMsg.botId,
236+});
237+},
207238});
208-},
209-});
239+const userMap = await resolveSlackThreadUserMap({
240+ctx: params.ctx,
241+messages: filteredThreadHistory,
242+});
210243if (omittedHistoryCount > 0 || omittedCurrentBotHistoryCount > 0) {
211244logVerbose(
212245`slack: omitted ${omittedHistoryCount + omittedCurrentBotHistoryCount} thread message(s) from context (mode=${params.contextVisibilityMode})`,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。