@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
81 lines (64 loc) • 2.61 kB
text/typescript
import { LobeChatPluginManifest } from '@lobehub/chat-plugin-sdk';
import { uniq } from 'lodash-es';
import { InstallPluginMeta, LobeToolCustomPlugin } from '@/types/tool/plugin';
import type { ToolStoreState } from '../../initialState';
const installedPlugins = (s: ToolStoreState) => s.installedPlugins;
const isPluginInstalled = (id: string) => (s: ToolStoreState) =>
installedPlugins(s).some((i) => i.identifier === id);
const getInstalledPluginById = (id: string) => (s: ToolStoreState) =>
installedPlugins(s).find((p) => p.identifier === id);
const getPluginMetaById = (id: string) => (s: ToolStoreState) => {
// first try to find meta from store
const storeMeta = s.pluginStoreList.find((i) => i.identifier === id)?.meta;
if (storeMeta) return storeMeta;
// then use installed meta
return getInstalledPluginById(id)(s)?.manifest?.meta;
};
const getCustomPluginById = (id: string) => (s: ToolStoreState) =>
installedPlugins(s).find((i) => i.identifier === id && i.type === 'customPlugin') as
| LobeToolCustomPlugin
| undefined;
const getToolManifestById = (id: string) => (s: ToolStoreState) =>
getInstalledPluginById(id)(s)?.manifest;
const getPluginSettingsById = (id: string) => (s: ToolStoreState) =>
getInstalledPluginById(id)(s)?.settings || {};
const storeAndInstallPluginsIdList = (s: ToolStoreState) =>
uniq(
[
s.installedPlugins.map((i) => i.identifier),
s.pluginStoreList.map((i) => i.identifier),
].flat(),
);
const installedPluginManifestList = (s: ToolStoreState) =>
installedPlugins(s)
.map((i) => i.manifest as LobeChatPluginManifest)
.filter((i) => !!i);
const installedPluginMetaList = (s: ToolStoreState) =>
installedPlugins(s).map<InstallPluginMeta>((p) => ({
author: p.manifest?.author,
createdAt: p.manifest?.createdAt || (p.manifest as any)?.createAt,
homepage: p.manifest?.homepage,
identifier: p.identifier,
meta: getPluginMetaById(p.identifier)(s),
type: p.type,
}));
const installedCustomPluginMetaList = (s: ToolStoreState) =>
installedPluginMetaList(s).filter((p) => p.type === 'customPlugin');
const isPluginHasUI = (id: string) => (s: ToolStoreState) => {
const plugin = getToolManifestById(id)(s);
return !!plugin?.ui;
};
export const pluginSelectors = {
getCustomPluginById,
getInstalledPluginById,
getPluginMetaById,
getPluginSettingsById,
getToolManifestById,
installedCustomPluginMetaList,
installedPluginManifestList,
installedPluginMetaList,
installedPlugins,
isPluginHasUI,
isPluginInstalled,
storeAndInstallPluginsIdList,
};