UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

198 lines (197 loc) • 7.57 kB
import { c as normalizeOptionalLowercaseString } from "./string-coerce-6kR-86XC.mjs"; import { y as uniqueStrings } from "./string-normalization-YMwDjufr.mjs"; import { r as normalizeProviderId } from "./provider-id-BIyeXQag.mjs"; import { l as normalizePluginsConfig } from "./config-state-1t-kMQI9.mjs"; import { p as normalizePluginIdScope, u as createPluginIdScopeSet } from "./current-plugin-metadata-snapshot-BvP9Ow4r.mjs"; import { i as passesManifestOwnerBasePolicy, r as isBundledManifestOwner, t as hasExplicitManifestOwnerTrust } from "./manifest-owner-policy-BRwRqqb1.mjs"; import { n as loadPluginManifestRegistryForPluginRegistry } from "./plugin-registry-contributions-C_gLZwDT.mjs"; //#region src/plugins/activation-planner.ts /** Computes which manifest-owned plugins need activation for commands, routes, providers, or capabilities. */ /** Returns a deterministic activation plan without importing plugin runtime modules. */ function resolveManifestActivationPlan(params) { const entries = []; const { pluginIds, diagnostics } = collectManifestActivationMatches(params, entries); return { trigger: params.trigger, pluginIds, entries, diagnostics }; } /** Selects plugin ids without materializing diagnostic reasons or plan entries. */ function resolveManifestActivationPluginIds(params) { return collectManifestActivationMatches(params).pluginIds; } function collectManifestActivationMatches(params, entries) { const onlyPluginIdSet = createPluginIdScopeSet(normalizePluginIdScope(params.onlyPluginIds)); const registry = params.manifestRecords ? { plugins: params.manifestRecords, diagnostics: [] } : loadPluginManifestRegistryForPluginRegistry({ config: params.config, workspaceDir: params.workspaceDir, env: params.env, includeDisabled: true }); if (registry.plugins.length === 0 || onlyPluginIdSet?.size === 0) return { pluginIds: [], diagnostics: registry.diagnostics }; const normalizedConfig = params.normalizedConfig ?? normalizePluginsConfig(params.config?.plugins); const expected = normalizeActivationTrigger(params.trigger); const rules = params.trigger.kind === "capability" ? CAPABILITY_RULES[params.trigger.capability] : ACTIVATION_RULES[params.trigger.kind]; const matchedIds = []; for (const plugin of registry.plugins) { if (params.origin && plugin.origin !== params.origin) continue; if (onlyPluginIdSet && !onlyPluginIdSet.has(plugin.id)) continue; if (!passesManifestOwnerBasePolicy({ plugin, normalizedConfig, allowRestrictiveAllowlistBypass: params.allowRestrictiveAllowlistBypass })) continue; if (params.requireExplicitManifestOwnerTrust && !hasExplicitActivationPlannerManifestOwnerTrust({ plugin, normalizedConfig })) continue; const reasons = entries ? [] : void 0; for (const rule of rules) { if (!rule.matches(plugin, expected)) continue; if (!reasons) { matchedIds.push(plugin.id); break; } reasons.push(rule.reason); } if (reasons?.length) entries?.push({ pluginId: plugin.id, origin: plugin.origin, reasons }); } if (entries) entries.sort((left, right) => left.pluginId.localeCompare(right.pluginId)); return { pluginIds: uniqueStrings(entries ? entries.map((entry) => entry.pluginId) : matchedIds.toSorted((left, right) => left.localeCompare(right))), diagnostics: registry.diagnostics }; } function hasExplicitActivationPlannerManifestOwnerTrust(params) { return isBundledManifestOwner(params.plugin) || params.plugin.origin === "config" || hasExplicitManifestOwnerTrust({ plugin: params.plugin, normalizedConfig: params.normalizedConfig }); } const ACTIVATION_RULES = { command: [ { reason: "activation-command-hint", matches: (plugin, command) => listHasNormalizedValue(plugin.activation?.onCommands, command, normalizeCommandId) }, { reason: "manifest-cli-command-owner", matches: (plugin, command) => plugin.cliCommands?.some((descriptor) => normalizeCommandId(descriptor.name) === command) ?? false }, { reason: "manifest-command-alias", matches: (plugin, command) => plugin.commandAliases?.some((alias) => normalizeCommandId(alias.cliCommand ?? alias.name) === command) ?? false } ], provider: [ { reason: "activation-provider-hint", matches: (plugin, provider) => listHasNormalizedValue(plugin.activation?.onProviders, provider, normalizeProviderId) }, { reason: "manifest-provider-owner", matches: (plugin, provider) => listHasNormalizedValue(plugin.providers, provider, normalizeProviderId) }, { reason: "manifest-setup-provider-owner", matches: (plugin, provider) => plugin.setup?.providers?.some((entry) => normalizeProviderId(entry.id) === provider) ?? false } ], agentHarness: [{ reason: "activation-agent-harness-hint", matches: (plugin, runtime) => listHasNormalizedValue(plugin.activation?.onAgentHarnesses, runtime, normalizeCommandId) }], channel: [{ reason: "activation-channel-hint", matches: (plugin, channel) => listHasNormalizedValue(plugin.activation?.onChannels, channel, normalizeCommandId) }, { reason: "manifest-channel-owner", matches: (plugin, channel) => listHasNormalizedValue(plugin.channels, channel, normalizeCommandId) }], route: [{ reason: "activation-route-hint", matches: (plugin, route) => listHasNormalizedValue(plugin.activation?.onRoutes, route, normalizeCommandId) }] }; const CAPABILITY_RULES = { provider: [ { reason: "activation-capability-hint", matches: (plugin) => plugin.activation?.onCapabilities?.includes("provider") ?? false }, { reason: "activation-provider-hint", matches: (plugin) => hasValues(plugin.activation?.onProviders) }, { reason: "manifest-provider-owner", matches: (plugin) => hasValues(plugin.providers) }, { reason: "manifest-setup-provider-owner", matches: (plugin) => hasValues(plugin.setup?.providers) } ], channel: [ { reason: "activation-capability-hint", matches: (plugin) => plugin.activation?.onCapabilities?.includes("channel") ?? false }, { reason: "activation-channel-hint", matches: (plugin) => hasValues(plugin.activation?.onChannels) }, { reason: "manifest-channel-owner", matches: (plugin) => hasValues(plugin.channels) } ], tool: [{ reason: "activation-capability-hint", matches: (plugin) => plugin.activation?.onCapabilities?.includes("tool") ?? false }, { reason: "manifest-tool-contract", matches: (plugin) => hasValues(plugin.contracts?.tools) }], hook: [{ reason: "activation-capability-hint", matches: (plugin) => plugin.activation?.onCapabilities?.includes("hook") ?? false }, { reason: "manifest-hook-owner", matches: (plugin) => hasValues(plugin.hooks) }] }; function normalizeActivationTrigger(trigger) { switch (trigger.kind) { case "command": return normalizeCommandId(trigger.command); case "provider": return normalizeProviderId(trigger.provider); case "agentHarness": return normalizeCommandId(trigger.runtime); case "channel": return normalizeCommandId(trigger.channel); case "route": return normalizeCommandId(trigger.route); case "capability": return trigger.capability; } return trigger; } function listHasNormalizedValue(values, expected, normalize) { return values?.some((value) => normalize(value) === expected) ?? false; } function hasValues(values) { return (values?.length ?? 0) > 0; } function normalizeCommandId(value) { return normalizeOptionalLowercaseString(value) ?? ""; } //#endregion export { resolveManifestActivationPluginIds as n, resolveManifestActivationPlan as t };