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

推荐订阅源

IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
G
GRAHAM CLULEY
P
Privacy & Cybersecurity Law Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
H
Help Net Security
V
Visual Studio Blog
阮一峰的网络日志
阮一峰的网络日志
C
Cisco Blogs
人人都是产品经理
人人都是产品经理
Know Your Adversary
Know Your Adversary
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Recorded Future
Recorded Future
I
Intezer
罗磊的独立博客
T
The Exploit Database - CXSecurity.com
Blog — PlanetScale
Blog — PlanetScale
Malwarebytes
Malwarebytes
Spread Privacy
Spread Privacy
T
Tor Project blog
V
Vulnerabilities – Threatpost
云风的 BLOG
云风的 BLOG
腾讯CDC
B
Blog RSS Feed
Stack Overflow Blog
Stack Overflow Blog
F
Future of Privacy Forum
MyScale Blog
MyScale Blog
Latest news
Latest news
IT之家
IT之家
MongoDB | Blog
MongoDB | Blog
The Hacker News
The Hacker News
S
Securelist
博客园 - 【当耐特】
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threat Research - Cisco Blogs
Jina AI
Jina AI
Cisco Talos Blog
Cisco Talos Blog
B
Blog
博客园 - 三生石上(FineUI控件)
Last Week in AI
Last Week in AI
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
V
V2EX
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Cloudflare Blog
The GitHub Blog
The GitHub Blog
博客园 - 聂微东
F
Full Disclosure
C
CERT Recently Published Vulnerability Notes

Recent Commits to openclaw:main

