




























@@ -0,0 +1,92 @@
1+import type { OpenClawConfig } from "../config/types.openclaw.js";
2+import {
3+resolveBundledPluginCompatibleLoadValues,
4+type PluginActivationBundledCompatMode,
5+} from "./activation-context.js";
6+import {
7+createPluginActivationSource,
8+normalizePluginsConfig,
9+resolveEffectivePluginActivationState,
10+} from "./config-state.js";
11+import { loadManifestContractSnapshot } from "./manifest-contract-eligibility.js";
12+import type { PluginManifestContractListKey, PluginManifestRecord } from "./manifest-registry.js";
13+14+function createPluginIdSet(pluginIds: readonly string[] | undefined): Set<string> | null {
15+return pluginIds && pluginIds.length > 0 ? new Set(pluginIds) : null;
16+}
17+18+export function listBundledManifestContractPluginIds(params: {
19+plugins: readonly PluginManifestRecord[];
20+contract: PluginManifestContractListKey;
21+onlyPluginIds?: readonly string[];
22+}): string[] {
23+const onlyPluginIdSet = createPluginIdSet(params.onlyPluginIds);
24+return params.plugins
25+.filter(
26+(plugin) =>
27+plugin.origin === "bundled" &&
28+(!onlyPluginIdSet || onlyPluginIdSet.has(plugin.id)) &&
29+(plugin.contracts?.[params.contract]?.length ?? 0) > 0,
30+)
31+.map((plugin) => plugin.id)
32+.toSorted((left, right) => left.localeCompare(right));
33+}
34+35+export function resolveEnabledBundledManifestContractPlugins(params: {
36+config?: OpenClawConfig;
37+workspaceDir?: string;
38+env?: NodeJS.ProcessEnv;
39+onlyPluginIds?: readonly string[];
40+contract: PluginManifestContractListKey;
41+compatMode: PluginActivationBundledCompatMode;
42+}): PluginManifestRecord[] {
43+if (params.config?.plugins?.enabled === false) {
44+return [];
45+}
46+let manifestRecords: readonly PluginManifestRecord[] | undefined;
47+const loadManifestRecords = (config?: OpenClawConfig) => {
48+manifestRecords ??= loadManifestContractSnapshot({
49+ config,
50+workspaceDir: params.workspaceDir,
51+env: params.env,
52+}).plugins;
53+return manifestRecords;
54+};
55+56+const activation = resolveBundledPluginCompatibleLoadValues({
57+rawConfig: params.config,
58+env: params.env,
59+workspaceDir: params.workspaceDir,
60+onlyPluginIds: params.onlyPluginIds,
61+applyAutoEnable: true,
62+compatMode: params.compatMode,
63+resolveCompatPluginIds: (compatParams) =>
64+listBundledManifestContractPluginIds({
65+plugins: loadManifestRecords(compatParams.config),
66+contract: params.contract,
67+onlyPluginIds: compatParams.onlyPluginIds,
68+}),
69+});
70+const normalizedPlugins = normalizePluginsConfig(activation.config?.plugins);
71+const activationSource = createPluginActivationSource({
72+config: activation.activationSourceConfig,
73+});
74+const onlyPluginIdSet = createPluginIdSet(params.onlyPluginIds);
75+return loadManifestRecords(activation.config).filter((plugin) => {
76+if (
77+plugin.origin !== "bundled" ||
78+(onlyPluginIdSet && !onlyPluginIdSet.has(plugin.id)) ||
79+(plugin.contracts?.[params.contract]?.length ?? 0) === 0
80+) {
81+return false;
82+}
83+return resolveEffectivePluginActivationState({
84+id: plugin.id,
85+origin: plugin.origin,
86+config: normalizedPlugins,
87+rootConfig: activation.config,
88+enabledByDefault: plugin.enabledByDefault,
89+ activationSource,
90+}).enabled;
91+});
92+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。