




















@@ -43,36 +43,17 @@ vi.mock("../channels/config-presence.js", () => ({
4343 hasMeaningfulChannelConfig,
4444}));
454546-vi.mock("./manifest-registry.js", async (importOriginal) => {
47-const actual = await importOriginal<typeof import("./manifest-registry.js")>();
48-return {
49- ...actual,
50- loadPluginManifestRegistry,
51-};
52-});
46+vi.mock("./manifest-registry-installed.js", () => ({
47+ loadPluginManifestRegistryForInstalledIndex,
48+}));
534954-vi.mock("./manifest-registry-installed.js", async (importOriginal) => {
55-const actual = await importOriginal<typeof import("./manifest-registry-installed.js")>();
56-return {
57- ...actual,
58- loadPluginManifestRegistryForInstalledIndex,
59-};
60-});
50+vi.mock("./plugin-registry-snapshot.js", () => ({ loadPluginRegistrySnapshot }));
615162-vi.mock("./plugin-registry.js", async (importOriginal) => {
63-const actual = await importOriginal<typeof import("./plugin-registry.js")>();
52+vi.mock("./plugin-registry-contributions.js", async (importOriginal) => {
53+const actual = await importOriginal<typeof import("./plugin-registry-contributions.js")>();
6454return {
6555 ...actual,
6656 loadPluginManifestRegistryForPluginRegistry,
67- loadPluginRegistrySnapshot,
68-};
69-});
70-71-vi.mock("./installed-plugin-index-store.js", async (importOriginal) => {
72-const actual = await importOriginal<typeof import("./installed-plugin-index-store.js")>();
73-return {
74- ...actual,
75-readPersistedInstalledPluginIndexSync: vi.fn(() => null),
7657};
7758});
7859@@ -87,7 +68,9 @@ import {
8768resolveGatewayStartupPluginIds,
8869} from "./channel-plugin-ids.js";
897090-function withManifestLoadPaths<T extends { id: string }>(plugin: T): T {
71+function withManifestLoadPaths<T extends { id: string }>(
72+plugin: T,
73+): T & Pick<PluginManifestRecord, "rootDir" | "source" | "manifestPath" | "skills" | "hooks"> {
9174return {
9275rootDir: `/tmp/plugins/${plugin.id}`,
9376source: `/tmp/plugins/${plugin.id}/index.ts`,
@@ -98,7 +81,7 @@ function withManifestLoadPaths<T extends { id: string }>(plugin: T): T {
9881};
9982}
10083101-function createManifestRegistryFixture() {
84+function createManifestRegistryFixture(): PluginManifestRegistry {
10285return {
10386plugins: [
10487{
@@ -282,27 +265,27 @@ function createManifestRegistryFixture() {
282265providers: [],
283266cliBackends: [],
284267},
285-].map(withManifestLoadPaths),
268+].map(withManifestLoadPaths) as PluginManifestRecord[],
286269diagnostics: [],
287270};
288271}
289272290-function createManifestRegistryFixtureWithWorkspaceDemoChannel() {
273+function createManifestRegistryFixtureWithWorkspaceDemoChannel(): PluginManifestRegistry {
291274const fixture = createManifestRegistryFixture();
292275return {
293276 ...fixture,
294277plugins: [
295278 ...fixture.plugins,
296-{
279+withManifestLoadPaths({
297280id: "workspace-demo-channel-plugin",
298281channels: ["demo-channel"],
299282startupDeferConfiguredChannelFullLoadUntilAfterListen: true,
300283origin: "workspace",
301284enabledByDefault: undefined,
302285providers: [],
303286cliBackends: [],
304-},
305-].map(withManifestLoadPaths),
287+}),
288+],
306289};
307290}
308291@@ -379,6 +362,15 @@ function filterManifestRegistryForInstalledIndex(params: {
379362};
380363}
381364365+function useManifestRegistryFixture(
366+registry: PluginManifestRegistry = createManifestRegistryFixture(),
367+) {
368+const index = createInstalledPluginIndexFixture(registry);
369+loadPluginManifestRegistry.mockReset().mockReturnValue(registry);
370+loadPluginRegistrySnapshot.mockReset().mockReturnValue(index);
371+return { registry, index };
372+}
373+382374function expectStartupPluginIds(params: {
383375config: OpenClawConfig;
384376activationSourceConfig?: OpenClawConfig;
@@ -544,10 +536,7 @@ describe("resolveGatewayStartupPluginIds", () => {
544536}
545537return true;
546538});
547-loadPluginManifestRegistry.mockReset().mockReturnValue(createManifestRegistryFixture());
548-loadPluginRegistrySnapshot
549-.mockReset()
550-.mockImplementation(() => createInstalledPluginIndexFixture());
539+useManifestRegistryFixture();
551540loadPluginManifestRegistryForInstalledIndex
552541.mockReset()
553542.mockImplementation(filterManifestRegistryForInstalledIndex);
@@ -778,9 +767,7 @@ describe("resolveGatewayStartupPluginIds", () => {
778767});
779768780769it("does not let weak channel presence start untrusted workspace channel owners", () => {
781-loadPluginManifestRegistry
782-.mockReset()
783-.mockReturnValue(createManifestRegistryFixtureWithWorkspaceDemoChannel());
770+useManifestRegistryFixture(createManifestRegistryFixtureWithWorkspaceDemoChannel());
784771listPotentialConfiguredChannelIds.mockReturnValue(["demo-channel"]);
785772listPotentialConfiguredChannelPresenceSignals.mockReturnValue([
786773{ channelId: "demo-channel", source: "env" },
@@ -807,9 +794,7 @@ describe("resolveGatewayStartupPluginIds", () => {
807794});
808795809796it("keeps explicitly trusted deferred channel owners eligible at startup", () => {
810-loadPluginManifestRegistry
811-.mockReset()
812-.mockReturnValue(createManifestRegistryFixtureWithWorkspaceDemoChannel());
797+useManifestRegistryFixture(createManifestRegistryFixtureWithWorkspaceDemoChannel());
813798expect(
814799resolveConfiguredDeferredChannelPluginIds({
815800config: {
@@ -879,9 +864,7 @@ describe("resolveGatewayStartupPluginIds", () => {
879864});
880865881866it("does not treat persisted auth alone as deferred channel startup intent", () => {
882-loadPluginManifestRegistry
883-.mockReset()
884-.mockReturnValue(createManifestRegistryFixtureWithWorkspaceDemoChannel());
867+useManifestRegistryFixture(createManifestRegistryFixtureWithWorkspaceDemoChannel());
885868listPotentialConfiguredChannelIds.mockImplementation(
886869(
887870_config: OpenClawConfig,
@@ -906,9 +889,7 @@ describe("resolveGatewayStartupPluginIds", () => {
906889});
907890908891it("does not treat explicitly disabled stale channel config as deferred startup intent", () => {
909-loadPluginManifestRegistry
910-.mockReset()
911-.mockReturnValue(createManifestRegistryFixtureWithWorkspaceDemoChannel());
892+useManifestRegistryFixture(createManifestRegistryFixtureWithWorkspaceDemoChannel());
912893913894expect(
914895resolveConfiguredDeferredChannelPluginIds({
@@ -1090,7 +1071,7 @@ describe("resolveConfiguredChannelPluginIds", () => {
10901071}
10911072return false;
10921073});
1093-loadPluginManifestRegistry.mockReset().mockReturnValue(createManifestRegistryFixture());
1074+useManifestRegistryFixture();
10941075});
1095107610961077it("uses manifest activation channel ownership before falling back to direct channel lists", () => {
@@ -1268,7 +1249,7 @@ describe("listConfiguredChannelIdsForReadOnlyScope", () => {
12681249listPotentialConfiguredChannelPresenceSignals.mockReset().mockReturnValue([]);
12691250hasPotentialConfiguredChannels.mockReset().mockReturnValue(false);
12701251hasMeaningfulChannelConfig.mockClear();
1271-loadPluginManifestRegistry.mockReset().mockReturnValue(createManifestRegistryFixture());
1252+useManifestRegistryFixture();
12721253});
1273125412741255it("filters bundled ambient channel triggers through effective activation", () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。