openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
93 lines (92 loc) • 4 kB
JavaScript
import { c as normalizeOptionalLowercaseString } from "./string-coerce-CIXf7egm.js";
import { a as normalizeChannelId, n as getLoadedChannelPlugin } from "./registry-Cz6cv4VC.js";
import "./plugins-Cozj1Enf.js";
import { t as createClackPrompter } from "./clack-prompter-BSpWH_ak.js";
import { t as resolveChannelSetupOwner } from "./owner-nhq5CyLg.js";
import { r as listTrustedChannelPluginCatalogEntries, t as getTrustedChannelPluginCatalogEntry } from "./trusted-catalog-DHqhhA7d.js";
import { n as loadChannelSetupPluginRegistrySnapshotForChannel, t as ensureChannelSetupPluginInstalled } from "./plugin-install-uIVtZNrH.js";
//#region src/commands/channel-setup/channel-plugin-resolution.ts
function resolveCatalogChannelEntry(raw, cfg, workspaceDir) {
const trimmed = normalizeOptionalLowercaseString(raw);
if (!trimmed) return;
return listTrustedChannelPluginCatalogEntries({
cfg,
workspaceDir
}).find((entry) => {
if (normalizeOptionalLowercaseString(entry.id) === trimmed) return true;
return (entry.meta.aliases ?? []).some((alias) => normalizeOptionalLowercaseString(alias) === trimmed);
});
}
/** 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 directChannelId = params.channelId ?? normalizeChannelId(params.rawChannel);
const registeredPlugin = params.preferRegisteredPlugin && directChannelId ? getLoadedChannelPlugin(directChannelId) : void 0;
if (params.preferRegisteredPlugin && directChannelId && registeredPlugin) return {
cfg: nextCfg,
channelId: directChannelId,
plugin: registeredPlugin,
configChanged: false,
pluginInstalled: false,
supportsRequestedCapability: supports(registeredPlugin)
};
const { workspaceDir } = resolveChannelSetupOwner(nextCfg, params.agentId);
let catalogEntry = (params.rawChannel ? resolveCatalogChannelEntry(params.rawChannel, nextCfg, workspaceDir) : void 0) ?? (params.channelId ? getTrustedChannelPluginCatalogEntry(params.channelId, {
cfg: nextCfg,
workspaceDir
}) : void 0);
const channelId = directChannelId ?? (catalogEntry ? normalizeChannelId(catalogEntry.id) ?? catalogEntry.id : void 0);
if (!channelId) return {
cfg: nextCfg,
catalogEntry,
configChanged: false,
pluginInstalled: false
};
let plugin = getLoadedChannelPlugin(channelId);
let pluginInstalled = false;
if (!plugin && catalogEntry) {
const loadPlugin = (pluginId) => {
const snapshot = loadChannelSetupPluginRegistrySnapshotForChannel({
cfg: nextCfg,
runtime: params.runtime,
channel: channelId,
...pluginId ? { pluginId } : {},
workspaceDir
});
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;
};
plugin = loadPlugin(catalogEntry.pluginId);
if (!plugin && 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 ?? catalogEntry.pluginId;
pluginInstalled = installResult.installed;
if (pluginInstalled) plugin = loadPlugin(installedPluginId);
if (installedPluginId && catalogEntry.pluginId !== installedPluginId) catalogEntry = {
...catalogEntry,
pluginId: installedPluginId
};
}
}
return {
cfg: nextCfg,
channelId,
plugin,
catalogEntry,
configChanged: nextCfg !== params.cfg,
pluginInstalled,
supportsRequestedCapability: plugin ? supports(plugin) : void 0
};
}
//#endregion
export { resolveInstallableChannelPlugin as t };