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,