UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

137 lines (136 loc) 5.09 kB
import { s as normalizeOptionalLowercaseString } from "./string-coerce-mnp54Vah.js"; import "./agent-scope-MrLta7Pq.js"; import { c as resolveDefaultAgentId, o as resolveAgentWorkspaceDir } from "./agent-scope-config-CgCYpZfK.js"; import { a as normalizeChannelId, t as getChannelPlugin } from "./registry-MkxNn1Ue.js"; import "./plugins-t2ejWcVy.js"; import { t as createClackPrompter } from "./clack-prompter-fc9v8HJv.js"; import { r as listRawChannelPluginCatalogEntries } from "./catalog-Px28uVRt.js"; import { n as loadChannelSetupPluginRegistrySnapshotForChannel, t as ensureChannelSetupPluginInstalled } from "./plugin-install-Z43r2oV7.js"; import { r as listTrustedChannelPluginCatalogEntries, t as getTrustedChannelPluginCatalogEntry } from "./trusted-catalog-LdIzL72U.js"; //#region src/commands/channel-setup/channel-plugin-resolution.ts function resolveWorkspaceDir(cfg) { return resolveAgentWorkspaceDir(cfg, resolveDefaultAgentId(cfg)); } function resolveResolvedChannelId(params) { const normalized = normalizeChannelId(params.rawChannel); if (normalized) return normalized; if (!params.catalogEntry) return; return normalizeChannelId(params.catalogEntry.id) ?? params.catalogEntry.id; } function resolveCatalogChannelEntry(raw, cfg) { const trimmed = normalizeOptionalLowercaseString(raw); if (!trimmed) return; return (cfg ? listTrustedChannelPluginCatalogEntries({ cfg, workspaceDir: resolveWorkspaceDir(cfg) }) : listRawChannelPluginCatalogEntries({ excludeWorkspace: true })).find((entry) => { if (normalizeOptionalLowercaseString(entry.id) === trimmed) return true; return (entry.meta.aliases ?? []).some((alias) => normalizeOptionalLowercaseString(alias) === trimmed); }); } function findScopedChannelPlugin(snapshot, channelId, supports) { const runtimePlugin = snapshot.channels.find((entry) => entry.plugin.id === channelId)?.plugin; if (runtimePlugin) return runtimePlugin; const setupPlugin = snapshot.channelSetups.find((entry) => entry.plugin.id === channelId)?.plugin; return setupPlugin && supports(setupPlugin) ? setupPlugin : void 0; } function loadScopedChannelPlugin(params) { return findScopedChannelPlugin(loadChannelSetupPluginRegistrySnapshotForChannel({ cfg: params.cfg, runtime: params.runtime, channel: params.channelId, ...params.pluginId ? { pluginId: params.pluginId } : {}, workspaceDir: params.workspaceDir }), params.channelId, params.supports); } /** Resolve an existing channel plugin, scoped setup plugin, or installable catalog entry. */ async function resolveInstallableChannelPlugin(params) { const supports = params.supports ?? (() => true); let nextCfg = params.cfg; const workspaceDir = resolveWorkspaceDir(nextCfg); const catalogEntry = (params.rawChannel ? resolveCatalogChannelEntry(params.rawChannel, nextCfg) : void 0) ?? (params.channelId ? getTrustedChannelPluginCatalogEntry(params.channelId, { cfg: nextCfg, workspaceDir }) : void 0); const channelId = params.channelId ?? resolveResolvedChannelId({ rawChannel: params.rawChannel, catalogEntry }); if (!channelId) return { cfg: nextCfg, catalogEntry, configChanged: false, pluginInstalled: false }; const existing = getChannelPlugin(channelId); if (existing) return { cfg: nextCfg, channelId, plugin: existing, catalogEntry, configChanged: false, pluginInstalled: false, supportsRequestedCapability: supports(existing) }; const resolvedPluginId = catalogEntry?.pluginId; if (catalogEntry) { const scoped = loadScopedChannelPlugin({ cfg: nextCfg, runtime: params.runtime, channelId, supports, pluginId: resolvedPluginId, workspaceDir }); if (scoped) return { cfg: nextCfg, channelId, plugin: scoped, catalogEntry, configChanged: false, pluginInstalled: false, supportsRequestedCapability: supports(scoped) }; if (params.allowInstall !== false) { const installResult = await ensureChannelSetupPluginInstalled({ cfg: nextCfg, entry: catalogEntry, prompter: params.prompter ?? createClackPrompter(), runtime: params.runtime, workspaceDir }); nextCfg = installResult.cfg; const installedPluginId = installResult.pluginId ?? resolvedPluginId; const installedPlugin = installResult.installed ? loadScopedChannelPlugin({ cfg: nextCfg, runtime: params.runtime, channelId, supports, pluginId: installedPluginId, workspaceDir: resolveWorkspaceDir(nextCfg) }) : void 0; return { cfg: nextCfg, channelId, plugin: installedPlugin ?? existing, catalogEntry: installedPluginId && catalogEntry.pluginId !== installedPluginId ? { ...catalogEntry, pluginId: installedPluginId } : catalogEntry, configChanged: nextCfg !== params.cfg, pluginInstalled: installResult.installed, supportsRequestedCapability: installedPlugin ? supports(installedPlugin) : void 0 }; } } return { cfg: nextCfg, channelId, plugin: existing, catalogEntry, configChanged: false, pluginInstalled: false }; } //#endregion export { resolveInstallableChannelPlugin as t };