




















@@ -354,48 +354,91 @@ function collectConfiguredPluginEntryIds(cfg: OpenClawConfig): string[] {
354354.filter(Boolean);
355355}
356356357+function hasOwnPluginEntry(cfg: OpenClawConfig, pluginId: string): boolean {
358+const entries = cfg.plugins?.entries;
359+return !!entries && typeof entries === "object" && Object.hasOwn(entries, pluginId);
360+}
361+362+function hasNonDisabledPluginEntry(cfg: OpenClawConfig, pluginId: string): boolean {
363+if (!hasOwnPluginEntry(cfg, pluginId)) {
364+return false;
365+}
366+const entry = cfg.plugins?.entries?.[pluginId];
367+return !isRecord(entry) || entry.enabled !== false;
368+}
369+370+function hasBrowserSetupAutoEnableRelevantConfig(cfg: OpenClawConfig): boolean {
371+if (isRecord(cfg.browser) && cfg.browser.enabled !== false) {
372+return true;
373+}
374+if (hasNonDisabledPluginEntry(cfg, "browser")) {
375+return true;
376+}
377+return hasBrowserToolReference(cfg);
378+}
379+380+function hasAcpxSetupAutoEnableRelevantConfig(cfg: OpenClawConfig): boolean {
381+if (!isRecord(cfg.acp)) {
382+return false;
383+}
384+const backend = normalizeOptionalLowercaseString(cfg.acp.backend);
385+const configured =
386+cfg.acp.enabled === true ||
387+(isRecord(cfg.acp.dispatch) && cfg.acp.dispatch.enabled === true) ||
388+backend === "acpx";
389+return configured && (!backend || backend === "acpx");
390+}
391+392+function hasXaiSetupAutoEnableRelevantConfig(cfg: OpenClawConfig): boolean {
393+const pluginConfig = cfg.plugins?.entries?.xai?.config;
394+return (
395+(isRecord(pluginConfig) &&
396+(isRecord(pluginConfig.xSearch) || isRecord(pluginConfig.codeExecution))) ||
397+(isRecord(cfg.tools?.web) && isRecord((cfg.tools.web as Record<string, unknown>).x_search))
398+);
399+}
400+357401function resolveRelevantSetupAutoEnablePluginIds(cfg: OpenClawConfig): string[] {
358402const pluginIds = new Set<string>(collectConfiguredPluginEntryIds(cfg));
359-if (
360-isRecord(cfg.browser) ||
361-isRecord(cfg.plugins?.entries?.browser) ||
362-hasBrowserToolReference(cfg)
363-) {
403+if (hasBrowserSetupAutoEnableRelevantConfig(cfg)) {
364404pluginIds.add("browser");
365405}
366-if (isRecord(cfg.acp) || isRecord(cfg.plugins?.entries?.acpx)) {
406+if (hasAcpxSetupAutoEnableRelevantConfig(cfg)) {
367407pluginIds.add("acpx");
368408}
369-if (
370-isRecord(cfg.plugins?.entries?.xai) ||
371-(isRecord(cfg.tools?.web) && isRecord((cfg.tools.web as Record<string, unknown>).x_search))
372-) {
409+if (hasXaiSetupAutoEnableRelevantConfig(cfg)) {
373410pluginIds.add("xai");
374411}
375412return [...pluginIds].toSorted((left, right) => left.localeCompare(right));
376413}
377414378415function hasSetupAutoEnableRelevantConfig(cfg: OpenClawConfig): boolean {
379-const entries = cfg.plugins?.entries;
380-if (isRecord(cfg.browser) || isRecord(cfg.acp) || hasBrowserToolReference(cfg)) {
381-return true;
382-}
383-if (isRecord(entries?.browser) || isRecord(entries?.acpx) || isRecord(entries?.xai)) {
384-return true;
385-}
386-if (isRecord(cfg.tools?.web) && isRecord((cfg.tools.web as Record<string, unknown>).x_search)) {
387-return true;
388-}
389-return hasConfiguredPluginConfigEntry(cfg);
416+return (
417+hasBrowserSetupAutoEnableRelevantConfig(cfg) ||
418+hasAcpxSetupAutoEnableRelevantConfig(cfg) ||
419+hasXaiSetupAutoEnableRelevantConfig(cfg) ||
420+hasConfiguredPluginConfigEntry(cfg)
421+);
390422}
391423392424function hasPluginEntries(cfg: OpenClawConfig): boolean {
393425const entries = cfg.plugins?.entries;
394426return !!entries && typeof entries === "object" && Object.keys(entries).length > 0;
395427}
396428397-function hasPluginAllowlistWithEntries(cfg: OpenClawConfig): boolean {
398-return Array.isArray(cfg.plugins?.allow) && cfg.plugins.allow.length > 0 && hasPluginEntries(cfg);
429+function hasPluginAllowlistWithMaterialEntries(cfg: OpenClawConfig): boolean {
430+if (
431+!Array.isArray(cfg.plugins?.allow) ||
432+cfg.plugins.allow.length === 0 ||
433+!hasPluginEntries(cfg)
434+) {
435+return false;
436+}
437+const entries = cfg.plugins?.entries;
438+if (!entries || typeof entries !== "object") {
439+return false;
440+}
441+return Object.values(entries).some(hasMaterialPluginEntryConfig);
399442}
400443401444function hasConfiguredProviderModelOrHarness(cfg: OpenClawConfig, env: NodeJS.ProcessEnv): boolean {
@@ -412,7 +455,7 @@ function hasConfiguredProviderModelOrHarness(cfg: OpenClawConfig, env: NodeJS.Pr
412455}
413456414457function configMayNeedPluginManifestRegistry(cfg: OpenClawConfig, env: NodeJS.ProcessEnv): boolean {
415-if (hasPluginAllowlistWithEntries(cfg)) {
458+if (hasPluginAllowlistWithMaterialEntries(cfg)) {
416459return true;
417460}
418461if (hasConfiguredPluginConfigEntry(cfg)) {
@@ -438,7 +481,7 @@ export function configMayNeedPluginAutoEnable(
438481cfg: OpenClawConfig,
439482env: NodeJS.ProcessEnv,
440483): boolean {
441-if (hasPluginAllowlistWithEntries(cfg)) {
484+if (hasPluginAllowlistWithMaterialEntries(cfg)) {
442485return true;
443486}
444487if (hasConfiguredPluginConfigEntry(cfg)) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。