























@@ -156,7 +156,8 @@ function collectActiveRegistryLookups() {
156156Boolean(
157157options &&
158158typeof options === "object" &&
159-Object.hasOwn(options as Record<string, unknown>, "onlyPluginIds"),
159+Object.hasOwn(options as Record<string, unknown>, "onlyPluginIds") &&
160+!Object.hasOwn(options as Record<string, unknown>, "activate"),
160161),
161162);
162163}
@@ -471,6 +472,62 @@ describe("resolvePluginCapabilityProviders", () => {
471472expect(mocks.loadBundledCapabilityRuntimeRegistry).not.toHaveBeenCalled();
472473});
473474475+it("cold-loads enabled external manifest-contract providers missing from startup registry", () => {
476+const loaded = createEmptyPluginRegistry();
477+loaded.speechProviders.push({
478+pluginId: "fish-audio",
479+pluginName: "Fish Audio",
480+source: "test",
481+provider: {
482+id: "fish-audio",
483+label: "Fish Audio",
484+isConfigured: () => true,
485+synthesize: async () => ({ kind: "audio", data: Buffer.from([]), mimeType: "audio/mpeg" }),
486+},
487+} as never);
488+mocks.loadPluginRegistrySnapshot.mockReturnValue({
489+plugins: [{ pluginId: "fish-audio", origin: "global", enabled: true }],
490+});
491+mocks.loadPluginManifestRegistry.mockReturnValue({
492+plugins: [
493+{
494+id: "fish-audio",
495+origin: "global",
496+enabledByDefault: false,
497+contracts: { speechProviders: ["fish-audio"] },
498+},
499+],
500+diagnostics: [],
501+});
502+mocks.resolveRuntimePluginRegistry.mockImplementation((options?: unknown) => {
503+if (
504+options &&
505+typeof options === "object" &&
506+(options as { activate?: unknown }).activate === false
507+) {
508+return loaded;
509+}
510+return undefined;
511+});
512+513+const provider = resolvePluginCapabilityProvider({
514+key: "speechProviders",
515+providerId: "fish-audio",
516+});
517+518+expect(provider?.id).toBe("fish-audio");
519+expect(mocks.resolveRuntimePluginRegistry).toHaveBeenCalledWith({
520+onlyPluginIds: ["fish-audio"],
521+});
522+expect(mocks.resolveRuntimePluginRegistry).toHaveBeenCalledWith(
523+expect.objectContaining({
524+activate: false,
525+onlyPluginIds: ["fish-audio"],
526+}),
527+);
528+expect(mocks.loadBundledCapabilityRuntimeRegistry).not.toHaveBeenCalled();
529+});
530+474531it("uses active non-speech capability providers even when cfg has explicit plugin entries", () => {
475532const active = createEmptyPluginRegistry();
476533active.mediaUnderstandingProviders.push({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。