



















@@ -2,6 +2,7 @@ import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
22import type { OpenClawConfig } from "../config/config.js";
33import type { PluginAutoEnableResult } from "../config/plugin-auto-enable.js";
44import type { PluginManifestRecord } from "./manifest-registry.js";
5+import type { PluginRegistrySnapshot } from "./plugin-registry.js";
56import { createEmptyPluginRegistry } from "./registry-empty.js";
67import type { ProviderPlugin } from "./types.js";
78@@ -125,6 +126,90 @@ function setOwningProviderManifestPluginsWithWorkspace() {
125126]);
126127}
127128129+function createProviderRegistrySnapshotFixture(): PluginRegistrySnapshot {
130+const manifestRegistry = loadPluginManifestRegistryMock();
131+const plugins = manifestRegistry.plugins.map((plugin) => ({
132+pluginId: plugin.id,
133+manifestPath: plugin.manifestPath,
134+manifestHash: `test-${plugin.id}`,
135+source: plugin.source,
136+rootDir: plugin.rootDir,
137+origin: plugin.origin,
138+enabled: plugin.enabledByDefault !== false,
139+ ...(plugin.enabledByDefault === true ? { enabledByDefault: true } : {}),
140+syntheticAuthRefs: plugin.syntheticAuthRefs,
141+startup: {
142+sidecar: false,
143+memory: false,
144+deferConfiguredChannelFullLoadUntilAfterListen: false,
145+agentHarnesses: [],
146+},
147+compat: [],
148+}));
149+150+return {
151+version: 1,
152+hostContractVersion: "test",
153+compatRegistryVersion: "test",
154+migrationVersion: 1,
155+policyHash: "test",
156+generatedAtMs: 0,
157+installRecords: {},
158+ plugins,
159+diagnostics: [],
160+};
161+}
162+163+function normalizeProviderForFixture(value: string): string {
164+return value.trim().toLowerCase();
165+}
166+167+function sortUniqueFixtureValues(values: Iterable<string>): string[] {
168+return [...new Set(values)].toSorted((left, right) => left.localeCompare(right));
169+}
170+171+function listManifestContributionIdsForFixture(
172+plugin: PluginManifestRecord,
173+contribution: string,
174+): readonly string[] {
175+switch (contribution) {
176+case "providers":
177+return plugin.providers;
178+case "cliBackends":
179+return plugin.cliBackends;
180+default:
181+return [];
182+}
183+}
184+185+function resolvePluginContributionOwnersFixture(params: {
186+contribution: string;
187+matches: string | ((contributionId: string) => boolean);
188+}): readonly string[] {
189+const matcher =
190+typeof params.matches === "string"
191+ ? (contributionId: string) => contributionId === params.matches
192+ : params.matches;
193+return sortUniqueFixtureValues(
194+loadPluginManifestRegistryMock().plugins.flatMap((plugin) =>
195+listManifestContributionIdsForFixture(plugin, params.contribution).some(matcher)
196+ ? [plugin.id]
197+ : [],
198+),
199+);
200+}
201+202+function resolveProviderOwnersFixture(params: { providerId: string }): readonly string[] {
203+const providerId = normalizeProviderForFixture(params.providerId);
204+if (!providerId) {
205+return [];
206+}
207+return resolvePluginContributionOwnersFixture({
208+contribution: "providers",
209+matches: (contributionId) => normalizeProviderForFixture(contributionId) === providerId,
210+});
211+}
212+128213function getLastRuntimeRegistryCall(): Record<string, unknown> {
129214const call = resolveRuntimePluginRegistryMock.mock.calls.at(-1)?.[0];
130215expect(call).toBeDefined();
@@ -290,6 +375,16 @@ describe("resolvePluginProviders", () => {
290375loadPluginManifestRegistry: (...args: Parameters<LoadPluginManifestRegistry>) =>
291376loadPluginManifestRegistryMock(...args),
292377}));
378+vi.doMock("./plugin-registry.js", async () => {
379+const actual =
380+await vi.importActual<typeof import("./plugin-registry.js")>("./plugin-registry.js");
381+return {
382+ ...actual,
383+loadPluginRegistrySnapshot: () => createProviderRegistrySnapshotFixture(),
384+resolvePluginContributionOwners: resolvePluginContributionOwnersFixture,
385+resolveProviderOwners: resolveProviderOwnersFixture,
386+};
387+});
293388vi.doMock("./installed-plugin-index-store.js", async (importOriginal) => {
294389const actual = await importOriginal<typeof import("./installed-plugin-index-store.js")>();
295390return {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。