openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
155 lines (154 loc) • 6.86 kB
JavaScript
import { s as normalizeOptionalLowercaseString } from "./string-coerce-mnp54Vah.js";
import { i as normalizeProviderId } from "./provider-id-Dq06Bcx6.js";
import { s as normalizePluginsConfig } from "./config-state-CikNNz7T.js";
import { p as resolvePluginControlPlaneFingerprint, r as getCurrentPluginMetadataSnapshot } from "./current-plugin-metadata-snapshot-CfA_n2Nc.js";
import { i as loadPluginMetadataSnapshot } from "./plugin-metadata-snapshot-Ctk9Oarq.js";
//#region src/plugins/plugin-config-trust.ts
/** Applies workspace plugin allow/deny config before manifest records reach control-plane decisions. */
/** Normalizes plugin ids used in config allow/deny/entry lists. */
function normalizePluginConfigId(id) {
return normalizeOptionalLowercaseString(id) ?? "";
}
function hasPluginConfigId(list, pluginId) {
return Array.isArray(list) && list.some((entry) => normalizePluginConfigId(entry) === pluginId);
}
function findPluginConfigEntry(entries, pluginId) {
if (!entries || typeof entries !== "object" || Array.isArray(entries)) return;
for (const [key, value] of Object.entries(entries)) {
if (normalizePluginConfigId(key) !== pluginId) continue;
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
}
}
/** Resolves whether workspace plugin config allows one plugin manifest record. */
function isWorkspacePluginAllowedByConfig(params) {
const pluginsConfig = params.config?.plugins;
if (pluginsConfig?.enabled === false) return false;
const pluginId = normalizePluginConfigId(params.plugin.id);
if (!pluginId || hasPluginConfigId(pluginsConfig?.deny, pluginId)) return false;
const entry = findPluginConfigEntry(pluginsConfig?.entries, pluginId);
if (entry?.enabled === false) return false;
if (entry?.enabled === true || hasPluginConfigId(pluginsConfig?.allow, pluginId)) return true;
return params.isImplicitlyAllowed?.(pluginId) ?? false;
}
//#endregion
//#region src/agents/provider-auth-aliases.ts
/**
* Provider auth alias resolution.
* Maps deprecated and plugin-defined provider IDs to canonical credential
* providers, with trusted workspace plugin handling and process-stable caching.
*/
const PROVIDER_AUTH_ALIAS_ORIGIN_PRIORITY = {
config: 0,
bundled: 1,
global: 2,
workspace: 3
};
let providerAuthAliasMapCache = /* @__PURE__ */ new WeakMap();
function buildProviderAuthAliasMapCacheKey(params, env) {
return JSON.stringify({
pluginControlPlane: resolvePluginControlPlaneFingerprint({
config: params?.config,
env,
workspaceDir: params?.workspaceDir
}),
includeUntrustedWorkspacePlugins: params?.includeUntrustedWorkspacePlugins === true,
plugins: params?.config?.plugins ?? null
});
}
/** Clear provider auth alias cache for tests that mutate plugin metadata. */
function resetProviderAuthAliasMapCacheForTest() {
providerAuthAliasMapCache = /* @__PURE__ */ new WeakMap();
}
function resolveProviderAuthAliasOriginPriority(origin) {
if (!origin) return Number.MAX_SAFE_INTEGER;
return PROVIDER_AUTH_ALIAS_ORIGIN_PRIORITY[origin] ?? Number.MAX_SAFE_INTEGER;
}
function isWorkspacePluginTrustedForAuthAliases(plugin, config) {
return isWorkspacePluginAllowedByConfig({
config,
isImplicitlyAllowed: (pluginId) => normalizePluginConfigId(config?.plugins?.slots?.contextEngine) === pluginId,
plugin
});
}
function shouldUsePluginAuthAliases(plugin, params) {
if (plugin.origin !== "workspace" || params?.includeUntrustedWorkspacePlugins === true) return true;
return isWorkspacePluginTrustedForAuthAliases(plugin, params?.config);
}
function setPreferredAlias(params) {
const normalizedAlias = normalizeProviderId(params.alias);
const normalizedTarget = normalizeProviderId(params.target);
if (!normalizedAlias || !normalizedTarget) return;
const existing = params.aliases.get(normalizedAlias);
if (!existing || resolveProviderAuthAliasOriginPriority(params.origin) < resolveProviderAuthAliasOriginPriority(existing.origin)) params.aliases.set(normalizedAlias, {
origin: params.origin,
target: normalizedTarget
});
}
/** Resolve canonical auth provider aliases from plugin metadata. */
function resolveProviderAuthAliasMap(params) {
const env = params?.env ?? process.env;
const config = params?.config;
let cacheKey;
let envCache;
if (!params?.metadataSnapshot) {
cacheKey = buildProviderAuthAliasMapCacheKey(params, env);
envCache = providerAuthAliasMapCache.get(env);
if (!envCache) {
envCache = /* @__PURE__ */ new Map();
providerAuthAliasMapCache.set(env, envCache);
}
const cached = envCache.get(cacheKey);
if (cached) return cached;
}
const snapshot = params?.metadataSnapshot ?? (config ? getCurrentPluginMetadataSnapshot({
config,
...params?.workspaceDir !== void 0 ? { workspaceDir: params.workspaceDir } : {},
env,
allowWorkspaceScopedSnapshot: true
}) : getCurrentPluginMetadataSnapshot({
...params?.workspaceDir !== void 0 ? { workspaceDir: params.workspaceDir } : {},
env,
allowWorkspaceScopedSnapshot: true,
requireDefaultDiscoveryContext: true
})) ?? (() => {
if (!config || normalizePluginsConfig(config.plugins).loadPaths.length !== 0) return;
return getCurrentPluginMetadataSnapshot({
...params?.workspaceDir !== void 0 ? { workspaceDir: params.workspaceDir } : {},
env,
allowWorkspaceScopedSnapshot: true,
requireDefaultDiscoveryContext: true
});
})() ?? loadPluginMetadataSnapshot({
config: config ?? {},
...params?.workspaceDir !== void 0 ? { workspaceDir: params.workspaceDir } : {},
env
});
const preferredAliases = /* @__PURE__ */ new Map();
const aliases = Object.create(null);
for (const plugin of snapshot.plugins) {
if (!shouldUsePluginAuthAliases(plugin, params)) continue;
for (const [alias, target] of Object.entries(plugin.providerAuthAliases ?? {}).toSorted(([left], [right]) => left.localeCompare(right))) setPreferredAlias({
aliases: preferredAliases,
alias,
origin: plugin.origin,
target
});
for (const choice of plugin.providerAuthChoices ?? []) for (const deprecatedChoiceId of choice.deprecatedChoiceIds ?? []) setPreferredAlias({
aliases: preferredAliases,
alias: deprecatedChoiceId,
origin: plugin.origin,
target: choice.provider
});
}
for (const [alias, candidate] of preferredAliases) aliases[alias] = candidate.target;
if (envCache && cacheKey) envCache.set(cacheKey, aliases);
return aliases;
}
/** Resolve the provider ID that should be used for credential lookup. */
function resolveProviderIdForAuth(provider, params) {
const normalized = normalizeProviderId(provider);
if (!normalized) return normalized;
return resolveProviderAuthAliasMap(params)[normalized] ?? normalized;
}
//#endregion
export { normalizePluginConfigId as a, isWorkspacePluginAllowedByConfig as i, resolveProviderAuthAliasMap as n, resolveProviderIdForAuth as r, resetProviderAuthAliasMapCacheForTest as t };