
























@@ -1,5 +1,6 @@
11import { beforeEach, describe, expect, it, vi } from "vitest";
22import type { OpenClawConfig } from "../config/types.openclaw.js";
3+import { resolveInstalledPluginIndexPolicyHash } from "./installed-plugin-index-policy.js";
34import type { PluginManifestRecord, PluginManifestRegistry } from "./manifest-registry.js";
45import type { PluginRegistrySnapshot } from "./plugin-registry.js";
56@@ -47,13 +48,16 @@ function createManifestRecord(
4748};
4849}
495050-function createIndex(plugins: readonly PluginManifestRecord[]): PluginRegistrySnapshot {
51+function createIndex(
52+plugins: readonly PluginManifestRecord[],
53+params: { policyHash?: string } = {},
54+): PluginRegistrySnapshot {
5155return {
5256version: 1,
5357hostContractVersion: "test",
5458compatRegistryVersion: "test",
5559migrationVersion: 1,
56-policyHash: "policy",
60+policyHash: params.policyHash ?? "policy",
5761generatedAtMs: 1,
5862installRecords: {},
5963diagnostics: [],
@@ -194,6 +198,15 @@ describe("loadPluginLookUpTable", () => {
194198}),
195199];
196200const index = createIndex(plugins);
201+const config = {
202+channels: {
203+telegram: { token: "configured" },
204+},
205+} as OpenClawConfig;
206+const compatibleIndex = {
207+ ...index,
208+policyHash: resolveInstalledPluginIndexPolicyHash(config),
209+};
197210const manifestRegistry: PluginManifestRegistry = {
198211 plugins,
199212diagnostics: [],
@@ -203,22 +216,14 @@ describe("loadPluginLookUpTable", () => {
203216const { loadPluginLookUpTable } = await import("./plugin-lookup-table.js");
204217205218const metadataSnapshot = loadPluginMetadataSnapshot({
206-config: {
207-channels: {
208-telegram: { token: "configured" },
209-},
210-} as OpenClawConfig,
219+ config,
211220env: {},
212- index,
221+index: compatibleIndex,
213222});
214223loadPluginManifestRegistryForInstalledIndex.mockClear();
215224216225const table = loadPluginLookUpTable({
217-config: {
218-channels: {
219-telegram: { token: "configured" },
220-},
221-} as OpenClawConfig,
226+ config,
222227env: {},
223228 metadataSnapshot,
224229});
@@ -229,4 +234,59 @@ describe("loadPluginLookUpTable", () => {
229234expect(table.metrics.indexPluginCount).toBe(1);
230235expect(table.metrics.manifestPluginCount).toBe(1);
231236});
237+238+it("rebuilds when a provided metadata snapshot has a stale plugin policy", async () => {
239+const plugins = [
240+createManifestRecord({
241+id: "telegram",
242+origin: "bundled",
243+channels: ["telegram"],
244+}),
245+];
246+const snapshotConfig = {
247+plugins: {
248+allow: ["telegram"],
249+},
250+} as OpenClawConfig;
251+const requestedConfig = {
252+plugins: {
253+allow: ["other-plugin"],
254+},
255+} as OpenClawConfig;
256+const snapshotIndex = createIndex(plugins, {
257+policyHash: resolveInstalledPluginIndexPolicyHash(snapshotConfig),
258+});
259+const requestedIndex = createIndex(plugins, {
260+policyHash: resolveInstalledPluginIndexPolicyHash(requestedConfig),
261+});
262+const manifestRegistry: PluginManifestRegistry = {
263+ plugins,
264+diagnostics: [],
265+};
266+loadPluginManifestRegistryForInstalledIndex.mockReturnValue(manifestRegistry);
267+const { loadPluginMetadataSnapshot } = await import("./plugin-metadata-snapshot.js");
268+const { loadPluginLookUpTable } = await import("./plugin-lookup-table.js");
269+270+const metadataSnapshot = loadPluginMetadataSnapshot({
271+config: snapshotConfig,
272+env: {},
273+index: snapshotIndex,
274+});
275+loadPluginManifestRegistryForInstalledIndex.mockClear();
276+277+loadPluginLookUpTable({
278+config: requestedConfig,
279+env: {},
280+index: requestedIndex,
281+ metadataSnapshot,
282+});
283+284+expect(loadPluginManifestRegistryForInstalledIndex).toHaveBeenCalledOnce();
285+expect(loadPluginManifestRegistryForInstalledIndex).toHaveBeenCalledWith(
286+expect.objectContaining({
287+index: requestedIndex,
288+config: requestedConfig,
289+}),
290+);
291+});
232292});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。