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

推荐订阅源

WordPress大学
WordPress大学
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
D
DataBreaches.Net
GbyAI
GbyAI
Microsoft Security Blog
Microsoft Security Blog
博客园_首页
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
IT之家
IT之家
MongoDB | Blog
MongoDB | Blog
The GitHub Blog
The GitHub Blog
月光博客
月光博客
U
Unit 42
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
腾讯CDC
B
Blog RSS Feed
博客园 - Franky
爱范儿
爱范儿

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
test(plugin-sdk): use narrow config runtime mocks · openc...
steipete · 2026-04-27 · via Recent Commits to openclaw:main
Original file line numberDiff line numberDiff line change

@@ -145,8 +145,10 @@ releases.

145145

| Secret input resolution | `openclaw/plugin-sdk/secret-input-runtime` |

146146

| Model/session overrides | `openclaw/plugin-sdk/model-session-runtime` |

147147
148-

Bundled production plugins are scanner-guarded against the broad barrel so

149-

imports stay local to the behavior they need.

148+

Bundled plugins and their tests are scanner-guarded against the broad

149+

barrel so imports and mocks stay local to the behavior they need. The broad

150+

barrel still exists for external compatibility, but new code should not

151+

depend on it.

150152
151153

</Step>

152154

@@ -233,6 +235,7 @@ releases.

233235
234236

```bash

235237

grep -r "plugin-sdk/compat" my-plugin/

238+

grep -r "plugin-sdk/config-runtime" my-plugin/

236239

grep -r "openclaw/extension-api" my-plugin/

237240

```

238241
Original file line numberDiff line numberDiff line change

