diff --git a/src/channels/plugins/registry-loader.ts b/src/channels/plugins/registry-loader.ts index 9f23c5fa09e..baa20555f46 100644 --- a/src/channels/plugins/registry-loader.ts +++ b/src/channels/plugins/registry-loader.ts @@ -1,5 +1,5 @@ import type { PluginChannelRegistration, PluginRegistry } from "../../plugins/registry.js"; -import { getActivePluginRegistry } from "../../plugins/runtime.js"; +import { getActivePluginChannelRegistry } from "../../plugins/runtime.js"; import type { ChannelId } from "./types.js"; type ChannelRegistryValueResolver = ( @@ -13,7 +13,7 @@ export function createChannelRegistryLoader( let lastRegistry: PluginRegistry | null = null; return async (id: ChannelId): Promise => { - const registry = getActivePluginRegistry(); + const registry = getActivePluginChannelRegistry(); if (registry !== lastRegistry) { cache.clear(); lastRegistry = registry; diff --git a/src/plugins/runtime.channel-pin.test.ts b/src/plugins/runtime.channel-pin.test.ts index 1cce99b0e6c..4271c4d6806 100644 --- a/src/plugins/runtime.channel-pin.test.ts +++ b/src/plugins/runtime.channel-pin.test.ts @@ -1,4 +1,5 @@ import { afterEach, describe, expect, it } from "vitest"; +import { loadChannelOutboundAdapter } from "../channels/plugins/outbound/load.js"; import { getChannelPlugin } from "../channels/plugins/registry.js"; import { createEmptyPluginRegistry } from "./registry-empty.js"; import { @@ -173,4 +174,26 @@ describe("channel registry pinning", () => { freshRegistry: fresh, }); }); + + it("loadChannelOutboundAdapter resolves from pinned registry after active registry replacement", async () => { + const outboundAdapter = { send: async () => ({ messageId: "1" }) }; + const startup = createEmptyPluginRegistry(); + startup.channels = [ + { + pluginId: "telegram", + plugin: { id: "telegram", meta: {}, outbound: outboundAdapter }, + source: "test", + }, + ] as never; + setActivePluginRegistry(startup); + pinActivePluginChannelRegistry(startup); + + // Simulate a post-boot registry replacement (e.g. config-schema load, plugin status query). + const replacement = createEmptyPluginRegistry(); + setActivePluginRegistry(replacement); + + // The outbound loader must still find the telegram adapter from the pinned registry. + const adapter = await loadChannelOutboundAdapter("telegram"); + expect(adapter).toBe(outboundAdapter); + }); });