openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
137 lines (136 loc) • 5.09 kB
JavaScript
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 };