| | import { loadDefaultInterface } from '@librechat/data-schemas'; |
| | import { SystemRoles, Permissions, PermissionTypes, roleDefaults } from 'librechat-data-provider'; |
| | import type { TConfigDefaults, TCustomConfig } from 'librechat-data-provider'; |
| | import type { AppConfig } from '@librechat/data-schemas'; |
| | import { updateInterfacePermissions } from './permissions'; |
| |
|
| | const mockUpdateAccessPermissions = jest.fn(); |
| | const mockGetRoleByName = jest.fn(); |
| |
|
| | describe('updateInterfacePermissions - permissions', () => { |
| | beforeEach(() => { |
| | jest.clearAllMocks(); |
| | |
| | mockGetRoleByName.mockResolvedValue(null); |
| | }); |
| |
|
| | it('should call updateAccessPermissions with the correct parameters when permission types are true', async () => { |
| | const config = { |
| | interface: { |
| | prompts: true, |
| | bookmarks: true, |
| | memories: true, |
| | multiConvo: true, |
| | agents: true, |
| | temporaryChat: true, |
| | runCode: true, |
| | webSearch: true, |
| | fileSearch: true, |
| | fileCitations: true, |
| | peoplePicker: { |
| | users: true, |
| | groups: true, |
| | roles: true, |
| | }, |
| | marketplace: { |
| | use: true, |
| | }, |
| | }, |
| | }; |
| | const configDefaults = { interface: {} } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | const expectedPermissionsForUser = { |
| | [PermissionTypes.PROMPTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: true }, |
| | [PermissionTypes.AGENTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: true }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: true, |
| | [Permissions.VIEW_GROUPS]: true, |
| | [Permissions.VIEW_ROLES]: true, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | const expectedPermissionsForAdmin = { |
| | [PermissionTypes.PROMPTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: true }, |
| | [PermissionTypes.AGENTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: true }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: true, |
| | [Permissions.VIEW_GROUPS]: true, |
| | [Permissions.VIEW_ROLES]: true, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledTimes(2); |
| |
|
| | |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.USER, |
| | expectedPermissionsForUser, |
| | null, |
| | ); |
| |
|
| | |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.ADMIN, |
| | expectedPermissionsForAdmin, |
| | null, |
| | ); |
| | }); |
| |
|
| | it('should call updateAccessPermissions with false when permission types are false', async () => { |
| | const config = { |
| | interface: { |
| | prompts: false, |
| | bookmarks: false, |
| | memories: false, |
| | multiConvo: false, |
| | agents: false, |
| | temporaryChat: false, |
| | runCode: false, |
| | webSearch: false, |
| | fileSearch: false, |
| | fileCitations: false, |
| | peoplePicker: { |
| | users: false, |
| | groups: false, |
| | roles: false, |
| | }, |
| | marketplace: { |
| | use: false, |
| | }, |
| | }, |
| | }; |
| | const configDefaults = { interface: {} } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | const expectedPermissionsForUser = { |
| | [PermissionTypes.PROMPTS]: { |
| | [Permissions.USE]: false, |
| | }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: false, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: false }, |
| | [PermissionTypes.AGENTS]: { |
| | [Permissions.USE]: false, |
| | }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: false }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: false }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: false }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: false }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: false, |
| | [Permissions.VIEW_GROUPS]: false, |
| | [Permissions.VIEW_ROLES]: false, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: false }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: false }, |
| | }; |
| |
|
| | const expectedPermissionsForAdmin = { |
| | [PermissionTypes.PROMPTS]: { |
| | [Permissions.USE]: false, |
| | }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: false, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: false }, |
| | [PermissionTypes.AGENTS]: { |
| | [Permissions.USE]: false, |
| | }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: false }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: false }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: false }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: false }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: false, |
| | [Permissions.VIEW_GROUPS]: false, |
| | [Permissions.VIEW_ROLES]: false, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: false }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: false }, |
| | }; |
| |
|
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledTimes(2); |
| |
|
| | |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.USER, |
| | expectedPermissionsForUser, |
| | null, |
| | ); |
| |
|
| | |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.ADMIN, |
| | expectedPermissionsForAdmin, |
| | null, |
| | ); |
| | }); |
| |
|
| | it('should call updateAccessPermissions with role-specific defaults when permission types are not specified in config', async () => { |
| | const config = {}; |
| | const configDefaults = { |
| | interface: { |
| | prompts: true, |
| | bookmarks: true, |
| | memories: true, |
| | multiConvo: true, |
| | agents: true, |
| | temporaryChat: true, |
| | runCode: true, |
| | webSearch: true, |
| | fileSearch: true, |
| | fileCitations: true, |
| | peoplePicker: { |
| | users: true, |
| | groups: true, |
| | roles: true, |
| | }, |
| | marketplace: { |
| | use: false, |
| | }, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | const expectedPermissionsForUser = { |
| | [PermissionTypes.PROMPTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: true }, |
| | [PermissionTypes.AGENTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: true }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: false }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: false, |
| | [Permissions.VIEW_GROUPS]: false, |
| | [Permissions.VIEW_ROLES]: false, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | const expectedPermissionsForAdmin = { |
| | [PermissionTypes.PROMPTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: true }, |
| | [PermissionTypes.AGENTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: true }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: true, |
| | [Permissions.VIEW_GROUPS]: true, |
| | [Permissions.VIEW_ROLES]: true, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledTimes(2); |
| |
|
| | |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.USER, |
| | expectedPermissionsForUser, |
| | null, |
| | ); |
| |
|
| | |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.ADMIN, |
| | expectedPermissionsForAdmin, |
| | null, |
| | ); |
| | }); |
| |
|
| | it('should call updateAccessPermissions with mixed values for permission types', async () => { |
| | const config = { |
| | interface: { |
| | prompts: true, |
| | bookmarks: false, |
| | memories: true, |
| | multiConvo: undefined, |
| | agents: true, |
| | temporaryChat: undefined, |
| | runCode: false, |
| | webSearch: true, |
| | fileSearch: false, |
| | fileCitations: true, |
| | }, |
| | }; |
| | const configDefaults = { |
| | interface: { |
| | prompts: true, |
| | bookmarks: true, |
| | memories: true, |
| | multiConvo: true, |
| | agents: true, |
| | temporaryChat: true, |
| | runCode: true, |
| | webSearch: true, |
| | fileSearch: true, |
| | fileCitations: true, |
| | peoplePicker: { |
| | users: true, |
| | groups: true, |
| | roles: true, |
| | }, |
| | marketplace: { |
| | use: false, |
| | }, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | const expectedPermissionsForUser = { |
| | [PermissionTypes.PROMPTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: true }, |
| | [PermissionTypes.AGENTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: true }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: false }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: false }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: false, |
| | [Permissions.VIEW_GROUPS]: false, |
| | [Permissions.VIEW_ROLES]: false, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: false }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | const expectedPermissionsForAdmin = { |
| | [PermissionTypes.PROMPTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: true }, |
| | [PermissionTypes.AGENTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: true }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: false }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: true, |
| | [Permissions.VIEW_GROUPS]: true, |
| | [Permissions.VIEW_ROLES]: true, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: false }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledTimes(2); |
| |
|
| | |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.USER, |
| | expectedPermissionsForUser, |
| | null, |
| | ); |
| |
|
| | |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.ADMIN, |
| | expectedPermissionsForAdmin, |
| | null, |
| | ); |
| | }); |
| |
|
| | it('should use default values when config is undefined', async () => { |
| | const config = undefined; |
| | const configDefaults = { |
| | interface: { |
| | prompts: true, |
| | bookmarks: true, |
| | memories: true, |
| | multiConvo: true, |
| | agents: true, |
| | temporaryChat: true, |
| | runCode: true, |
| | webSearch: true, |
| | fileSearch: true, |
| | fileCitations: true, |
| | peoplePicker: { |
| | users: true, |
| | groups: true, |
| | roles: true, |
| | }, |
| | marketplace: { |
| | use: false, |
| | }, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | const expectedPermissionsForUser = { |
| | [PermissionTypes.PROMPTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: true }, |
| | [PermissionTypes.AGENTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: true }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: false }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: false, |
| | [Permissions.VIEW_GROUPS]: false, |
| | [Permissions.VIEW_ROLES]: false, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | const expectedPermissionsForAdmin = { |
| | [PermissionTypes.PROMPTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: true }, |
| | [PermissionTypes.AGENTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: true }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: true, |
| | [Permissions.VIEW_GROUPS]: true, |
| | [Permissions.VIEW_ROLES]: true, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledTimes(2); |
| |
|
| | |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.USER, |
| | expectedPermissionsForUser, |
| | null, |
| | ); |
| |
|
| | |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.ADMIN, |
| | expectedPermissionsForAdmin, |
| | null, |
| | ); |
| | }); |
| |
|
| | it('should only update permissions that do not exist when no config provided', async () => { |
| | |
| | mockGetRoleByName.mockResolvedValue({ |
| | permissions: { |
| | [PermissionTypes.PROMPTS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.AGENTS]: { [Permissions.USE]: true }, |
| | }, |
| | }); |
| |
|
| | const config = undefined; |
| | const configDefaults = { |
| | interface: { |
| | prompts: true, |
| | bookmarks: true, |
| | memories: true, |
| | multiConvo: true, |
| | agents: true, |
| | temporaryChat: true, |
| | runCode: true, |
| | webSearch: true, |
| | fileSearch: true, |
| | fileCitations: true, |
| | peoplePicker: { |
| | users: true, |
| | groups: true, |
| | roles: true, |
| | }, |
| | marketplace: { |
| | use: false, |
| | }, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | |
| | const expectedPermissionsForUser = { |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: true }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: true }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: false }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: false, |
| | [Permissions.VIEW_GROUPS]: false, |
| | [Permissions.VIEW_ROLES]: false, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | const expectedPermissionsForAdmin = { |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: true }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: true }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: true, |
| | [Permissions.VIEW_GROUPS]: true, |
| | [Permissions.VIEW_ROLES]: true, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledTimes(2); |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.USER, |
| | expectedPermissionsForUser, |
| | expect.objectContaining({ |
| | permissions: { |
| | [PermissionTypes.PROMPTS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.AGENTS]: { [Permissions.USE]: true }, |
| | }, |
| | }), |
| | ); |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.ADMIN, |
| | expectedPermissionsForAdmin, |
| | expect.objectContaining({ |
| | permissions: { |
| | [PermissionTypes.PROMPTS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.AGENTS]: { [Permissions.USE]: true }, |
| | }, |
| | }), |
| | ); |
| | }); |
| |
|
| | it('should override existing permissions when explicitly configured', async () => { |
| | |
| | mockGetRoleByName.mockResolvedValue({ |
| | permissions: { |
| | [PermissionTypes.PROMPTS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.AGENTS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: false }, |
| | }, |
| | }); |
| |
|
| | const config = { |
| | interface: { |
| | prompts: true, |
| | |
| | |
| | }, |
| | }; |
| | const configDefaults = { |
| | interface: { |
| | prompts: false, |
| | agents: true, |
| | bookmarks: true, |
| | memories: true, |
| | multiConvo: true, |
| | temporaryChat: true, |
| | runCode: true, |
| | webSearch: true, |
| | fileSearch: true, |
| | fileCitations: true, |
| | peoplePicker: { |
| | users: true, |
| | groups: true, |
| | roles: true, |
| | }, |
| | marketplace: { |
| | use: false, |
| | }, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | |
| | const expectedPermissionsForUser = { |
| | [PermissionTypes.PROMPTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: true }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: true }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: false }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: false, |
| | [Permissions.VIEW_GROUPS]: false, |
| | [Permissions.VIEW_ROLES]: false, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | const expectedPermissionsForAdmin = { |
| | [PermissionTypes.PROMPTS]: { |
| | [Permissions.USE]: true, |
| | }, |
| | |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }, |
| | [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: true }, |
| | [PermissionTypes.TEMPORARY_CHAT]: { [Permissions.USE]: true }, |
| | [PermissionTypes.RUN_CODE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.WEB_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: true }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: true, |
| | [Permissions.VIEW_GROUPS]: true, |
| | [Permissions.VIEW_ROLES]: true, |
| | }, |
| | [PermissionTypes.FILE_SEARCH]: { [Permissions.USE]: true }, |
| | [PermissionTypes.FILE_CITATIONS]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledTimes(2); |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.USER, |
| | expectedPermissionsForUser, |
| | expect.objectContaining({ |
| | permissions: expect.any(Object), |
| | }), |
| | ); |
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledWith( |
| | SystemRoles.ADMIN, |
| | expectedPermissionsForAdmin, |
| | expect.objectContaining({ |
| | permissions: expect.any(Object), |
| | }), |
| | ); |
| | }); |
| |
|
| | it('should handle memories OPT_OUT based on personalization when memories are enabled', async () => { |
| | const config = { |
| | interface: { |
| | memories: true, |
| | }, |
| | memory: { |
| | |
| | agent: { |
| | id: 'test-agent-id', |
| | }, |
| | personalize: true, |
| | } as unknown as TCustomConfig['memory'], |
| | }; |
| | const configDefaults = { interface: {} } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | const userCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.USER, |
| | ); |
| | const adminCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.ADMIN, |
| | ); |
| |
|
| | |
| | expect(userCall[1][PermissionTypes.MEMORIES][Permissions.OPT_OUT]).toBe(true); |
| | expect(adminCall[1][PermissionTypes.MEMORIES][Permissions.OPT_OUT]).toBe(true); |
| | }); |
| |
|
| | it('should use role-specific defaults for PEOPLE_PICKER when peoplePicker config is undefined', async () => { |
| | const config = { |
| | interface: { |
| | |
| | prompts: true, |
| | bookmarks: true, |
| | }, |
| | }; |
| | const configDefaults = { interface: {} } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | expect(mockUpdateAccessPermissions).toHaveBeenCalledTimes(2); |
| |
|
| | |
| | const userCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.USER, |
| | ); |
| | const adminCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.ADMIN, |
| | ); |
| |
|
| | |
| | expect(userCall[1][PermissionTypes.PEOPLE_PICKER]).toEqual({ |
| | [Permissions.VIEW_USERS]: false, |
| | [Permissions.VIEW_GROUPS]: false, |
| | [Permissions.VIEW_ROLES]: false, |
| | }); |
| |
|
| | |
| | expect(adminCall[1][PermissionTypes.PEOPLE_PICKER]).toEqual({ |
| | [Permissions.VIEW_USERS]: true, |
| | [Permissions.VIEW_GROUPS]: true, |
| | [Permissions.VIEW_ROLES]: true, |
| | }); |
| | }); |
| |
|
| | it('should only call getRoleByName once per role for efficiency', async () => { |
| | const config = { |
| | interface: { |
| | prompts: true, |
| | bookmarks: true, |
| | }, |
| | }; |
| | const configDefaults = { interface: {} } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | |
| | expect(mockGetRoleByName).toHaveBeenCalledTimes(2); |
| | expect(mockGetRoleByName).toHaveBeenCalledWith(SystemRoles.USER); |
| | expect(mockGetRoleByName).toHaveBeenCalledWith(SystemRoles.ADMIN); |
| | }); |
| |
|
| | it('should use role-specific defaults for complex permissions when not configured', async () => { |
| | const config = { |
| | interface: { |
| | |
| | bookmarks: true, |
| | multiConvo: false, |
| | }, |
| | }; |
| | const configDefaults = { |
| | interface: { |
| | prompts: true, |
| | bookmarks: true, |
| | memories: true, |
| | multiConvo: true, |
| | agents: true, |
| | temporaryChat: true, |
| | runCode: true, |
| | webSearch: true, |
| | fileSearch: true, |
| | fileCitations: true, |
| | peoplePicker: { |
| | users: true, |
| | groups: true, |
| | roles: true, |
| | }, |
| | marketplace: { |
| | use: false, |
| | }, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | const userCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.USER, |
| | ); |
| | const adminCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.ADMIN, |
| | ); |
| |
|
| | |
| | expect(userCall[1][PermissionTypes.PROMPTS]).toEqual({ |
| | [Permissions.USE]: true, |
| | }); |
| |
|
| | expect(adminCall[1][PermissionTypes.PROMPTS]).toEqual({ |
| | [Permissions.USE]: true, |
| | }); |
| |
|
| | |
| | expect(userCall[1][PermissionTypes.AGENTS]).toEqual({ |
| | [Permissions.USE]: true, |
| | }); |
| |
|
| | expect(adminCall[1][PermissionTypes.AGENTS]).toEqual({ |
| | [Permissions.USE]: true, |
| | }); |
| |
|
| | |
| | expect(userCall[1][PermissionTypes.MEMORIES]).toEqual({ |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }); |
| |
|
| | expect(adminCall[1][PermissionTypes.MEMORIES]).toEqual({ |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: undefined, |
| | }); |
| | }); |
| |
|
| | it('should populate missing PEOPLE_PICKER and MARKETPLACE permissions with role-specific defaults', async () => { |
| | |
| | mockGetRoleByName.mockResolvedValue({ |
| | permissions: { |
| | [PermissionTypes.PROMPTS]: { [Permissions.USE]: true }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: true }, |
| | |
| | }, |
| | }); |
| |
|
| | const config = { |
| | interface: { |
| | prompts: true, |
| | bookmarks: true, |
| | }, |
| | }; |
| | const configDefaults = { |
| | interface: { |
| | prompts: true, |
| | bookmarks: true, |
| | peoplePicker: { |
| | users: true, |
| | groups: true, |
| | roles: true, |
| | }, |
| | marketplace: { |
| | use: false, |
| | }, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | const userCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.USER, |
| | ); |
| | const adminCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.ADMIN, |
| | ); |
| |
|
| | |
| | expect(userCall[1][PermissionTypes.PEOPLE_PICKER]).toEqual({ |
| | [Permissions.VIEW_USERS]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.PEOPLE_PICKER][ |
| | Permissions.VIEW_USERS |
| | ], |
| | [Permissions.VIEW_GROUPS]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.PEOPLE_PICKER][ |
| | Permissions.VIEW_GROUPS |
| | ], |
| | [Permissions.VIEW_ROLES]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.PEOPLE_PICKER][ |
| | Permissions.VIEW_ROLES |
| | ], |
| | }); |
| |
|
| | expect(adminCall[1][PermissionTypes.PEOPLE_PICKER]).toEqual({ |
| | [Permissions.VIEW_USERS]: |
| | roleDefaults[SystemRoles.ADMIN].permissions[PermissionTypes.PEOPLE_PICKER][ |
| | Permissions.VIEW_USERS |
| | ], |
| | [Permissions.VIEW_GROUPS]: |
| | roleDefaults[SystemRoles.ADMIN].permissions[PermissionTypes.PEOPLE_PICKER][ |
| | Permissions.VIEW_GROUPS |
| | ], |
| | [Permissions.VIEW_ROLES]: |
| | roleDefaults[SystemRoles.ADMIN].permissions[PermissionTypes.PEOPLE_PICKER][ |
| | Permissions.VIEW_ROLES |
| | ], |
| | }); |
| |
|
| | |
| | expect(userCall[1][PermissionTypes.MARKETPLACE]).toEqual({ |
| | [Permissions.USE]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.MARKETPLACE][Permissions.USE], |
| | }); |
| |
|
| | expect(adminCall[1][PermissionTypes.MARKETPLACE]).toEqual({ |
| | [Permissions.USE]: |
| | roleDefaults[SystemRoles.ADMIN].permissions[PermissionTypes.MARKETPLACE][Permissions.USE], |
| | }); |
| | }); |
| |
|
| | it('should leave all existing permissions unchanged when nothing is configured', async () => { |
| | |
| | const existingUserPermissions = { |
| | [PermissionTypes.PROMPTS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.MEMORIES]: { [Permissions.USE]: false }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: true, |
| | [Permissions.VIEW_GROUPS]: false, |
| | [Permissions.VIEW_ROLES]: true, |
| | }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: true }, |
| | }; |
| |
|
| | mockGetRoleByName.mockResolvedValue({ |
| | permissions: existingUserPermissions, |
| | }); |
| |
|
| | |
| | const config = undefined; |
| | const configDefaults = { |
| | interface: { |
| | prompts: true, |
| | bookmarks: true, |
| | memories: true, |
| | peoplePicker: { |
| | users: true, |
| | groups: true, |
| | roles: true, |
| | }, |
| | marketplace: { |
| | use: false, |
| | }, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | |
| | const userCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.USER, |
| | ); |
| |
|
| | |
| | expect(userCall[1]).not.toHaveProperty(PermissionTypes.PROMPTS); |
| | expect(userCall[1]).not.toHaveProperty(PermissionTypes.BOOKMARKS); |
| | expect(userCall[1]).not.toHaveProperty(PermissionTypes.MEMORIES); |
| | expect(userCall[1]).not.toHaveProperty(PermissionTypes.PEOPLE_PICKER); |
| | expect(userCall[1]).not.toHaveProperty(PermissionTypes.MARKETPLACE); |
| |
|
| | |
| | expect(userCall[1]).toHaveProperty(PermissionTypes.MULTI_CONVO); |
| | expect(userCall[1]).toHaveProperty(PermissionTypes.AGENTS); |
| | }); |
| |
|
| | it('should only update explicitly configured permissions and leave others unchanged', async () => { |
| | |
| | mockGetRoleByName.mockResolvedValue({ |
| | permissions: { |
| | [PermissionTypes.PROMPTS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: false }, |
| | [PermissionTypes.MEMORIES]: { [Permissions.USE]: false }, |
| | [PermissionTypes.PEOPLE_PICKER]: { |
| | [Permissions.VIEW_USERS]: false, |
| | [Permissions.VIEW_GROUPS]: false, |
| | [Permissions.VIEW_ROLES]: false, |
| | }, |
| | [PermissionTypes.MARKETPLACE]: { [Permissions.USE]: false }, |
| | }, |
| | }); |
| |
|
| | |
| | const config = { |
| | interface: { |
| | prompts: true, |
| | bookmarks: true, |
| | |
| | |
| | marketplace: { |
| | use: true, |
| | }, |
| | }, |
| | }; |
| | const configDefaults = { |
| | interface: { |
| | prompts: false, |
| | bookmarks: false, |
| | memories: true, |
| | peoplePicker: { |
| | users: true, |
| | groups: true, |
| | roles: true, |
| | }, |
| | marketplace: { |
| | use: false, |
| | }, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | const userCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.USER, |
| | ); |
| |
|
| | |
| | expect(userCall[1][PermissionTypes.PROMPTS]).toEqual({ |
| | [Permissions.USE]: true, |
| | }); |
| | expect(userCall[1][PermissionTypes.BOOKMARKS]).toEqual({ [Permissions.USE]: true }); |
| | expect(userCall[1][PermissionTypes.MARKETPLACE]).toEqual({ [Permissions.USE]: true }); |
| |
|
| | |
| | expect(userCall[1]).not.toHaveProperty(PermissionTypes.MEMORIES); |
| | expect(userCall[1]).not.toHaveProperty(PermissionTypes.PEOPLE_PICKER); |
| |
|
| | |
| | expect(userCall[1]).toHaveProperty(PermissionTypes.AGENTS); |
| | expect(userCall[1]).toHaveProperty(PermissionTypes.MULTI_CONVO); |
| | }); |
| |
|
| | it('should disable all memory permissions when memory.disabled is true', async () => { |
| | const config = { |
| | interface: { |
| | |
| | prompts: true, |
| | bookmarks: true, |
| | }, |
| | memory: { |
| | disabled: true, |
| | |
| | agent: { |
| | id: 'test-agent-id', |
| | }, |
| | personalize: true, |
| | } as unknown as TCustomConfig['memory'], |
| | }; |
| | const configDefaults = { |
| | interface: { |
| | memories: true, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | const expectedMemoryPermissions = { |
| | [Permissions.USE]: false, |
| | [Permissions.CREATE]: false, |
| | [Permissions.READ]: false, |
| | [Permissions.UPDATE]: false, |
| | [Permissions.OPT_OUT]: false, |
| | }; |
| |
|
| | |
| | const userCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.USER, |
| | ); |
| | expect(userCall[1][PermissionTypes.MEMORIES]).toEqual(expectedMemoryPermissions); |
| |
|
| | |
| | const adminCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.ADMIN, |
| | ); |
| | expect(adminCall[1][PermissionTypes.MEMORIES]).toEqual(expectedMemoryPermissions); |
| | }); |
| |
|
| | it('should enable memory permissions based on role defaults when memory is configured without disabled flag', async () => { |
| | const config = { |
| | interface: { |
| | memories: true, |
| | }, |
| | memory: { |
| | |
| | agent: { |
| | provider: 'openai', |
| | model: 'gpt-4', |
| | }, |
| | personalize: true, |
| | } as unknown as TCustomConfig['memory'], |
| | }; |
| | const configDefaults = { |
| | interface: { |
| | memories: true, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | |
| | const userCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.USER, |
| | ); |
| | expect(userCall[1][PermissionTypes.MEMORIES]).toEqual({ |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.MEMORIES]?.[Permissions.CREATE], |
| | [Permissions.READ]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.MEMORIES]?.[Permissions.READ], |
| | [Permissions.UPDATE]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.MEMORIES]?.[Permissions.UPDATE], |
| | [Permissions.OPT_OUT]: true, |
| | }); |
| |
|
| | |
| | const adminCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.ADMIN, |
| | ); |
| | expect(adminCall[1][PermissionTypes.MEMORIES]).toEqual({ |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: |
| | roleDefaults[SystemRoles.ADMIN].permissions[PermissionTypes.MEMORIES]?.[Permissions.CREATE], |
| | [Permissions.READ]: |
| | roleDefaults[SystemRoles.ADMIN].permissions[PermissionTypes.MEMORIES]?.[Permissions.READ], |
| | [Permissions.UPDATE]: |
| | roleDefaults[SystemRoles.ADMIN].permissions[PermissionTypes.MEMORIES]?.[Permissions.UPDATE], |
| | [Permissions.OPT_OUT]: true, |
| | }); |
| | }); |
| |
|
| | it('should re-enable memory permissions when memory.disabled changes from true to false', async () => { |
| | |
| | mockGetRoleByName.mockResolvedValue({ |
| | permissions: { |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: false, |
| | [Permissions.CREATE]: false, |
| | [Permissions.READ]: false, |
| | [Permissions.UPDATE]: false, |
| | [Permissions.OPT_OUT]: false, |
| | }, |
| | |
| | [PermissionTypes.PROMPTS]: { [Permissions.USE]: true }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: true }, |
| | }, |
| | }); |
| |
|
| | const config = { |
| | interface: { |
| | |
| | prompts: true, |
| | bookmarks: true, |
| | }, |
| | memory: { |
| | disabled: false, |
| | agent: { |
| | id: 'test-agent-id', |
| | }, |
| | personalize: true, |
| | } as unknown as TCustomConfig['memory'], |
| | }; |
| | const configDefaults = { |
| | interface: { |
| | memories: true, |
| | prompts: true, |
| | bookmarks: true, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | |
| | const userCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.USER, |
| | ); |
| | |
| | expect(userCall[1][PermissionTypes.MEMORIES]).toEqual({ |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.MEMORIES]?.[Permissions.CREATE], |
| | [Permissions.READ]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.MEMORIES]?.[Permissions.READ], |
| | [Permissions.UPDATE]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.MEMORIES]?.[Permissions.UPDATE], |
| | [Permissions.OPT_OUT]: true, |
| | }); |
| |
|
| | |
| | const adminCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.ADMIN, |
| | ); |
| | expect(adminCall[1][PermissionTypes.MEMORIES]).toEqual({ |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: |
| | roleDefaults[SystemRoles.ADMIN].permissions[PermissionTypes.MEMORIES]?.[Permissions.CREATE], |
| | [Permissions.READ]: |
| | roleDefaults[SystemRoles.ADMIN].permissions[PermissionTypes.MEMORIES]?.[Permissions.READ], |
| | [Permissions.UPDATE]: |
| | roleDefaults[SystemRoles.ADMIN].permissions[PermissionTypes.MEMORIES]?.[Permissions.UPDATE], |
| | [Permissions.OPT_OUT]: true, |
| | }); |
| |
|
| | |
| | expect(userCall[2]).toMatchObject({ |
| | permissions: expect.objectContaining({ |
| | [PermissionTypes.MEMORIES]: expect.any(Object), |
| | }), |
| | }); |
| | }); |
| |
|
| | it('should re-enable memory permissions when valid memory config exists without disabled field', async () => { |
| | |
| | mockGetRoleByName.mockResolvedValue({ |
| | permissions: { |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: false, |
| | [Permissions.CREATE]: false, |
| | [Permissions.READ]: false, |
| | [Permissions.UPDATE]: false, |
| | [Permissions.OPT_OUT]: false, |
| | }, |
| | }, |
| | }); |
| |
|
| | const config = { |
| | memory: { |
| | |
| | agent: { |
| | id: 'test-agent-id', |
| | provider: 'openai', |
| | }, |
| | personalize: false, |
| | } as unknown as TCustomConfig['memory'], |
| | }; |
| | const configDefaults = { interface: {} } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | |
| | const userCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.USER, |
| | ); |
| | expect(userCall[1][PermissionTypes.MEMORIES]).toEqual({ |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.MEMORIES]?.[Permissions.CREATE], |
| | [Permissions.READ]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.MEMORIES]?.[Permissions.READ], |
| | [Permissions.UPDATE]: |
| | roleDefaults[SystemRoles.USER].permissions[PermissionTypes.MEMORIES]?.[Permissions.UPDATE], |
| | [Permissions.OPT_OUT]: undefined, |
| | }); |
| | }); |
| |
|
| | it('should override existing memory permissions when memory.disabled is true', async () => { |
| | |
| | mockGetRoleByName.mockResolvedValue({ |
| | permissions: { |
| | [PermissionTypes.MEMORIES]: { |
| | [Permissions.USE]: true, |
| | [Permissions.CREATE]: true, |
| | [Permissions.READ]: true, |
| | [Permissions.UPDATE]: true, |
| | [Permissions.OPT_OUT]: true, |
| | }, |
| | |
| | [PermissionTypes.PROMPTS]: { [Permissions.USE]: true }, |
| | [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: true }, |
| | }, |
| | }); |
| |
|
| | const config = { |
| | interface: { |
| | |
| | prompts: true, |
| | bookmarks: true, |
| | }, |
| | memory: { |
| | disabled: true, |
| | agent: { |
| | id: 'test-agent-id', |
| | }, |
| | personalize: true, |
| | } as unknown as TCustomConfig['memory'], |
| | }; |
| | const configDefaults = { |
| | interface: { |
| | memories: true, |
| | prompts: true, |
| | bookmarks: true, |
| | }, |
| | } as TConfigDefaults; |
| | const interfaceConfig = await loadDefaultInterface({ config, configDefaults }); |
| | const appConfig = { config, interfaceConfig } as unknown as AppConfig; |
| |
|
| | await updateInterfacePermissions({ |
| | appConfig, |
| | getRoleByName: mockGetRoleByName, |
| | updateAccessPermissions: mockUpdateAccessPermissions, |
| | }); |
| |
|
| | const expectedMemoryPermissions = { |
| | [Permissions.USE]: false, |
| | [Permissions.CREATE]: false, |
| | [Permissions.READ]: false, |
| | [Permissions.UPDATE]: false, |
| | [Permissions.OPT_OUT]: false, |
| | }; |
| |
|
| | |
| | const userCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.USER, |
| | ); |
| | |
| | expect(userCall[1][PermissionTypes.MEMORIES]).toEqual(expectedMemoryPermissions); |
| | |
| | expect(userCall[1][PermissionTypes.PROMPTS]).toEqual({ [Permissions.USE]: true }); |
| | |
| | expect(userCall[1][PermissionTypes.BOOKMARKS]).toEqual({ [Permissions.USE]: true }); |
| |
|
| | |
| | const adminCall = mockUpdateAccessPermissions.mock.calls.find( |
| | (call) => call[0] === SystemRoles.ADMIN, |
| | ); |
| | |
| | expect(adminCall[1][PermissionTypes.MEMORIES]).toEqual(expectedMemoryPermissions); |
| | expect(adminCall[1][PermissionTypes.PROMPTS]).toEqual({ [Permissions.USE]: true }); |
| | expect(adminCall[1][PermissionTypes.BOOKMARKS]).toEqual({ [Permissions.USE]: true }); |
| |
|
| | |
| | expect(userCall[2]).toMatchObject({ |
| | permissions: expect.objectContaining({ |
| | [PermissionTypes.MEMORIES]: expect.any(Object), |
| | }), |
| | }); |
| | expect(adminCall[2]).toMatchObject({ |
| | permissions: expect.objectContaining({ |
| | [PermissionTypes.MEMORIES]: expect.any(Object), |
| | }), |
| | }); |
| | }); |
| | }); |
| |
|