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

推荐订阅源

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

chore(release): update appcast for 2026.5.20 · openclaw/openclaw@de5f1fa fix(whatsapp): update baileys dependency · openclaw/openclaw@26e64bd fix(channels): hint at when bundled channel module is missing (#76974) · openclaw/openclaw@98af517 fix(discord): preserve reusable presentation buttons · openclaw/openclaw@0212188 Fix Ollama cloud API key discovery (#85091) · openclaw/openclaw@5f5e3b4 fix(config): refresh Discord component ttl metadata · openclaw/openclaw@9a4fb3e fix(config): refresh Discord component TTL metadata (#84189) (thanks … · openclaw/openclaw@48bb3b0 fix(discord): deep merge agent component config · openclaw/openclaw@814386a docs(discord): document component ttl config · openclaw/openclaw@c17a48c fix(discord): cap component ttl at one day · openclaw/openclaw@4c6fe55 fix(discord): allow component registry ttl override · openclaw/openclaw@ee915cf 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(discord): log component registry error details · openclaw/openclaw@f52db02
100menotu001 · 2026-05-22 · via Recent Commits to openclaw:main
Original file line numberDiff line numberDiff line change

@@ -22,6 +22,7 @@ Docs: https://docs.openclaw.ai

2222
2323

- Infra/json: retry transient `File changed during read` races while loading JSON state so config and state reads recover instead of failing the turn. (#84285)

2424

- Providers/Ollama: resolve configured Ollama Cloud `OLLAMA_API_KEY` markers to the real discovery key so cloud provider entries keep authenticated model catalog access. (#85037)

25+

- Discord: keep persistent component registry fallback warnings actionable by forwarding structured error and cause metadata through the runtime logger. Fixes #84185. (#84190) Thanks @100menotu001.

2526

- Gateway/sessions: preserve compatible session auth profile overrides when switching models within the same provider, including provider-auth aliases. Fixes #81837. (#81886) Thanks @TurboTheTurtle.

2627

- Gateway/status: surface inbound delivery telemetry counters and transport-liveness warnings in `openclaw status --all`. Fixes #49577. (#72724)

2728

- Docker: prune package-excluded plugin source workspaces and dependency closures so runtime images do not keep packages for plugins that were not opted in.

Original file line numberDiff line numberDiff line change

@@ -48,12 +48,60 @@ function reportPersistentComponentRegistryError(error: unknown): void {

4848

try {

4949

getOptionalDiscordRuntime()

5050

?.logging.getChildLogger({ plugin: "discord", feature: "component-registry-state" })

51-

.warn("Discord persistent component registry state failed", { error: String(error) });

51+

.warn("Discord persistent component registry state failed", formatRegistryError(error));

5252

} catch {

5353

// Best effort only: persistent state must never break Discord interactions.

5454

}

5555

}

5656
57+

function formatRegistryError(error: unknown): Record<string, unknown> {

58+

if (!(error instanceof Error)) {

59+

return { error: formatRegistryErrorValue(error) };

60+

}

61+

const details: Record<string, unknown> = {

62+

error: String(error),

63+

errorName: error.name,

64+

errorMessage: error.message,

65+

};

66+

if (error.stack) {

67+

details.errorStack = error.stack;

68+

}

69+

const cause = (error as { cause?: unknown }).cause;

70+

if (cause instanceof Error) {

71+

details.errorCause = String(cause);

72+

details.errorCauseName = cause.name;

73+

details.errorCauseMessage = cause.message;

74+

if (cause.stack) {

75+

details.errorCauseStack = cause.stack;

76+

}

77+

} else if (cause !== undefined) {

78+

details.errorCause = formatRegistryErrorValue(cause);

79+

}

80+

return details;

81+

}

82+
83+

function formatRegistryErrorValue(value: unknown): string {

84+

if (typeof value === "string") {

85+

return value;

86+

}

87+

if (

88+

typeof value === "number" ||

89+

typeof value === "boolean" ||

90+

typeof value === "bigint" ||

91+

typeof value === "symbol"

92+

) {

93+

return String(value);

94+

}

95+

if (value === null) {

96+

return "null";

97+

}

98+

try {

99+

return JSON.stringify(value) ?? Object.prototype.toString.call(value);

100+

} catch {

101+

return Object.prototype.toString.call(value);

102+

}

103+

}

104+
57105

function disablePersistentComponentRegistry(error: unknown): void {

58106

persistentRegistryDisabled = true;

59107

persistentComponentStore = undefined;

Original file line numberDiff line numberDiff line change

@@ -354,11 +354,14 @@ describe("discord component registry", () => {

354354
355355

it("falls back to the in-memory registry when persistent state cannot open", async () => {

356356

const warn = vi.fn();

357+

const cause = new TypeError("disk busy");

357358

const { setDiscordRuntime } = await import("./runtime.js");

358359

setDiscordRuntime({

359360

state: {

360361

openKeyedStore: vi.fn(() => {

361-

throw new Error("sqlite unavailable");

362+

const error = new Error("sqlite unavailable") as Error & { cause?: unknown };

363+

error.cause = cause;

364+

throw error;

362365

}),

363366

},

364367

logging: { getChildLogger: () => ({ warn }) },

@@ -375,6 +378,16 @@ describe("discord component registry", () => {

375378

expect(fallbackEntry?.label).toBe("Fallback");

376379

expect(typeof fallbackEntry?.createdAt).toBe("number");

377380

expect(typeof fallbackEntry?.expiresAt).toBe("number");

378-

expect(warn).toHaveBeenCalled();

381+

expect(warn).toHaveBeenCalledWith(

382+

"Discord persistent component registry state failed",

383+

expect.objectContaining({

384+

error: "Error: sqlite unavailable",

385+

errorName: "Error",

386+

errorMessage: "sqlite unavailable",

387+

errorCause: "TypeError: disk busy",

388+

errorCauseName: "TypeError",

389+

errorCauseMessage: "disk busy",

390+

}),

391+

);

379392

});

380393

});

Original file line numberDiff line numberDiff line change

@@ -0,0 +1,55 @@

1+

import { beforeEach, describe, expect, it, vi } from "vitest";

2+
3+

const loggingMocks = vi.hoisted(() => {

4+

const childLogger = {

5+

debug: vi.fn(),

6+

info: vi.fn(),

7+

warn: vi.fn(),

8+

error: vi.fn(),

9+

};

10+

return {

11+

childLogger,

12+

getChildLogger: vi.fn(() => childLogger),

13+

};

14+

});

15+
16+

vi.mock("../../globals.js", () => ({

17+

shouldLogVerbose: vi.fn(() => false),

18+

}));

19+
20+

vi.mock("../../logging.js", () => ({

21+

getChildLogger: loggingMocks.getChildLogger,

22+

}));

23+
24+

let createRuntimeLogging: typeof import("./runtime-logging.js").createRuntimeLogging;

25+
26+

beforeEach(async () => {

27+

vi.clearAllMocks();

28+

loggingMocks.getChildLogger.mockReturnValue(loggingMocks.childLogger);

29+

({ createRuntimeLogging } = await import("./runtime-logging.js"));

30+

});

31+
32+

describe("createRuntimeLogging", () => {

33+

it("forwards structured metadata to child loggers", () => {

34+

const logging = createRuntimeLogging();

35+

const logger = logging.getChildLogger({ plugin: "discord" }, { level: "warn" });

36+

const meta = {

37+

errorName: "Error",

38+

errorCauseName: "TypeError",

39+

};

40+
41+

logger.debug?.("debug details", meta);

42+

logger.info("info details", meta);

43+

logger.warn("warn details", meta);

44+

logger.error("error details", meta);

45+
46+

expect(loggingMocks.getChildLogger).toHaveBeenCalledWith(

47+

{ plugin: "discord" },

48+

{ level: "warn" },

49+

);

50+

expect(loggingMocks.childLogger.debug).toHaveBeenCalledWith(meta, "debug details");

51+

expect(loggingMocks.childLogger.info).toHaveBeenCalledWith(meta, "info details");

52+

expect(loggingMocks.childLogger.warn).toHaveBeenCalledWith(meta, "warn details");

53+

expect(loggingMocks.childLogger.error).toHaveBeenCalledWith(meta, "error details");

54+

});

55+

});

Original file line numberDiff line numberDiff line change

@@ -3,6 +3,18 @@ import { getChildLogger } from "../../logging.js";

33

import { normalizeLogLevel } from "../../logging/levels.js";

44

import type { PluginRuntime } from "./types.js";

55
6+

function writeRuntimeLog(

7+

log: (...args: unknown[]) => void,

8+

message: string,

9+

meta?: Record<string, unknown>,

10+

): void {

11+

if (meta && Object.keys(meta).length > 0) {

12+

log(meta, message);

13+

return;

14+

}

15+

log(message);

16+

}

17+
618

export function createRuntimeLogging(): PluginRuntime["logging"] {

719

return {

820

shouldLogVerbose,

@@ -11,10 +23,14 @@ export function createRuntimeLogging(): PluginRuntime["logging"] {

1123

level: opts?.level ? normalizeLogLevel(opts.level) : undefined,

1224

});

1325

return {

14-

debug: (message) => logger.debug?.(message),

15-

info: (message) => logger.info(message),

16-

warn: (message) => logger.warn(message),

17-

error: (message) => logger.error(message),

26+

debug: (message, meta) => {

27+

if (logger.debug) {

28+

writeRuntimeLog(logger.debug.bind(logger), message, meta);

29+

}

30+

},

31+

info: (message, meta) => writeRuntimeLog(logger.info.bind(logger), message, meta),

32+

warn: (message, meta) => writeRuntimeLog(logger.warn.bind(logger), message, meta),

33+

error: (message, meta) => writeRuntimeLog(logger.error.bind(logger), message, meta),

1834

};

1935

},

2036

};