mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-31 16:08:37 +00:00
* refactor: share talk event metric extraction * refactor: reuse shared coercion helpers * refactor: reuse shared primitive guards * refactor: reuse shared record guard * refactor: reuse shared primitive helpers * refactor: reuse shared string guards * refactor: reuse shared non-empty string guard * refactor: share plugin primitive coercion helpers * refactor: reuse plugin coercion helpers * refactor: reuse plugin coercion helpers in more plugins * refactor: reuse channel coercion helpers * refactor: reuse monitor coercion helpers * refactor: reuse provider coercion helpers * refactor: reuse core coercion helpers * refactor: reuse runtime coercion helpers * refactor: reuse helper coercion in codex paths * refactor: reuse helper coercion in runtime paths * refactor: reuse codex app-server coercion helpers * refactor: reuse codex record helpers * refactor: reuse migration and qa record helpers * refactor: reuse feishu and core helper guards * refactor: reuse browser and policy coercion helpers * refactor: reuse memory wiki record helper * refactor: share boolean coercion helpers * refactor: reuse finite number coercion * refactor: reuse trimmed string list helpers * refactor: reuse string list normalization * refactor: reuse remaining string list helpers * refactor: reuse string entry normalizer * refactor: share sorted string helpers * refactor: share string list normalization * test: preserve command registry browser imports * refactor: reuse trimmed list helpers * refactor: reuse string dedupe helpers * refactor: reuse local dedupe helpers * refactor: reuse more string dedupe helpers * refactor: reuse command string dedupe helpers * refactor: dedupe memory path lists with helper * refactor: expose string dedupe helpers to plugins * refactor: reuse core string dedupe helpers * refactor: reuse shared unique value helpers * refactor: reuse unique helpers in agent utilities * refactor: reuse unique helpers in config plumbing * refactor: reuse unique helpers in extensions * refactor: reuse unique helpers in core utilities * refactor: reuse unique helpers in qa plugins * refactor: reuse unique helpers in memory plugins * refactor: reuse unique helpers in channel plugins * refactor: reuse unique helpers in core tails * refactor: reuse unique helper in comfy workflow * refactor: reuse unique helpers in test utilities * refactor: expose unique value helper to plugins * refactor: reuse unique helpers for numeric lists * refactor: replace index dedupe filters * refactor: reuse string entry normalization * refactor: reuse string normalization in plugin helpers * refactor: reuse string normalization in extension helpers * refactor: reuse string normalization in channel parsers * refactor: reuse string normalization in memory search * refactor: reuse string normalization in provider parsers * refactor: reuse string normalization in qa helpers * refactor: reuse string normalization in infra parsers * refactor: reuse string normalization in messaging parsers * refactor: reuse string normalization in core parsers * refactor: reuse string normalization in extension parsers * refactor: reuse string normalization in remaining parsers * refactor: reuse string normalization in final parser spots * refactor: reuse string normalization in qa media helpers * refactor: reuse normalization in provider and media lists * refactor: reuse normalization for remaining set filters * refactor: reuse normalization in policy allowlists * refactor: reuse normalization in session and owner lists * refactor: centralize primitive string lists * refactor: reuse lowercase entry helpers * refactor: reuse sorted string helpers * refactor: reuse unique trimmed helpers * refactor: reuse string normalization helpers * refactor: reuse catalog string helpers * refactor: reuse remaining string helpers * refactor: simplify remaining list normalization * refactor: reuse codex auth order normalization * chore: refresh plugin sdk api baseline * fix: make shared string sorting deterministic * chore: refresh plugin sdk api baseline * fix: align host env security ordering
190 lines
5.7 KiB
TypeScript
190 lines
5.7 KiB
TypeScript
import {
|
|
listExplicitlyDisabledChannelIdsForConfig,
|
|
listPotentialConfiguredChannelIds,
|
|
} from "../channels/config-presence.js";
|
|
import { applyPluginAutoEnable } from "../config/plugin-auto-enable.js";
|
|
import type { OpenClawConfig } from "../config/types.openclaw.js";
|
|
import { normalizeOptionalLowercaseString } from "../shared/string-coerce.js";
|
|
import { sortUniqueStrings } from "../shared/string-normalization.js";
|
|
import {
|
|
listExplicitConfiguredChannelIdsForConfig,
|
|
loadGatewayStartupPluginPlan,
|
|
resolveConfiguredChannelPluginIds,
|
|
} from "./channel-plugin-ids.js";
|
|
import { normalizePluginsConfig } from "./config-state.js";
|
|
import { loadManifestMetadataSnapshot } from "./manifest-contract-eligibility.js";
|
|
import { passesManifestOwnerBasePolicy } from "./manifest-owner-policy.js";
|
|
import { defaultSlotIdForKey } from "./slots.js";
|
|
|
|
function collectConfiguredChannelIds(
|
|
config: OpenClawConfig,
|
|
activationSourceConfig: OpenClawConfig,
|
|
env: NodeJS.ProcessEnv,
|
|
): string[] {
|
|
const disabled = new Set([
|
|
...listExplicitlyDisabledChannelIdsForConfig(config),
|
|
...listExplicitlyDisabledChannelIdsForConfig(activationSourceConfig),
|
|
]);
|
|
const ids = new Set([
|
|
...listPotentialConfiguredChannelIds(config, env, { includePersistedAuthState: false }),
|
|
...listExplicitConfiguredChannelIdsForConfig(activationSourceConfig),
|
|
]);
|
|
return [...ids]
|
|
.map((channelId) => normalizeOptionalLowercaseString(channelId))
|
|
.filter((channelId): channelId is string => {
|
|
if (!channelId) {
|
|
return false;
|
|
}
|
|
return !disabled.has(channelId);
|
|
})
|
|
.toSorted((left, right) => left.localeCompare(right));
|
|
}
|
|
|
|
function collectBundledChannelOwnerPluginIds(params: {
|
|
config: OpenClawConfig;
|
|
channelIds: readonly string[];
|
|
env: NodeJS.ProcessEnv;
|
|
workspaceDir?: string;
|
|
bundledPluginsDir?: string;
|
|
}): string[] {
|
|
const plugins = normalizePluginsConfig(params.config.plugins);
|
|
const channelIds = new Set(
|
|
params.channelIds
|
|
.map((channelId) => normalizeOptionalLowercaseString(channelId))
|
|
.filter((channelId): channelId is string => Boolean(channelId)),
|
|
);
|
|
if (channelIds.size === 0) {
|
|
return [];
|
|
}
|
|
const env = params.bundledPluginsDir
|
|
? {
|
|
...params.env,
|
|
OPENCLAW_BUNDLED_PLUGINS_DIR: params.bundledPluginsDir,
|
|
...(params.env.VITEST || process.env.VITEST
|
|
? { OPENCLAW_TEST_TRUST_BUNDLED_PLUGINS_DIR: "1" }
|
|
: {}),
|
|
}
|
|
: params.env;
|
|
const snapshot = loadManifestMetadataSnapshot({
|
|
config: params.config,
|
|
env,
|
|
workspaceDir: params.workspaceDir,
|
|
});
|
|
const pluginIds = new Set<string>();
|
|
for (const plugin of snapshot.plugins) {
|
|
if (plugin.origin !== "bundled") {
|
|
continue;
|
|
}
|
|
if (
|
|
plugin.channels.some((channelId) =>
|
|
channelIds.has(normalizeOptionalLowercaseString(channelId) ?? ""),
|
|
)
|
|
) {
|
|
const pluginId = normalizeOptionalLowercaseString(plugin.id);
|
|
if (
|
|
pluginId &&
|
|
passesManifestOwnerBasePolicy({
|
|
plugin: { id: pluginId },
|
|
normalizedConfig: plugins,
|
|
allowRestrictiveAllowlistBypass: true,
|
|
})
|
|
) {
|
|
pluginIds.add(pluginId);
|
|
}
|
|
}
|
|
}
|
|
return sortUniqueStrings(pluginIds);
|
|
}
|
|
|
|
function collectExplicitEffectivePluginIds(config: OpenClawConfig): string[] {
|
|
const plugins = normalizePluginsConfig(config.plugins);
|
|
if (!plugins.enabled) {
|
|
return [];
|
|
}
|
|
|
|
const ids = new Set(plugins.allow);
|
|
for (const [pluginId, entry] of Object.entries(plugins.entries)) {
|
|
if (
|
|
entry?.enabled === true &&
|
|
(plugins.allow.length === 0 || plugins.allow.includes(pluginId))
|
|
) {
|
|
ids.add(pluginId);
|
|
}
|
|
}
|
|
for (const pluginId of plugins.deny) {
|
|
ids.delete(pluginId);
|
|
}
|
|
for (const [pluginId, entry] of Object.entries(plugins.entries)) {
|
|
if (entry?.enabled === false) {
|
|
ids.delete(pluginId);
|
|
}
|
|
}
|
|
return sortUniqueStrings(ids);
|
|
}
|
|
|
|
function collectSelectedContextEnginePluginIds(config: OpenClawConfig): string[] {
|
|
const plugins = normalizePluginsConfig(config.plugins);
|
|
if (!plugins.enabled) {
|
|
return [];
|
|
}
|
|
const pluginId = plugins.slots.contextEngine;
|
|
if (!pluginId || pluginId === defaultSlotIdForKey("contextEngine")) {
|
|
return [];
|
|
}
|
|
if (plugins.deny.includes(pluginId)) {
|
|
return [];
|
|
}
|
|
if (plugins.entries[pluginId]?.enabled === false) {
|
|
return [];
|
|
}
|
|
return [pluginId];
|
|
}
|
|
|
|
export function resolveEffectivePluginIds(params: {
|
|
config: OpenClawConfig;
|
|
env: NodeJS.ProcessEnv;
|
|
workspaceDir?: string;
|
|
bundledPluginsDir?: string;
|
|
}): string[] {
|
|
const autoEnabled = applyPluginAutoEnable({
|
|
config: params.config,
|
|
env: params.env,
|
|
});
|
|
const effectiveConfig = autoEnabled.config;
|
|
const ids = new Set(collectExplicitEffectivePluginIds(effectiveConfig));
|
|
for (const pluginId of collectSelectedContextEnginePluginIds(effectiveConfig)) {
|
|
ids.add(pluginId);
|
|
}
|
|
const configuredChannelIds = collectConfiguredChannelIds(
|
|
effectiveConfig,
|
|
params.config,
|
|
params.env,
|
|
);
|
|
for (const pluginId of resolveConfiguredChannelPluginIds({
|
|
config: effectiveConfig,
|
|
activationSourceConfig: params.config,
|
|
workspaceDir: params.workspaceDir,
|
|
env: params.env,
|
|
})) {
|
|
ids.add(pluginId);
|
|
}
|
|
for (const pluginId of collectBundledChannelOwnerPluginIds({
|
|
config: effectiveConfig,
|
|
channelIds: configuredChannelIds,
|
|
env: params.env,
|
|
workspaceDir: params.workspaceDir,
|
|
...(params.bundledPluginsDir ? { bundledPluginsDir: params.bundledPluginsDir } : {}),
|
|
})) {
|
|
ids.add(pluginId);
|
|
}
|
|
for (const pluginId of loadGatewayStartupPluginPlan({
|
|
config: effectiveConfig,
|
|
activationSourceConfig: params.config,
|
|
workspaceDir: params.workspaceDir,
|
|
env: params.env,
|
|
}).pluginIds) {
|
|
ids.add(pluginId);
|
|
}
|
|
return sortUniqueStrings(ids);
|
|
}
|