























@@ -214,6 +214,28 @@ function manifestOwnsConfiguredSpeechProvider(params: {
214214});
215215}
216216217+function collectConfiguredWebSearchProviderIds(config: OpenClawConfig): ReadonlySet<string> {
218+const search = config.tools?.web?.search;
219+if (search?.enabled === false || typeof search?.provider !== "string") {
220+return new Set();
221+}
222+const providerId = normalizeOptionalLowercaseString(search.provider);
223+return providerId ? new Set([providerId]) : new Set();
224+}
225+226+function manifestOwnsConfiguredWebSearchProvider(params: {
227+manifest: PluginManifestRecord | undefined;
228+configuredWebSearchProviderIds: ReadonlySet<string>;
229+}): boolean {
230+if (params.configuredWebSearchProviderIds.size === 0) {
231+return false;
232+}
233+return (params.manifest?.contracts?.webSearchProviders ?? []).some((providerId) => {
234+const normalized = normalizeOptionalLowercaseString(providerId);
235+return normalized ? params.configuredWebSearchProviderIds.has(normalized) : false;
236+});
237+}
238+217239function listModelProviderRefs(value: unknown): string[] {
218240if (typeof value === "string") {
219241return [value];
@@ -433,6 +455,52 @@ function canStartConfiguredSpeechProviderPlugin(params: {
433455return activationState.enabled && activationState.explicitlyEnabled;
434456}
435457458+function canStartConfiguredWebSearchProviderPlugin(params: {
459+plugin: InstalledPluginIndexRecord;
460+manifest: PluginManifestRecord | undefined;
461+config: OpenClawConfig;
462+pluginsConfig: ReturnType<typeof normalizePluginsConfigWithRegistry>;
463+activationSource: {
464+plugins: ReturnType<typeof normalizePluginsConfigWithRegistry>;
465+rootConfig?: OpenClawConfig;
466+};
467+configuredWebSearchProviderIds: ReadonlySet<string>;
468+platform?: NodeJS.Platform;
469+}): boolean {
470+if (
471+!manifestOwnsConfiguredWebSearchProvider({
472+manifest: params.manifest,
473+configuredWebSearchProviderIds: params.configuredWebSearchProviderIds,
474+})
475+) {
476+return false;
477+}
478+if (!params.pluginsConfig.enabled || !params.activationSource.plugins.enabled) {
479+return false;
480+}
481+if (
482+params.pluginsConfig.deny.includes(params.plugin.pluginId) ||
483+params.activationSource.plugins.deny.includes(params.plugin.pluginId)
484+) {
485+return false;
486+}
487+if (
488+params.pluginsConfig.entries[params.plugin.pluginId]?.enabled === false ||
489+params.activationSource.plugins.entries[params.plugin.pluginId]?.enabled === false
490+) {
491+return false;
492+}
493+const activationState = resolveEffectivePluginActivationState({
494+id: params.plugin.pluginId,
495+origin: params.plugin.origin,
496+config: params.pluginsConfig,
497+rootConfig: params.config,
498+enabledByDefault: isPluginEnabledByDefaultForPlatform(params.plugin, params.platform),
499+activationSource: params.activationSource,
500+});
501+return activationState.enabled;
502+}
503+436504function canStartConfiguredRootPlugin(params: {
437505plugin: InstalledPluginIndexRecord;
438506manifest: PluginManifestRecord | undefined;
@@ -693,6 +761,8 @@ export function resolveGatewayStartupPluginPlanFromRegistry(params: {
693761const startupDreamingPluginIds = resolveGatewayStartupDreamingPluginIds(params.config);
694762const manifestLookup = createManifestRegistryLookup(params.manifestRegistry);
695763const configuredSpeechProviderIds = collectConfiguredSpeechProviderIds(activationSourceConfig);
764+const configuredWebSearchProviderIds =
765+collectConfiguredWebSearchProviderIds(activationSourceConfig);
696766const configuredGenerationProviderIds =
697767collectConfiguredGenerationProviderIds(activationSourceConfig);
698768const normalizePluginId = createPluginRegistryIdNormalizer(params.index, {
@@ -763,6 +833,19 @@ export function resolveGatewayStartupPluginPlanFromRegistry(params: {
763833) {
764834return true;
765835}
836+if (
837+canStartConfiguredWebSearchProviderPlugin({
838+ plugin,
839+ manifest,
840+config: params.config,
841+ pluginsConfig,
842+ activationSource,
843+ configuredWebSearchProviderIds,
844+platform: params.platform,
845+})
846+) {
847+return true;
848+}
766849if (
767850canStartConfiguredGenerationProviderPlugin({
768851 plugin,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。