@@ -41,13 +41,14 @@ Persist changes with `api.runtime.config.mutateConfigFile(...)` or `api.runtime.

4141
4242

The mutation helpers return `afterWrite` plus a typed `followUp` summary so callers can log or test whether they requested a restart. The gateway still owns when that restart actually happens.

4343
44-

`api.runtime.config.loadConfig()` and `api.runtime.config.writeConfigFile(...)` are deprecated compatibility helpers under `runtime-config-load-write`. They warn once at runtime, and bundled plugins must not use them; the config boundary guards fail if production plugin code calls them or imports those helpers from plugin SDK subpaths.

44+

`api.runtime.config.loadConfig()` and `api.runtime.config.writeConfigFile(...)` are deprecated compatibility helpers under `runtime-config-load-write`. They warn once at runtime, and remain available for old external plugins during the migration window. Bundled plugins must not use them; the config boundary guards fail if plugin code calls them or imports those helpers from plugin SDK subpaths.

4545
4646

For direct SDK imports, use the focused config subpaths instead of the broad

4747

`openclaw/plugin-sdk/config-runtime` compatibility barrel: `config-types` for

4848

types, `plugin-config-runtime` for already-loaded config assertions and plugin

4949

entry lookup, `runtime-config-snapshot` for current process snapshots, and

50-

`config-mutation` for writes.

50+

`config-mutation` for writes. Bundled plugin tests should mock these focused

51+

subpaths directly instead of mocking the broad compatibility barrel.

5152
5253

Internal OpenClaw runtime code has the same direction: load config once at the CLI, gateway, or process boundary, then pass that value through. Successful mutation writes refresh the process runtime snapshot and advance its internal revision; long-lived caches should key off the runtime-owned cache key instead of serializing config locally. Long-lived runtime modules have a zero-tolerance scanner for ambient `loadConfig()` calls; use a passed `cfg`, a request `context.getRuntimeConfig()`, or `getRuntimeConfig()` at an explicit process boundary.

5354
Original file line numberDiff line numberDiff line change

@@ -26,9 +26,9 @@ const hoisted = vi.hoisted(() => {

2626

};

2727

});

2828
29-

vi.mock("openclaw/plugin-sdk/config-runtime", async () => {

30-

const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/config-runtime")>(

31-

"openclaw/plugin-sdk/config-runtime",

29+

vi.mock("openclaw/plugin-sdk/session-store-runtime", async () => {

30+

const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/session-store-runtime")>(

31+

"openclaw/plugin-sdk/session-store-runtime",

3232

);

3333

return {

3434

...actual,

Original file line numberDiff line numberDiff line change

@@ -136,10 +136,10 @@ const configMocks = vi.hoisted(() => ({

136136

}

137137

>(() => ({ browser: {} })),

138138

}));

139-

vi.mock("openclaw/plugin-sdk/config-runtime", async () => {

140-

const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/config-runtime")>(

141-

"openclaw/plugin-sdk/config-runtime",

142-

);

139+

vi.mock("openclaw/plugin-sdk/runtime-config-snapshot", async () => {

140+

const actual = await vi.importActual<

141+

typeof import("openclaw/plugin-sdk/runtime-config-snapshot")

142+

>("openclaw/plugin-sdk/runtime-config-snapshot");

143143

return {

144144

...actual,

145145

getRuntimeConfig: configMocks.loadConfig,

Original file line numberDiff line numberDiff line change

@@ -8,10 +8,10 @@ const { loadConfigMock, isNodeCommandAllowedMock, resolveNodeCommandAllowlistMoc

88

}),

99

);

1010
11-

vi.mock("openclaw/plugin-sdk/config-runtime", async () => {

12-

const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/config-runtime")>(

13-

"openclaw/plugin-sdk/config-runtime",

14-

);

11+

vi.mock("openclaw/plugin-sdk/runtime-config-snapshot", async () => {

12+

const actual = await vi.importActual<

13+

typeof import("openclaw/plugin-sdk/runtime-config-snapshot")

14+

>("openclaw/plugin-sdk/runtime-config-snapshot");

1515

return {

1616

...actual,

1717

loadConfig: loadConfigMock,

Original file line numberDiff line numberDiff line change

@@ -3,10 +3,10 @@ import { beforeEach, describe, expect, it, vi } from "vitest";

33
44

const loadConfigMock = vi.hoisted(() => vi.fn());

55
6-

vi.mock("openclaw/plugin-sdk/config-runtime", async () => {

7-

const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/config-runtime")>(

8-

"openclaw/plugin-sdk/config-runtime",

9-

);

6+

vi.mock("openclaw/plugin-sdk/runtime-config-snapshot", async () => {

7+

const actual = await vi.importActual<

8+

typeof import("openclaw/plugin-sdk/runtime-config-snapshot")

9+

>("openclaw/plugin-sdk/runtime-config-snapshot");

1010

return {

1111

...actual,

1212

getRuntimeConfig: () => loadConfigMock(),

Original file line numberDiff line numberDiff line change

@@ -24,7 +24,7 @@ vi.mock("@buape/carbon/voice", () => ({

2424

},

2525

}));

2626
27-

vi.mock("openclaw/plugin-sdk/config-runtime", () => ({

27+

vi.mock("openclaw/plugin-sdk/dangerous-name-runtime", () => ({

2828

isDangerousNameMatchingEnabled: () => false,

2929

}));

3030
Original file line numberDiff line numberDiff line change

@@ -6,9 +6,9 @@ const hoisted = vi.hoisted(() => {

66

return { updateSessionStore, resolveStorePath };

77

});

88
9-

vi.mock("openclaw/plugin-sdk/config-runtime", async () => {

10-

const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/config-runtime")>(

11-

"openclaw/plugin-sdk/config-runtime",

9+

vi.mock("openclaw/plugin-sdk/session-store-runtime", async () => {

10+

const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/session-store-runtime")>(

11+

"openclaw/plugin-sdk/session-store-runtime",

1212

);

1313

return {

1414

...actual,

Original file line numberDiff line numberDiff line change

@@ -15,9 +15,9 @@ const DISCORD_TEST_CFG = {

1515

session: { dmScope: "main" },

1616

} as const;

1717
18-

vi.mock("openclaw/plugin-sdk/config-runtime", async () => {

19-

const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/config-runtime")>(

20-

"openclaw/plugin-sdk/config-runtime",

18+

vi.mock("openclaw/plugin-sdk/plugin-config-runtime", async () => {

19+

const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/plugin-config-runtime")>(

20+

"openclaw/plugin-sdk/plugin-config-runtime",

2121

);

2222

return {

2323

...actual,

Original file line numberDiff line numberDiff line change

@@ -3,13 +3,13 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite

33

const recordChannelActivityMock = vi.hoisted(() => vi.fn());

44

const loadConfigMock = vi.hoisted(() => vi.fn(() => ({ channels: { discord: {} } })));

55
6-

vi.mock("openclaw/plugin-sdk/config-runtime", async () => {

7-

const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/config-runtime")>(

8-

"openclaw/plugin-sdk/config-runtime",

6+

vi.mock("openclaw/plugin-sdk/plugin-config-runtime", async () => {

7+

const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/plugin-config-runtime")>(

8+

"openclaw/plugin-sdk/plugin-config-runtime",

99

);

1010

return {

1111

...actual,

12-

loadConfig: () => loadConfigMock(),

12+

requireRuntimeConfig: (cfg: unknown) => cfg ?? loadConfigMock(),

1313

};

1414

});

1515