Skip to content

Commit c70a497

Browse files
committed
fix(gitlab): validation pass — SAML provider param, member/invitation query filter, moderation user guard, registry order
1 parent d41d8f1 commit c70a497

7 files changed

Lines changed: 92 additions & 31 deletions

File tree

apps/docs/content/docs/en/integrations/gitlab.mdx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Using Sim’s GitLab integration, your agents can programmatically interact with
2727

2828
## Usage Instructions
2929

30-
Integrate GitLab into the workflow. Can manage projects, issues, merge requests, pipelines, and add comments. Supports all core GitLab DevOps operations.
30+
Integrate GitLab into the workflow. Can manage projects, issues, merge requests, pipelines, and add comments, plus project/group membership, invitations, access requests, SAML group links, and instance user administration. Supports all core GitLab DevOps operations.
3131

3232

3333

@@ -1680,6 +1680,7 @@ Add a SAML group link that maps an identity-provider group to a GitLab group at
16801680
| `samlGroupName` | string | Yes | The name of the SAML group as sent by the identity provider |
16811681
| `accessLevel` | number | Yes | Access level granted to members of the SAML group: 10 \(Guest\), 20 \(Reporter\), 30 \(Developer\), 40 \(Maintainer\), 50 \(Owner\) |
16821682
| `memberRoleId` | number | No | Custom member role ID \(GitLab Ultimate only\) |
1683+
| `provider` | string | No | Unique provider name that must match for this group link to be applied |
16831684

16841685
#### Output
16851686

@@ -1698,6 +1699,7 @@ Delete a SAML group link from a GitLab group
16981699
| `host` | string | No | Self-managed GitLab host \(e.g. gitlab.example.com\). Defaults to gitlab.com. |
16991700
| `groupId` | string | Yes | Group ID or URL-encoded path |
17001701
| `samlGroupName` | string | Yes | The name of the SAML group link to delete |
1702+
| `provider` | string | No | Provider name of the link to delete. Required when multiple links share the same SAML group name. |
17011703

17021704
#### Output
17031705

apps/sim/blocks/blocks/gitlab.ts

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ export const GitLabBlock: BlockConfig<GitLabResponse> = {
9595
authMode: AuthMode.ApiKey,
9696
triggerAllowed: true,
9797
longDescription:
98-
'Integrate GitLab into the workflow. Can manage projects, issues, merge requests, pipelines, and add comments. Supports all core GitLab DevOps operations.',
98+
'Integrate GitLab into the workflow. Can manage projects, issues, merge requests, pipelines, and add comments, plus project/group membership, invitations, access requests, SAML group links, and instance user administration. Supports all core GitLab DevOps operations.',
9999
docsLink: 'https://docs.sim.ai/integrations/gitlab',
100100
category: 'tools',
101101
integrationType: IntegrationType.DevOps,
@@ -991,6 +991,18 @@ Return ONLY the commit message - no explanations, no extra text.`,
991991
value: EMAIL_OPS,
992992
},
993993
},
994+
// Filter for member / invitation listings
995+
{
996+
id: 'query',
997+
title: 'Filter',
998+
type: 'short-input',
999+
placeholder: 'Filter members by name/username, or invitations by email',
1000+
mode: 'advanced',
1001+
condition: {
1002+
field: 'operation',
1003+
value: ['gitlab_list_members', 'gitlab_list_invitations'],
1004+
},
1005+
},
9941006
// Direct members only toggle (list members)
9951007
{
9961008
id: 'directMembersOnly',
@@ -1027,6 +1039,18 @@ Return ONLY the commit message - no explanations, no extra text.`,
10271039
value: SAML_NAME_OPS,
10281040
},
10291041
},
1042+
// SAML provider name (add/delete SAML group link)
1043+
{
1044+
id: 'samlProvider',
1045+
title: 'SAML Provider',
1046+
type: 'short-input',
1047+
placeholder: 'Provider name (required when multiple links share a group name)',
1048+
mode: 'advanced',
1049+
condition: {
1050+
field: 'operation',
1051+
value: SAML_NAME_OPS,
1052+
},
1053+
},
10301054
// Provider (delete user identity)
10311055
{
10321056
id: 'provider',
@@ -1644,6 +1668,7 @@ Return ONLY the commit message - no explanations, no extra text.`,
16441668
resourceType: params.resourceType || 'project',
16451669
resourceId: params.resourceId.trim(),
16461670
directOnly: params.directMembersOnly || undefined,
1671+
query: params.query?.trim() || undefined,
16471672
perPage: params.perPage ? Number(params.perPage) : undefined,
16481673
page: params.page ? Number(params.page) : undefined,
16491674
}
@@ -1709,6 +1734,7 @@ Return ONLY the commit message - no explanations, no extra text.`,
17091734
...baseParams,
17101735
resourceType: params.resourceType || 'project',
17111736
resourceId: params.resourceId.trim(),
1737+
query: params.query?.trim() || undefined,
17121738
perPage: params.perPage ? Number(params.perPage) : undefined,
17131739
page: params.page ? Number(params.page) : undefined,
17141740
}
@@ -1795,6 +1821,7 @@ Return ONLY the commit message - no explanations, no extra text.`,
17951821
samlGroupName: params.samlGroupName.trim(),
17961822
accessLevel: Number(params.accessLevel),
17971823
memberRoleId: params.memberRoleId ? Number(params.memberRoleId) : undefined,
1824+
provider: params.samlProvider?.trim() || undefined,
17981825
}
17991826

18001827
case 'gitlab_delete_saml_group_link':
@@ -1805,6 +1832,7 @@ Return ONLY the commit message - no explanations, no extra text.`,
18051832
...baseParams,
18061833
groupId: params.groupId.trim(),
18071834
samlGroupName: params.samlGroupName.trim(),
1835+
provider: params.samlProvider?.trim() || undefined,
18081836
}
18091837

