From e4d3fa9afecb3419ce31a1578c77be9615b5396b Mon Sep 17 00:00:00 2001 From: Peter Hegman Date: Mon, 3 Nov 2025 11:46:36 -0800 Subject: [PATCH 1/4] Add admin_web_path and admin_edit_path GraphQL fields For group and project types. Used in the admin area for link paths. Only available to admins Changelog: added --- app/graphql/types/group_type.rb | 20 +++++++ app/graphql/types/project_type.rb | 24 ++++++++ doc/api/graphql/reference/_index.md | 4 ++ spec/graphql/types/group_type_spec.rb | 77 ++++++++++++++++++++++++- spec/graphql/types/project_type_spec.rb | 76 +++++++++++++++++++++++- 5 files changed, 199 insertions(+), 2 deletions(-) diff --git a/app/graphql/types/group_type.rb b/app/graphql/types/group_type.rb index 35cd44f224fb2d..5bd4eb7ff2b130 100644 --- a/app/graphql/types/group_type.rb +++ b/app/graphql/types/group_type.rb @@ -31,6 +31,14 @@ class GroupType < NamespaceType null: false, description: 'Path for editing group.' + field :admin_edit_path, GraphQL::Types::String, + null: true, + description: 'Admin path for editing group. Only available to admins.' + + field :admin_web_path, GraphQL::Types::String, + null: true, + description: 'Admin web path of the group. Only available to admins.' + field :avatar_url, type: GraphQL::Types::String, null: true, @@ -532,6 +540,18 @@ def edit_path ::Gitlab::Routing.url_helpers.edit_group_path(group) end + def admin_web_path + return unless current_user&.can_admin_all_resources? + + ::Gitlab::Routing.url_helpers.admin_group_path(group) + end + + def admin_edit_path + return unless current_user&.can_admin_all_resources? + + ::Gitlab::Routing.url_helpers.admin_group_edit_path(group) + end + private def group diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb index af10eb05df709b..1f96ed2502ded2 100644 --- a/app/graphql/types/project_type.rb +++ b/app/graphql/types/project_type.rb @@ -136,6 +136,14 @@ def self.authorization_scopes null: false, description: 'Path for editing project.' + field :admin_edit_path, GraphQL::Types::String, + null: true, + description: 'Admin path for editing project. Only available to admins.' + + field :admin_web_path, GraphQL::Types::String, + null: true, + description: 'Admin web path of the project. Only available to admins.' + field :forks_count, GraphQL::Types::Int, null: false, calls_gitaly: true, # 4 times @@ -1143,6 +1151,22 @@ def edit_path ::Gitlab::Routing.url_helpers.edit_project_path(project) end + def admin_web_path + return unless current_user&.can_admin_all_resources? + + ::Gitlab::Routing.url_helpers.admin_namespace_project_path( + { id: project.to_param, namespace_id: project.namespace.to_param } + ) + end + + def admin_edit_path + return unless current_user&.can_admin_all_resources? + + ::Gitlab::Routing.url_helpers.edit_admin_namespace_project_path( + { id: project.to_param, namespace_id: project.namespace.to_param } + ) + end + def grafana_integration nil end diff --git a/doc/api/graphql/reference/_index.md b/doc/api/graphql/reference/_index.md index 1fcc7e4f11d1ce..14740c95b1d0f4 100644 --- a/doc/api/graphql/reference/_index.md +++ b/doc/api/graphql/reference/_index.md @@ -31563,6 +31563,8 @@ GPG signature for a signed commit. | `actualRepositorySizeLimit` | [`Float`](#float) | Size limit for repositories in the namespace in bytes. This limit only applies to namespaces under Project limit enforcement. | | `actualSizeLimit` | [`Float`](#float) | The actual storage size limit (in bytes) based on the enforcement type of either repository or namespace. This limit is agnostic of enforcement type. | | `additionalPurchasedStorageSize` | [`Float`](#float) | Additional storage purchased for the root namespace in bytes. | +| `adminEditPath` | [`String`](#string) | Admin path for editing group. Only available to admins. | +| `adminWebPath` | [`String`](#string) | Admin web path of the group. Only available to admins. | | `aiUsageData` {{< icon name="warning-solid" >}} | [`AiUsageData`](#aiusagedata) | **Introduced** in GitLab 17.5. **Status**: Experiment. AI-related data. | | `allowStaleRunnerPruning` | [`Boolean!`](#boolean) | Indicates whether to regularly prune stale group runners. Defaults to false. | | `amazonS3Configurations` | [`AmazonS3ConfigurationTypeConnection`](#amazons3configurationtypeconnection) | Amazon S3 configurations that receive audit events belonging to the group. (see [Connections](#connections)) | @@ -39986,6 +39988,8 @@ Project-level settings for product analytics provider. | Name | Type | Description | | ---- | ---- | ----------- | | `actualRepositorySizeLimit` | [`Float`](#float) | Size limit for the repository in bytes. | +| `adminEditPath` | [`String`](#string) | Admin path for editing project. Only available to admins. | +| `adminWebPath` | [`String`](#string) | Admin web path of the project. Only available to admins. | | `agentConfigurations` | [`AgentConfigurationConnection`](#agentconfigurationconnection) | Agent configurations defined by the project. (see [Connections](#connections)) | | `aiAgents` {{< icon name="warning-solid" >}} | [`AiAgentConnection`](#aiagentconnection) | **Introduced** in GitLab 16.9. **Status**: Experiment. Ai Agents for the project. | | `aiUsageData` {{< icon name="warning-solid" >}} | [`AiUsageData`](#aiusagedata) | **Introduced** in GitLab 17.5. **Status**: Experiment. AI-related data. | diff --git a/spec/graphql/types/group_type_spec.rb b/spec/graphql/types/group_type_spec.rb index 22a81a1a1bcbb8..be93604931d706 100644 --- a/spec/graphql/types/group_type_spec.rb +++ b/spec/graphql/types/group_type_spec.rb @@ -20,7 +20,8 @@ expected_fields = %w[ id name path full_name full_path description description_html visibility archived is_self_archived lfs_enabled request_access_enabled projects root_storage_statistics - web_url web_path edit_path avatar_url share_with_group_lock project_creation_level + web_url web_path edit_path admin_web_path admin_edit_path avatar_url + share_with_group_lock project_creation_level descendant_groups_count group_members_count projects_count subgroup_creation_level require_two_factor_authentication two_factor_grace_period auto_devops_enabled emails_disabled emails_enabled @@ -562,4 +563,78 @@ def clean_state_query expect(edit_path).to eq("/groups/#{group.full_path}/-/edit") end end + + describe 'admin_web_path' do + let_it_be(:group) { create(:group, :public) } + + let(:query) do + %( + query { + group(fullPath: "#{group.full_path}") { + adminWebPath + } + } + ) + end + + subject(:admin_web_path) do + GitlabSchema + .execute(query, context: { current_user: current_user }) + .as_json + .dig('data', 'group', 'adminWebPath') + end + + context 'when current user is an admin', :enable_admin_mode do + let_it_be(:current_user) { create(:user, :admin) } + + it 'returns admin_web_path field' do + expect(admin_web_path).to eq("/admin/groups/#{group.full_path}") + end + end + + context 'when current user is not an admin' do + let_it_be(:current_user) { create(:user) } + + it 'returns admin_web_path field as null' do + expect(admin_web_path).to be_nil + end + end + end + + describe 'admin_edit_path' do + let_it_be(:group) { create(:group, :public) } + + let(:query) do + %( + query { + group(fullPath: "#{group.full_path}") { + adminEditPath + } + } + ) + end + + subject(:admin_edit_path) do + GitlabSchema + .execute(query, context: { current_user: current_user }) + .as_json + .dig('data', 'group', 'adminEditPath') + end + + context 'when current user is an admin', :enable_admin_mode do + let_it_be(:current_user) { create(:user, :admin) } + + it 'returns admin_edit_path field' do + expect(admin_edit_path).to eq("/admin/groups/#{group.full_path}/edit") + end + end + + context 'when current user is not an admin' do + let_it_be(:current_user) { create(:user) } + + it 'returns admin_edit_path field as null' do + expect(admin_edit_path).to be_nil + end + end + end end diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb index 7ae8c477c0a787..fe64fd06d520c4 100644 --- a/spec/graphql/types/project_type_spec.rb +++ b/spec/graphql/types/project_type_spec.rb @@ -21,7 +21,7 @@ expected_fields = %w[ user_permissions id full_path path name_with_namespace name description description_html tag_list topics ssh_url_to_repo - http_url_to_repo web_url web_path edit_path star_count forks_count + http_url_to_repo web_url web_path edit_path admin_web_path admin_edit_path star_count forks_count created_at updated_at last_activity_at archived is_self_archived visibility container_registry_enabled shared_runners_enabled lfs_enabled merge_requests_ff_only_enabled avatar_url @@ -1432,6 +1432,80 @@ end end + describe 'admin_web_path' do + let_it_be(:project) { create(:project, :public) } + + let(:query) do + %( + query { + project(fullPath: "#{project.full_path}") { + adminWebPath + } + } + ) + end + + subject(:admin_web_path) do + GitlabSchema + .execute(query, context: { current_user: current_user }) + .as_json + .dig('data', 'project', 'adminWebPath') + end + + context 'when current user is an admin', :enable_admin_mode do + let_it_be(:current_user) { create(:user, :admin) } + + it 'returns admin_web_path field' do + expect(admin_web_path).to eq("/admin/projects/#{project.full_path}") + end + end + + context 'when current user is not an admin' do + let_it_be(:current_user) { create(:user) } + + it 'returns admin_web_path field as null' do + expect(admin_web_path).to be_nil + end + end + end + + describe 'admin_edit_path' do + let_it_be(:project) { create(:project, :public) } + + let(:query) do + %( + query { + project(fullPath: "#{project.full_path}") { + adminEditPath + } + } + ) + end + + subject(:admin_edit_path) do + GitlabSchema + .execute(query, context: { current_user: current_user }) + .as_json + .dig('data', 'project', 'adminEditPath') + end + + context 'when current user is an admin', :enable_admin_mode do + let_it_be(:current_user) { create(:user, :admin) } + + it 'returns admin_edit_path field' do + expect(admin_edit_path).to eq("/admin/projects/#{project.full_path}/edit") + end + end + + context 'when current user is not an admin' do + let_it_be(:current_user) { create(:user) } + + it 'returns admin_edit_path field as null' do + expect(admin_edit_path).to be_nil + end + end + end + describe 'organization_edit_path' do let_it_be(:user) { create(:user) } let_it_be(:organization) { create(:organization) } -- GitLab From db1402fe93129f96793cff652c3f684694c81f04 Mon Sep 17 00:00:00 2001 From: Peter Hegman Date: Fri, 14 Nov 2025 09:19:36 -0800 Subject: [PATCH 2/4] Switch to using `authorize` in field definition Instead of manual check --- app/graphql/types/group_type.rb | 10 ++++------ app/graphql/types/project_type.rb | 10 ++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/app/graphql/types/group_type.rb b/app/graphql/types/group_type.rb index 5bd4eb7ff2b130..773b3e933e5854 100644 --- a/app/graphql/types/group_type.rb +++ b/app/graphql/types/group_type.rb @@ -33,11 +33,13 @@ class GroupType < NamespaceType field :admin_edit_path, GraphQL::Types::String, null: true, - description: 'Admin path for editing group. Only available to admins.' + description: 'Admin path for editing group. Only available to admins.', + authorize: :admin_all_resources field :admin_web_path, GraphQL::Types::String, null: true, - description: 'Admin web path of the group. Only available to admins.' + description: 'Admin web path of the group. Only available to admins.', + authorize: :admin_all_resources field :avatar_url, type: GraphQL::Types::String, @@ -541,14 +543,10 @@ def edit_path end def admin_web_path - return unless current_user&.can_admin_all_resources? - ::Gitlab::Routing.url_helpers.admin_group_path(group) end def admin_edit_path - return unless current_user&.can_admin_all_resources? - ::Gitlab::Routing.url_helpers.admin_group_edit_path(group) end diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb index 1f96ed2502ded2..d19656eb44da9b 100644 --- a/app/graphql/types/project_type.rb +++ b/app/graphql/types/project_type.rb @@ -138,11 +138,13 @@ def self.authorization_scopes field :admin_edit_path, GraphQL::Types::String, null: true, - description: 'Admin path for editing project. Only available to admins.' + description: 'Admin path for editing project. Only available to admins.', + authorize: :admin_all_resources field :admin_web_path, GraphQL::Types::String, null: true, - description: 'Admin web path of the project. Only available to admins.' + description: 'Admin web path of the project. Only available to admins.', + authorize: :admin_all_resources field :forks_count, GraphQL::Types::Int, null: false, @@ -1152,16 +1154,12 @@ def edit_path end def admin_web_path - return unless current_user&.can_admin_all_resources? - ::Gitlab::Routing.url_helpers.admin_namespace_project_path( { id: project.to_param, namespace_id: project.namespace.to_param } ) end def admin_edit_path - return unless current_user&.can_admin_all_resources? - ::Gitlab::Routing.url_helpers.edit_admin_namespace_project_path( { id: project.to_param, namespace_id: project.namespace.to_param } ) -- GitLab From c29dde38adaf9885900f5d2ec9a5ed938531a91e Mon Sep 17 00:00:00 2001 From: Peter Hegman Date: Fri, 14 Nov 2025 09:53:26 -0800 Subject: [PATCH 3/4] Switch to adminShowPath From adminWebPath --- app/graphql/types/group_type.rb | 4 ++-- app/graphql/types/project_type.rb | 4 ++-- doc/api/graphql/reference/_index.md | 4 ++-- spec/graphql/types/group_type_spec.rb | 18 +++++++++--------- spec/graphql/types/project_type_spec.rb | 18 +++++++++--------- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/app/graphql/types/group_type.rb b/app/graphql/types/group_type.rb index 773b3e933e5854..6c50b5949ac3ee 100644 --- a/app/graphql/types/group_type.rb +++ b/app/graphql/types/group_type.rb @@ -36,7 +36,7 @@ class GroupType < NamespaceType description: 'Admin path for editing group. Only available to admins.', authorize: :admin_all_resources - field :admin_web_path, GraphQL::Types::String, + field :admin_show_path, GraphQL::Types::String, null: true, description: 'Admin web path of the group. Only available to admins.', authorize: :admin_all_resources @@ -542,7 +542,7 @@ def edit_path ::Gitlab::Routing.url_helpers.edit_group_path(group) end - def admin_web_path + def admin_show_path ::Gitlab::Routing.url_helpers.admin_group_path(group) end diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb index d19656eb44da9b..559de0da014262 100644 --- a/app/graphql/types/project_type.rb +++ b/app/graphql/types/project_type.rb @@ -141,7 +141,7 @@ def self.authorization_scopes description: 'Admin path for editing project. Only available to admins.', authorize: :admin_all_resources - field :admin_web_path, GraphQL::Types::String, + field :admin_show_path, GraphQL::Types::String, null: true, description: 'Admin web path of the project. Only available to admins.', authorize: :admin_all_resources @@ -1153,7 +1153,7 @@ def edit_path ::Gitlab::Routing.url_helpers.edit_project_path(project) end - def admin_web_path + def admin_show_path ::Gitlab::Routing.url_helpers.admin_namespace_project_path( { id: project.to_param, namespace_id: project.namespace.to_param } ) diff --git a/doc/api/graphql/reference/_index.md b/doc/api/graphql/reference/_index.md index 14740c95b1d0f4..8f6a4fdeaa5f04 100644 --- a/doc/api/graphql/reference/_index.md +++ b/doc/api/graphql/reference/_index.md @@ -31564,7 +31564,7 @@ GPG signature for a signed commit. | `actualSizeLimit` | [`Float`](#float) | The actual storage size limit (in bytes) based on the enforcement type of either repository or namespace. This limit is agnostic of enforcement type. | | `additionalPurchasedStorageSize` | [`Float`](#float) | Additional storage purchased for the root namespace in bytes. | | `adminEditPath` | [`String`](#string) | Admin path for editing group. Only available to admins. | -| `adminWebPath` | [`String`](#string) | Admin web path of the group. Only available to admins. | +| `adminShowPath` | [`String`](#string) | Admin web path of the group. Only available to admins. | | `aiUsageData` {{< icon name="warning-solid" >}} | [`AiUsageData`](#aiusagedata) | **Introduced** in GitLab 17.5. **Status**: Experiment. AI-related data. | | `allowStaleRunnerPruning` | [`Boolean!`](#boolean) | Indicates whether to regularly prune stale group runners. Defaults to false. | | `amazonS3Configurations` | [`AmazonS3ConfigurationTypeConnection`](#amazons3configurationtypeconnection) | Amazon S3 configurations that receive audit events belonging to the group. (see [Connections](#connections)) | @@ -39989,7 +39989,7 @@ Project-level settings for product analytics provider. | ---- | ---- | ----------- | | `actualRepositorySizeLimit` | [`Float`](#float) | Size limit for the repository in bytes. | | `adminEditPath` | [`String`](#string) | Admin path for editing project. Only available to admins. | -| `adminWebPath` | [`String`](#string) | Admin web path of the project. Only available to admins. | +| `adminShowPath` | [`String`](#string) | Admin web path of the project. Only available to admins. | | `agentConfigurations` | [`AgentConfigurationConnection`](#agentconfigurationconnection) | Agent configurations defined by the project. (see [Connections](#connections)) | | `aiAgents` {{< icon name="warning-solid" >}} | [`AiAgentConnection`](#aiagentconnection) | **Introduced** in GitLab 16.9. **Status**: Experiment. Ai Agents for the project. | | `aiUsageData` {{< icon name="warning-solid" >}} | [`AiUsageData`](#aiusagedata) | **Introduced** in GitLab 17.5. **Status**: Experiment. AI-related data. | diff --git a/spec/graphql/types/group_type_spec.rb b/spec/graphql/types/group_type_spec.rb index be93604931d706..73fa8a91b2ce5b 100644 --- a/spec/graphql/types/group_type_spec.rb +++ b/spec/graphql/types/group_type_spec.rb @@ -20,7 +20,7 @@ expected_fields = %w[ id name path full_name full_path description description_html visibility archived is_self_archived lfs_enabled request_access_enabled projects root_storage_statistics - web_url web_path edit_path admin_web_path admin_edit_path avatar_url + web_url web_path edit_path admin_show_path admin_edit_path avatar_url share_with_group_lock project_creation_level descendant_groups_count group_members_count projects_count subgroup_creation_level require_two_factor_authentication @@ -564,39 +564,39 @@ def clean_state_query end end - describe 'admin_web_path' do + describe 'admin_show_path' do let_it_be(:group) { create(:group, :public) } let(:query) do %( query { group(fullPath: "#{group.full_path}") { - adminWebPath + adminShowPath } } ) end - subject(:admin_web_path) do + subject(:admin_show_path) do GitlabSchema .execute(query, context: { current_user: current_user }) .as_json - .dig('data', 'group', 'adminWebPath') + .dig('data', 'group', 'adminShowPath') end context 'when current user is an admin', :enable_admin_mode do let_it_be(:current_user) { create(:user, :admin) } - it 'returns admin_web_path field' do - expect(admin_web_path).to eq("/admin/groups/#{group.full_path}") + it 'returns admin_show_path field' do + expect(admin_show_path).to eq("/admin/groups/#{group.full_path}") end end context 'when current user is not an admin' do let_it_be(:current_user) { create(:user) } - it 'returns admin_web_path field as null' do - expect(admin_web_path).to be_nil + it 'returns admin_show_path field as null' do + expect(admin_show_path).to be_nil end end end diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb index fe64fd06d520c4..b729365a205796 100644 --- a/spec/graphql/types/project_type_spec.rb +++ b/spec/graphql/types/project_type_spec.rb @@ -21,7 +21,7 @@ expected_fields = %w[ user_permissions id full_path path name_with_namespace name description description_html tag_list topics ssh_url_to_repo - http_url_to_repo web_url web_path edit_path admin_web_path admin_edit_path star_count forks_count + http_url_to_repo web_url web_path edit_path admin_show_path admin_edit_path star_count forks_count created_at updated_at last_activity_at archived is_self_archived visibility container_registry_enabled shared_runners_enabled lfs_enabled merge_requests_ff_only_enabled avatar_url @@ -1432,39 +1432,39 @@ end end - describe 'admin_web_path' do + describe 'admin_show_path' do let_it_be(:project) { create(:project, :public) } let(:query) do %( query { project(fullPath: "#{project.full_path}") { - adminWebPath + adminShowPath } } ) end - subject(:admin_web_path) do + subject(:admin_show_path) do GitlabSchema .execute(query, context: { current_user: current_user }) .as_json - .dig('data', 'project', 'adminWebPath') + .dig('data', 'project', 'adminShowPath') end context 'when current user is an admin', :enable_admin_mode do let_it_be(:current_user) { create(:user, :admin) } - it 'returns admin_web_path field' do - expect(admin_web_path).to eq("/admin/projects/#{project.full_path}") + it 'returns admin_show_path field' do + expect(admin_show_path).to eq("/admin/projects/#{project.full_path}") end end context 'when current user is not an admin' do let_it_be(:current_user) { create(:user) } - it 'returns admin_web_path field as null' do - expect(admin_web_path).to be_nil + it 'returns admin_show_path field as null' do + expect(admin_show_path).to be_nil end end end -- GitLab From 1685bcdcf00d2930b845d2b204bfe060c9b9761d Mon Sep 17 00:00:00 2001 From: Peter Hegman Date: Fri, 14 Nov 2025 10:10:46 -0800 Subject: [PATCH 4/4] Update docs to match new field names --- app/graphql/types/group_type.rb | 2 +- app/graphql/types/project_type.rb | 2 +- doc/api/graphql/reference/_index.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/graphql/types/group_type.rb b/app/graphql/types/group_type.rb index 6c50b5949ac3ee..b14716f618525b 100644 --- a/app/graphql/types/group_type.rb +++ b/app/graphql/types/group_type.rb @@ -38,7 +38,7 @@ class GroupType < NamespaceType field :admin_show_path, GraphQL::Types::String, null: true, - description: 'Admin web path of the group. Only available to admins.', + description: 'Admin path of the group. Only available to admins.', authorize: :admin_all_resources field :avatar_url, diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb index 559de0da014262..a42cee6f5e798e 100644 --- a/app/graphql/types/project_type.rb +++ b/app/graphql/types/project_type.rb @@ -143,7 +143,7 @@ def self.authorization_scopes field :admin_show_path, GraphQL::Types::String, null: true, - description: 'Admin web path of the project. Only available to admins.', + description: 'Admin path of the project. Only available to admins.', authorize: :admin_all_resources field :forks_count, GraphQL::Types::Int, diff --git a/doc/api/graphql/reference/_index.md b/doc/api/graphql/reference/_index.md index 8f6a4fdeaa5f04..f6fc331e9c6c49 100644 --- a/doc/api/graphql/reference/_index.md +++ b/doc/api/graphql/reference/_index.md @@ -31564,7 +31564,7 @@ GPG signature for a signed commit. | `actualSizeLimit` | [`Float`](#float) | The actual storage size limit (in bytes) based on the enforcement type of either repository or namespace. This limit is agnostic of enforcement type. | | `additionalPurchasedStorageSize` | [`Float`](#float) | Additional storage purchased for the root namespace in bytes. | | `adminEditPath` | [`String`](#string) | Admin path for editing group. Only available to admins. | -| `adminShowPath` | [`String`](#string) | Admin web path of the group. Only available to admins. | +| `adminShowPath` | [`String`](#string) | Admin path of the group. Only available to admins. | | `aiUsageData` {{< icon name="warning-solid" >}} | [`AiUsageData`](#aiusagedata) | **Introduced** in GitLab 17.5. **Status**: Experiment. AI-related data. | | `allowStaleRunnerPruning` | [`Boolean!`](#boolean) | Indicates whether to regularly prune stale group runners. Defaults to false. | | `amazonS3Configurations` | [`AmazonS3ConfigurationTypeConnection`](#amazons3configurationtypeconnection) | Amazon S3 configurations that receive audit events belonging to the group. (see [Connections](#connections)) | @@ -39989,7 +39989,7 @@ Project-level settings for product analytics provider. | ---- | ---- | ----------- | | `actualRepositorySizeLimit` | [`Float`](#float) | Size limit for the repository in bytes. | | `adminEditPath` | [`String`](#string) | Admin path for editing project. Only available to admins. | -| `adminShowPath` | [`String`](#string) | Admin web path of the project. Only available to admins. | +| `adminShowPath` | [`String`](#string) | Admin path of the project. Only available to admins. | | `agentConfigurations` | [`AgentConfigurationConnection`](#agentconfigurationconnection) | Agent configurations defined by the project. (see [Connections](#connections)) | | `aiAgents` {{< icon name="warning-solid" >}} | [`AiAgentConnection`](#aiagentconnection) | **Introduced** in GitLab 16.9. **Status**: Experiment. Ai Agents for the project. | | `aiUsageData` {{< icon name="warning-solid" >}} | [`AiUsageData`](#aiusagedata) | **Introduced** in GitLab 17.5. **Status**: Experiment. AI-related data. | -- GitLab