惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
Jina AI
Jina AI
B
Blog
aimingoo的专栏
aimingoo的专栏
酷 壳 – CoolShell
酷 壳 – CoolShell
T
The Blog of Author Tim Ferriss
Last Week in AI
Last Week in AI
月光博客
月光博客
H
Help Net Security
V
Visual Studio Blog
量子位
A
About on SuperTechFans
博客园 - Franky
人人都是产品经理
人人都是产品经理
N
Netflix TechBlog - Medium
云风的 BLOG
云风的 BLOG
雷峰网
雷峰网
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
博客园 - 叶小钗
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
perf(slack): trim thread context allocation · openclaw/op...
vincentkoc · 2026-05-07 · via Recent Commits to openclaw:main

@@ -1,4 +1,5 @@

11

import { formatInboundEnvelope } from "openclaw/plugin-sdk/channel-inbound";

2+

import { runTasksWithConcurrency } from "openclaw/plugin-sdk/concurrency-runtime";

23

import type { ContextVisibilityMode } from "openclaw/plugin-sdk/config-types";

34

import { logVerbose } from "openclaw/plugin-sdk/runtime-env";

45

import {

@@ -29,6 +30,8 @@ type SlackThreadContextData = {

2930

threadStarterMedia: SlackMediaResult[] | null;

3031

};

313233+

const SLACK_THREAD_CONTEXT_USER_LOOKUP_CONCURRENCY = 4;

34+3235

function isSlackThreadContextSenderAllowed(params: {

3336

allowFromLower: string[];

3437

allowNameMatching: 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+5388

export async function resolveSlackThreadContextData(params: {

5489

ctx: SlackMonitorContext;

5590

account: ResolvedSlackAccount;

@@ -92,7 +127,7 @@ export async function resolveSlackThreadContextData(params: {

9212793128

const starter = params.threadStarter;

94129

const 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;

98133

const starterIsCurrentBot = Boolean(

@@ -174,39 +209,37 @@ export async function resolveSlackThreadContextData(params: {

174209

const omittedCurrentBotHistoryCount =

175210

threadHistory.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 }>();

194221

const { 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+

});

210243

if (omittedHistoryCount > 0 || omittedCurrentBotHistoryCount > 0) {

211244

logVerbose(

212245

`slack: omitted ${omittedHistoryCount + omittedCurrentBotHistoryCount} thread message(s) from context (mode=${params.contextVisibilityMode})`,