mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-20 18:30:15 +01:00
- Move AgentCategory from api/models to @packages/data-schemas structure - Add schema, types, methods, and model following codebase conventions - Implement auto-seeding of default categories during AppService startup - Update marketplace controller to use new data-schemas methods - Remove old model file and standalone seed script refactor: unify agent marketplace to single endpoint with cursor pagination - Replace multiple marketplace routes with unified /marketplace endpoint - Add query string controls: category, search, limit, cursor, promoted, requiredPermission - Implement cursor-based pagination replacing page-based system - Integrate ACL permissions for proper access control - Fix ObjectId constructor error in Agent model - Update React components to use unified useGetMarketplaceAgentsQuery hook - Enhance type safety and remove deprecated useDynamicAgentQuery - Update tests for new marketplace architecture -Known issues: see more button after category switching + Unit tests feat: add icon property to ProcessedAgentCategory interface - Add useMarketplaceAgentsInfiniteQuery and useGetAgentCategoriesQuery to client/src/data-provider/Agents/ - Replace manual pagination in AgentGrid with infinite query pattern - Update imports to use local data provider instead of librechat-data-provider - Add proper permission handling with PERMISSION_BITS.VIEW/EDIT constants - Improve agent access control by adding requiredPermission validation in backend - Remove manual cursor/state management in favor of infinite query built-ins - Maintain existing search and category filtering functionality refactor: consolidate agent marketplace endpoints into main agents API and improve data management consistency - Remove dedicated marketplace controller and routes, merging functionality into main agents v1 API - Add countPromotedAgents function to Agent model for promoted agents count - Enhance getListAgents handler with marketplace filtering (category, search, promoted status) - Move getAgentCategories from marketplace to v1 controller with same functionality - Update agent mutations to invalidate marketplace queries and handle multiple permission levels - Improve cache management by updating all agent query variants (VIEW/EDIT permissions) - Consolidate agent data access patterns for better maintainability and consistency - Remove duplicate marketplace route definitions and middleware selected view only agents injected in the drop down fix: remove minlength validation for support contact name in agent schema feat: add validation and error messages for agent name in AgentConfig and AgentPanel fix: update agent permission check logic in AgentPanel to simplify condition Fix linting WIP Fix Unit tests WIP ESLint fixes eslint fix refactor: enhance isDuplicateVersion function in Agent model for improved comparison logic - Introduced handling for undefined/null values in array and object comparisons. - Normalized array comparisons to treat undefined/null as empty arrays. - Added deep comparison for objects and improved handling of primitive values. - Enhanced projectIds comparison to ensure consistent MongoDB ObjectId handling. refactor: remove redundant properties from IAgent interface in agent schema chore: update localization for agent detail component and clean up imports ci: update access middleware tests chore: remove unused PermissionTypes import from Role model ci: update AclEntry model tests ci: update button accessibility labels in AgentDetail tests refactor: update exhaustive dep. lint warning
196 lines
5.4 KiB
TypeScript
196 lines
5.4 KiB
TypeScript
import { useMemo } from 'react';
|
|
import { MessageSquareQuote, ArrowRightToLine, Settings2, Database, Bookmark } from 'lucide-react';
|
|
import {
|
|
isAssistantsEndpoint,
|
|
isAgentsEndpoint,
|
|
PermissionTypes,
|
|
isParamEndpoint,
|
|
EModelEndpoint,
|
|
Permissions,
|
|
} from 'librechat-data-provider';
|
|
import type { TInterfaceConfig, TEndpointsConfig } from 'librechat-data-provider';
|
|
import type { NavLink } from '~/common';
|
|
import AgentPanelSwitch from '~/components/SidePanel/Agents/AgentPanelSwitch';
|
|
import BookmarkPanel from '~/components/SidePanel/Bookmarks/BookmarkPanel';
|
|
import MemoryViewer from '~/components/SidePanel/Memories/MemoryViewer';
|
|
import PanelSwitch from '~/components/SidePanel/Builder/PanelSwitch';
|
|
import PromptsAccordion from '~/components/Prompts/PromptsAccordion';
|
|
import { Blocks, MCPIcon, AttachmentIcon } from '~/components/svg';
|
|
import Parameters from '~/components/SidePanel/Parameters/Panel';
|
|
import FilesPanel from '~/components/SidePanel/Files/Panel';
|
|
import MCPPanel from '~/components/SidePanel/MCP/MCPPanel';
|
|
import { useGetStartupConfig } from '~/data-provider';
|
|
import { useHasAccess } from '~/hooks';
|
|
|
|
export default function useSideNavLinks({
|
|
hidePanel,
|
|
keyProvided,
|
|
endpoint,
|
|
endpointType,
|
|
interfaceConfig,
|
|
endpointsConfig,
|
|
}: {
|
|
hidePanel: () => void;
|
|
keyProvided: boolean;
|
|
endpoint?: EModelEndpoint | null;
|
|
endpointType?: EModelEndpoint | null;
|
|
interfaceConfig: Partial<TInterfaceConfig>;
|
|
endpointsConfig: TEndpointsConfig;
|
|
}) {
|
|
const hasAccessToPrompts = useHasAccess({
|
|
permissionType: PermissionTypes.PROMPTS,
|
|
permission: Permissions.USE,
|
|
});
|
|
const hasAccessToBookmarks = useHasAccess({
|
|
permissionType: PermissionTypes.BOOKMARKS,
|
|
permission: Permissions.USE,
|
|
});
|
|
const hasAccessToMemories = useHasAccess({
|
|
permissionType: PermissionTypes.MEMORIES,
|
|
permission: Permissions.USE,
|
|
});
|
|
const hasAccessToReadMemories = useHasAccess({
|
|
permissionType: PermissionTypes.MEMORIES,
|
|
permission: Permissions.READ,
|
|
});
|
|
const hasAccessToAgents = useHasAccess({
|
|
permissionType: PermissionTypes.AGENTS,
|
|
permission: Permissions.USE,
|
|
});
|
|
const hasAccessToCreateAgents = useHasAccess({
|
|
permissionType: PermissionTypes.AGENTS,
|
|
permission: Permissions.CREATE,
|
|
});
|
|
const { data: startupConfig } = useGetStartupConfig();
|
|
|
|
const Links = useMemo(() => {
|
|
const links: NavLink[] = [];
|
|
if (
|
|
isAssistantsEndpoint(endpoint) &&
|
|
((endpoint === EModelEndpoint.assistants &&
|
|
endpointsConfig?.[EModelEndpoint.assistants] &&
|
|
endpointsConfig[EModelEndpoint.assistants].disableBuilder !== true) ||
|
|
(endpoint === EModelEndpoint.azureAssistants &&
|
|
endpointsConfig?.[EModelEndpoint.azureAssistants] &&
|
|
endpointsConfig[EModelEndpoint.azureAssistants].disableBuilder !== true)) &&
|
|
keyProvided
|
|
) {
|
|
links.push({
|
|
title: 'com_sidepanel_assistant_builder',
|
|
label: '',
|
|
icon: Blocks,
|
|
id: EModelEndpoint.assistants,
|
|
Component: PanelSwitch,
|
|
});
|
|
}
|
|
|
|
if (
|
|
endpointsConfig?.[EModelEndpoint.agents] &&
|
|
hasAccessToAgents &&
|
|
hasAccessToCreateAgents &&
|
|
endpointsConfig[EModelEndpoint.agents].disableBuilder !== true
|
|
) {
|
|
links.push({
|
|
title: 'com_sidepanel_agent_builder',
|
|
label: '',
|
|
icon: Blocks,
|
|
id: EModelEndpoint.agents,
|
|
Component: AgentPanelSwitch,
|
|
});
|
|
}
|
|
|
|
if (hasAccessToPrompts) {
|
|
links.push({
|
|
title: 'com_ui_prompts',
|
|
label: '',
|
|
icon: MessageSquareQuote,
|
|
id: 'prompts',
|
|
Component: PromptsAccordion,
|
|
});
|
|
}
|
|
|
|
if (hasAccessToMemories && hasAccessToReadMemories) {
|
|
links.push({
|
|
title: 'com_ui_memories',
|
|
label: '',
|
|
icon: Database,
|
|
id: 'memories',
|
|
Component: MemoryViewer,
|
|
});
|
|
}
|
|
|
|
if (
|
|
interfaceConfig.parameters === true &&
|
|
isParamEndpoint(endpoint ?? '', endpointType ?? '') === true &&
|
|
!isAgentsEndpoint(endpoint) &&
|
|
keyProvided
|
|
) {
|
|
links.push({
|
|
title: 'com_sidepanel_parameters',
|
|
label: '',
|
|
icon: Settings2,
|
|
id: 'parameters',
|
|
Component: Parameters,
|
|
});
|
|
}
|
|
|
|
links.push({
|
|
title: 'com_sidepanel_attach_files',
|
|
label: '',
|
|
icon: AttachmentIcon,
|
|
id: 'files',
|
|
Component: FilesPanel,
|
|
});
|
|
|
|
if (hasAccessToBookmarks) {
|
|
links.push({
|
|
title: 'com_sidepanel_conversation_tags',
|
|
label: '',
|
|
icon: Bookmark,
|
|
id: 'bookmarks',
|
|
Component: BookmarkPanel,
|
|
});
|
|
}
|
|
|
|
if (
|
|
startupConfig?.mcpServers &&
|
|
Object.values(startupConfig.mcpServers).some(
|
|
(server) => server.customUserVars && Object.keys(server.customUserVars).length > 0,
|
|
)
|
|
) {
|
|
links.push({
|
|
title: 'com_nav_setting_mcp',
|
|
label: '',
|
|
icon: MCPIcon,
|
|
id: 'mcp-settings',
|
|
Component: MCPPanel,
|
|
});
|
|
}
|
|
|
|
links.push({
|
|
title: 'com_sidepanel_hide_panel',
|
|
label: '',
|
|
icon: ArrowRightToLine,
|
|
onClick: hidePanel,
|
|
id: 'hide-panel',
|
|
});
|
|
|
|
return links;
|
|
}, [
|
|
endpointsConfig,
|
|
interfaceConfig.parameters,
|
|
keyProvided,
|
|
endpointType,
|
|
endpoint,
|
|
hasAccessToAgents,
|
|
hasAccessToPrompts,
|
|
hasAccessToMemories,
|
|
hasAccessToReadMemories,
|
|
hasAccessToBookmarks,
|
|
hasAccessToCreateAgents,
|
|
hidePanel,
|
|
startupConfig,
|
|
]);
|
|
|
|
return Links;
|
|
}
|