fix(channels): hint at when bundled channel module is missing (#76974) fix(discord): preserve reusable presentation buttons Fix Ollama cloud API key discovery (#85091) fix(config): refresh Discord component ttl metadata · openclaw/openclaw@9a4fb3e fix(config): refresh Discord component TTL metadata (#84189) (thanks … fix(discord): deep merge agent component config docs(discord): document component ttl config · openclaw/openclaw@c17a48c fix(discord): cap component ttl at one day · openclaw/openclaw@4c6fe55 fix(cli): reject invalid node run port (#84307) · openclaw/openclaw@8961eae fix(agents): classify auth HTML provider responses (#79900) · openclaw/openclaw@7f4462e fix(gateway): allow bearer-auth session history reads (#81815) fix(installer): handle headless onboarding tty · openclaw/openclaw@504f0df fix(exec): protect pathPrepend against posix login-shell RC overrides… · openclaw/openclaw@b77f36f refactor(gateway): remove unused readLastMessagePreviewFromTranscript… · openclaw/openclaw@9b7e431 test: fix environment sensitivity in resolveNpmCommandInvocation test… · openclaw/openclaw@faf96ff fix(auth): load legacy Codex OAuth sidecars in embedded secrets-runti… Fix/codex deactivated workspace failover (#55893) fix(codex): demote plugin thread eligibility log · openclaw/openclaw@1d5b5db address review v2: workspace scope, warm generation guard, plugin rel… · openclaw/openclaw@c452a1e address review: scope short-circuit by caller auth context + rewarm o… · openclaw/openclaw@01087cb test(model-provider-auth): cover prepared-state short-circuit and clear · openclaw/openclaw@180cecd fix(models): reset warmed provider auth on hot reload · openclaw/openclaw@aef8d17 perf(models): pre-warm provider auth state at gateway startup · openclaw/openclaw@4f80cc1 address review v3: invalidate prepared map on auth-profile logout + d… · openclaw/openclaw@7ddcca6 fix(qa-lab): rename codex lifecycle fixtures to match knip ignore pat… · openclaw/openclaw@ebd8b00 test(gateway): relax e2e node status waits · openclaw/openclaw@b25a0d0 fix #84745: scope Google preview model normalization to Google provid… · openclaw/openclaw@7d5afcb test(qa-lab): cover codex plugin lifecycle fixtures · openclaw/openclaw@bbf3eec fix(tests): allow slower kitchen sink installs · openclaw/openclaw@ec0cf9a revert(qa-lab): remove scenario github traceability metadata · openclaw/openclaw@46c8864 fix(docker): prune omitted plugin runtime deps fix(auth): skip OAuth refresh adapter when credential has no refresh … test(qa-lab): cover update package sentinel · openclaw/openclaw@178e510 fix(json): retry on transient File changed during read race condition… fix(status): add gateway delivery health telemetry (#85016) · openclaw/openclaw@5955f35 test(qa-lab): trace scenario issue evidence · openclaw/openclaw@efb7e47 fix(sessions): preserve compatible auth overrides (#85014) · openclaw/openclaw@b33deb4 ci(qa): publish soak parity artifacts fix(qa): keep searchable tool coverage report-only test(e2e): isolate kitchen sink rpc gateway fix(ollama): allow Orb host local auth (#84999) · openclaw/openclaw@277a4b6 test(qa-lab): add personal failure recovery scenario · openclaw/openclaw@229323d ci: tune crabbox developer image config feat(qa-lab): add jsonl replay harness · openclaw/openclaw@cf06578 fix(codex): beta blocker - keep context engine on canonical session k… · openclaw/openclaw@66dcc4e chore(release): refresh generated baselines · openclaw/openclaw@1b1580c fix(openshell): use NVIDIA CLI contract · openclaw/openclaw@e72f601 docs(release): prefer 1Password provider preflight Policy: add model, network, and MCP conformance checks (#80783) · openclaw/openclaw@6dbd5bd fix(agents): fence embedded session writes refactor: remove sender owner tool gating · openclaw/openclaw@02182d5 docs: remove stale owner tool wording test: update command auth expectations · openclaw/openclaw@95eac52 fix(xai): keep OAuth URL clickable (#84927) · openclaw/openclaw@159b300 Fix stale WebChat typing indicator after terminal session patch (#84565) docs: document rejected autoreview findings · openclaw/openclaw@c49647e docs(changelog): note VAPID subject fix · openclaw/openclaw@db606a8 perf(plugins): reuse compatible gateway startup registry · openclaw/openclaw@d2ad7d6 test: cover dispatch registry reuse caller · openclaw/openclaw@b248b48 docs: add plugin registry reuse changelog · openclaw/openclaw@6ccca4a fix(tests): wrap kitchen sink pnpm runner fix(agents): cap heartbeat context hint fallback · openclaw/openclaw@04061bc chore(deadcode): dedupe repeated helpers · openclaw/openclaw@88c49f9 perf(cli): cache stable subcommand help (#84786) · openclaw/openclaw@f39f56a fix(ollama): preserve tool call ids [AI-assisted] (#84855) · openclaw/openclaw@2000227 fix: align remaining copyright notice · openclaw/openclaw@f43e83c fix(config): append numeric bound hints to ceiling/floor validation e… · openclaw/openclaw@8a8f9dc fix(qa): enable private self-check runtime · openclaw/openclaw@0fb1de5 fix(diffs): replace iconMarkup string with ToolbarIconName enum to el… · openclaw/openclaw@b7f9bf5 fix: update mac copyright owner fix(agents): normalize openapi tool schemas · openclaw/openclaw@ec67290 fix(memory): stop recall tracking when dreaming is disabled · openclaw/openclaw@c89632b fix(diagnostics-otel): suppress exporter rejection crashes (#84881) perf: speed up secrets and nodes help startup (#84818) · openclaw/openclaw@233765b docs: add PDF timeout changelog · openclaw/openclaw@e3b77d6 fix(pdf): bound remote body reads [Fix] Reject slow node event sends (#84387) fix(doctor): detect Codex bwrap namespace denials · openclaw/openclaw@43c6c26 fix(update): prune stale local bundled plugin shadows · openclaw/openclaw@4a360ac ci: add live Codex plugin release check · openclaw/openclaw@3eb2d64 fix(slack): suppress reasoning reply payloads (#84322) chore: update vite · openclaw/openclaw@ec7495c chore: update dependencies · openclaw/openclaw@ec10d12 fix(config): validate browser sandbox bind sources [AI] (#84799) · openclaw/openclaw@3cc8b2a doctor: constrain legacy plugin cleanup paths [AI] (#84801) Fix Telegram isolated polling stall watchdog (#84861) · openclaw/openclaw@40db92f ci(release): keep non-waiting clawhub publish best effort fix(docker): keep prune store warmup before offline stage · openclaw/openclaw@1e8d966 ci(release): require resolved target before child dispatch · openclaw/openclaw@2fd02c2 fix(docker): keep runtime prune offline · openclaw/openclaw@a329b9e ci(release): streamline beta publish verification · openclaw/openclaw@1c5fda1 ci(release): preserve direct repair publishes · openclaw/openclaw@0604d25 ci(release): keep focused validation reruns independent · openclaw/openclaw@624d920 [Fix] Keep node systemd tokens out of unit files (#84815) fix: reject symlinked whatsapp creds · openclaw/openclaw@194f078 fix(whatsapp): guard credential atomic writes refactor(whatsapp): use async fs-safe credential checks · openclaw/openclaw@9ec9fbf fix(doctor): clear stale runtime override pins (#84221) fix(agents): disable pi-coding-agent auto-retry to prevent tool call … fix(trajectory): tolerate partial skill snapshot entries in support c… · openclaw/openclaw@c9b6a8b
fix(discord): allow component registry ttl override · openclaw/openclaw@ee915cf
100menotu001 · 2026-05-22 · via Recent Commits to openclaw:main
Original file line numberDiff line numberDiff line change

@@ -400,6 +400,35 @@ describe("discord config schema", () => {

400400

expect(res.success).toBe(true);

401401

});

402402
403+

it("accepts agentComponents.ttlMs at channel and account scope", () => {

404+

const res = DiscordConfigSchema.safeParse({

405+

agentComponents: {

406+

ttlMs: 86_400_000,

407+

},

408+

accounts: {

409+

work: {

410+

agentComponents: {

411+

ttlMs: 120_000,

412+

},

413+

},

414+

},

415+

});

416+
417+

expect(res.success).toBe(true);

418+

});

419+
420+

it("rejects invalid agentComponents.ttlMs values", () => {

421+

for (const ttlMs of [0, -1, 1.5, 604_800_001]) {

422+

const res = DiscordConfigSchema.safeParse({

423+

agentComponents: {

424+

ttlMs,

425+

},

426+

});

427+
428+

expect(res.success).toBe(false);

429+

}

430+

});

431+
403432

it("accepts agentComponents.enabled at account scope", () => {

404433

const res = DiscordConfigSchema.safeParse({

405434

accounts: {

Original file line numberDiff line numberDiff line change

@@ -157,6 +157,10 @@ export const discordChannelConfigUiHints = {

157157

label: "Discord Component Accent Color",

158158

help: "Accent color for Discord component containers (hex). Set per account via channels.discord.accounts.<id>.ui.components.accentColor.",

159159

},

160+

"agentComponents.ttlMs": {

161+

label: "Discord Component TTL (ms)",

162+

help: "How long sent Discord component callbacks remain registered. Default is 1800000 (30 minutes); maximum is 604800000 (7 days).",

163+

},

160164

"intents.presence": {

161165

label: "Discord Presence Intent",

162166

help: "Enable the Guild Presences privileged intent. Must also be enabled in the Discord Developer Portal. Allows tracking user activities (e.g. Spotify). Default: false.",

Original file line numberDiff line numberDiff line change

@@ -173,6 +173,7 @@ describe("sendDiscordComponentMessage", () => {

173173

it("registers a prebuilt component message against an edited message id", () => {

174174

registerBuiltDiscordComponentMessage({

175175

messageId: "msg1",

176+

ttlMs: 120_000,

176177

buildResult: {

177178

components: [],

178179

entries: [{ id: "entry-1", kind: "button", label: "Tap" }],

@@ -184,8 +185,45 @@ describe("sendDiscordComponentMessage", () => {

184185

entries: [{ id: "entry-1", kind: "button", label: "Tap" }],

185186

modals: [{ id: "modal-1", title: "Modal", fields: [] }],

186187

messageId: "msg1",

188+

ttlMs: 120_000,

187189

});

188190

});

191+
192+

it("passes configured component TTL when registering sent entries", async () => {

193+

const { rest, postMock, getMock } = makeDiscordRest();

194+

getMock.mockResolvedValueOnce({

195+

type: ChannelType.DM,

196+

recipients: [{ id: "user-1" }],

197+

});

198+

postMock.mockResolvedValueOnce({ id: "msg1", channel_id: "dm-1" });

199+
200+

await sendDiscordComponentMessage(

201+

"channel:dm-1",

202+

{

203+

blocks: [{ type: "actions", buttons: [{ label: "Tap" }] }],

204+

},

205+

{

206+

cfg: {

207+

channels: {

208+

discord: {

209+

agentComponents: {

210+

ttlMs: 120_000,

211+

},

212+

accounts: {

213+

default: {},

214+

},

215+

},

216+

},

217+

session: { dmScope: "main" },

218+

},

219+

rest,

220+

token: "t",

221+

},

222+

);

223+
224+

expect(registerMock).toHaveBeenCalledTimes(1);

225+

expect(readRecordArg(registerMock, 0, 0).ttlMs).toBe(120_000);

226+

});

189227

});

190228
191229

describe("sendDiscordComponentMessage classic message downgrade", () => {

Original file line numberDiff line numberDiff line change

@@ -170,14 +170,25 @@ type DiscordComponentSendOpts = {

170170

export function registerBuiltDiscordComponentMessage(params: {

171171

buildResult: DiscordComponentBuildResult;

172172

messageId: string;

173+

ttlMs?: number;

173174

}): void {

174175

registerDiscordComponentEntries({

175176

entries: params.buildResult.entries,

176177

modals: params.buildResult.modals,

177178

messageId: params.messageId,

179+

ttlMs: params.ttlMs,

178180

});

179181

}

180182
183+

function resolveDiscordComponentRegistryTtlMs(

184+

accountConfig: { agentComponents?: { ttlMs?: number } } | undefined,

185+

): number | undefined {

186+

const ttlMs = accountConfig?.agentComponents?.ttlMs;

187+

return typeof ttlMs === "number" && Number.isFinite(ttlMs) && ttlMs > 0

188+

? Math.floor(ttlMs)

189+

: undefined;

190+

}

191+
181192

async function buildDiscordComponentPayload(params: {

182193

spec: DiscordComponentMessageSpec;

183194

opts: DiscordComponentSendOpts;

@@ -316,6 +327,7 @@ export async function sendDiscordComponentMessage(

316327

registerBuiltDiscordComponentMessage({

317328

buildResult,

318329

messageId: result.id,

330+

ttlMs: resolveDiscordComponentRegistryTtlMs(accountInfo.config),

319331

});

320332
321333

recordChannelActivity({

@@ -371,6 +383,7 @@ export async function editDiscordComponentMessage(

371383

registerBuiltDiscordComponentMessage({

372384

buildResult,

373385

messageId: result.id ?? messageId,

386+

ttlMs: resolveDiscordComponentRegistryTtlMs(accountInfo.config),

374387

});

375388
376389

recordChannelActivity({

Original file line numberDiff line numberDiff line change

@@ -229,6 +229,8 @@ export type DiscordExecApprovalConfig = {

229229

export type DiscordAgentComponentsConfig = {

230230

/** Enable agent-controlled interactive components (buttons, select menus). Default: true. */

231231

enabled?: boolean;

232+

/** Time in milliseconds before sent Discord component callbacks expire. Default: 1800000. */

233+

ttlMs?: number;

232234

};

233235
234236

export type DiscordUiComponentsConfig = {

Original file line numberDiff line numberDiff line change

@@ -702,6 +702,12 @@ export const DiscordAccountSchema = z

702702

agentComponents: z

703703

.object({

704704

enabled: z.boolean().optional(),

705+

ttlMs: z

706+

.number()

707+

.int()

708+

.positive()

709+

.max(7 * 24 * 60 * 60 * 1000)

710+

.optional(),

705711

})

706712

.strict()

707713

.optional(),