

























@@ -119,6 +119,9 @@ const mocks = vi.hoisted(() => ({
119119 : {}),
120120}),
121121),
122+getProviderEnvVars: vi.fn((providerId: string) => [
123+`${providerId.toUpperCase().replaceAll("-", "_")}_API_KEY`,
124+]),
122125createEmbeddingProvider: vi.fn(async () => ({
123126provider: {
124127id: "openai",
@@ -136,6 +139,37 @@ const mocks = vi.hoisted(() => ({
136139convertHeicToJpeg: vi.fn(async () => Buffer.from("jpeg-normalized")),
137140isWebSearchProviderConfigured: vi.fn(() => false),
138141isWebFetchProviderConfigured: vi.fn(() => false),
142+getModelsCommandSecretTargetIds: vi.fn(() => new Set(["models.providers.*.apiKey"])),
143+getMemoryEmbeddingCommandSecretTargetIds: vi.fn(() => new Set(["models.providers.*.apiKey"])),
144+getTtsCommandSecretTargetIds: vi.fn(() => new Set(["models.providers.*.apiKey"])),
145+getCapabilityWebSearchCommandSecretTargets: vi.fn(
146+(
147+config: { tools?: { web?: { search?: { provider?: string } } } },
148+options?: { providerId?: string },
149+) => {
150+const providerId = options?.providerId ?? config.tools?.web?.search?.provider ?? "tavily";
151+const path = `plugins.entries.${providerId}.config.webSearch.apiKey`;
152+return {
153+targetIds: new Set([path]),
154+ ...(options?.providerId ? { forcedActivePaths: new Set([path]) } : {}),
155+};
156+},
157+),
158+getCapabilityWebFetchCommandSecretTargets: vi.fn(
159+(
160+_config: { tools?: { web?: { fetch?: { provider?: string } } } },
161+options?: { providerId?: string },
162+) => {
163+const path =
164+options?.providerId === "firecrawl"
165+ ? "plugins.entries.firecrawl.config.webSearch.apiKey"
166+ : "plugins.entries.firecrawl.config.webFetch.apiKey";
167+return {
168+targetIds: new Set([path]),
169+ ...(options?.providerId ? { forcedActivePaths: new Set([path]) } : {}),
170+};
171+},
172+),
139173resolveCommandConfigWithSecrets: vi.fn(
140174async ({ config }: { config: Record<string, unknown> }) => ({
141175resolvedConfig: config,
@@ -156,6 +190,10 @@ vi.mock("../runtime.js", () => ({
156190runtime.writeJson(value),
157191}));
158192193+vi.mock("../secrets/provider-env-vars.js", () => ({
194+getProviderEnvVars: mocks.getProviderEnvVars,
195+}));
196+159197vi.mock("../config/config.js", () => ({
160198getRuntimeConfigSourceSnapshot:
161199mocks.getRuntimeConfigSourceSnapshot as typeof import("../config/config.js").getRuntimeConfigSourceSnapshot,
@@ -169,6 +207,14 @@ vi.mock("./command-config-resolution.js", () => ({
169207resolveCommandConfigWithSecrets: mocks.resolveCommandConfigWithSecrets,
170208}));
171209210+vi.mock("./command-secret-targets.js", () => ({
211+getCapabilityWebFetchCommandSecretTargets: mocks.getCapabilityWebFetchCommandSecretTargets,
212+getCapabilityWebSearchCommandSecretTargets: mocks.getCapabilityWebSearchCommandSecretTargets,
213+getMemoryEmbeddingCommandSecretTargetIds: mocks.getMemoryEmbeddingCommandSecretTargetIds,
214+getModelsCommandSecretTargetIds: mocks.getModelsCommandSecretTargetIds,
215+getTtsCommandSecretTargetIds: mocks.getTtsCommandSecretTargetIds,
216+}));
217+172218vi.mock("../agents/agent-scope.js", () => ({
173219resolveDefaultAgentId: () => "main",
174220resolveAgentDir: mocks.resolveAgentDir,
@@ -443,13 +489,19 @@ describe("capability cli", () => {
443489mocks.textToSpeech.mockClear();
444490mocks.setTtsProvider.mockClear();
445491mocks.resolveExplicitTtsOverrides.mockClear();
492+mocks.getProviderEnvVars.mockClear();
446493mocks.buildMediaUnderstandingRegistry.mockReset().mockReturnValue(new Map());
447494mocks.convertHeicToJpeg.mockClear();
448495mocks.createEmbeddingProvider.mockClear();
449496mocks.registerMemoryEmbeddingProvider.mockClear();
450497mocks.registerBuiltInMemoryEmbeddingProviders.mockClear();
451498mocks.isWebSearchProviderConfigured.mockReset().mockReturnValue(false);
452499mocks.isWebFetchProviderConfigured.mockReset().mockReturnValue(false);
500+mocks.getModelsCommandSecretTargetIds.mockClear();
501+mocks.getMemoryEmbeddingCommandSecretTargetIds.mockClear();
502+mocks.getTtsCommandSecretTargetIds.mockClear();
503+mocks.getCapabilityWebSearchCommandSecretTargets.mockClear();
504+mocks.getCapabilityWebFetchCommandSecretTargets.mockClear();
453505mocks.resolveCommandConfigWithSecrets
454506.mockReset()
455507.mockImplementation(async ({ config }: { config: Record<string, unknown> }) => ({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。