mirror of https://github.com/openclaw/openclaw.git
83 lines
2.4 KiB
TypeScript
83 lines
2.4 KiB
TypeScript
import {
|
|
getActivePluginChannelRegistryVersion,
|
|
requireActivePluginChannelRegistry,
|
|
} from "../../plugins/runtime.js";
|
|
import { CHAT_CHANNEL_ORDER, type ChatChannelId, normalizeAnyChannelId } from "../registry.js";
|
|
import type { ChannelId, ChannelPlugin } from "./types.js";
|
|
|
|
function dedupeChannels(channels: ChannelPlugin[]): ChannelPlugin[] {
|
|
const seen = new Set<string>();
|
|
const resolved: ChannelPlugin[] = [];
|
|
for (const plugin of channels) {
|
|
const id = String(plugin.id).trim();
|
|
if (!id || seen.has(id)) {
|
|
continue;
|
|
}
|
|
seen.add(id);
|
|
resolved.push(plugin);
|
|
}
|
|
return resolved;
|
|
}
|
|
|
|
type CachedChannelPlugins = {
|
|
registryVersion: number;
|
|
sorted: ChannelPlugin[];
|
|
byId: Map<string, ChannelPlugin>;
|
|
};
|
|
|
|
const EMPTY_CHANNEL_PLUGIN_CACHE: CachedChannelPlugins = {
|
|
registryVersion: -1,
|
|
sorted: [],
|
|
byId: new Map(),
|
|
};
|
|
|
|
let cachedChannelPlugins = EMPTY_CHANNEL_PLUGIN_CACHE;
|
|
|
|
function resolveCachedChannelPlugins(): CachedChannelPlugins {
|
|
const registry = requireActivePluginChannelRegistry();
|
|
const registryVersion = getActivePluginChannelRegistryVersion();
|
|
const cached = cachedChannelPlugins;
|
|
if (cached.registryVersion === registryVersion) {
|
|
return cached;
|
|
}
|
|
|
|
const sorted = dedupeChannels(registry.channels.map((entry) => entry.plugin)).toSorted((a, b) => {
|
|
const indexA = CHAT_CHANNEL_ORDER.indexOf(a.id as ChatChannelId);
|
|
const indexB = CHAT_CHANNEL_ORDER.indexOf(b.id as ChatChannelId);
|
|
const orderA = a.meta.order ?? (indexA === -1 ? 999 : indexA);
|
|
const orderB = b.meta.order ?? (indexB === -1 ? 999 : indexB);
|
|
if (orderA !== orderB) {
|
|
return orderA - orderB;
|
|
}
|
|
return a.id.localeCompare(b.id);
|
|
});
|
|
const byId = new Map<string, ChannelPlugin>();
|
|
for (const plugin of sorted) {
|
|
byId.set(plugin.id, plugin);
|
|
}
|
|
|
|
const next: CachedChannelPlugins = {
|
|
registryVersion,
|
|
sorted,
|
|
byId,
|
|
};
|
|
cachedChannelPlugins = next;
|
|
return next;
|
|
}
|
|
|
|
export function listChannelPlugins(): ChannelPlugin[] {
|
|
return resolveCachedChannelPlugins().sorted.slice();
|
|
}
|
|
|
|
export function getChannelPlugin(id: ChannelId): ChannelPlugin | undefined {
|
|
const resolvedId = String(id).trim();
|
|
if (!resolvedId) {
|
|
return undefined;
|
|
}
|
|
return resolveCachedChannelPlugins().byId.get(resolvedId);
|
|
}
|
|
|
|
export function normalizeChannelId(raw?: string | null): ChannelId | null {
|
|
return normalizeAnyChannelId(raw);
|
|
}
|