From 30550d9190ef5e70d9c765b5d15a074b76848167 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 28 Sep 2025 13:42:10 +0000 Subject: [PATCH 1/6] Feat: Add warning for conflicting group permissions This change introduces a visual warning in the group settings page. The warning appears when an admin attempts to disable a permission for a group that is already enabled in the default 'user' group. This is necessary because permissions are additive, and disabling a permission in a specific group will not revoke it if it's enabled in the default group. To achieve this, the following changes were made: - A new `PermissionSwitch.svelte` component was created to encapsulate the permission switch and its warning logic, avoiding redundant code. - The `Groups.svelte` component was updated to correctly fetch the default user group's permissions. - The `Permissions.svelte` component was refactored to use the new `PermissionSwitch.svelte` component, making the code cleaner and more maintainable. --- src/lib/components/admin/Users/Groups.svelte | 62 +- .../admin/Users/Groups/EditGroupModal.svelte | 3 +- .../admin/Users/Groups/GroupItem.svelte | 2 + .../Users/Groups/PermissionSwitch.svelte | 38 ++ .../admin/Users/Groups/Permissions.svelte | 552 ++++++------------ src/lib/components/common/Warning.svelte | 9 + .../icons/ExclamationTriangle.svelte | 26 + 7 files changed, 274 insertions(+), 418 deletions(-) create mode 100644 src/lib/components/admin/Users/Groups/PermissionSwitch.svelte create mode 100644 src/lib/components/common/Warning.svelte create mode 100644 src/lib/components/icons/ExclamationTriangle.svelte diff --git a/src/lib/components/admin/Users/Groups.svelte b/src/lib/components/admin/Users/Groups.svelte index cc57536f83..2e8255eae8 100644 --- a/src/lib/components/admin/Users/Groups.svelte +++ b/src/lib/components/admin/Users/Groups.svelte @@ -24,11 +24,7 @@ import GroupItem from './Groups/GroupItem.svelte'; import AddGroupModal from './Groups/AddGroupModal.svelte'; import { createNewGroup, getGroups } from '$lib/apis/groups'; - import { - getUserDefaultPermissions, - getAllUsers, - updateUserDefaultPermissions - } from '$lib/apis/users'; + import { getAllUsers, updateUserDefaultPermissions } from '$lib/apis/users'; const i18n = getContext('i18n'); @@ -51,54 +47,20 @@ }); let search = ''; - let defaultPermissions = { - workspace: { - models: false, - knowledge: false, - prompts: false, - tools: false - }, - sharing: { - public_models: false, - public_knowledge: false, - public_prompts: false, - public_tools: false - }, - chat: { - controls: true, - valves: true, - system_prompt: true, - params: true, - file_upload: true, - delete: true, - delete_message: true, - continue_response: true, - regenerate_response: true, - rate_response: true, - edit: true, - share: true, - export: true, - stt: true, - tts: true, - call: true, - multiple_models: true, - temporary: true, - temporary_enforced: false - }, - features: { - direct_tool_servers: false, - web_search: true, - image_generation: true, - code_interpreter: true, - notes: true - } - }; + let defaultPermissions = {}; let showCreateGroupModal = false; let showDefaultPermissionsModal = false; const setGroups = async () => { - groups = await getGroups(localStorage.token); + const allGroups = await getGroups(localStorage.token); + const userGroup = allGroups.find((g) => g.name.toLowerCase() === 'user'); + + if (userGroup) { + defaultPermissions = userGroup.permissions; + } + + groups = allGroups.filter((g) => g.name.toLowerCase() !== 'user'); }; const addGroupHandler = async (group) => { @@ -146,8 +108,6 @@ } await setGroups(); - defaultPermissions = await getUserDefaultPermissions(localStorage.token); - loaded = true; }); @@ -226,7 +186,7 @@ {#each filteredGroups as group}
- +
{/each} diff --git a/src/lib/components/admin/Users/Groups/EditGroupModal.svelte b/src/lib/components/admin/Users/Groups/EditGroupModal.svelte index 151735e3d1..1225a3dcf4 100644 --- a/src/lib/components/admin/Users/Groups/EditGroupModal.svelte +++ b/src/lib/components/admin/Users/Groups/EditGroupModal.svelte @@ -21,6 +21,7 @@ export let users = []; export let group = null; + export let defaultPermissions = {}; export let custom = true; @@ -230,7 +231,7 @@ {#if selectedTab == 'general'} {:else if selectedTab == 'permissions'} - + {:else if selectedTab == 'users'} {/if} diff --git a/src/lib/components/admin/Users/Groups/GroupItem.svelte b/src/lib/components/admin/Users/Groups/GroupItem.svelte index 7a208f84a6..a16ab6560e 100644 --- a/src/lib/components/admin/Users/Groups/GroupItem.svelte +++ b/src/lib/components/admin/Users/Groups/GroupItem.svelte @@ -17,6 +17,7 @@ name: 'Admins', user_ids: [1, 2, 3] }; + export let defaultPermissions = {}; export let setGroups = () => {}; @@ -59,6 +60,7 @@ edit {users} {group} + {defaultPermissions} onSubmit={updateHandler} onDelete={deleteHandler} /> diff --git a/src/lib/components/admin/Users/Groups/PermissionSwitch.svelte b/src/lib/components/admin/Users/Groups/PermissionSwitch.svelte new file mode 100644 index 0000000000..71958d1059 --- /dev/null +++ b/src/lib/components/admin/Users/Groups/PermissionSwitch.svelte @@ -0,0 +1,38 @@ + + +
+ {#if tooltip} + +
+ {label} +
+ +
+ {:else} +
+
+ {label} +
+ +
+ {/if} + {#if defaultState && !state} +
+ +
+ {/if} +
\ No newline at end of file diff --git a/src/lib/components/admin/Users/Groups/Permissions.svelte b/src/lib/components/admin/Users/Groups/Permissions.svelte index b7f7c3093f..3663960d86 100644 --- a/src/lib/components/admin/Users/Groups/Permissions.svelte +++ b/src/lib/components/admin/Users/Groups/Permissions.svelte @@ -2,11 +2,11 @@ import { getContext, onMount } from 'svelte'; const i18n = getContext('i18n'); - import Switch from '$lib/components/common/Switch.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; + import PermissionSwitch from './PermissionSwitch.svelte'; // Default values for permissions - const defaultPermissions = { + const DEFAULT_PERMISSIONS = { workspace: { models: false, knowledge: false, @@ -51,10 +51,11 @@ }; export let permissions = {}; + export let defaultPermissions = {}; // Reactive statement to ensure all fields are present in `permissions` $: { - permissions = fillMissingProperties(permissions, defaultPermissions); + permissions = fillMissingProperties(permissions, DEFAULT_PERMISSIONS); } function fillMissingProperties(obj: any, defaults: any) { @@ -69,398 +70,217 @@ } onMount(() => { - permissions = fillMissingProperties(permissions, defaultPermissions); + permissions = fillMissingProperties(permissions, DEFAULT_PERMISSIONS); }); -
- - +
{$i18n.t('Workspace Permissions')}
- -
-
- {$i18n.t('Models Access')} -
- -
- -
-
- {$i18n.t('Knowledge Access')} -
- -
- -
-
- {$i18n.t('Prompts Access')} -
- -
- -
- + + + + -
- {$i18n.t('Tools Access')} -
- -
+ />
-
+
{$i18n.t('Sharing Permissions')}
- -
-
- {$i18n.t('Models Public Sharing')} -
- -
- -
-
- {$i18n.t('Knowledge Public Sharing')} -
- -
- -
-
- {$i18n.t('Prompts Public Sharing')} -
- -
- -
-
- {$i18n.t('Tools Public Sharing')} -
- -
- -
-
- {$i18n.t('Notes Public Sharing')} -
- +
+ + + + +
-
+
{$i18n.t('Chat Permissions')}
+
+ + -
-
- {$i18n.t('Allow File Upload')} -
- - -
- -
-
- {$i18n.t('Allow Chat Controls')} -
- - -
- - {#if permissions.chat.controls} -
-
- {$i18n.t('Allow Chat Valves')} + {#if permissions.chat.controls} +
+ + +
+ {/if} - -
+ + + + + + + + + + + + + -
-
- {$i18n.t('Allow Chat System Prompt')} + {#if permissions.chat.temporary} +
+
- - -
- -
-
- {$i18n.t('Allow Chat Params')} -
- - -
- {/if} - -
-
- {$i18n.t('Allow Chat Edit')} -
- - + {/if}
- -
-
- {$i18n.t('Allow Chat Delete')} -
- - -
- -
-
- {$i18n.t('Allow Delete Messages')} -
- - -
- -
-
- {$i18n.t('Allow Continue Response')} -
- - -
- -
-
- {$i18n.t('Allow Regenerate Response')} -
- - -
- -
-
- {$i18n.t('Allow Rate Response')} -
- - -
- -
-
- {$i18n.t('Allow Chat Share')} -
- - -
- -
-
- {$i18n.t('Allow Chat Export')} -
- - -
- -
-
- {$i18n.t('Allow Speech to Text')} -
- - -
-
-
- {$i18n.t('Allow Text to Speech')} -
- - -
- -
-
- {$i18n.t('Allow Call')} -
- - -
- -
-
- {$i18n.t('Allow Multiple Models in Chat')} -
- - -
- -
-
- {$i18n.t('Allow Temporary Chat')} -
- - -
- - {#if permissions.chat.temporary} -
-
- {$i18n.t('Enforce Temporary Chat')} -
- - -
- {/if}
-
+
{$i18n.t('Features Permissions')}
- -
-
- {$i18n.t('Direct Tool Servers')} -
- - -
- -
-
- {$i18n.t('Web Search')} -
- - -
- -
-
- {$i18n.t('Image Generation')} -
- - -
- -
-
- {$i18n.t('Code Interpreter')} -
- - -
- -
-
- {$i18n.t('Notes')} -
- - +
+ + + + +
-
+
\ No newline at end of file diff --git a/src/lib/components/common/Warning.svelte b/src/lib/components/common/Warning.svelte new file mode 100644 index 0000000000..85f60ff851 --- /dev/null +++ b/src/lib/components/common/Warning.svelte @@ -0,0 +1,9 @@ + + +
+ +

{text}

+
\ No newline at end of file diff --git a/src/lib/components/icons/ExclamationTriangle.svelte b/src/lib/components/icons/ExclamationTriangle.svelte new file mode 100644 index 0000000000..256e4a7be4 --- /dev/null +++ b/src/lib/components/icons/ExclamationTriangle.svelte @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file From fb3eeaa12662cf89c1efc8e116d622b50a1e3677 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 28 Sep 2025 16:56:04 +0200 Subject: [PATCH 2/6] Update Groups.svelte --- src/lib/components/admin/Users/Groups.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/admin/Users/Groups.svelte b/src/lib/components/admin/Users/Groups.svelte index 2e8255eae8..7ac9a6eba1 100644 --- a/src/lib/components/admin/Users/Groups.svelte +++ b/src/lib/components/admin/Users/Groups.svelte @@ -24,7 +24,7 @@ import GroupItem from './Groups/GroupItem.svelte'; import AddGroupModal from './Groups/AddGroupModal.svelte'; import { createNewGroup, getGroups } from '$lib/apis/groups'; - import { getAllUsers, updateUserDefaultPermissions } from '$lib/apis/users'; + import { getUserDefaultPermissions, getAllUsers, updateUserDefaultPermissions } from '$lib/apis/users'; const i18n = getContext('i18n'); From a4e0c10f344ccaf5726f6dadcf3cdbd400ed2673 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 28 Sep 2025 21:27:06 +0200 Subject: [PATCH 3/6] Delete src/lib/components/admin/Users/Groups/PermissionSwitch.svelte --- .../Users/Groups/PermissionSwitch.svelte | 38 ------------------- 1 file changed, 38 deletions(-) delete mode 100644 src/lib/components/admin/Users/Groups/PermissionSwitch.svelte diff --git a/src/lib/components/admin/Users/Groups/PermissionSwitch.svelte b/src/lib/components/admin/Users/Groups/PermissionSwitch.svelte deleted file mode 100644 index 71958d1059..0000000000 --- a/src/lib/components/admin/Users/Groups/PermissionSwitch.svelte +++ /dev/null @@ -1,38 +0,0 @@ - - -
- {#if tooltip} - -
- {label} -
- -
- {:else} -
-
- {label} -
- -
- {/if} - {#if defaultState && !state} -
- -
- {/if} -
\ No newline at end of file From ad9cae32dc3df80f6206d5c01032bfbb1ec6963d Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 28 Sep 2025 21:27:20 +0200 Subject: [PATCH 4/6] Delete src/lib/components/icons/ExclamationTriangle.svelte --- .../icons/ExclamationTriangle.svelte | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 src/lib/components/icons/ExclamationTriangle.svelte diff --git a/src/lib/components/icons/ExclamationTriangle.svelte b/src/lib/components/icons/ExclamationTriangle.svelte deleted file mode 100644 index 256e4a7be4..0000000000 --- a/src/lib/components/icons/ExclamationTriangle.svelte +++ /dev/null @@ -1,26 +0,0 @@ - - - - - \ No newline at end of file From 67b39299541d5f242afa4a45f17bf0cf5c47e3bc Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 28 Sep 2025 21:27:31 +0200 Subject: [PATCH 5/6] Delete src/lib/components/common/Warning.svelte --- src/lib/components/common/Warning.svelte | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/lib/components/common/Warning.svelte diff --git a/src/lib/components/common/Warning.svelte b/src/lib/components/common/Warning.svelte deleted file mode 100644 index 85f60ff851..0000000000 --- a/src/lib/components/common/Warning.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - -
- -

{text}

-
\ No newline at end of file From cf20f04bdce27233028b89db4b30f8db043e4c6c Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 28 Sep 2025 21:33:40 +0200 Subject: [PATCH 6/6] Update Permissions.svelte --- .../admin/Users/Groups/Permissions.svelte | 709 +++++++++++++----- 1 file changed, 530 insertions(+), 179 deletions(-) diff --git a/src/lib/components/admin/Users/Groups/Permissions.svelte b/src/lib/components/admin/Users/Groups/Permissions.svelte index 3663960d86..dfba887fd4 100644 --- a/src/lib/components/admin/Users/Groups/Permissions.svelte +++ b/src/lib/components/admin/Users/Groups/Permissions.svelte @@ -2,8 +2,8 @@ import { getContext, onMount } from 'svelte'; const i18n = getContext('i18n'); + import Switch from '$lib/components/common/Switch.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; - import PermissionSwitch from './PermissionSwitch.svelte'; // Default values for permissions const DEFAULT_PERMISSIONS = { @@ -77,30 +77,75 @@
{$i18n.t('Workspace Permissions')}
-
- - - - +
+
+ {$i18n.t('Models Access')} +
+ +
+ {#if defaultPermissions?.workspace?.models && !permissions.workspace.models} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Knowledge Access')} +
+ +
+ {#if defaultPermissions?.workspace?.knowledge && !permissions.workspace.knowledge} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Prompts Access')} +
+ +
+ {#if defaultPermissions?.workspace?.prompts && !permissions.workspace.prompts} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+ + placement="top-start" + > +
+ {$i18n.t('Tools Access')} +
+ +
+ {#if defaultPermissions?.workspace?.tools && !permissions.workspace.tools} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if}
@@ -108,32 +153,85 @@
{$i18n.t('Sharing Permissions')}
-
- - - - - + +
+
+
+ {$i18n.t('Models Public Sharing')} +
+ +
+ {#if defaultPermissions?.sharing?.public_models && !permissions.sharing.public_models} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Knowledge Public Sharing')} +
+ +
+ {#if defaultPermissions?.sharing?.public_knowledge && !permissions.sharing.public_knowledge} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Prompts Public Sharing')} +
+ +
+ {#if defaultPermissions?.sharing?.public_prompts && !permissions.sharing.public_prompts} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Tools Public Sharing')} +
+ +
+ {#if defaultPermissions?.sharing?.public_tools && !permissions.sharing.public_tools} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Notes Public Sharing')} +
+ +
+ {#if defaultPermissions?.sharing?.public_notes && !permissions.sharing.public_notes} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if}
@@ -141,146 +239,399 @@
{$i18n.t('Chat Permissions')}
-
- - - {#if permissions.chat.controls} -
- - - +
+
+
+ {$i18n.t('Allow File Upload')}
- {/if} - - - - - - - - - - - - - - - - {#if permissions.chat.temporary} -
- + +
+ {#if defaultPermissions?.chat?.file_upload && !permissions.chat.file_upload} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
{/if}
+ +
+
+
+ {$i18n.t('Allow Chat Controls')} +
+ +
+ {#if defaultPermissions?.chat?.controls && !permissions.chat.controls} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ + {#if permissions.chat.controls} +
+
+
+ {$i18n.t('Allow Chat Valves')} +
+ +
+ {#if defaultPermissions?.chat?.valves && !permissions.chat.valves} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Chat System Prompt')} +
+ +
+ {#if defaultPermissions?.chat?.system_prompt && !permissions.chat.system_prompt} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Chat Params')} +
+ +
+ {#if defaultPermissions?.chat?.params && !permissions.chat.params} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ {/if} + +
+
+
+ {$i18n.t('Allow Chat Edit')} +
+ +
+ {#if defaultPermissions?.chat?.edit && !permissions.chat.edit} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Chat Delete')} +
+ +
+ {#if defaultPermissions?.chat?.delete && !permissions.chat.delete} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Delete Messages')} +
+ +
+ {#if defaultPermissions?.chat?.delete_message && !permissions.chat.delete_message} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Continue Response')} +
+ +
+ {#if defaultPermissions?.chat?.continue_response && !permissions.chat.continue_response} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Regenerate Response')} +
+ +
+ {#if defaultPermissions?.chat?.regenerate_response && !permissions.chat.regenerate_response} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Rate Response')} +
+ +
+ {#if defaultPermissions?.chat?.rate_response && !permissions.chat.rate_response} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Chat Share')} +
+ +
+ {#if defaultPermissions?.chat?.share && !permissions.chat.share} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Chat Export')} +
+ +
+ {#if defaultPermissions?.chat?.export && !permissions.chat.export} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Speech to Text')} +
+ +
+ {#if defaultPermissions?.chat?.stt && !permissions.chat.stt} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Text to Speech')} +
+ +
+ {#if defaultPermissions?.chat?.tts && !permissions.chat.tts} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Call')} +
+ +
+ {#if defaultPermissions?.chat?.call && !permissions.chat.call} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Multiple Models in Chat')} +
+ +
+ {#if defaultPermissions?.chat?.multiple_models && !permissions.chat.multiple_models} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Allow Temporary Chat')} +
+ +
+ {#if defaultPermissions?.chat?.temporary && !permissions.chat.temporary} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ + {#if permissions.chat.temporary} +
+
+
+ {$i18n.t('Enforce Temporary Chat')} +
+ +
+ {#if defaultPermissions?.chat?.temporary_enforced && !permissions.chat.temporary_enforced} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ {/if}

{$i18n.t('Features Permissions')}
-
- - - - - + +
+
+
+ {$i18n.t('Direct Tool Servers')} +
+ +
+ {#if defaultPermissions?.features?.direct_tool_servers && !permissions.features.direct_tool_servers} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Web Search')} +
+ +
+ {#if defaultPermissions?.features?.web_search && !permissions.features.web_search} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Image Generation')} +
+ +
+ {#if defaultPermissions?.features?.image_generation && !permissions.features.image_generation} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Code Interpreter')} +
+ +
+ {#if defaultPermissions?.features?.code_interpreter && !permissions.features.code_interpreter} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if} +
+ +
+
+
+ {$i18n.t('Notes')} +
+ +
+ {#if defaultPermissions?.features?.notes && !permissions.features.notes} +
+
+ ⚠️ {$i18n.t('This permission is enabled for the default "user" role and will remain active.')} +
+
+ {/if}
-
\ No newline at end of file +