























@@ -3,8 +3,8 @@ import type { OpenClawConfig } from "../config/config.js";
33import {
44applyExclusiveSlotSelection,
55buildPluginDiagnosticsReport,
6-buildPluginSnapshotReport,
76enablePluginInConfig,
7+loadPluginManifestRegistry,
88refreshPluginRegistry,
99resetPluginsCliTestState,
1010writeConfigFile,
@@ -111,7 +111,7 @@ describe("persistPluginInstall", () => {
111111expect(next).toEqual(enabledConfig);
112112});
113113114-it("falls back to runtime kind registry cleanup when metadata omits kind", async () => {
114+it("scopes runtime kind lookup to the selected plugin when metadata omits kind", async () => {
115115const { persistPluginInstall } = await import("./plugins-install-persist.js");
116116const baseConfig = {
117117plugins: {
@@ -129,15 +129,12 @@ describe("persistPluginInstall", () => {
129129},
130130} as OpenClawConfig;
131131enablePluginInConfig.mockReturnValue({ config: enabledConfig });
132-buildPluginSnapshotReport.mockReturnValue({
133-plugins: [{ id: "legacy-memory-a" }, { id: "legacy-memory" }],
132+loadPluginManifestRegistry.mockReturnValue({
133+plugins: [{ id: "legacy-memory" }],
134134diagnostics: [],
135135});
136-buildPluginDiagnosticsReport.mockReturnValue({
137-plugins: [
138-{ id: "legacy-memory-a", kind: "memory" },
139-{ id: "legacy-memory", kind: "memory" },
140-],
136+buildPluginDiagnosticsReport.mockReturnValueOnce({
137+plugins: [{ id: "legacy-memory", kind: "memory" }],
141138diagnostics: [],
142139});
143140applyExclusiveSlotSelection.mockImplementation(((params: {
@@ -148,19 +145,12 @@ describe("persistPluginInstall", () => {
148145}) => {
149146expect(params.selectedId).toBe("legacy-memory");
150147expect(params.selectedKind).toBe("memory");
151-expect(params.registry?.plugins).toEqual([
152-{ id: "legacy-memory-a", kind: "memory" },
153-{ id: "legacy-memory", kind: "memory" },
154-]);
148+expect(params.registry?.plugins).toEqual([{ id: "legacy-memory", kind: "memory" }]);
155149return {
156150config: {
157151 ...params.config,
158152plugins: {
159153 ...params.config.plugins,
160-entries: {
161- ...params.config.plugins?.entries,
162-"legacy-memory-a": { enabled: false },
163-},
164154slots: {
165155 ...params.config.plugins?.slots,
166156memory: "legacy-memory",
@@ -185,14 +175,21 @@ describe("persistPluginInstall", () => {
185175},
186176});
187177178+expect(buildPluginDiagnosticsReport).toHaveBeenCalledTimes(1);
188179expect(buildPluginDiagnosticsReport).toHaveBeenCalledWith({
189180config: enabledConfig,
181+onlyPluginIds: ["legacy-memory"],
182+});
183+expect(loadPluginManifestRegistry).toHaveBeenCalledWith({
184+config: enabledConfig,
185+includeDisabled: true,
186+pluginIds: ["legacy-memory"],
190187});
191-expect(next.plugins?.entries?.["legacy-memory-a"]?.enabled).toBe(false);
188+expect(next.plugins?.entries?.["legacy-memory-a"]?.enabled).toBe(true);
192189expect(next.plugins?.slots?.memory).toBe("legacy-memory");
193190});
194191195-it("uses runtime registry cleanup when a manifest-kind plugin has runtime-kind siblings", async () => {
192+it("uses cold metadata for manifest-kind slot selection without loading runtime siblings", async () => {
196193const { persistPluginInstall } = await import("./plugins-install-persist.js");
197194const baseConfig = {
198195plugins: {
@@ -210,15 +207,8 @@ describe("persistPluginInstall", () => {
210207},
211208} as OpenClawConfig;
212209enablePluginInConfig.mockReturnValue({ config: enabledConfig });
213-buildPluginSnapshotReport.mockReturnValue({
214-plugins: [{ id: "legacy-memory-a" }, { id: "memory-b", kind: "memory" }],
215-diagnostics: [],
216-});
217-buildPluginDiagnosticsReport.mockReturnValue({
218-plugins: [
219-{ id: "legacy-memory-a", kind: "memory" },
220-{ id: "memory-b", kind: "memory" },
221-],
210+loadPluginManifestRegistry.mockReturnValue({
211+plugins: [{ id: "memory-b", kind: "memory" }],
222212diagnostics: [],
223213});
224214applyExclusiveSlotSelection.mockImplementation(((params: {
@@ -229,19 +219,12 @@ describe("persistPluginInstall", () => {
229219}) => {
230220expect(params.selectedId).toBe("memory-b");
231221expect(params.selectedKind).toBe("memory");
232-expect(params.registry?.plugins).toEqual([
233-{ id: "legacy-memory-a", kind: "memory" },
234-{ id: "memory-b", kind: "memory" },
235-]);
222+expect(params.registry?.plugins).toEqual([{ id: "memory-b", kind: "memory" }]);
236223return {
237224config: {
238225 ...params.config,
239226plugins: {
240227 ...params.config.plugins,
241-entries: {
242- ...params.config.plugins?.entries,
243-"legacy-memory-a": { enabled: false },
244-},
245228slots: {
246229 ...params.config.plugins?.slots,
247230memory: "memory-b",
@@ -266,13 +249,71 @@ describe("persistPluginInstall", () => {
266249},
267250});
268251269-expect(buildPluginDiagnosticsReport).toHaveBeenCalledWith({
252+expect(buildPluginDiagnosticsReport).not.toHaveBeenCalled();
253+expect(loadPluginManifestRegistry).toHaveBeenCalledWith({
270254config: enabledConfig,
255+includeDisabled: true,
256+pluginIds: ["memory-b"],
271257});
272-expect(next.plugins?.entries?.["legacy-memory-a"]?.enabled).toBe(false);
258+expect(next.plugins?.entries?.["legacy-memory-a"]?.enabled).toBe(true);
273259expect(next.plugins?.slots?.memory).toBe("memory-b");
274260});
275261262+it("does not load every plugin runtime for non-slot installs without manifest kind", async () => {
263+const { persistPluginInstall } = await import("./plugins-install-persist.js");
264+const baseConfig = {
265+plugins: {
266+entries: {},
267+},
268+} as OpenClawConfig;
269+const enabledConfig = {
270+plugins: {
271+entries: {
272+plain: { enabled: true },
273+},
274+},
275+} as OpenClawConfig;
276+enablePluginInConfig.mockReturnValue({ config: enabledConfig });
277+loadPluginManifestRegistry.mockReturnValue({
278+plugins: [{ id: "plain" }],
279+diagnostics: [],
280+});
281+buildPluginDiagnosticsReport.mockReturnValue({
282+plugins: [{ id: "plain" }],
283+diagnostics: [],
284+});
285+applyExclusiveSlotSelection.mockReturnValue({
286+config: enabledConfig,
287+warnings: [],
288+changed: false,
289+});
290+291+const next = await persistPluginInstall({
292+snapshot: {
293+config: baseConfig,
294+baseHash: "config-1",
295+},
296+pluginId: "plain",
297+install: {
298+source: "path",
299+sourcePath: "/tmp/plain",
300+installPath: "/tmp/plain",
301+},
302+});
303+304+expect(buildPluginDiagnosticsReport).toHaveBeenCalledTimes(1);
305+expect(buildPluginDiagnosticsReport).toHaveBeenCalledWith({
306+config: enabledConfig,
307+onlyPluginIds: ["plain"],
308+});
309+expect(loadPluginManifestRegistry).toHaveBeenCalledWith({
310+config: enabledConfig,
311+includeDisabled: true,
312+pluginIds: ["plain"],
313+});
314+expect(next).toEqual(enabledConfig);
315+});
316+276317it("can persist an install record without enabling a plugin that needs config first", async () => {
277318const { persistPluginInstall } = await import("./plugins-install-persist.js");
278319const baseConfig = {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。