18101838
case 'gitlab_search_users':
@@ -1954,8 +1982,16 @@ Return ONLY the commit message - no explanations, no extra text.`,
19541982
memberRoleId: { type: 'number', description: 'Custom member role ID (Ultimate)' },
19551983
email: { type: 'string', description: 'Email address for invitations' },
19561984
directMembersOnly: { type: 'boolean', description: 'Exclude inherited members' },
1985+
query: {
1986+
type: 'string',
1987+
description: 'Filter members by name/username, or invitations by email',
1988+
},
19571989
userSearch: { type: 'string', description: 'User search query' },
19581990
samlGroupName: { type: 'string', description: 'SAML group name' },
1991+
samlProvider: {
1992+
type: 'string',
1993+
description: 'SAML provider name for a group link (disambiguates duplicate link names)',
1994+
},
19591995
provider: { type: 'string', description: 'External identity provider name' },
19601996
hardDelete: { type: 'boolean', description: 'Hard-delete a user' },
19611997
userAdminEmail: { type: 'string', description: "User's email (create/update user)" },

apps/sim/tools/gitlab/add_saml_group_link.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ export const gitlabAddSamlGroupLinkTool: ToolConfig<
5353
visibility: 'user-or-llm',
5454
description: 'Custom member role ID (GitLab Ultimate only)',
5555
},
56+
provider: {
57+
type: 'string',
58+
required: false,
59+
visibility: 'user-or-llm',
60+
description: 'Unique provider name that must match for this group link to be applied',
61+
},
5662
},
5763

5864
request: {
@@ -72,6 +78,7 @@ export const gitlabAddSamlGroupLinkTool: ToolConfig<
7278
}
7379

7480
if (params.memberRoleId !== undefined) body.member_role_id = params.memberRoleId
81+
if (params.provider) body.provider = params.provider.trim()
7582

7683
return body
7784
},

apps/sim/tools/gitlab/delete_saml_group_link.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,23 @@ export const gitlabDeleteSamlGroupLinkTool: ToolConfig<
3939
visibility: 'user-or-llm',
4040
description: 'The name of the SAML group link to delete',
4141
},
42+
provider: {
43+
type: 'string',
44+
required: false,
45+
visibility: 'user-or-llm',
46+
description:
47+
'Provider name of the link to delete. Required when multiple links share the same SAML group name.',
48+
},
4249
},
4350

4451
request: {
4552
url: (params) => {
4653
const encodedId = encodeURIComponent(String(params.groupId).trim())
4754
const encodedName = encodeURIComponent(String(params.samlGroupName).trim())
48-
return `${getGitLabApiBase(params.host)}/groups/${encodedId}/saml_group_links/${encodedName}`
55+
const queryParams = new URLSearchParams()
56+
if (params.provider) queryParams.append('provider', params.provider.trim())
57+
const query = queryParams.toString()
58+
return `${getGitLabApiBase(params.host)}/groups/${encodedId}/saml_group_links/${encodedName}${query ? `?${query}` : ''}`
4959
},
5060
method: 'DELETE',
5161
headers: (params) => ({

apps/sim/tools/gitlab/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,7 @@ interface GitLabInvitation {
774774
created_at?: string
775775
expires_at?: string | null
776776
user_name?: string
777+
created_by_name?: string
777778
invite_token?: string
778779
member_role_id?: number | null
779780
}
@@ -792,6 +793,7 @@ interface GitLabSamlGroupLink {
792793
name: string
793794
access_level: number
794795
member_role_id?: number | null
796+
provider?: string | null
795797
}
796798

797799
interface GitLabUser {
@@ -886,11 +888,14 @@ export interface GitLabAddSamlGroupLinkParams extends GitLabBaseParams {
886888
samlGroupName: string
887889
accessLevel: number
888890
memberRoleId?: number
891+
provider?: string
889892
}
890893

891894
export interface GitLabDeleteSamlGroupLinkParams extends GitLabBaseParams {
892895
groupId: string | number
893896
samlGroupName: string
897+
/** Provider name; required by GitLab when multiple links share the same SAML group name. */
898+
provider?: string
894899
}
895900

896901
export interface GitLabSearchUsersParams extends GitLabBaseParams {

apps/sim/tools/gitlab/user_status_actions.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,10 @@ function createUserStatusActionTool(
5959
}
6060
}
6161

62-
// These endpoints return either `true` or the updated user object.
62+
// These endpoints return `true`, `{ message: 'Success' }`, or the updated
63+
// user object. Only surface objects that are actually a user record.
6364
const data = await response.json().catch(() => null)
64-
const user = data && typeof data === 'object' ? data : undefined
65+
const user = data && typeof data === 'object' && 'id' in data ? data : undefined
6566

6667
return {
6768
success: true,

apps/sim/tools/registry.ts

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6294,7 +6294,14 @@ export const tools: Record<string, ToolConfig> = {
62946294
github_check_star_v2: githubCheckStarV2Tool,
62956295
github_list_stargazers: githubListStargazersTool,
62966296
github_list_stargazers_v2: githubListStargazersV2Tool,
6297+
gitlab_activate_user: gitlabActivateUserTool,
6298+
gitlab_add_member: gitlabAddMemberTool,
6299+
gitlab_add_saml_group_link: gitlabAddSamlGroupLinkTool,
6300+
gitlab_approve_access_request: gitlabApproveAccessRequestTool,
62976301
gitlab_approve_merge_request: gitlabApproveMergeRequestTool,
6302+
gitlab_approve_user: gitlabApproveUserTool,
6303+
gitlab_ban_user: gitlabBanUserTool,
6304+
gitlab_block_user: gitlabBlockUserTool,
62986305
gitlab_cancel_pipeline: gitlabCancelPipelineTool,
62996306
gitlab_compare_branches: gitlabCompareBranchesTool,
63006307
gitlab_create_branch: gitlabCreateBranchTool,
@@ -6305,57 +6312,50 @@ export const tools: Record<string, ToolConfig> = {
63056312
gitlab_create_merge_request_note: gitlabCreateMergeRequestNoteTool,
63066313
gitlab_create_pipeline: gitlabCreatePipelineTool,
63076314
gitlab_create_release: gitlabCreateReleaseTool,
6315+
gitlab_create_user: gitlabCreateUserTool,
6316+
gitlab_deactivate_user: gitlabDeactivateUserTool,
63086317
gitlab_delete_branch: gitlabDeleteBranchTool,
63096318
gitlab_delete_issue: gitlabDeleteIssueTool,
6319+
gitlab_delete_saml_group_link: gitlabDeleteSamlGroupLinkTool,
6320+
gitlab_delete_user: gitlabDeleteUserTool,
6321+
gitlab_delete_user_identity: gitlabDeleteUserIdentityTool,
6322+
gitlab_deny_access_request: gitlabDenyAccessRequestTool,
63106323
gitlab_get_file: gitlabGetFileTool,
63116324
gitlab_get_issue: gitlabGetIssueTool,
63126325
gitlab_get_job_log: gitlabGetJobLogTool,
63136326
gitlab_get_merge_request: gitlabGetMergeRequestTool,
63146327
gitlab_get_merge_request_changes: gitlabGetMergeRequestChangesTool,
63156328
gitlab_get_pipeline: gitlabGetPipelineTool,
63166329
gitlab_get_project: gitlabGetProjectTool,
6330+
gitlab_invite_member: gitlabInviteMemberTool,
6331+
gitlab_list_access_requests: gitlabListAccessRequestsTool,
63176332
gitlab_list_branches: gitlabListBranchesTool,
63186333
gitlab_list_commits: gitlabListCommitsTool,
6334+
gitlab_list_invitations: gitlabListInvitationsTool,
63196335
gitlab_list_issues: gitlabListIssuesTool,
6336+
gitlab_list_members: gitlabListMembersTool,
63206337
gitlab_list_merge_requests: gitlabListMergeRequestsTool,
63216338
gitlab_list_pipeline_jobs: gitlabListPipelineJobsTool,
63226339
gitlab_list_pipelines: gitlabListPipelinesTool,
63236340
gitlab_list_projects: gitlabListProjectsTool,
63246341
gitlab_list_releases: gitlabListReleasesTool,
63256342
gitlab_list_repository_tree: gitlabListRepositoryTreeTool,
6343+
gitlab_list_saml_group_links: gitlabListSamlGroupLinksTool,
63266344
gitlab_merge_merge_request: gitlabMergeMergeRequestTool,
63276345
gitlab_play_job: gitlabPlayJobTool,
6346+
gitlab_reject_user: gitlabRejectUserTool,
6347+
gitlab_remove_member: gitlabRemoveMemberTool,
63286348
gitlab_retry_pipeline: gitlabRetryPipelineTool,
6349+
gitlab_revoke_invitation: gitlabRevokeInvitationTool,
6350+
gitlab_search_users: gitlabSearchUsersTool,
6351+
gitlab_unban_user: gitlabUnbanUserTool,
6352+
gitlab_unblock_user: gitlabUnblockUserTool,
63296353
gitlab_update_file: gitlabUpdateFileTool,
6354+
gitlab_update_invitation: gitlabUpdateInvitationTool,
63306355
gitlab_update_issue: gitlabUpdateIssueTool,
6331-
gitlab_update_merge_request: gitlabUpdateMergeRequestTool,
6332-
gitlab_list_members: gitlabListMembersTool,
6333-
gitlab_add_member: gitlabAddMemberTool,
63346356
gitlab_update_member: gitlabUpdateMemberTool,
6335-
gitlab_remove_member: gitlabRemoveMemberTool,
6336-
gitlab_invite_member: gitlabInviteMemberTool,
6337-
gitlab_list_invitations: gitlabListInvitationsTool,
6338-
gitlab_update_invitation: gitlabUpdateInvitationTool,
6339-
gitlab_revoke_invitation: gitlabRevokeInvitationTool,
6340-
gitlab_list_access_requests: gitlabListAccessRequestsTool,
6341-
gitlab_approve_access_request: gitlabApproveAccessRequestTool,
6342-
gitlab_deny_access_request: gitlabDenyAccessRequestTool,
6343-
gitlab_list_saml_group_links: gitlabListSamlGroupLinksTool,
6344-
gitlab_search_users: gitlabSearchUsersTool,
6345-
gitlab_create_user: gitlabCreateUserTool,
6357+
gitlab_update_merge_request: gitlabUpdateMergeRequestTool,
63466358
gitlab_update_user: gitlabUpdateUserTool,
6347-
gitlab_delete_user: gitlabDeleteUserTool,
6348-
gitlab_block_user: gitlabBlockUserTool,
6349-
gitlab_unblock_user: gitlabUnblockUserTool,
6350-
gitlab_deactivate_user: gitlabDeactivateUserTool,
6351-
gitlab_activate_user: gitlabActivateUserTool,
6352-
gitlab_ban_user: gitlabBanUserTool,
6353-
gitlab_unban_user: gitlabUnbanUserTool,
6354-
gitlab_approve_user: gitlabApproveUserTool,
6355-
gitlab_reject_user: gitlabRejectUserTool,
6356-
gitlab_delete_user_identity: gitlabDeleteUserIdentityTool,
6357-
gitlab_add_saml_group_link: gitlabAddSamlGroupLinkTool,
6358-
gitlab_delete_saml_group_link: gitlabDeleteSamlGroupLinkTool,
63596359
grain_list_recordings: grainListRecordingsTool,
63606360
grain_get_recording: grainGetRecordingTool,
63616361
grain_get_transcript: grainGetTranscriptTool,

0 commit comments

Comments
 (0)