


























@@ -9,10 +9,11 @@ import {
99} from "../memory-host-sdk/dreaming.js";
1010import { normalizeOptionalLowercaseString } from "../shared/string-coerce.js";
1111import { hasExplicitChannelConfig } from "./channel-presence-policy.js";
12+import { collectPluginConfigContractMatches } from "./config-contracts.js";
1213import { resolveEffectivePluginActivationState } from "./config-state.js";
1314import type { InstalledPluginIndexRecord } from "./installed-plugin-index.js";
1415import { loadPluginManifestRegistryForInstalledIndex } from "./manifest-registry-installed.js";
15-import type { PluginManifestRegistry } from "./manifest-registry.js";
16+import type { PluginManifestRecord, PluginManifestRegistry } from "./manifest-registry.js";
1617import {
1718createPluginRegistryIdNormalizer,
1819normalizePluginsConfigWithRegistry,
@@ -39,6 +40,20 @@ function listDisabledChannelIds(config: OpenClawConfig): Set<string> {
3940);
4041}
414243+function isRecord(value: unknown): value is Record<string, unknown> {
44+return Boolean(value && typeof value === "object" && !Array.isArray(value));
45+}
46+47+function isConfigActivationValueEnabled(value: unknown): boolean {
48+if (value === false) {
49+return false;
50+}
51+if (isRecord(value) && value.enabled === false) {
52+return false;
53+}
54+return true;
55+}
56+4257function listPotentialEnabledChannelIds(config: OpenClawConfig, env: NodeJS.ProcessEnv): string[] {
4358const disabled = listDisabledChannelIds(config);
4459return listPotentialConfiguredChannelIds(config, env, { includePersistedAuthState: false })
@@ -125,6 +140,60 @@ function listManifestChannelIds(
125140return manifestRegistry.plugins.find((plugin) => plugin.id === pluginId)?.channels ?? [];
126141}
127142143+function findManifestPlugin(
144+manifestRegistry: PluginManifestRegistry,
145+pluginId: string,
146+): PluginManifestRecord | undefined {
147+return manifestRegistry.plugins.find((plugin) => plugin.id === pluginId);
148+}
149+150+function hasConfiguredActivationPath(params: {
151+manifest: PluginManifestRecord | undefined;
152+config: OpenClawConfig;
153+}): boolean {
154+const paths = params.manifest?.activation?.onConfigPaths;
155+if (!paths?.length) {
156+return false;
157+}
158+return paths.some((pathPattern) =>
159+collectPluginConfigContractMatches({
160+root: params.config,
161+ pathPattern,
162+}).some((match) => isConfigActivationValueEnabled(match.value)),
163+);
164+}
165+166+function canStartConfiguredRootPlugin(params: {
167+plugin: InstalledPluginIndexRecord;
168+manifest: PluginManifestRecord | undefined;
169+config: OpenClawConfig;
170+pluginsConfig: ReturnType<typeof normalizePluginsConfigWithRegistry>;
171+activationSourcePlugins: ReturnType<typeof normalizePluginsConfigWithRegistry>;
172+}): boolean {
173+if (params.plugin.origin !== "bundled") {
174+return false;
175+}
176+if (!hasConfiguredActivationPath({ manifest: params.manifest, config: params.config })) {
177+return false;
178+}
179+if (!params.pluginsConfig.enabled || !params.activationSourcePlugins.enabled) {
180+return false;
181+}
182+if (
183+params.pluginsConfig.deny.includes(params.plugin.pluginId) ||
184+params.activationSourcePlugins.deny.includes(params.plugin.pluginId)
185+) {
186+return false;
187+}
188+if (
189+params.pluginsConfig.entries[params.plugin.pluginId]?.enabled === false ||
190+params.activationSourcePlugins.entries[params.plugin.pluginId]?.enabled === false
191+) {
192+return false;
193+}
194+return true;
195+}
196+128197function canStartConfiguredChannelPlugin(params: {
129198plugin: InstalledPluginIndexRecord;
130199config: OpenClawConfig;
@@ -301,6 +370,7 @@ export function resolveGatewayStartupPluginIdsFromRegistry(params: {
301370});
302371return params.index.plugins
303372.filter((plugin) => {
373+const manifest = findManifestPlugin(params.manifestRegistry, plugin.pluginId);
304374if (
305375hasConfiguredStartupChannel({
306376 plugin,
@@ -338,6 +408,17 @@ export function resolveGatewayStartupPluginIdsFromRegistry(params: {
338408) {
339409return false;
340410}
411+if (
412+canStartConfiguredRootPlugin({
413+ plugin,
414+ manifest,
415+config: activationSourceConfig,
416+ pluginsConfig,
417+ activationSourcePlugins,
418+})
419+) {
420+return true;
421+}
341422const activationState = resolveEffectivePluginActivationState({
342423id: plugin.pluginId,
343424origin: plugin.origin,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。