






























@@ -2,6 +2,8 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
2233type ResolveProviderInstallCatalogEntries =
44typeof import("../plugins/provider-install-catalog.js").resolveProviderInstallCatalogEntries;
5+type ResolveManifestProviderAuthChoices =
6+typeof import("../plugins/provider-auth-choices.js").resolveManifestProviderAuthChoices;
57type ResolveProviderWizardOptions =
68typeof import("../plugins/provider-wizard.js").resolveProviderWizardOptions;
79type ResolveProviderModelPickerEntries =
@@ -16,6 +18,13 @@ vi.mock("../plugins/provider-install-catalog.js", () => ({
1618 resolveProviderInstallCatalogEntries,
1719}));
182021+const resolveManifestProviderAuthChoices = vi.hoisted(() =>
22+vi.fn<ResolveManifestProviderAuthChoices>(() => []),
23+);
24+vi.mock("../plugins/provider-auth-choices.js", () => ({
25+ resolveManifestProviderAuthChoices,
26+}));
27+1928const resolveProviderWizardOptions = vi.hoisted(() =>
2029vi.fn<ResolveProviderWizardOptions>(() => []),
2130);
@@ -39,7 +48,117 @@ import {
39484049describe("provider flow install catalog contributions", () => {
4150beforeEach(() => {
42-vi.clearAllMocks();
51+resolveManifestProviderAuthChoices.mockReset();
52+resolveManifestProviderAuthChoices.mockReturnValue([]);
53+resolveProviderInstallCatalogEntries.mockReset();
54+resolveProviderInstallCatalogEntries.mockReturnValue([]);
55+resolveProviderWizardOptions.mockReset();
56+resolveProviderWizardOptions.mockReturnValue([]);
57+resolveProviderModelPickerEntries.mockReset();
58+resolveProviderModelPickerEntries.mockReturnValue([]);
59+resolvePluginProviders.mockReset();
60+resolvePluginProviders.mockReturnValue([]);
61+});
62+63+it("surfaces manifest provider auth choices before setup runtime loads", () => {
64+resolveManifestProviderAuthChoices.mockReturnValue([
65+{
66+pluginId: "openai-compatible",
67+providerId: "openai-compatible",
68+methodId: "api-key",
69+choiceId: "openai-compatible-api-key",
70+choiceLabel: "OpenAI-compatible API key",
71+choiceHint: "Use a compatible endpoint",
72+assistantPriority: -5,
73+assistantVisibility: "visible",
74+groupId: "openai-compatible",
75+groupLabel: "OpenAI-compatible",
76+groupHint: "Self-hosted and compatible providers",
77+onboardingScopes: ["text-inference"],
78+},
79+]);
80+81+expect(resolveProviderSetupFlowContributions()).toEqual([
82+{
83+id: "provider:setup:openai-compatible-api-key",
84+kind: "provider",
85+surface: "setup",
86+providerId: "openai-compatible",
87+pluginId: "openai-compatible",
88+option: {
89+value: "openai-compatible-api-key",
90+label: "OpenAI-compatible API key",
91+hint: "Use a compatible endpoint",
92+assistantPriority: -5,
93+assistantVisibility: "visible",
94+group: {
95+id: "openai-compatible",
96+label: "OpenAI-compatible",
97+hint: "Self-hosted and compatible providers",
98+},
99+},
100+onboardingScopes: ["text-inference"],
101+source: "manifest",
102+},
103+]);
104+expect(resolveManifestProviderAuthChoices).toHaveBeenCalledWith(
105+expect.objectContaining({
106+includeUntrustedWorkspacePlugins: false,
107+}),
108+);
109+});
110+111+it("prefers manifest setup contributions over duplicate runtime and install-catalog entries", () => {
112+resolveManifestProviderAuthChoices.mockReturnValue([
113+{
114+pluginId: "openai",
115+providerId: "openai",
116+methodId: "api-key",
117+choiceId: "openai-api-key",
118+choiceLabel: "OpenAI API key",
119+},
120+]);
121+resolveProviderWizardOptions.mockReturnValue([
122+{
123+value: "openai-api-key",
124+label: "Runtime OpenAI API key",
125+groupId: "openai",
126+groupLabel: "OpenAI",
127+},
128+]);
129+resolveProviderInstallCatalogEntries.mockReturnValue([
130+{
131+pluginId: "openai",
132+providerId: "openai",
133+methodId: "api-key",
134+choiceId: "openai-api-key",
135+choiceLabel: "Catalog OpenAI API key",
136+label: "OpenAI",
137+origin: "bundled",
138+install: {
139+npmSpec: "@openclaw/openai",
140+},
141+},
142+]);
143+144+expect(resolveProviderSetupFlowContributions()).toEqual([
145+{
146+id: "provider:setup:openai-api-key",
147+kind: "provider",
148+surface: "setup",
149+providerId: "openai",
150+pluginId: "openai",
151+option: {
152+value: "openai-api-key",
153+label: "OpenAI API key",
154+group: {
155+id: "openai",
156+label: "OpenAI API key",
157+},
158+},
159+source: "manifest",
160+},
161+]);
43162});
4416345164it("surfaces install-catalog provider choices when runtime setup options are absent", () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。