From b742c8c7f9cf8a76dd75a9414e41416f1cecf161 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Wed, 13 Aug 2025 00:35:12 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=81=EF=B8=8F=E2=80=8D=F0=9F=97=A8?= =?UTF-8?q?=EF=B8=8F=20refactor:=20use=20`PermissionBits.VIEW`=20in=20`use?= =?UTF-8?q?AgentsMap`=20for=20`requiredPermission`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/common/types.ts | 1 + .../SidePanel/Agents/AgentSelect.tsx | 10 +++----- client/src/data-provider/Agents/queries.ts | 24 +------------------ client/src/hooks/Agents/index.ts | 1 + .../Agents/useAgentDefaultPermissionLevel.ts | 18 ++++++++++++++ client/src/hooks/Agents/useAgentsMap.ts | 9 ++++--- client/src/hooks/Input/useQueryParams.spec.ts | 5 +++- 7 files changed, 32 insertions(+), 36 deletions(-) create mode 100644 client/src/hooks/Agents/useAgentDefaultPermissionLevel.ts diff --git a/client/src/common/types.ts b/client/src/common/types.ts index 214dc349b..5e001c758 100644 --- a/client/src/common/types.ts +++ b/client/src/common/types.ts @@ -225,6 +225,7 @@ export type AgentPanelContextType = { setActivePanel: React.Dispatch>; setCurrentAgentId: React.Dispatch>; agent_id?: string; + agentsConfig?: t.TAgentsEndpoint; }; export type AgentModelPanelProps = { diff --git a/client/src/components/SidePanel/Agents/AgentSelect.tsx b/client/src/components/SidePanel/Agents/AgentSelect.tsx index 5d3285d4a..411f1c45f 100644 --- a/client/src/components/SidePanel/Agents/AgentSelect.tsx +++ b/client/src/components/SidePanel/Agents/AgentSelect.tsx @@ -7,12 +7,8 @@ import type { UseMutationResult, QueryObserverResult } from '@tanstack/react-que import type { Agent, AgentCreateParams } from 'librechat-data-provider'; import type { TAgentCapabilities, AgentForm } from '~/common'; import { cn, createProviderOption, processAgentOption, getDefaultAgentFormValues } from '~/utils'; -import { - useAgentListingDefaultPermissionLevel, - useGetStartupConfig, - useListAgentsQuery, -} from '~/data-provider'; -import { useLocalize } from '~/hooks'; +import { useGetStartupConfig, useListAgentsQuery } from '~/data-provider'; +import { useLocalize, useAgentDefaultPermissionLevel } from '~/hooks'; const keys = new Set(Object.keys(defaultAgentFormValues)); @@ -32,7 +28,7 @@ export default function AgentSelect({ const { control, reset } = useFormContext(); const { data: startupConfig } = useGetStartupConfig(); - const permissionLevel = useAgentListingDefaultPermissionLevel(); + const permissionLevel = useAgentDefaultPermissionLevel(); const { data: agents = null } = useListAgentsQuery( { requiredPermission: permissionLevel }, diff --git a/client/src/data-provider/Agents/queries.ts b/client/src/data-provider/Agents/queries.ts index 473ee8875..416dec6e4 100644 --- a/client/src/data-provider/Agents/queries.ts +++ b/client/src/data-provider/Agents/queries.ts @@ -1,33 +1,11 @@ -import { - QueryKeys, - dataService, - Permissions, - EModelEndpoint, - PermissionBits, - PermissionTypes, -} from 'librechat-data-provider'; import { useQuery, useInfiniteQuery, useQueryClient } from '@tanstack/react-query'; +import { QueryKeys, dataService, EModelEndpoint, PermissionBits } from 'librechat-data-provider'; import type { QueryObserverResult, UseQueryOptions, UseInfiniteQueryOptions, } from '@tanstack/react-query'; import type t from 'librechat-data-provider'; -import { useHasAccess } from '~/hooks'; - -/** - * Hook to determine the appropriate permission level for agent queries based on marketplace configuration - */ -export const useAgentListingDefaultPermissionLevel = () => { - const hasMarketplaceAccess = useHasAccess({ - permissionType: PermissionTypes.MARKETPLACE, - permission: Permissions.USE, - }); - - // When marketplace is active: EDIT permissions (builder mode) - // When marketplace is not active: VIEW permissions (browse mode) - return hasMarketplaceAccess ? PermissionBits.EDIT : PermissionBits.VIEW; -}; /** * AGENTS diff --git a/client/src/hooks/Agents/index.ts b/client/src/hooks/Agents/index.ts index 4eba68fe0..496d2c19a 100644 --- a/client/src/hooks/Agents/index.ts +++ b/client/src/hooks/Agents/index.ts @@ -4,3 +4,4 @@ export { default as useAgentCategories } from './useAgentCategories'; export type { ProcessedAgentCategory } from './useAgentCategories'; export { default as useAgentCapabilities } from './useAgentCapabilities'; export { default as useGetAgentsConfig } from './useGetAgentsConfig'; +export { default as useAgentDefaultPermissionLevel } from './useAgentDefaultPermissionLevel'; diff --git a/client/src/hooks/Agents/useAgentDefaultPermissionLevel.ts b/client/src/hooks/Agents/useAgentDefaultPermissionLevel.ts new file mode 100644 index 000000000..9b0345208 --- /dev/null +++ b/client/src/hooks/Agents/useAgentDefaultPermissionLevel.ts @@ -0,0 +1,18 @@ +import { Permissions, PermissionBits, PermissionTypes } from 'librechat-data-provider'; +import { useHasAccess } from '~/hooks/Roles'; + +/** + * Hook to determine the appropriate permission level for agent queries based on marketplace configuration + */ +const useAgentDefaultPermissionLevel = () => { + const hasMarketplaceAccess = useHasAccess({ + permissionType: PermissionTypes.MARKETPLACE, + permission: Permissions.USE, + }); + + // When marketplace is active: EDIT permissions (builder mode) + // When marketplace is not active: VIEW permissions (browse mode) + return hasMarketplaceAccess ? PermissionBits.EDIT : PermissionBits.VIEW; +}; + +export default useAgentDefaultPermissionLevel; diff --git a/client/src/hooks/Agents/useAgentsMap.ts b/client/src/hooks/Agents/useAgentsMap.ts index 112f75a25..19a0b1d99 100644 --- a/client/src/hooks/Agents/useAgentsMap.ts +++ b/client/src/hooks/Agents/useAgentsMap.ts @@ -1,6 +1,7 @@ -import { TAgentsMap } from 'librechat-data-provider'; import { useMemo } from 'react'; -import { useListAgentsQuery, useAgentListingDefaultPermissionLevel } from '~/data-provider'; +import { PermissionBits } from 'librechat-data-provider'; +import type { TAgentsMap } from 'librechat-data-provider'; +import { useListAgentsQuery } from '~/data-provider'; import { mapAgents } from '~/utils'; export default function useAgentsMap({ @@ -8,10 +9,8 @@ export default function useAgentsMap({ }: { isAuthenticated: boolean; }): TAgentsMap | undefined { - const permissionLevel = useAgentListingDefaultPermissionLevel(); - const { data: agentsList = null } = useListAgentsQuery( - { requiredPermission: permissionLevel }, + { requiredPermission: PermissionBits.VIEW }, { select: (res) => mapAgents(res.data), enabled: isAuthenticated, diff --git a/client/src/hooks/Input/useQueryParams.spec.ts b/client/src/hooks/Input/useQueryParams.spec.ts index 9647fc2d7..7b52495cc 100644 --- a/client/src/hooks/Input/useQueryParams.spec.ts +++ b/client/src/hooks/Input/useQueryParams.spec.ts @@ -60,6 +60,10 @@ jest.mock('~/hooks/Agents/useAgentsMap', () => ({ __esModule: true, default: jest.fn(() => ({})), })); +jest.mock('~/hooks/Agents/useAgentDefaultPermissionLevel', () => ({ + __esModule: true, + default: jest.fn(() => ({})), +})); jest.mock('~/utils', () => ({ getConvoSwitchLogic: jest.fn(() => ({ @@ -101,7 +105,6 @@ jest.mock('~/data-provider', () => ({ isLoading: false, error: null, })), - useAgentListingDefaultPermissionLevel: jest.fn(() => 'view'), useListAgentsQuery: jest.fn(() => ({ data: null, isLoading: false,