


























@@ -1,5 +1,6 @@
11import { afterEach, describe, expect, it, vi } from "vitest";
22import type { OpenClawConfig } from "../config/config.js";
3+import { resetConfigRuntimeState, setRuntimeConfigSnapshot } from "../config/config.js";
34import { activateSecretsRuntimeSnapshot, clearSecretsRuntimeSnapshot } from "../secrets/runtime.js";
45import { resolveOpenClawPluginToolsForOptions } from "./openclaw-plugin-tools.js";
56@@ -15,6 +16,7 @@ describe("createOpenClawTools browser plugin integration", () => {
1516afterEach(() => {
1617hoisted.resolvePluginTools.mockReset();
1718clearSecretsRuntimeSnapshot();
19+resetConfigRuntimeState();
1820});
19212022it("keeps the browser tool returned by plugin resolution", () => {
@@ -193,6 +195,48 @@ describe("createOpenClawTools browser plugin integration", () => {
193195expect(capturedRuntimeConfig).toBe(resolvedRunConfig);
194196});
195197198+it("does not let a source-less pinned config snapshot override explicit plugin tool config", () => {
199+const pinnedRuntimeConfig = {
200+plugins: {
201+allow: ["old-plugin"],
202+},
203+} as OpenClawConfig;
204+const explicitConfig = {
205+plugins: {
206+allow: ["browser"],
207+},
208+tools: {
209+experimental: {
210+planTool: true,
211+},
212+},
213+} as OpenClawConfig;
214+let capturedRuntimeConfig: OpenClawConfig | undefined;
215+let getRuntimeConfig: (() => OpenClawConfig | undefined) | undefined;
216+hoisted.resolvePluginTools.mockImplementation((params: unknown) => {
217+const context = (
218+params as {
219+context?: {
220+runtimeConfig?: OpenClawConfig;
221+getRuntimeConfig?: () => OpenClawConfig | undefined;
222+};
223+}
224+).context;
225+capturedRuntimeConfig = context?.runtimeConfig;
226+getRuntimeConfig = context?.getRuntimeConfig;
227+return [];
228+});
229+setRuntimeConfigSnapshot(pinnedRuntimeConfig);
230+231+resolveOpenClawPluginToolsForOptions({
232+options: { config: explicitConfig },
233+resolvedConfig: explicitConfig,
234+});
235+236+expect(capturedRuntimeConfig).toBe(explicitConfig);
237+expect(getRuntimeConfig?.()).toBe(explicitConfig);
238+});
239+196240it("exposes a live runtime config getter to plugin tool factories", () => {
197241const sourceConfig = {
198242plugins: {
@@ -218,23 +262,7 @@ describe("createOpenClawTools browser plugin integration", () => {
218262).context?.getRuntimeConfig;
219263return [];
220264});
221-activateSecretsRuntimeSnapshot({
222- sourceConfig,
223-config: firstRuntimeConfig,
224-authStores: [],
225-warnings: [],
226-webTools: {
227-search: {
228-providerSource: "none",
229-diagnostics: [],
230-},
231-fetch: {
232-providerSource: "none",
233-diagnostics: [],
234-},
235-diagnostics: [],
236-},
237-});
265+setRuntimeConfigSnapshot(firstRuntimeConfig, sourceConfig);
238266239267resolveOpenClawPluginToolsForOptions({
240268options: { config: sourceConfig },
@@ -243,23 +271,7 @@ describe("createOpenClawTools browser plugin integration", () => {
243271244272expect(getRuntimeConfig?.()).toStrictEqual(firstRuntimeConfig);
245273246-activateSecretsRuntimeSnapshot({
247- sourceConfig,
248-config: nextRuntimeConfig,
249-authStores: [],
250-warnings: [],
251-webTools: {
252-search: {
253-providerSource: "none",
254-diagnostics: [],
255-},
256-fetch: {
257-providerSource: "none",
258-diagnostics: [],
259-},
260-diagnostics: [],
261-},
262-});
274+setRuntimeConfigSnapshot(nextRuntimeConfig, sourceConfig);
263275264276expect(getRuntimeConfig?.()).toStrictEqual(nextRuntimeConfig);
265277expect(getRuntimeConfig?.()?.plugins?.entries?.["memory-core"]?.enabled).toBe(false);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。