@mastra/factory 0.24.0-alpha.1 → 0.24.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -4
- package/dist/auth.d.ts +14 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +45 -9
- package/dist/auth.js.map +1 -1
- package/dist/boards/work-transition-policy.d.ts.map +1 -1
- package/dist/boards/work-transition-policy.js +10 -0
- package/dist/boards/work-transition-policy.js.map +1 -1
- package/dist/boards/work.d.ts +14 -0
- package/dist/boards/work.d.ts.map +1 -1
- package/dist/boards/work.js +70 -7
- package/dist/boards/work.js.map +1 -1
- package/dist/capabilities/version-control.d.ts +26 -0
- package/dist/capabilities/version-control.d.ts.map +1 -1
- package/dist/factory.d.ts +8 -0
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +191 -16
- package/dist/factory.js.map +1 -1
- package/dist/integrations/github/integration.d.ts.map +1 -1
- package/dist/integrations/github/integration.js +37 -1
- package/dist/integrations/github/integration.js.map +1 -1
- package/dist/integrations/gitlab/api.d.ts +15 -0
- package/dist/integrations/gitlab/api.d.ts.map +1 -1
- package/dist/integrations/gitlab/api.js +9 -0
- package/dist/integrations/gitlab/api.js.map +1 -1
- package/dist/integrations/gitlab/version-control.d.ts.map +1 -1
- package/dist/integrations/gitlab/version-control.js +37 -3
- package/dist/integrations/gitlab/version-control.js.map +1 -1
- package/dist/integrations/platform/github/integration.d.ts.map +1 -1
- package/dist/integrations/platform/github/integration.js +27 -1
- package/dist/integrations/platform/github/integration.js.map +1 -1
- package/dist/integrations/subscription-session.d.ts +15 -0
- package/dist/integrations/subscription-session.d.ts.map +1 -1
- package/dist/integrations/subscription-session.js +30 -13
- package/dist/integrations/subscription-session.js.map +1 -1
- package/dist/mcp/disconnect.d.ts +10 -0
- package/dist/mcp/disconnect.d.ts.map +1 -0
- package/dist/mcp/disconnect.js +44 -0
- package/dist/mcp/disconnect.js.map +1 -0
- package/dist/mcp/routes.d.ts +46 -0
- package/dist/mcp/routes.d.ts.map +1 -0
- package/dist/mcp/routes.js +243 -0
- package/dist/mcp/routes.js.map +1 -0
- package/dist/provider-display-name.d.ts +2 -0
- package/dist/provider-display-name.d.ts.map +1 -0
- package/dist/provider-display-name.js +16 -0
- package/dist/provider-display-name.js.map +1 -0
- package/dist/routes/config.js +2 -2
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/contracts.d.ts +4 -0
- package/dist/routes/contracts.d.ts.map +1 -1
- package/dist/routes/contracts.js +3 -1
- package/dist/routes/contracts.js.map +1 -1
- package/dist/routes/oauth.js +1 -1
- package/dist/routes/oauth.js.map +1 -1
- package/dist/routes/provider-credentials.d.ts +6 -2
- package/dist/routes/provider-credentials.d.ts.map +1 -1
- package/dist/routes/provider-credentials.js +20 -7
- package/dist/routes/provider-credentials.js.map +1 -1
- package/dist/routes/source-control-sessions.d.ts +1 -0
- package/dist/routes/source-control-sessions.d.ts.map +1 -1
- package/dist/routes/source-control-sessions.js +1 -1
- package/dist/routes/source-control-sessions.js.map +1 -1
- package/dist/routes/surface.d.ts +1 -0
- package/dist/routes/surface.d.ts.map +1 -1
- package/dist/routes/surface.js +4 -3
- package/dist/routes/surface.js.map +1 -1
- package/dist/routes/work-items.d.ts.map +1 -1
- package/dist/routes/work-items.js +61 -121
- package/dist/routes/work-items.js.map +1 -1
- package/dist/rules/dispatcher.d.ts +7 -0
- package/dist/rules/dispatcher.d.ts.map +1 -1
- package/dist/rules/dispatcher.js +62 -5
- package/dist/rules/dispatcher.js.map +1 -1
- package/dist/rules/processor.d.ts.map +1 -1
- package/dist/rules/processor.js +2 -1
- package/dist/rules/processor.js.map +1 -1
- package/dist/rules/tools.d.ts.map +1 -1
- package/dist/rules/tools.js +82 -3
- package/dist/rules/tools.js.map +1 -1
- package/dist/rules/transition-service.d.ts +17 -0
- package/dist/rules/transition-service.d.ts.map +1 -1
- package/dist/rules/transition-service.js +25 -0
- package/dist/rules/transition-service.js.map +1 -1
- package/dist/rules/types.d.ts +2 -4
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/rules/types.js +1 -4
- package/dist/rules/types.js.map +1 -1
- package/dist/sandbox/local-factory-sandbox.d.ts.map +1 -1
- package/dist/sandbox/local-factory-sandbox.js +1 -0
- package/dist/sandbox/local-factory-sandbox.js.map +1 -1
- package/dist/session/factory-session.d.ts +15 -1
- package/dist/session/factory-session.d.ts.map +1 -1
- package/dist/session/factory-session.js +4 -2
- package/dist/session/factory-session.js.map +1 -1
- package/dist/session/reply-credential-processor.d.ts +15 -0
- package/dist/session/reply-credential-processor.d.ts.map +1 -0
- package/dist/session/reply-credential-processor.js +40 -0
- package/dist/session/reply-credential-processor.js.map +1 -0
- package/dist/session/source-control-tools.d.ts +19 -1
- package/dist/session/source-control-tools.d.ts.map +1 -1
- package/dist/session/source-control-tools.js +70 -3
- package/dist/session/source-control-tools.js.map +1 -1
- package/dist/storage/domains/audit/domain.js +1 -1
- package/dist/storage/domains/projects/base.d.ts +6 -0
- package/dist/storage/domains/projects/base.d.ts.map +1 -1
- package/dist/storage/domains/projects/base.js +12 -0
- package/dist/storage/domains/projects/base.js.map +1 -1
- package/dist/storage/domains/source-control/base.d.ts +17 -0
- package/dist/storage/domains/source-control/base.d.ts.map +1 -1
- package/dist/storage/domains/source-control/base.js +23 -0
- package/dist/storage/domains/source-control/base.js.map +1 -1
- package/dist/storage/domains/source-control/inmemory.d.ts +4 -0
- package/dist/storage/domains/source-control/inmemory.d.ts.map +1 -1
- package/dist/storage/domains/source-control/inmemory.js +5 -1
- package/dist/storage/domains/source-control/inmemory.js.map +1 -1
- package/dist/storage/domains/work-items/base.d.ts +56 -0
- package/dist/storage/domains/work-items/base.d.ts.map +1 -1
- package/dist/storage/domains/work-items/base.js +139 -25
- package/dist/storage/domains/work-items/base.js.map +1 -1
- package/dist/tools/annotations.d.ts +7 -0
- package/dist/tools/annotations.d.ts.map +1 -0
- package/dist/tools/annotations.js +102 -0
- package/dist/tools/annotations.js.map +1 -0
- package/dist/tools/approval-tools.d.ts +15 -0
- package/dist/tools/approval-tools.d.ts.map +1 -0
- package/dist/tools/approval-tools.js +77 -0
- package/dist/tools/approval-tools.js.map +1 -0
- package/dist/tools/deliver.d.ts +54 -0
- package/dist/tools/deliver.d.ts.map +1 -0
- package/dist/tools/deliver.js +105 -0
- package/dist/tools/deliver.js.map +1 -0
- package/dist/tools/index.d.ts +29 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +39 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/messaging-tools.d.ts +28 -0
- package/dist/tools/messaging-tools.d.ts.map +1 -0
- package/dist/tools/messaging-tools.js +312 -0
- package/dist/tools/messaging-tools.js.map +1 -0
- package/dist/tools/permissions.d.ts +31 -0
- package/dist/tools/permissions.d.ts.map +1 -0
- package/dist/tools/permissions.js +44 -0
- package/dist/tools/permissions.js.map +1 -0
- package/dist/tools/read-tools.d.ts +27 -0
- package/dist/tools/read-tools.d.ts.map +1 -0
- package/dist/tools/read-tools.js +285 -0
- package/dist/tools/read-tools.js.map +1 -0
- package/dist/tools/reports.d.ts +163 -0
- package/dist/tools/reports.d.ts.map +1 -0
- package/dist/tools/reports.js +352 -0
- package/dist/tools/reports.js.map +1 -0
- package/dist/tools/run-watch.d.ts +46 -0
- package/dist/tools/run-watch.d.ts.map +1 -0
- package/dist/tools/run-watch.js +102 -0
- package/dist/tools/run-watch.js.map +1 -0
- package/dist/tools/scope.d.ts +45 -0
- package/dist/tools/scope.d.ts.map +1 -0
- package/dist/tools/scope.js +73 -0
- package/dist/tools/scope.js.map +1 -0
- package/dist/tools/session-tools.d.ts +31 -0
- package/dist/tools/session-tools.d.ts.map +1 -0
- package/dist/tools/session-tools.js +312 -0
- package/dist/tools/session-tools.js.map +1 -0
- package/dist/tools/sessions-state-processor.d.ts +37 -0
- package/dist/tools/sessions-state-processor.d.ts.map +1 -0
- package/dist/tools/sessions-state-processor.js +206 -0
- package/dist/tools/sessions-state-processor.js.map +1 -0
- package/dist/tools/work-item-tools.d.ts +28 -0
- package/dist/tools/work-item-tools.d.ts.map +1 -0
- package/dist/tools/work-item-tools.js +322 -0
- package/dist/tools/work-item-tools.js.map +1 -0
- package/dist/work-items/create-work-item.d.ts +55 -0
- package/dist/work-items/create-work-item.d.ts.map +1 -0
- package/dist/work-items/create-work-item.js +101 -0
- package/dist/work-items/create-work-item.js.map +1 -0
- package/dist/work-items/decision-actions.d.ts +42 -0
- package/dist/work-items/decision-actions.d.ts.map +1 -0
- package/dist/work-items/decision-actions.js +70 -0
- package/dist/work-items/decision-actions.js.map +1 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +3 -1
- package/dist/workspace.js.map +1 -1
- package/factory-skills/factory-gitlab-rereview/SKILL.md +1 -1
- package/factory-skills/factory-gitlab-review/SKILL.md +1 -1
- package/factory-skills/factory-plan/SKILL.md +4 -4
- package/factory-skills/factory-rereview/SKILL.md +3 -1
- package/factory-skills/factory-review/SKILL.md +3 -1
- package/factory-skills/factory-self-review/SKILL.md +46 -0
- package/package.json +13 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/integrations/gitlab/api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/integrations/gitlab/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -173,6 +173,15 @@ var GitLabApiClient = class {
|
|
|
173
173
|
async resolveMergeRequestDiscussion(projectId, mergeRequestIid, discussionId, resolved) {
|
|
174
174
|
return this.#request("PUT", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}`, { body: { resolved } });
|
|
175
175
|
}
|
|
176
|
+
async setCommitStatus(projectId, sha, status) {
|
|
177
|
+
return this.#request("POST", `/api/v4/projects/${encodeURIComponent(projectId)}/statuses/${encodeURIComponent(sha)}`, { body: {
|
|
178
|
+
state: status.state,
|
|
179
|
+
name: status.name,
|
|
180
|
+
ref: status.ref,
|
|
181
|
+
description: status.description,
|
|
182
|
+
target_url: status.targetUrl
|
|
183
|
+
} });
|
|
184
|
+
}
|
|
176
185
|
async createMergeRequestDiscussion(projectId, mergeRequestIid, input) {
|
|
177
186
|
return this.#request("POST", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions`, { body: {
|
|
178
187
|
body: input.body,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","names":["#direct","#platform","#request"],"sources":["../../../src/integrations/gitlab/api.ts"],"sourcesContent":["import { PlatformApiClient, PlatformApiError } from '../platform/api-client.js';\n\nexport const GITLAB_PROJECTS_PAGE_SIZE = 100;\nexport const GITLAB_ISSUES_PAGE_SIZE = 30;\nexport const GITLAB_NOTES_PAGE_SIZE = 100;\nexport const GITLAB_MIN_ACCESS_LEVEL = 20;\nexport const GITLAB_MERGE_REQUESTS_PAGE_SIZE = 30;\nexport const GITLAB_DISCUSSIONS_PAGE_SIZE = 100;\n\nexport type GitLabApiErrorCode = 'gitlab_auth_failed' | 'gitlab_request_failed';\n\nexport class GitLabApiError extends Error {\n readonly status: number | null;\n readonly code: GitLabApiErrorCode;\n\n constructor(message: string, status: number | null) {\n super(message);\n this.name = 'GitLabApiError';\n this.status = status;\n this.code = status === 401 || status === 403 ? 'gitlab_auth_failed' : 'gitlab_request_failed';\n }\n}\n\nexport interface GitLabProject {\n id: number;\n name: string;\n path_with_namespace: string;\n web_url: string;\n default_branch?: string | null;\n}\n\nexport interface GitLabUser {\n id?: number;\n name?: string | null;\n username: string;\n}\n\nexport interface GitLabLabelDetail {\n name: string;\n color: string;\n text_color?: string;\n}\n\ntype GitLabIssueResponse = Omit<GitLabIssue, 'labels' | 'labelDetails'> & {\n labels?: Array<string | GitLabLabelDetail>;\n};\n\nexport interface GitLabIssue {\n id: number;\n iid: number;\n project_id: number;\n title: string;\n description?: string | null;\n state: 'opened' | 'closed';\n web_url: string;\n author?: GitLabUser | null;\n assignee?: GitLabUser | null;\n assignees?: GitLabUser[];\n labels?: string[];\n labelDetails?: GitLabLabelDetail[];\n weight?: number | null;\n user_notes_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface GitLabNote {\n id: number;\n body: string;\n type?: string | null;\n author?: GitLabUser | null;\n created_at: string;\n updated_at?: string;\n system?: boolean;\n}\n\nexport interface GitLabDiffRefs {\n base_sha: string;\n start_sha: string;\n head_sha: string;\n}\n\nexport interface GitLabMergeRequest {\n id: number;\n iid: number;\n project_id: number;\n title: string;\n description?: string | null;\n state: 'opened' | 'closed' | 'merged' | 'locked';\n web_url: string;\n author?: GitLabUser | null;\n assignees?: GitLabUser[];\n reviewers?: GitLabUser[];\n labels?: string[];\n source_branch: string;\n target_branch: string;\n sha: string;\n merge_commit_sha?: string | null;\n squash_commit_sha?: string | null;\n diff_refs?: GitLabDiffRefs | null;\n merge_status?: string;\n detailed_merge_status?: string;\n draft?: boolean;\n work_in_progress?: boolean;\n merged_at?: string | null;\n user_notes_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface GitLabMergeResult extends GitLabMergeRequest {\n message?: string;\n}\n\nexport interface GitLabDiscussionPosition {\n position_type: 'text';\n base_sha: string;\n start_sha: string;\n head_sha: string;\n old_path: string;\n new_path: string;\n old_line?: number | null;\n new_line?: number | null;\n line_range?: {\n start: GitLabDiscussionLine;\n end: GitLabDiscussionLine;\n };\n}\n\nexport interface GitLabDiscussionLine {\n line_code: string;\n type: 'old' | 'new';\n old_line?: number | null;\n new_line?: number | null;\n}\n\nexport interface GitLabDiscussionNote extends GitLabNote {\n position?: GitLabDiscussionPosition | null;\n resolvable?: boolean;\n resolved?: boolean;\n}\n\nexport interface GitLabDiscussion {\n id: string;\n individual_note?: boolean;\n notes: GitLabDiscussionNote[];\n}\n\nexport interface GitLabMergeRequestApprovals {\n approved: boolean;\n approvals_required?: number;\n approvals_left?: number;\n approved_by?: Array<{ user: GitLabUser }>;\n}\n\nexport interface GitLabMember {\n id: number;\n username: string;\n name?: string | null;\n state?: string;\n access_level?: number;\n}\n\nexport interface GitLabApiClientConfig {\n baseUrl: string;\n accessToken: string;\n fetchImpl?: typeof fetch;\n}\n\nexport interface PlatformGitLabApiClientConfig {\n client: PlatformApiClient;\n connectionId: string;\n}\n\nexport class GitLabApiClient {\n readonly #direct: { baseUrl: string; accessToken: string; fetch: typeof fetch } | null;\n readonly #platform: PlatformGitLabApiClientConfig | null;\n\n constructor(config: GitLabApiClientConfig | PlatformGitLabApiClientConfig) {\n if ('client' in config) {\n if (!config.connectionId.trim()) throw new Error('GitLabApiClient is missing required config: connectionId.');\n this.#direct = null;\n this.#platform = config;\n return;\n }\n\n const accessToken = config.accessToken.trim();\n if (!accessToken) throw new Error('GitLabApiClient is missing required config: accessToken.');\n let url: URL;\n try {\n url = new URL(config.baseUrl);\n } catch {\n throw new Error('GitLabApiClient baseUrl must be an absolute HTTP(S) URL.');\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error('GitLabApiClient baseUrl must be an absolute HTTP(S) URL.');\n }\n if (url.username || url.password || url.search || url.hash) {\n throw new Error('GitLabApiClient baseUrl must not include credentials, query, or fragment.');\n }\n const hostname = url.hostname.replace(/^\\[|\\]$/g, '').toLowerCase();\n const isLoopback = hostname === 'localhost' || hostname === '::1' || /^127(?:\\.\\d{1,3}){3}$/.test(hostname);\n if (url.protocol === 'http:' && !isLoopback) {\n throw new Error('GitLabApiClient baseUrl must use HTTPS unless it targets a loopback host.');\n }\n this.#direct = {\n baseUrl: config.baseUrl.replace(/\\/+$/, ''),\n accessToken,\n fetch: config.fetchImpl ?? globalThis.fetch,\n };\n this.#platform = null;\n }\n\n async getCurrentUser(): Promise<GitLabUser> {\n return this.#request<GitLabUser>('GET', '/api/v4/user');\n }\n\n async getProject(projectId: string): Promise<GitLabProject> {\n return this.#request<GitLabProject>('GET', `/api/v4/projects/${encodeURIComponent(projectId)}`);\n }\n\n async listProjects(options: { page?: number } = {}): Promise<GitLabProject[]> {\n return this.#request<GitLabProject[]>('GET', '/api/v4/projects', {\n query: {\n membership: 'true',\n simple: 'true',\n with_issues_enabled: 'true',\n min_access_level: GITLAB_MIN_ACCESS_LEVEL,\n order_by: 'last_activity_at',\n sort: 'desc',\n page: options.page ?? 1,\n per_page: GITLAB_PROJECTS_PAGE_SIZE,\n },\n });\n }\n\n async listIssues(projectId: string, options: { page?: number; labels?: string[] } = {}): Promise<GitLabIssue[]> {\n const issues = await this.#request<GitLabIssueResponse[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/issues`,\n {\n query: {\n state: 'opened',\n scope: 'all',\n order_by: 'updated_at',\n sort: 'desc',\n page: options.page ?? 1,\n per_page: GITLAB_ISSUES_PAGE_SIZE,\n labels: options.labels?.length ? options.labels.join(',') : undefined,\n with_labels_details: 'true',\n },\n },\n );\n return issues.map(normalizeIssue);\n }\n\n async getIssue(projectId: string, issueIid: number): Promise<GitLabIssue> {\n // GitLab's single-issue endpoint returns label names even when\n // with_labels_details is requested. The IID-filtered list endpoint returns\n // the same issue with label colors, including for closed issues.\n const issues = await this.#request<GitLabIssueResponse[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/issues`,\n { query: { 'iids[]': issueIid, state: 'all', scope: 'all', with_labels_details: 'true' } },\n );\n const issue = issues.find(candidate => candidate.iid === issueIid);\n if (!issue) throw new GitLabApiError(`GitLab issue ${issueIid} was not found`, 404);\n return normalizeIssue(issue);\n }\n\n async listNotes(projectId: string, issueIid: number, options: { page?: number } = {}): Promise<GitLabNote[]> {\n return this.#request<GitLabNote[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/issues/${issueIid}/notes`,\n {\n query: { order_by: 'created_at', sort: 'asc', page: options.page ?? 1, per_page: GITLAB_NOTES_PAGE_SIZE },\n },\n );\n }\n\n async createNote(projectId: string, issueIid: number, body: string): Promise<GitLabNote> {\n return this.#request<GitLabNote>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/issues/${issueIid}/notes`,\n { body: { body } },\n );\n }\n\n async updateIssueState(projectId: string, issueIid: number, stateEvent: 'close' | 'reopen'): Promise<GitLabIssue> {\n return this.#request<GitLabIssue>('PUT', `/api/v4/projects/${encodeURIComponent(projectId)}/issues/${issueIid}`, {\n body: { state_event: stateEvent },\n });\n }\n\n async listMergeRequests(\n projectId: string,\n options: { page?: number; state?: 'opened' | 'closed' | 'merged' | 'all' } = {},\n ): Promise<GitLabMergeRequest[]> {\n return this.#request<GitLabMergeRequest[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests`,\n {\n query: {\n state: options.state ?? 'opened',\n order_by: 'updated_at',\n sort: 'desc',\n page: options.page ?? 1,\n per_page: GITLAB_MERGE_REQUESTS_PAGE_SIZE,\n },\n },\n );\n }\n\n async getMergeRequest(projectId: string, mergeRequestIid: number): Promise<GitLabMergeRequest> {\n return this.#request<GitLabMergeRequest>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}`,\n );\n }\n\n async createMergeRequest(\n projectId: string,\n input: {\n sourceBranch: string;\n targetBranch: string;\n title: string;\n description?: string;\n removeSourceBranch?: boolean;\n squash?: boolean;\n },\n ): Promise<GitLabMergeRequest> {\n return this.#request<GitLabMergeRequest>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests`,\n {\n body: {\n source_branch: input.sourceBranch,\n target_branch: input.targetBranch,\n title: input.title,\n description: input.description,\n remove_source_branch: input.removeSourceBranch,\n squash: input.squash,\n },\n },\n );\n }\n\n async updateMergeRequest(\n projectId: string,\n mergeRequestIid: number,\n input: {\n title?: string;\n description?: string;\n targetBranch?: string;\n stateEvent?: 'close' | 'reopen';\n removeSourceBranch?: boolean;\n squash?: boolean;\n reviewerIds?: number[];\n },\n ): Promise<GitLabMergeRequest> {\n return this.#request<GitLabMergeRequest>(\n 'PUT',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}`,\n {\n body: {\n title: input.title,\n description: input.description,\n target_branch: input.targetBranch,\n state_event: input.stateEvent,\n remove_source_branch: input.removeSourceBranch,\n squash: input.squash,\n reviewer_ids: input.reviewerIds,\n },\n },\n );\n }\n\n async mergeMergeRequest(\n projectId: string,\n mergeRequestIid: number,\n options: {\n squash?: boolean;\n mergeCommitMessage?: string;\n squashCommitMessage?: string;\n shouldRemoveSourceBranch?: boolean;\n } = {},\n ): Promise<GitLabMergeResult> {\n return this.#request<GitLabMergeResult>(\n 'PUT',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/merge`,\n {\n body: {\n squash: options.squash,\n merge_commit_message: options.mergeCommitMessage,\n squash_commit_message: options.squashCommitMessage,\n should_remove_source_branch: options.shouldRemoveSourceBranch,\n },\n },\n );\n }\n\n async listMergeRequestNotes(\n projectId: string,\n mergeRequestIid: number,\n options: { page?: number } = {},\n ): Promise<GitLabNote[]> {\n return this.#request<GitLabNote[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes`,\n {\n query: {\n order_by: 'created_at',\n sort: 'asc',\n page: options.page ?? 1,\n per_page: GITLAB_NOTES_PAGE_SIZE,\n },\n },\n );\n }\n\n async createMergeRequestNote(projectId: string, mergeRequestIid: number, body: string): Promise<GitLabNote> {\n return this.#request<GitLabNote>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes`,\n { body: { body } },\n );\n }\n\n async getMergeRequestNote(projectId: string, mergeRequestIid: number, noteId: number): Promise<GitLabNote> {\n return this.#request<GitLabNote>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes/${noteId}`,\n );\n }\n\n async updateMergeRequestNote(\n projectId: string,\n mergeRequestIid: number,\n noteId: number,\n body: string,\n ): Promise<GitLabNote> {\n return this.#request<GitLabNote>(\n 'PUT',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes/${noteId}`,\n { body: { body } },\n );\n }\n\n async deleteMergeRequestNote(projectId: string, mergeRequestIid: number, noteId: number): Promise<void> {\n await this.#request<void>(\n 'DELETE',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes/${noteId}`,\n );\n }\n\n async listMergeRequestDiscussions(\n projectId: string,\n mergeRequestIid: number,\n options: { page?: number } = {},\n ): Promise<GitLabDiscussion[]> {\n return this.#request<GitLabDiscussion[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions`,\n { query: { page: options.page ?? 1, per_page: GITLAB_DISCUSSIONS_PAGE_SIZE } },\n );\n }\n\n async getMergeRequestDiscussion(\n projectId: string,\n mergeRequestIid: number,\n discussionId: string,\n ): Promise<GitLabDiscussion> {\n return this.#request<GitLabDiscussion>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}`,\n );\n }\n\n async resolveMergeRequestDiscussion(\n projectId: string,\n mergeRequestIid: number,\n discussionId: string,\n resolved: boolean,\n ): Promise<GitLabDiscussion> {\n return this.#request<GitLabDiscussion>(\n 'PUT',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}`,\n { body: { resolved } },\n );\n }\n\n async createMergeRequestDiscussion(\n projectId: string,\n mergeRequestIid: number,\n input: { body: string; commitId?: string; position?: GitLabDiscussionPosition },\n ): Promise<GitLabDiscussion> {\n return this.#request<GitLabDiscussion>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions`,\n { body: { body: input.body, commit_id: input.commitId, position: input.position } },\n );\n }\n\n async addMergeRequestDiscussionNote(\n projectId: string,\n mergeRequestIid: number,\n discussionId: string,\n body: string,\n ): Promise<GitLabDiscussionNote> {\n return this.#request<GitLabDiscussionNote>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}/notes`,\n { body: { body } },\n );\n }\n\n async updateMergeRequestDiscussionNote(\n projectId: string,\n mergeRequestIid: number,\n discussionId: string,\n noteId: number,\n body: string,\n ): Promise<GitLabDiscussionNote> {\n return this.#request<GitLabDiscussionNote>(\n 'PUT',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}/notes/${noteId}`,\n { body: { body } },\n );\n }\n\n async deleteMergeRequestDiscussionNote(\n projectId: string,\n mergeRequestIid: number,\n discussionId: string,\n noteId: number,\n ): Promise<void> {\n await this.#request<void>(\n 'DELETE',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}/notes/${noteId}`,\n );\n }\n\n async getMergeRequestApprovals(projectId: string, mergeRequestIid: number): Promise<GitLabMergeRequestApprovals> {\n return this.#request<GitLabMergeRequestApprovals>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/approvals`,\n );\n }\n\n async approveMergeRequest(projectId: string, mergeRequestIid: number, sha?: string): Promise<GitLabMergeRequest> {\n return this.#request<GitLabMergeRequest>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/approve`,\n sha ? { body: { sha } } : undefined,\n );\n }\n\n async unapproveMergeRequest(projectId: string, mergeRequestIid: number): Promise<GitLabMergeRequest> {\n return this.#request<GitLabMergeRequest>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/unapprove`,\n );\n }\n\n async setMergeRequestReviewers(\n projectId: string,\n mergeRequestIid: number,\n reviewerIds: number[],\n ): Promise<GitLabMergeRequest> {\n return this.#request<GitLabMergeRequest>(\n 'PUT',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}`,\n { body: { reviewer_ids: reviewerIds } },\n );\n }\n\n async listProjectMembers(\n projectId: string,\n options: { query?: string; page?: number } = {},\n ): Promise<GitLabMember[]> {\n return this.#request<GitLabMember[]>('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/members/all`, {\n query: {\n query: options.query,\n page: options.page ?? 1,\n per_page: GITLAB_DISCUSSIONS_PAGE_SIZE,\n },\n });\n }\n\n async #request<T>(\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n path: string,\n options: { query?: Record<string, string | number | undefined>; body?: unknown } = {},\n ): Promise<T> {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query ?? {})) {\n if (value !== undefined) query.set(key, String(value));\n }\n const suffix = query.size > 0 ? `?${query.toString()}` : '';\n // Repository targets carry both the immutable numeric ID for GitLab API\n // requests and the path for browser links. A Platform proxy decodes %2F,\n // so forwarding a path-based project locator would turn into a 404.\n const apiPath = path.replace(/^\\/api\\/v4\\/projects\\/([^/]+)/, (full, encoded: string) => {\n const target = decodeURIComponent(encoded);\n const match = /^(\\d+):(.+)$/.exec(target);\n return match ? `/api/v4/projects/${encodeURIComponent(match[1]!)}` : full;\n });\n\n if (this.#platform) {\n const proxyPath = `/v2/connections/${encodeURIComponent(this.#platform.connectionId)}/proxy${apiPath}${suffix}`;\n try {\n return await this.#platform.client.request<T>(method, proxyPath, options.body);\n } catch (error) {\n if (error instanceof PlatformApiError) throw new GitLabApiError(error.message, error.status);\n throw new GitLabApiError(error instanceof Error ? error.message : String(error), null);\n }\n }\n\n const direct = this.#direct!;\n const headers: Record<string, string> = {\n accept: 'application/json',\n 'private-token': direct.accessToken,\n };\n const init: RequestInit = { method, headers, signal: AbortSignal.timeout(15_000) };\n if (options.body !== undefined) {\n headers['content-type'] = 'application/json';\n init.body = JSON.stringify(options.body);\n }\n\n let response: Response;\n try {\n response = await direct.fetch(`${direct.baseUrl}${apiPath}${suffix}`, init);\n } catch (error) {\n const message = (error instanceof Error ? error.message : String(error))\n .split(direct.accessToken)\n .join('[REDACTED]');\n throw new GitLabApiError(message, null);\n }\n if (!response.ok) {\n const message = (await extractError(response)).split(direct.accessToken).join('[REDACTED]');\n throw new GitLabApiError(message, response.status);\n }\n if (response.status === 204) return undefined as T;\n return (await response.json()) as T;\n }\n}\n\nasync function extractError(response: Response): Promise<string> {\n try {\n const data = (await response.clone().json()) as Record<string, unknown>;\n if (typeof data.message === 'string' && data.message) return data.message;\n if (typeof data.error === 'string' && data.error) return data.error;\n } catch {\n // Fall through to the status-based message.\n }\n return `GitLab API request failed (${response.status})`;\n}\n\nfunction normalizeIssue(response: GitLabIssueResponse): GitLabIssue {\n const { labels, ...issue } = response;\n const labelDetails = (labels ?? []).filter((label): label is GitLabLabelDetail => typeof label !== 'string');\n return {\n ...issue,\n labels: (labels ?? []).map(label => (typeof label === 'string' ? label : label.name)),\n ...(labelDetails.length > 0 ? { labelDetails } : {}),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.js","names":["#direct","#platform","#request"],"sources":["../../../src/integrations/gitlab/api.ts"],"sourcesContent":["import { PlatformApiClient, PlatformApiError } from '../platform/api-client.js';\n\nexport const GITLAB_PROJECTS_PAGE_SIZE = 100;\nexport const GITLAB_ISSUES_PAGE_SIZE = 30;\nexport const GITLAB_NOTES_PAGE_SIZE = 100;\nexport const GITLAB_MIN_ACCESS_LEVEL = 20;\nexport const GITLAB_MERGE_REQUESTS_PAGE_SIZE = 30;\nexport const GITLAB_DISCUSSIONS_PAGE_SIZE = 100;\n\nexport type GitLabApiErrorCode = 'gitlab_auth_failed' | 'gitlab_request_failed';\n\nexport class GitLabApiError extends Error {\n readonly status: number | null;\n readonly code: GitLabApiErrorCode;\n\n constructor(message: string, status: number | null) {\n super(message);\n this.name = 'GitLabApiError';\n this.status = status;\n this.code = status === 401 || status === 403 ? 'gitlab_auth_failed' : 'gitlab_request_failed';\n }\n}\n\nexport interface GitLabProject {\n id: number;\n name: string;\n path_with_namespace: string;\n web_url: string;\n default_branch?: string | null;\n}\n\nexport interface GitLabUser {\n id?: number;\n name?: string | null;\n username: string;\n}\n\nexport interface GitLabLabelDetail {\n name: string;\n color: string;\n text_color?: string;\n}\n\ntype GitLabIssueResponse = Omit<GitLabIssue, 'labels' | 'labelDetails'> & {\n labels?: Array<string | GitLabLabelDetail>;\n};\n\nexport interface GitLabIssue {\n id: number;\n iid: number;\n project_id: number;\n title: string;\n description?: string | null;\n state: 'opened' | 'closed';\n web_url: string;\n author?: GitLabUser | null;\n assignee?: GitLabUser | null;\n assignees?: GitLabUser[];\n labels?: string[];\n labelDetails?: GitLabLabelDetail[];\n weight?: number | null;\n user_notes_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface GitLabNote {\n id: number;\n body: string;\n type?: string | null;\n author?: GitLabUser | null;\n created_at: string;\n updated_at?: string;\n system?: boolean;\n}\n\nexport interface GitLabDiffRefs {\n base_sha: string;\n start_sha: string;\n head_sha: string;\n}\n\nexport interface GitLabMergeRequest {\n id: number;\n iid: number;\n project_id: number;\n title: string;\n description?: string | null;\n state: 'opened' | 'closed' | 'merged' | 'locked';\n web_url: string;\n author?: GitLabUser | null;\n assignees?: GitLabUser[];\n reviewers?: GitLabUser[];\n labels?: string[];\n source_branch: string;\n target_branch: string;\n sha: string;\n merge_commit_sha?: string | null;\n squash_commit_sha?: string | null;\n diff_refs?: GitLabDiffRefs | null;\n merge_status?: string;\n detailed_merge_status?: string;\n draft?: boolean;\n work_in_progress?: boolean;\n merged_at?: string | null;\n user_notes_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface GitLabMergeResult extends GitLabMergeRequest {\n message?: string;\n}\n\nexport interface GitLabDiscussionPosition {\n position_type: 'text';\n base_sha: string;\n start_sha: string;\n head_sha: string;\n old_path: string;\n new_path: string;\n old_line?: number | null;\n new_line?: number | null;\n line_range?: {\n start: GitLabDiscussionLine;\n end: GitLabDiscussionLine;\n };\n}\n\nexport interface GitLabDiscussionLine {\n line_code: string;\n type: 'old' | 'new';\n old_line?: number | null;\n new_line?: number | null;\n}\n\nexport interface GitLabDiscussionNote extends GitLabNote {\n position?: GitLabDiscussionPosition | null;\n resolvable?: boolean;\n resolved?: boolean;\n}\n\nexport interface GitLabDiscussion {\n id: string;\n individual_note?: boolean;\n notes: GitLabDiscussionNote[];\n}\n\nexport interface GitLabMergeRequestApprovals {\n approved: boolean;\n approvals_required?: number;\n approvals_left?: number;\n approved_by?: Array<{ user: GitLabUser }>;\n}\n\nexport interface GitLabMember {\n id: number;\n username: string;\n name?: string | null;\n state?: string;\n access_level?: number;\n}\n\nexport type GitLabCommitStatusState = 'pending' | 'running' | 'success' | 'failed' | 'canceled' | 'skipped';\n\nexport interface GitLabCommitStatus {\n id: number;\n sha: string;\n name: string;\n status: GitLabCommitStatusState;\n target_url: string | null;\n}\n\nexport interface GitLabApiClientConfig {\n baseUrl: string;\n accessToken: string;\n fetchImpl?: typeof fetch;\n}\n\nexport interface PlatformGitLabApiClientConfig {\n client: PlatformApiClient;\n connectionId: string;\n}\n\nexport class GitLabApiClient {\n readonly #direct: { baseUrl: string; accessToken: string; fetch: typeof fetch } | null;\n readonly #platform: PlatformGitLabApiClientConfig | null;\n\n constructor(config: GitLabApiClientConfig | PlatformGitLabApiClientConfig) {\n if ('client' in config) {\n if (!config.connectionId.trim()) throw new Error('GitLabApiClient is missing required config: connectionId.');\n this.#direct = null;\n this.#platform = config;\n return;\n }\n\n const accessToken = config.accessToken.trim();\n if (!accessToken) throw new Error('GitLabApiClient is missing required config: accessToken.');\n let url: URL;\n try {\n url = new URL(config.baseUrl);\n } catch {\n throw new Error('GitLabApiClient baseUrl must be an absolute HTTP(S) URL.');\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error('GitLabApiClient baseUrl must be an absolute HTTP(S) URL.');\n }\n if (url.username || url.password || url.search || url.hash) {\n throw new Error('GitLabApiClient baseUrl must not include credentials, query, or fragment.');\n }\n const hostname = url.hostname.replace(/^\\[|\\]$/g, '').toLowerCase();\n const isLoopback = hostname === 'localhost' || hostname === '::1' || /^127(?:\\.\\d{1,3}){3}$/.test(hostname);\n if (url.protocol === 'http:' && !isLoopback) {\n throw new Error('GitLabApiClient baseUrl must use HTTPS unless it targets a loopback host.');\n }\n this.#direct = {\n baseUrl: config.baseUrl.replace(/\\/+$/, ''),\n accessToken,\n fetch: config.fetchImpl ?? globalThis.fetch,\n };\n this.#platform = null;\n }\n\n async getCurrentUser(): Promise<GitLabUser> {\n return this.#request<GitLabUser>('GET', '/api/v4/user');\n }\n\n async getProject(projectId: string): Promise<GitLabProject> {\n return this.#request<GitLabProject>('GET', `/api/v4/projects/${encodeURIComponent(projectId)}`);\n }\n\n async listProjects(options: { page?: number } = {}): Promise<GitLabProject[]> {\n return this.#request<GitLabProject[]>('GET', '/api/v4/projects', {\n query: {\n membership: 'true',\n simple: 'true',\n with_issues_enabled: 'true',\n min_access_level: GITLAB_MIN_ACCESS_LEVEL,\n order_by: 'last_activity_at',\n sort: 'desc',\n page: options.page ?? 1,\n per_page: GITLAB_PROJECTS_PAGE_SIZE,\n },\n });\n }\n\n async listIssues(projectId: string, options: { page?: number; labels?: string[] } = {}): Promise<GitLabIssue[]> {\n const issues = await this.#request<GitLabIssueResponse[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/issues`,\n {\n query: {\n state: 'opened',\n scope: 'all',\n order_by: 'updated_at',\n sort: 'desc',\n page: options.page ?? 1,\n per_page: GITLAB_ISSUES_PAGE_SIZE,\n labels: options.labels?.length ? options.labels.join(',') : undefined,\n with_labels_details: 'true',\n },\n },\n );\n return issues.map(normalizeIssue);\n }\n\n async getIssue(projectId: string, issueIid: number): Promise<GitLabIssue> {\n // GitLab's single-issue endpoint returns label names even when\n // with_labels_details is requested. The IID-filtered list endpoint returns\n // the same issue with label colors, including for closed issues.\n const issues = await this.#request<GitLabIssueResponse[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/issues`,\n { query: { 'iids[]': issueIid, state: 'all', scope: 'all', with_labels_details: 'true' } },\n );\n const issue = issues.find(candidate => candidate.iid === issueIid);\n if (!issue) throw new GitLabApiError(`GitLab issue ${issueIid} was not found`, 404);\n return normalizeIssue(issue);\n }\n\n async listNotes(projectId: string, issueIid: number, options: { page?: number } = {}): Promise<GitLabNote[]> {\n return this.#request<GitLabNote[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/issues/${issueIid}/notes`,\n {\n query: { order_by: 'created_at', sort: 'asc', page: options.page ?? 1, per_page: GITLAB_NOTES_PAGE_SIZE },\n },\n );\n }\n\n async createNote(projectId: string, issueIid: number, body: string): Promise<GitLabNote> {\n return this.#request<GitLabNote>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/issues/${issueIid}/notes`,\n { body: { body } },\n );\n }\n\n async updateIssueState(projectId: string, issueIid: number, stateEvent: 'close' | 'reopen'): Promise<GitLabIssue> {\n return this.#request<GitLabIssue>('PUT', `/api/v4/projects/${encodeURIComponent(projectId)}/issues/${issueIid}`, {\n body: { state_event: stateEvent },\n });\n }\n\n async listMergeRequests(\n projectId: string,\n options: { page?: number; state?: 'opened' | 'closed' | 'merged' | 'all' } = {},\n ): Promise<GitLabMergeRequest[]> {\n return this.#request<GitLabMergeRequest[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests`,\n {\n query: {\n state: options.state ?? 'opened',\n order_by: 'updated_at',\n sort: 'desc',\n page: options.page ?? 1,\n per_page: GITLAB_MERGE_REQUESTS_PAGE_SIZE,\n },\n },\n );\n }\n\n async getMergeRequest(projectId: string, mergeRequestIid: number): Promise<GitLabMergeRequest> {\n return this.#request<GitLabMergeRequest>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}`,\n );\n }\n\n async createMergeRequest(\n projectId: string,\n input: {\n sourceBranch: string;\n targetBranch: string;\n title: string;\n description?: string;\n removeSourceBranch?: boolean;\n squash?: boolean;\n },\n ): Promise<GitLabMergeRequest> {\n return this.#request<GitLabMergeRequest>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests`,\n {\n body: {\n source_branch: input.sourceBranch,\n target_branch: input.targetBranch,\n title: input.title,\n description: input.description,\n remove_source_branch: input.removeSourceBranch,\n squash: input.squash,\n },\n },\n );\n }\n\n async updateMergeRequest(\n projectId: string,\n mergeRequestIid: number,\n input: {\n title?: string;\n description?: string;\n targetBranch?: string;\n stateEvent?: 'close' | 'reopen';\n removeSourceBranch?: boolean;\n squash?: boolean;\n reviewerIds?: number[];\n },\n ): Promise<GitLabMergeRequest> {\n return this.#request<GitLabMergeRequest>(\n 'PUT',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}`,\n {\n body: {\n title: input.title,\n description: input.description,\n target_branch: input.targetBranch,\n state_event: input.stateEvent,\n remove_source_branch: input.removeSourceBranch,\n squash: input.squash,\n reviewer_ids: input.reviewerIds,\n },\n },\n );\n }\n\n async mergeMergeRequest(\n projectId: string,\n mergeRequestIid: number,\n options: {\n squash?: boolean;\n mergeCommitMessage?: string;\n squashCommitMessage?: string;\n shouldRemoveSourceBranch?: boolean;\n } = {},\n ): Promise<GitLabMergeResult> {\n return this.#request<GitLabMergeResult>(\n 'PUT',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/merge`,\n {\n body: {\n squash: options.squash,\n merge_commit_message: options.mergeCommitMessage,\n squash_commit_message: options.squashCommitMessage,\n should_remove_source_branch: options.shouldRemoveSourceBranch,\n },\n },\n );\n }\n\n async listMergeRequestNotes(\n projectId: string,\n mergeRequestIid: number,\n options: { page?: number } = {},\n ): Promise<GitLabNote[]> {\n return this.#request<GitLabNote[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes`,\n {\n query: {\n order_by: 'created_at',\n sort: 'asc',\n page: options.page ?? 1,\n per_page: GITLAB_NOTES_PAGE_SIZE,\n },\n },\n );\n }\n\n async createMergeRequestNote(projectId: string, mergeRequestIid: number, body: string): Promise<GitLabNote> {\n return this.#request<GitLabNote>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes`,\n { body: { body } },\n );\n }\n\n async getMergeRequestNote(projectId: string, mergeRequestIid: number, noteId: number): Promise<GitLabNote> {\n return this.#request<GitLabNote>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes/${noteId}`,\n );\n }\n\n async updateMergeRequestNote(\n projectId: string,\n mergeRequestIid: number,\n noteId: number,\n body: string,\n ): Promise<GitLabNote> {\n return this.#request<GitLabNote>(\n 'PUT',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes/${noteId}`,\n { body: { body } },\n );\n }\n\n async deleteMergeRequestNote(projectId: string, mergeRequestIid: number, noteId: number): Promise<void> {\n await this.#request<void>(\n 'DELETE',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes/${noteId}`,\n );\n }\n\n async listMergeRequestDiscussions(\n projectId: string,\n mergeRequestIid: number,\n options: { page?: number } = {},\n ): Promise<GitLabDiscussion[]> {\n return this.#request<GitLabDiscussion[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions`,\n { query: { page: options.page ?? 1, per_page: GITLAB_DISCUSSIONS_PAGE_SIZE } },\n );\n }\n\n async getMergeRequestDiscussion(\n projectId: string,\n mergeRequestIid: number,\n discussionId: string,\n ): Promise<GitLabDiscussion> {\n return this.#request<GitLabDiscussion>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}`,\n );\n }\n\n async resolveMergeRequestDiscussion(\n projectId: string,\n mergeRequestIid: number,\n discussionId: string,\n resolved: boolean,\n ): Promise<GitLabDiscussion> {\n return this.#request<GitLabDiscussion>(\n 'PUT',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}`,\n { body: { resolved } },\n );\n }\n\n async setCommitStatus(\n projectId: string,\n sha: string,\n status: { state: GitLabCommitStatusState; name: string; ref?: string; description?: string; targetUrl?: string },\n ): Promise<GitLabCommitStatus> {\n return this.#request<GitLabCommitStatus>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/statuses/${encodeURIComponent(sha)}`,\n {\n body: {\n state: status.state,\n name: status.name,\n ref: status.ref,\n description: status.description,\n target_url: status.targetUrl,\n },\n },\n );\n }\n\n async createMergeRequestDiscussion(\n projectId: string,\n mergeRequestIid: number,\n input: { body: string; commitId?: string; position?: GitLabDiscussionPosition },\n ): Promise<GitLabDiscussion> {\n return this.#request<GitLabDiscussion>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions`,\n { body: { body: input.body, commit_id: input.commitId, position: input.position } },\n );\n }\n\n async addMergeRequestDiscussionNote(\n projectId: string,\n mergeRequestIid: number,\n discussionId: string,\n body: string,\n ): Promise<GitLabDiscussionNote> {\n return this.#request<GitLabDiscussionNote>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}/notes`,\n { body: { body } },\n );\n }\n\n async updateMergeRequestDiscussionNote(\n projectId: string,\n mergeRequestIid: number,\n discussionId: string,\n noteId: number,\n body: string,\n ): Promise<GitLabDiscussionNote> {\n return this.#request<GitLabDiscussionNote>(\n 'PUT',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}/notes/${noteId}`,\n { body: { body } },\n );\n }\n\n async deleteMergeRequestDiscussionNote(\n projectId: string,\n mergeRequestIid: number,\n discussionId: string,\n noteId: number,\n ): Promise<void> {\n await this.#request<void>(\n 'DELETE',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}/notes/${noteId}`,\n );\n }\n\n async getMergeRequestApprovals(projectId: string, mergeRequestIid: number): Promise<GitLabMergeRequestApprovals> {\n return this.#request<GitLabMergeRequestApprovals>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/approvals`,\n );\n }\n\n async approveMergeRequest(projectId: string, mergeRequestIid: number, sha?: string): Promise<GitLabMergeRequest> {\n return this.#request<GitLabMergeRequest>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/approve`,\n sha ? { body: { sha } } : undefined,\n );\n }\n\n async unapproveMergeRequest(projectId: string, mergeRequestIid: number): Promise<GitLabMergeRequest> {\n return this.#request<GitLabMergeRequest>(\n 'POST',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/unapprove`,\n );\n }\n\n async setMergeRequestReviewers(\n projectId: string,\n mergeRequestIid: number,\n reviewerIds: number[],\n ): Promise<GitLabMergeRequest> {\n return this.#request<GitLabMergeRequest>(\n 'PUT',\n `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}`,\n { body: { reviewer_ids: reviewerIds } },\n );\n }\n\n async listProjectMembers(\n projectId: string,\n options: { query?: string; page?: number } = {},\n ): Promise<GitLabMember[]> {\n return this.#request<GitLabMember[]>('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/members/all`, {\n query: {\n query: options.query,\n page: options.page ?? 1,\n per_page: GITLAB_DISCUSSIONS_PAGE_SIZE,\n },\n });\n }\n\n async #request<T>(\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n path: string,\n options: { query?: Record<string, string | number | undefined>; body?: unknown } = {},\n ): Promise<T> {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query ?? {})) {\n if (value !== undefined) query.set(key, String(value));\n }\n const suffix = query.size > 0 ? `?${query.toString()}` : '';\n // Repository targets carry both the immutable numeric ID for GitLab API\n // requests and the path for browser links. A Platform proxy decodes %2F,\n // so forwarding a path-based project locator would turn into a 404.\n const apiPath = path.replace(/^\\/api\\/v4\\/projects\\/([^/]+)/, (full, encoded: string) => {\n const target = decodeURIComponent(encoded);\n const match = /^(\\d+):(.+)$/.exec(target);\n return match ? `/api/v4/projects/${encodeURIComponent(match[1]!)}` : full;\n });\n\n if (this.#platform) {\n const proxyPath = `/v2/connections/${encodeURIComponent(this.#platform.connectionId)}/proxy${apiPath}${suffix}`;\n try {\n return await this.#platform.client.request<T>(method, proxyPath, options.body);\n } catch (error) {\n if (error instanceof PlatformApiError) throw new GitLabApiError(error.message, error.status);\n throw new GitLabApiError(error instanceof Error ? error.message : String(error), null);\n }\n }\n\n const direct = this.#direct!;\n const headers: Record<string, string> = {\n accept: 'application/json',\n 'private-token': direct.accessToken,\n };\n const init: RequestInit = { method, headers, signal: AbortSignal.timeout(15_000) };\n if (options.body !== undefined) {\n headers['content-type'] = 'application/json';\n init.body = JSON.stringify(options.body);\n }\n\n let response: Response;\n try {\n response = await direct.fetch(`${direct.baseUrl}${apiPath}${suffix}`, init);\n } catch (error) {\n const message = (error instanceof Error ? error.message : String(error))\n .split(direct.accessToken)\n .join('[REDACTED]');\n throw new GitLabApiError(message, null);\n }\n if (!response.ok) {\n const message = (await extractError(response)).split(direct.accessToken).join('[REDACTED]');\n throw new GitLabApiError(message, response.status);\n }\n if (response.status === 204) return undefined as T;\n return (await response.json()) as T;\n }\n}\n\nasync function extractError(response: Response): Promise<string> {\n try {\n const data = (await response.clone().json()) as Record<string, unknown>;\n if (typeof data.message === 'string' && data.message) return data.message;\n if (typeof data.error === 'string' && data.error) return data.error;\n } catch {\n // Fall through to the status-based message.\n }\n return `GitLab API request failed (${response.status})`;\n}\n\nfunction normalizeIssue(response: GitLabIssueResponse): GitLabIssue {\n const { labels, ...issue } = response;\n const labelDetails = (labels ?? []).filter((label): label is GitLabLabelDetail => typeof label !== 'string');\n return {\n ...issue,\n labels: (labels ?? []).map(label => (typeof label === 'string' ? label : label.name)),\n ...(labelDetails.length > 0 ? { labelDetails } : {}),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-control.d.ts","sourceRoot":"","sources":["../../../src/integrations/gitlab/version-control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"version-control.d.ts","sourceRoot":"","sources":["../../../src/integrations/gitlab/version-control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,KAAK,EAOV,cAAc,EACf,MAAM,uCAAuC,CAAC;AAQ/C,OAAO,KAAK,EACV,eAAe,EAQhB,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,2BAA2B;IAC1C,GAAG,EAAE,eAAe,CAAC;IACrB,UAAU,EAAE,qBAAqB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,gCAAgC;IAC/C,oBAAoB,CAAC,UAAU,EAAE,qBAAqB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC9F,4BAA4B,CAAC,CAC3B,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAAC,2BAA2B,CAAC,CAAC;CACzC;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,gCAAgC,GAAG,cAAc,CAohBhG"}
|
|
@@ -227,6 +227,30 @@ function buildGitLabVersionControl(deps) {
|
|
|
227
227
|
const reference = parseDiscussionNoteId(input.commentId);
|
|
228
228
|
await context.api.resolveMergeRequestDiscussion(input.sourceId, reference.mergeRequestIid, reference.discussionId, input.resolved);
|
|
229
229
|
};
|
|
230
|
+
const publishCommitCheck = async (input) => {
|
|
231
|
+
const context = await deps.contextForConnection(input.connection);
|
|
232
|
+
const body = {
|
|
233
|
+
state: GITLAB_COMMIT_STATUS_STATE[input.status],
|
|
234
|
+
name: input.name,
|
|
235
|
+
...input.ref !== void 0 ? { ref: input.ref } : {},
|
|
236
|
+
description: input.title.slice(0, GITLAB_COMMIT_STATUS_DESCRIPTION_LIMIT)
|
|
237
|
+
};
|
|
238
|
+
let status;
|
|
239
|
+
for (let attempt = 1;; attempt++) try {
|
|
240
|
+
status = await context.api.setCommitStatus(input.sourceId, input.headSha, body);
|
|
241
|
+
break;
|
|
242
|
+
} catch (error) {
|
|
243
|
+
if (attempt >= 3 || error?.status !== 409) throw error;
|
|
244
|
+
await new Promise((resolve) => setTimeout(resolve, 250 * attempt));
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
id: String(status.id),
|
|
248
|
+
name: status.name,
|
|
249
|
+
headSha: status.sha,
|
|
250
|
+
status: input.status,
|
|
251
|
+
url: status.target_url
|
|
252
|
+
};
|
|
253
|
+
};
|
|
230
254
|
const listRequestedReviewers = async (input) => {
|
|
231
255
|
return toRequestedReviewers(await (await deps.contextForConnection(input.connection)).api.getMergeRequest(input.sourceId, requirePositiveId(input.pullRequestId, "merge request")));
|
|
232
256
|
};
|
|
@@ -354,9 +378,19 @@ function buildGitLabVersionControl(deps) {
|
|
|
354
378
|
deleteReviewComment,
|
|
355
379
|
listRequestedReviewers,
|
|
356
380
|
requestReviewers,
|
|
357
|
-
removeRequestedReviewers
|
|
358
|
-
|
|
359
|
-
}
|
|
381
|
+
removeRequestedReviewers,
|
|
382
|
+
publishCommitCheck
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
const GITLAB_COMMIT_STATUS_DESCRIPTION_LIMIT = 255;
|
|
386
|
+
const GITLAB_COMMIT_STATUS_STATE = {
|
|
387
|
+
"in-progress": "running",
|
|
388
|
+
success: "success",
|
|
389
|
+
failure: "failed",
|
|
390
|
+
neutral: "skipped",
|
|
391
|
+
cancelled: "canceled",
|
|
392
|
+
skipped: "skipped"
|
|
393
|
+
};
|
|
360
394
|
async function submitReviewAction(deps, input) {
|
|
361
395
|
const context = await deps.contextForConnection(input.connection);
|
|
362
396
|
const mergeRequestIid = requirePositiveId(input.pullRequestId, "merge request");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-control.js","names":[],"sources":["../../../src/integrations/gitlab/version-control.ts"],"sourcesContent":["import type { IntegrationConnection } from '../../capabilities/connection.js';\nimport type {\n PullRequest,\n PullRequestComment,\n RequestedReviewers,\n Review,\n ReviewComment,\n VersionControl,\n} from '../../capabilities/version-control.js';\nimport type { SourceControlStorageHandle } from '../../storage/domains/source-control/base.js';\nimport {\n GITLAB_DISCUSSIONS_PAGE_SIZE,\n GITLAB_MERGE_REQUESTS_PAGE_SIZE,\n GITLAB_NOTES_PAGE_SIZE,\n GitLabApiError,\n} from './api.js';\nimport type {\n GitLabApiClient,\n GitLabDiscussionNote,\n GitLabDiscussionPosition,\n GitLabMember,\n GitLabMergeRequest,\n GitLabNote,\n GitLabUser,\n} from './api.js';\n\nexport interface GitLabVersionControlContext {\n api: GitLabApiClient;\n connection: IntegrationConnection;\n host: string;\n webBaseUrl?: string;\n repositoryAccessToken?: () => Promise<string>;\n}\n\nexport interface GitLabVersionControlDependencies {\n contextForConnection(connection: IntegrationConnection): Promise<GitLabVersionControlContext>;\n contextForStoredInstallation?(\n connection: IntegrationConnection,\n host: string | undefined,\n ): Promise<GitLabVersionControlContext>;\n}\n\nexport function buildGitLabVersionControl(deps: GitLabVersionControlDependencies): VersionControl {\n let storage: SourceControlStorageHandle | undefined;\n\n const sourceControlStorage = (): SourceControlStorageHandle => {\n if (!storage) throw new Error('GitLab VersionControl is not initialized.');\n return storage;\n };\n\n const listPullRequests: VersionControl['listPullRequests'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const page = parsePositiveCursor(input.cursor);\n const state = input.state === 'open' ? 'opened' : input.state === 'closed' ? 'all' : (input.state ?? 'opened');\n const mergeRequests = await context.api.listMergeRequests(input.sourceId, { page, state });\n return {\n pullRequests: mergeRequests\n .filter(\n mergeRequest =>\n input.state !== 'closed' || mergeRequest.state === 'closed' || mergeRequest.state === 'merged',\n )\n .filter(mergeRequest => input.includeDrafts !== false || !isDraft(mergeRequest))\n .map(toPullRequest),\n nextCursor: mergeRequests.length === GITLAB_MERGE_REQUESTS_PAGE_SIZE ? String(page + 1) : null,\n };\n };\n\n const getPullRequest: VersionControl['getPullRequest'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n try {\n return toPullRequest(\n await context.api.getMergeRequest(input.sourceId, requirePositiveId(input.pullRequestId, 'merge request')),\n );\n } catch (error) {\n if (error instanceof GitLabApiError && error.status === 404) return null;\n throw error;\n }\n };\n\n const createPullRequest: VersionControl['createPullRequest'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const title = input.draft && !/^(?:draft:|\\[draft\\])/i.test(input.title) ? `Draft: ${input.title}` : input.title;\n return toPullRequest(\n await context.api.createMergeRequest(input.sourceId, {\n sourceBranch: input.headBranch,\n targetBranch: input.baseBranch,\n title,\n description: input.body,\n }),\n );\n };\n\n const updatePullRequest: VersionControl['updatePullRequest'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n return toPullRequest(\n await context.api.updateMergeRequest(input.sourceId, requirePositiveId(input.pullRequestId, 'merge request'), {\n title: input.title,\n description: input.body === null ? '' : input.body,\n targetBranch: input.baseBranch,\n stateEvent: input.state === 'closed' ? 'close' : input.state === 'open' ? 'reopen' : undefined,\n }),\n );\n };\n\n const closePullRequest: VersionControl['closePullRequest'] = input =>\n updatePullRequest({ ...input, state: 'closed' });\n\n const mergePullRequest: VersionControl['mergePullRequest'] = async input => {\n if (input.method === 'rebase') {\n throw notSupported('GitLab rebases merge requests asynchronously; rebase-and-merge is not supported.');\n }\n const context = await deps.contextForConnection(input.connection);\n const commitMessage = combinedCommitMessage(input.commitTitle, input.commitMessage);\n const result = await context.api.mergeMergeRequest(\n input.sourceId,\n requirePositiveId(input.pullRequestId, 'merge request'),\n {\n squash: input.method === 'squash',\n mergeCommitMessage: input.method === 'squash' ? undefined : commitMessage,\n squashCommitMessage: input.method === 'squash' ? commitMessage : undefined,\n },\n );\n const merged = result.state === 'merged' || Boolean(result.merged_at);\n return {\n merged,\n message: result.message ?? (merged ? 'Merge request merged.' : 'Merge request was not merged.'),\n sha: result.squash_commit_sha ?? result.merge_commit_sha ?? result.sha ?? null,\n };\n };\n\n const listComments: VersionControl['listComments'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const page = parsePositiveCursor(input.cursor);\n const notes = await context.api.listMergeRequestNotes(input.sourceId, mergeRequestIid, { page });\n return {\n comments: notes\n .filter(note => !note.system && note.type !== 'DiffNote')\n .map(note => toPullRequestComment(webBaseUrl(context), input.sourceId, mergeRequestIid, note)),\n nextCursor: notes.length === GITLAB_NOTES_PAGE_SIZE ? String(page + 1) : null,\n };\n };\n\n const createComment: VersionControl['createComment'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const note = await context.api.createMergeRequestNote(input.sourceId, mergeRequestIid, input.body);\n return toPullRequestComment(webBaseUrl(context), input.sourceId, mergeRequestIid, note);\n };\n\n const updateComment: VersionControl['updateComment'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const { mergeRequestIid, noteId } = parseNoteId(input.commentId);\n const note = await context.api.updateMergeRequestNote(input.sourceId, mergeRequestIid, noteId, input.body);\n return toPullRequestComment(webBaseUrl(context), input.sourceId, mergeRequestIid, note);\n };\n\n const deleteComment: VersionControl['deleteComment'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const { mergeRequestIid, noteId } = parseNoteId(input.commentId);\n await context.api.deleteMergeRequestNote(input.sourceId, mergeRequestIid, noteId);\n };\n\n const listReviews: VersionControl['listReviews'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const approvals = await context.api.getMergeRequestApprovals(input.sourceId, mergeRequestIid);\n return {\n reviews: (approvals.approved_by ?? []).map(({ user }) =>\n toApprovalReview(webBaseUrl(context), input.sourceId, mergeRequestIid, user),\n ),\n nextCursor: null,\n };\n };\n\n const getReview: VersionControl['getReview'] = async input => {\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const approvalPrefix = `${mergeRequestIid}:approval`;\n const commentPrefix = `${mergeRequestIid}:comment:`;\n if (\n input.reviewId !== approvalPrefix &&\n !input.reviewId.startsWith(`${approvalPrefix}:`) &&\n !input.reviewId.startsWith(commentPrefix)\n ) {\n return null;\n }\n const context = await deps.contextForConnection(input.connection);\n if (input.reviewId === approvalPrefix || input.reviewId.startsWith(`${approvalPrefix}:`)) {\n const reviewerKey = input.reviewId === approvalPrefix ? null : input.reviewId.slice(approvalPrefix.length + 1);\n if (reviewerKey === '') return null;\n const currentUser = reviewerKey === null ? await context.api.getCurrentUser() : null;\n const approvals = await context.api.getMergeRequestApprovals(input.sourceId, mergeRequestIid);\n const user = (approvals.approved_by ?? [])\n .map(entry => entry.user)\n .find(candidate =>\n reviewerKey === null\n ? (currentUser?.id !== undefined && candidate.id === currentUser.id) ||\n candidate.username === currentUser?.username\n : String(candidate.id ?? candidate.username) === reviewerKey,\n );\n return user ? toApprovalReview(webBaseUrl(context), input.sourceId, mergeRequestIid, user) : null;\n }\n const noteId = parsePositiveInteger(input.reviewId.slice(commentPrefix.length));\n if (noteId === null) return null;\n try {\n const note = await context.api.getMergeRequestNote(input.sourceId, mergeRequestIid, noteId);\n if (note.system || note.type === 'DiffNote') return null;\n return toCommentReview(webBaseUrl(context), input.sourceId, mergeRequestIid, note);\n } catch (error) {\n if (error instanceof GitLabApiError && error.status === 404) return null;\n throw error;\n }\n };\n\n const createReview: VersionControl['createReview'] = async input =>\n submitReviewAction(deps, {\n connection: input.connection,\n sourceId: input.sourceId,\n pullRequestId: input.pullRequestId,\n event: input.event,\n body: input.body,\n commitId: input.commitId,\n });\n\n const updateReview: VersionControl['updateReview'] = async () => {\n // FLAGGED FOR MANUAL REVIEW (spec §6.2)\n throw notSupported('GitLab does not expose mutable pending review objects.');\n };\n\n const submitReview: VersionControl['submitReview'] = async input =>\n submitReviewAction(deps, {\n connection: input.connection,\n sourceId: input.sourceId,\n pullRequestId: input.pullRequestId,\n event: input.event,\n body: input.body,\n });\n\n const dismissReview: VersionControl['dismissReview'] = async () => {\n // FLAGGED FOR MANUAL REVIEW (spec §6.2)\n throw notSupported('GitLab approval dismissal has no GitHub review equivalent.');\n };\n\n const deletePendingReview: VersionControl['deletePendingReview'] = async () => {\n // FLAGGED FOR MANUAL REVIEW (spec §6.2)\n throw notSupported('GitLab does not expose pending review objects.');\n };\n\n const listReviewComments: VersionControl['listReviewComments'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const page = parsePositiveCursor(input.cursor);\n const discussions = await context.api.listMergeRequestDiscussions(input.sourceId, mergeRequestIid, { page });\n return {\n comments: discussions.flatMap(discussion => {\n const position = discussionPosition(discussion.notes);\n if (!position) return [];\n const root = discussion.notes.find(note => note.position) ?? discussion.notes[0];\n const replyToId = root ? packDiscussionNoteId(mergeRequestIid, discussion.id, root.id) : null;\n return discussion.notes\n .filter(note => !note.system)\n .map(note =>\n toReviewComment(\n webBaseUrl(context),\n input.sourceId,\n mergeRequestIid,\n discussion.id,\n note,\n note === root ? null : replyToId,\n position,\n ),\n );\n }),\n nextCursor: discussions.length === GITLAB_DISCUSSIONS_PAGE_SIZE ? String(page + 1) : null,\n };\n };\n\n const createReviewComment: VersionControl['createReviewComment'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n if (input.replyToId) {\n const thread = parseReviewReplyId(input.replyToId);\n if (thread.mergeRequestIid !== mergeRequestIid) {\n throw new GitLabApiError('GitLab discussion does not belong to the requested merge request.', 400);\n }\n const discussion = await context.api.getMergeRequestDiscussion(\n input.sourceId,\n mergeRequestIid,\n thread.discussionId,\n );\n const position = discussionPosition(discussion.notes);\n if (!position) throw new GitLabApiError('GitLab discussion is not anchored to a diff.', 400);\n const root = discussion.notes.find(note => note.position) ?? discussion.notes[0];\n if (!root) throw new GitLabApiError('GitLab discussion response did not include a note.', 502);\n const note = await context.api.addMergeRequestDiscussionNote(\n input.sourceId,\n mergeRequestIid,\n thread.discussionId,\n input.body,\n );\n return toReviewComment(\n webBaseUrl(context),\n input.sourceId,\n mergeRequestIid,\n thread.discussionId,\n note,\n packDiscussionNoteId(mergeRequestIid, thread.discussionId, root.id),\n position,\n );\n }\n\n const mergeRequest = await context.api.getMergeRequest(input.sourceId, mergeRequestIid);\n if (!mergeRequest.diff_refs) {\n throw new GitLabApiError('GitLab merge request diff refs are not ready.', 409);\n }\n if (mergeRequest.diff_refs.head_sha !== input.commitId) {\n throw new GitLabApiError('GitLab merge request changed since this review comment was prepared.', 409);\n }\n const { path, line, side } = input;\n if (typeof path !== 'string' || typeof line !== 'number' || (side !== 'left' && side !== 'right')) {\n throw new GitLabApiError('GitLab diff review comment position is invalid.', 400);\n }\n if ((input.startLine === undefined) !== (input.startSide === undefined)) {\n throw new GitLabApiError('A multi-line GitLab review comment requires both startLine and startSide.', 400);\n }\n const position: GitLabDiscussionPosition = {\n position_type: 'text',\n ...mergeRequest.diff_refs,\n old_path: path,\n new_path: path,\n old_line: side === 'left' ? line : undefined,\n new_line: side === 'right' ? line : undefined,\n ...(input.startLine !== undefined && input.startSide\n ? {\n line_range: {\n start: await discussionLine(path, input.startLine, input.startSide),\n end: await discussionLine(path, line, side),\n },\n }\n : {}),\n };\n const discussion = await context.api.createMergeRequestDiscussion(input.sourceId, mergeRequestIid, {\n body: input.body,\n commitId: input.commitId,\n position,\n });\n const note = discussion.notes.find(candidate => candidate.position) ?? discussion.notes[0];\n if (!note) throw new GitLabApiError('GitLab discussion response did not include a note.', 502);\n return toReviewComment(webBaseUrl(context), input.sourceId, mergeRequestIid, discussion.id, note, null, position);\n };\n\n const updateReviewComment: VersionControl['updateReviewComment'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const reference = parseDiscussionNoteId(input.commentId);\n const discussion = await context.api.getMergeRequestDiscussion(\n input.sourceId,\n reference.mergeRequestIid,\n reference.discussionId,\n );\n const position = discussionPosition(discussion.notes);\n if (!position) throw new GitLabApiError('GitLab discussion is not anchored to a diff.', 400);\n const root = discussion.notes.find(candidate => candidate.position) ?? discussion.notes[0];\n if (!root) throw new GitLabApiError('GitLab discussion response did not include a note.', 502);\n const note = await context.api.updateMergeRequestDiscussionNote(\n input.sourceId,\n reference.mergeRequestIid,\n reference.discussionId,\n reference.noteId,\n input.body,\n );\n return toReviewComment(\n webBaseUrl(context),\n input.sourceId,\n reference.mergeRequestIid,\n reference.discussionId,\n note,\n note.id === root.id ? null : packDiscussionNoteId(reference.mergeRequestIid, reference.discussionId, root.id),\n position,\n );\n };\n\n const deleteReviewComment: VersionControl['deleteReviewComment'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const reference = parseDiscussionNoteId(input.commentId);\n await context.api.deleteMergeRequestDiscussionNote(\n input.sourceId,\n reference.mergeRequestIid,\n reference.discussionId,\n reference.noteId,\n );\n };\n\n const resolveReviewThread: NonNullable<VersionControl['resolveReviewThread']> = async input => {\n const context = await deps.contextForConnection(input.connection);\n const reference = parseDiscussionNoteId(input.commentId);\n await context.api.resolveMergeRequestDiscussion(\n input.sourceId,\n reference.mergeRequestIid,\n reference.discussionId,\n input.resolved,\n );\n };\n\n const listRequestedReviewers: VersionControl['listRequestedReviewers'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequest = await context.api.getMergeRequest(\n input.sourceId,\n requirePositiveId(input.pullRequestId, 'merge request'),\n );\n return toRequestedReviewers(mergeRequest);\n };\n\n const requestReviewers: VersionControl['requestReviewers'] = async input => {\n rejectTeamReviewers(input.teams);\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const mergeRequest = await context.api.getMergeRequest(input.sourceId, mergeRequestIid);\n const requestedMembers = await resolveMembers(context.api, input.sourceId, input.users ?? []);\n const currentIds = await reviewerIds(context.api, input.sourceId, mergeRequest.reviewers ?? []);\n const reviewerIdsToSet = [...new Set([...currentIds, ...requestedMembers.map(member => member.id)])];\n return toRequestedReviewers(\n await context.api.setMergeRequestReviewers(input.sourceId, mergeRequestIid, reviewerIdsToSet),\n );\n };\n\n const removeRequestedReviewers: VersionControl['removeRequestedReviewers'] = async input => {\n rejectTeamReviewers(input.teams);\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const mergeRequest = await context.api.getMergeRequest(input.sourceId, mergeRequestIid);\n const removals = new Set((input.users ?? []).map(username => username.toLowerCase()));\n const retained = (mergeRequest.reviewers ?? []).filter(user => !removals.has(user.username.toLowerCase()));\n const retainedIds = await reviewerIds(context.api, input.sourceId, retained);\n return toRequestedReviewers(\n await context.api.setMergeRequestReviewers(input.sourceId, mergeRequestIid, retainedIds),\n );\n };\n\n return {\n initialize: input => {\n storage = input.storage;\n },\n registerInstallation: async ({ orgId, userId, installation }) => {\n const requestedConnection = parseConnection(installation.metadata?.connection);\n if (!requestedConnection) {\n throw new GitLabApiError('GitLab installation metadata must include a valid connection.', 400);\n }\n const context = await deps.contextForConnection(requestedConnection);\n return sourceControlStorage().installations.upsert({\n orgId,\n connectedByUserId: userId,\n externalId: installation.externalId,\n accountName: installation.accountName,\n accountType: installation.accountType,\n providerMetadata: {\n ...installation.metadata,\n connection: context.connection,\n host: normalizeHost(context.host),\n },\n });\n },\n registerRepositories: async ({ orgId, installationId, repositories }) => {\n const normalizedRepositories = repositories.map(repository => ({\n ...repository,\n slug: normalizeSlug(repository.slug),\n }));\n return await Promise.all(\n normalizedRepositories.map(repository =>\n sourceControlStorage().repositories.upsert({\n orgId,\n input: {\n installationId,\n externalId: repository.externalId,\n slug: repository.slug,\n defaultBranch: repository.defaultBranch,\n providerMetadata: repository.metadata,\n },\n }),\n ),\n );\n },\n getRepositoryTarget: async ({ orgId, repositoryId }) => {\n const repository = await sourceControlStorage().repositories.get({ orgId, id: repositoryId });\n if (!repository) throw new Error('Version-control repository not found.');\n const installation = await sourceControlStorage().installations.get({\n orgId,\n id: repository.installationId,\n });\n if (!installation) throw new Error('Version-control installation not found.');\n const connection = parseConnection(installation.providerMetadata.connection);\n if (!connection) throw new GitLabApiError('GitLab installation connection metadata is invalid.', 500);\n const context = await (deps.contextForStoredInstallation ?? deps.contextForConnection)(\n connection,\n typeof installation.providerMetadata.host === 'string' ? installation.providerMetadata.host : undefined,\n );\n // The API uses GitLab's immutable numeric project ID because Platform's\n // proxy normalizes encoded path slashes; retain the slug for browser URLs.\n return { connection: context.connection, sourceId: `${repository.externalId}:${repository.slug}` };\n },\n getRepositoryAccess: async ({ orgId, repositoryId }) => {\n const repository = await sourceControlStorage().repositories.get({ orgId, id: repositoryId });\n if (!repository) throw new Error('Version-control repository not found.');\n const installation = await sourceControlStorage().installations.get({\n orgId,\n id: repository.installationId,\n });\n if (!installation) throw new Error('Version-control installation not found.');\n const connection = parseConnection(installation.providerMetadata.connection);\n if (!connection) throw new GitLabApiError('GitLab installation connection metadata is invalid.', 500);\n const context = await (deps.contextForStoredInstallation ?? deps.contextForConnection)(\n connection,\n typeof installation.providerMetadata.host === 'string' ? installation.providerMetadata.host : undefined,\n );\n if (!context.repositoryAccessToken) {\n throw notSupported('This GitLab connection does not expose credentials for repository cloning.');\n }\n const token = await context.repositoryAccessToken();\n const baseUrl = webBaseUrl(context);\n const slug = normalizeSlug(repository.slug);\n return {\n cloneUrl: `${baseUrl}/${slug}.git`,\n authorization: { scheme: 'bearer', token, username: 'oauth2' },\n };\n },\n listPullRequests,\n getPullRequest,\n createPullRequest,\n updatePullRequest,\n closePullRequest,\n mergePullRequest,\n listComments,\n resolveReviewThread,\n createComment,\n updateComment,\n deleteComment,\n listReviews,\n getReview,\n createReview,\n updateReview,\n submitReview,\n dismissReview,\n deletePendingReview,\n listReviewComments,\n createReviewComment,\n updateReviewComment,\n deleteReviewComment,\n listRequestedReviewers,\n requestReviewers,\n removeRequestedReviewers,\n };\n}\n\nasync function submitReviewAction(\n deps: GitLabVersionControlDependencies,\n input: {\n connection: IntegrationConnection;\n sourceId: string;\n pullRequestId: string;\n event: 'approve' | 'request-changes' | 'comment' | undefined;\n body?: string;\n commitId?: string;\n },\n): Promise<Review> {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n if (input.event === 'request-changes') {\n // FLAGGED FOR MANUAL REVIEW (spec §6.2)\n throw notSupported('GitLab has no first-class request-changes review event.');\n }\n if (input.event === undefined) {\n // FLAGGED FOR MANUAL REVIEW (spec §6.2)\n throw notSupported('GitLab has no first-class pending review object.');\n }\n if (input.event === 'approve') {\n const body = input.body?.trim();\n await context.api.approveMergeRequest(input.sourceId, mergeRequestIid, input.commitId);\n const comment = body\n ? toPullRequestComment(\n webBaseUrl(context),\n input.sourceId,\n mergeRequestIid,\n await context.api.createMergeRequestNote(input.sourceId, mergeRequestIid, body),\n )\n : null;\n return {\n id: String(mergeRequestIid) + ':approval',\n url: comment?.url ?? mergeRequestUrl(webBaseUrl(context), input.sourceId, mergeRequestIid),\n author: comment?.author ?? null,\n body: comment?.body ?? null,\n state: 'approved',\n commitId: null,\n submittedAt: comment?.createdAt ?? null,\n };\n }\n const body = input.body?.trim();\n if (!body) throw new GitLabApiError('GitLab comment reviews require a body.', 400);\n const note = await context.api.createMergeRequestNote(input.sourceId, mergeRequestIid, body);\n return toCommentReview(webBaseUrl(context), input.sourceId, mergeRequestIid, note);\n}\n\nfunction toCommentReview(host: string, sourceId: string, mergeRequestIid: number, note: GitLabNote): Review {\n const comment = toPullRequestComment(host, sourceId, mergeRequestIid, note);\n return {\n id: `${mergeRequestIid}:comment:${note.id}`,\n url: comment.url,\n author: comment.author,\n body: comment.body,\n state: 'commented',\n commitId: null,\n submittedAt: note.created_at,\n };\n}\n\nfunction toApprovalReview(host: string, sourceId: string, mergeRequestIid: number, user: GitLabUser): Review {\n return {\n id: `${mergeRequestIid}:approval:${user.id ?? user.username}`,\n url: mergeRequestUrl(host, sourceId, mergeRequestIid),\n author: displayName(user),\n body: null,\n state: 'approved',\n commitId: null,\n submittedAt: null,\n };\n}\n\nfunction toReviewComment(\n host: string,\n sourceId: string,\n mergeRequestIid: number,\n discussionId: string,\n note: GitLabDiscussionNote,\n replyToId: string | null,\n fallbackPosition?: GitLabDiscussionPosition,\n): ReviewComment {\n const position = note.position ?? fallbackPosition;\n if (!position) throw new GitLabApiError('GitLab review comment is missing its diff position.', 502);\n const base = toPullRequestComment(host, sourceId, mergeRequestIid, note);\n const side = position.new_line !== null && position.new_line !== undefined ? 'right' : 'left';\n return {\n ...base,\n id: packDiscussionNoteId(mergeRequestIid, discussionId, note.id),\n path: side === 'right' ? position.new_path : position.old_path,\n line: side === 'right' ? (position.new_line ?? null) : (position.old_line ?? null),\n side,\n commitId: position.head_sha,\n replyToId,\n };\n}\n\nfunction mergeRequestUrl(host: string, sourceId: string, mergeRequestIid: number): string {\n return `${host}/${sourcePath(sourceId)}/-/merge_requests/${mergeRequestIid}`;\n}\n\nfunction webBaseUrl(context: GitLabVersionControlContext): string {\n const host = normalizeHost(context.host);\n if (!context.webBaseUrl) return `https://${host}`;\n let url: URL;\n try {\n url = new URL(context.webBaseUrl);\n } catch {\n throw new GitLabApiError('GitLab web base URL is invalid.', 400);\n }\n const loopback =\n url.hostname === 'localhost' || url.hostname === '[::1]' || /^127(?:\\.\\d{1,3}){3}$/.test(url.hostname);\n if (\n url.host !== host ||\n (url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) ||\n url.username ||\n url.password ||\n url.search ||\n url.hash\n ) {\n throw new GitLabApiError('GitLab web base URL is invalid.', 400);\n }\n return `${url.origin}${url.pathname.replace(/\\/+$/, '')}`;\n}\n\nfunction sourcePath(sourceId: string): string {\n const match = /^\\d+:(.+)$/.exec(sourceId);\n return normalizeSlug(match?.[1] ?? sourceId);\n}\n\nfunction packDiscussionId(mergeRequestIid: number, discussionId: string): string {\n if (!discussionId || discussionId.includes(':')) {\n throw new GitLabApiError('GitLab discussion id is invalid.', 400);\n }\n return `${mergeRequestIid}:${discussionId}`;\n}\n\nfunction packDiscussionNoteId(mergeRequestIid: number, discussionId: string, noteId: number): string {\n return `${packDiscussionId(mergeRequestIid, discussionId)}:${noteId}`;\n}\n\nfunction parseReviewReplyId(value: string): { mergeRequestIid: number; discussionId: string } {\n const parts = value.split(':');\n if (parts.length === 2) return parseDiscussionId(value);\n if (parts.length === 3 && parts[1]) {\n requirePositiveId(parts[2]!, 'discussion note');\n return {\n mergeRequestIid: requirePositiveId(parts[0]!, 'merge request'),\n discussionId: parts[1],\n };\n }\n throw new GitLabApiError('GitLab review reply id is invalid.', 400);\n}\n\nfunction parseDiscussionId(value: string): { mergeRequestIid: number; discussionId: string } {\n const parts = value.split(':');\n if (parts.length !== 2 || !parts[1]) throw new GitLabApiError('GitLab discussion id is invalid.', 400);\n return {\n mergeRequestIid: requirePositiveId(parts[0]!, 'merge request'),\n discussionId: parts[1],\n };\n}\n\nfunction parseDiscussionNoteId(value: string): { mergeRequestIid: number; discussionId: string; noteId: number } {\n const parts = value.split(':');\n if (parts.length !== 3 || !parts[1]) throw new GitLabApiError('GitLab discussion note id is invalid.', 400);\n return {\n mergeRequestIid: requirePositiveId(parts[0]!, 'merge request'),\n discussionId: parts[1],\n noteId: requirePositiveId(parts[2]!, 'discussion note'),\n };\n}\n\nfunction discussionPosition(notes: GitLabDiscussionNote[]): GitLabDiscussionPosition | undefined {\n return notes.find(note => note.position)?.position ?? undefined;\n}\n\nasync function discussionLine(path: string, line: number, side: 'left' | 'right') {\n const pathHash = Buffer.from(await globalThis.crypto.subtle.digest('SHA-1', new TextEncoder().encode(path))).toString(\n 'hex',\n );\n const oldLine = side === 'left' ? line : undefined;\n const newLine = side === 'right' ? line : undefined;\n return {\n line_code: `${pathHash}_${oldLine ?? 0}_${newLine ?? 0}`,\n type: side === 'left' ? ('old' as const) : ('new' as const),\n old_line: oldLine,\n new_line: newLine,\n };\n}\n\nfunction toRequestedReviewers(mergeRequest: GitLabMergeRequest): RequestedReviewers {\n return {\n users: (mergeRequest.reviewers ?? []).map(user => user.username),\n teams: [],\n };\n}\n\nasync function resolveMembers(api: GitLabApiClient, sourceId: string, usernames: string[]): Promise<GitLabMember[]> {\n return Promise.all(usernames.map(username => resolveMember(api, sourceId, username)));\n}\n\nasync function resolveMember(api: GitLabApiClient, sourceId: string, username: string): Promise<GitLabMember> {\n const normalized = username.trim();\n if (!normalized) throw new GitLabApiError('GitLab reviewer username is invalid.', 400);\n const members = await api.listProjectMembers(sourceId, { query: normalized });\n const member = members.find(candidate => candidate.username.toLowerCase() === normalized.toLowerCase());\n if (!member) throw new GitLabApiError(`GitLab reviewer ${normalized} is not a project member.`, 404);\n return member;\n}\n\nasync function reviewerIds(api: GitLabApiClient, sourceId: string, users: GitLabUser[]): Promise<number[]> {\n return Promise.all(users.map(async user => user.id ?? (await resolveMember(api, sourceId, user.username)).id));\n}\n\nfunction rejectTeamReviewers(teams: string[] | undefined): void {\n if (!teams?.length) return;\n // FLAGGED FOR MANUAL REVIEW (spec §6.2)\n throw notSupported('GitLab merge requests do not have a direct team-reviewer equivalent.');\n}\n\nfunction notSupported(message: string): GitLabApiError {\n return new GitLabApiError(message, 501);\n}\n\nfunction toPullRequest(mergeRequest: GitLabMergeRequest): PullRequest {\n return {\n id: String(mergeRequest.iid),\n title: mergeRequest.title,\n url: mergeRequest.web_url,\n author: displayName(mergeRequest.author),\n assignees: mergeRequest.assignees?.map(user => user.username),\n requestedReviewers: mergeRequest.reviewers?.map(user => user.username),\n labels: mergeRequest.labels,\n body: mergeRequest.description?.trim() ? mergeRequest.description : null,\n state: mergeRequest.state === 'closed' || mergeRequest.state === 'merged' ? 'closed' : 'open',\n draft: isDraft(mergeRequest),\n merged: mergeRequest.state === 'merged' || Boolean(mergeRequest.merged_at),\n mergeable: mergeableState(mergeRequest.merge_status),\n baseBranch: mergeRequest.target_branch,\n headBranch: mergeRequest.source_branch,\n headSha: mergeRequest.sha,\n createdAt: mergeRequest.created_at,\n updatedAt: mergeRequest.updated_at,\n };\n}\n\nfunction toPullRequestComment(\n host: string,\n sourceId: string,\n mergeRequestIid: number,\n note: GitLabNote,\n): PullRequestComment {\n return {\n id: `${mergeRequestIid}:${note.id}`,\n url: `${mergeRequestUrl(host, sourceId, mergeRequestIid)}#note_${note.id}`,\n author: displayName(note.author),\n body: note.body,\n createdAt: note.created_at,\n updatedAt: note.updated_at ?? note.created_at,\n };\n}\n\nfunction displayName(user: { name?: string | null; username: string } | null | undefined): string | null {\n return user?.username || user?.name?.trim() || null;\n}\n\nfunction isDraft(mergeRequest: GitLabMergeRequest): boolean {\n return mergeRequest.draft ?? mergeRequest.work_in_progress ?? /^(?:draft:|\\[draft\\])/i.test(mergeRequest.title);\n}\n\nfunction mergeableState(status: string | undefined): boolean | null {\n if (status === 'can_be_merged') return true;\n if (status === 'cannot_be_merged') return false;\n return null;\n}\n\nfunction combinedCommitMessage(title: string | undefined, body: string | undefined): string | undefined {\n const parts = [title?.trim(), body?.trim()].filter((part): part is string => Boolean(part));\n return parts.length > 0 ? parts.join('\\n\\n') : undefined;\n}\n\nfunction parseNoteId(value: string): { mergeRequestIid: number; noteId: number } {\n const parts = value.split(':');\n if (parts.length !== 2) throw new GitLabApiError('GitLab merge request note id is invalid.', 400);\n return {\n mergeRequestIid: requirePositiveId(parts[0]!, 'merge request'),\n noteId: requirePositiveId(parts[1]!, 'note'),\n };\n}\n\nfunction parsePositiveCursor(cursor: string | undefined): number {\n if (cursor === undefined) return 1;\n const page = parsePositiveInteger(cursor);\n if (page === null) throw new GitLabApiError('GitLab cursor must be a positive page number.', 400);\n return page;\n}\n\nfunction requirePositiveId(value: string, resource: string): number {\n const parsed = parsePositiveInteger(value);\n if (parsed === null) throw new GitLabApiError(`GitLab ${resource} id must be a positive integer.`, 400);\n return parsed;\n}\n\nfunction parsePositiveInteger(value: string): number | null {\n if (!/^\\d+$/.test(value)) return null;\n const parsed = Number(value);\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null;\n}\n\nfunction parseConnection(value: unknown): IntegrationConnection | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n const connection = value as Record<string, unknown>;\n if (connection.type === 'oauth' && typeof connection.accessToken === 'string' && connection.accessToken.length > 0) {\n return { type: 'oauth', accessToken: connection.accessToken };\n }\n if (\n connection.type === 'app-installation' &&\n Number.isSafeInteger(connection.installationId) &&\n Number(connection.installationId) > 0\n ) {\n return { type: 'app-installation', installationId: Number(connection.installationId) };\n }\n return null;\n}\n\nfunction normalizeHost(value: string): string {\n const host = value.trim();\n if (!host || host.includes('/') || host.includes('@')) throw new GitLabApiError('GitLab host is invalid.', 400);\n let parsed: URL;\n try {\n parsed = new URL(`https://${host}`);\n } catch {\n throw new GitLabApiError('GitLab host is invalid.', 400);\n }\n if (parsed.host !== host) throw new GitLabApiError('GitLab host is invalid.', 400);\n return host;\n}\n\nfunction normalizeSlug(value: string): string {\n const slug = value.replace(/^\\/+|\\/+$/g, '');\n const segments = slug.split('/');\n if (!slug || segments.some(segment => !/^[A-Za-z0-9_.-]+$/.test(segment) || segment === '.' || segment === '..')) {\n throw new GitLabApiError('GitLab repository slug is invalid.', 400);\n }\n return slug;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"version-control.js","names":[],"sources":["../../../src/integrations/gitlab/version-control.ts"],"sourcesContent":["import type { IntegrationConnection } from '../../capabilities/connection.js';\nimport type {\n CommitCheckStatus,\n PullRequest,\n PullRequestComment,\n RequestedReviewers,\n Review,\n ReviewComment,\n VersionControl,\n} from '../../capabilities/version-control.js';\nimport type { SourceControlStorageHandle } from '../../storage/domains/source-control/base.js';\nimport {\n GITLAB_DISCUSSIONS_PAGE_SIZE,\n GITLAB_MERGE_REQUESTS_PAGE_SIZE,\n GITLAB_NOTES_PAGE_SIZE,\n GitLabApiError,\n} from './api.js';\nimport type {\n GitLabApiClient,\n GitLabCommitStatusState,\n GitLabDiscussionNote,\n GitLabDiscussionPosition,\n GitLabMember,\n GitLabMergeRequest,\n GitLabNote,\n GitLabUser,\n} from './api.js';\n\nexport interface GitLabVersionControlContext {\n api: GitLabApiClient;\n connection: IntegrationConnection;\n host: string;\n webBaseUrl?: string;\n repositoryAccessToken?: () => Promise<string>;\n}\n\nexport interface GitLabVersionControlDependencies {\n contextForConnection(connection: IntegrationConnection): Promise<GitLabVersionControlContext>;\n contextForStoredInstallation?(\n connection: IntegrationConnection,\n host: string | undefined,\n ): Promise<GitLabVersionControlContext>;\n}\n\nexport function buildGitLabVersionControl(deps: GitLabVersionControlDependencies): VersionControl {\n let storage: SourceControlStorageHandle | undefined;\n\n const sourceControlStorage = (): SourceControlStorageHandle => {\n if (!storage) throw new Error('GitLab VersionControl is not initialized.');\n return storage;\n };\n\n const listPullRequests: VersionControl['listPullRequests'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const page = parsePositiveCursor(input.cursor);\n const state = input.state === 'open' ? 'opened' : input.state === 'closed' ? 'all' : (input.state ?? 'opened');\n const mergeRequests = await context.api.listMergeRequests(input.sourceId, { page, state });\n return {\n pullRequests: mergeRequests\n .filter(\n mergeRequest =>\n input.state !== 'closed' || mergeRequest.state === 'closed' || mergeRequest.state === 'merged',\n )\n .filter(mergeRequest => input.includeDrafts !== false || !isDraft(mergeRequest))\n .map(toPullRequest),\n nextCursor: mergeRequests.length === GITLAB_MERGE_REQUESTS_PAGE_SIZE ? String(page + 1) : null,\n };\n };\n\n const getPullRequest: VersionControl['getPullRequest'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n try {\n return toPullRequest(\n await context.api.getMergeRequest(input.sourceId, requirePositiveId(input.pullRequestId, 'merge request')),\n );\n } catch (error) {\n if (error instanceof GitLabApiError && error.status === 404) return null;\n throw error;\n }\n };\n\n const createPullRequest: VersionControl['createPullRequest'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const title = input.draft && !/^(?:draft:|\\[draft\\])/i.test(input.title) ? `Draft: ${input.title}` : input.title;\n return toPullRequest(\n await context.api.createMergeRequest(input.sourceId, {\n sourceBranch: input.headBranch,\n targetBranch: input.baseBranch,\n title,\n description: input.body,\n }),\n );\n };\n\n const updatePullRequest: VersionControl['updatePullRequest'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n return toPullRequest(\n await context.api.updateMergeRequest(input.sourceId, requirePositiveId(input.pullRequestId, 'merge request'), {\n title: input.title,\n description: input.body === null ? '' : input.body,\n targetBranch: input.baseBranch,\n stateEvent: input.state === 'closed' ? 'close' : input.state === 'open' ? 'reopen' : undefined,\n }),\n );\n };\n\n const closePullRequest: VersionControl['closePullRequest'] = input =>\n updatePullRequest({ ...input, state: 'closed' });\n\n const mergePullRequest: VersionControl['mergePullRequest'] = async input => {\n if (input.method === 'rebase') {\n throw notSupported('GitLab rebases merge requests asynchronously; rebase-and-merge is not supported.');\n }\n const context = await deps.contextForConnection(input.connection);\n const commitMessage = combinedCommitMessage(input.commitTitle, input.commitMessage);\n const result = await context.api.mergeMergeRequest(\n input.sourceId,\n requirePositiveId(input.pullRequestId, 'merge request'),\n {\n squash: input.method === 'squash',\n mergeCommitMessage: input.method === 'squash' ? undefined : commitMessage,\n squashCommitMessage: input.method === 'squash' ? commitMessage : undefined,\n },\n );\n const merged = result.state === 'merged' || Boolean(result.merged_at);\n return {\n merged,\n message: result.message ?? (merged ? 'Merge request merged.' : 'Merge request was not merged.'),\n sha: result.squash_commit_sha ?? result.merge_commit_sha ?? result.sha ?? null,\n };\n };\n\n const listComments: VersionControl['listComments'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const page = parsePositiveCursor(input.cursor);\n const notes = await context.api.listMergeRequestNotes(input.sourceId, mergeRequestIid, { page });\n return {\n comments: notes\n .filter(note => !note.system && note.type !== 'DiffNote')\n .map(note => toPullRequestComment(webBaseUrl(context), input.sourceId, mergeRequestIid, note)),\n nextCursor: notes.length === GITLAB_NOTES_PAGE_SIZE ? String(page + 1) : null,\n };\n };\n\n const createComment: VersionControl['createComment'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const note = await context.api.createMergeRequestNote(input.sourceId, mergeRequestIid, input.body);\n return toPullRequestComment(webBaseUrl(context), input.sourceId, mergeRequestIid, note);\n };\n\n const updateComment: VersionControl['updateComment'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const { mergeRequestIid, noteId } = parseNoteId(input.commentId);\n const note = await context.api.updateMergeRequestNote(input.sourceId, mergeRequestIid, noteId, input.body);\n return toPullRequestComment(webBaseUrl(context), input.sourceId, mergeRequestIid, note);\n };\n\n const deleteComment: VersionControl['deleteComment'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const { mergeRequestIid, noteId } = parseNoteId(input.commentId);\n await context.api.deleteMergeRequestNote(input.sourceId, mergeRequestIid, noteId);\n };\n\n const listReviews: VersionControl['listReviews'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const approvals = await context.api.getMergeRequestApprovals(input.sourceId, mergeRequestIid);\n return {\n reviews: (approvals.approved_by ?? []).map(({ user }) =>\n toApprovalReview(webBaseUrl(context), input.sourceId, mergeRequestIid, user),\n ),\n nextCursor: null,\n };\n };\n\n const getReview: VersionControl['getReview'] = async input => {\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const approvalPrefix = `${mergeRequestIid}:approval`;\n const commentPrefix = `${mergeRequestIid}:comment:`;\n if (\n input.reviewId !== approvalPrefix &&\n !input.reviewId.startsWith(`${approvalPrefix}:`) &&\n !input.reviewId.startsWith(commentPrefix)\n ) {\n return null;\n }\n const context = await deps.contextForConnection(input.connection);\n if (input.reviewId === approvalPrefix || input.reviewId.startsWith(`${approvalPrefix}:`)) {\n const reviewerKey = input.reviewId === approvalPrefix ? null : input.reviewId.slice(approvalPrefix.length + 1);\n if (reviewerKey === '') return null;\n const currentUser = reviewerKey === null ? await context.api.getCurrentUser() : null;\n const approvals = await context.api.getMergeRequestApprovals(input.sourceId, mergeRequestIid);\n const user = (approvals.approved_by ?? [])\n .map(entry => entry.user)\n .find(candidate =>\n reviewerKey === null\n ? (currentUser?.id !== undefined && candidate.id === currentUser.id) ||\n candidate.username === currentUser?.username\n : String(candidate.id ?? candidate.username) === reviewerKey,\n );\n return user ? toApprovalReview(webBaseUrl(context), input.sourceId, mergeRequestIid, user) : null;\n }\n const noteId = parsePositiveInteger(input.reviewId.slice(commentPrefix.length));\n if (noteId === null) return null;\n try {\n const note = await context.api.getMergeRequestNote(input.sourceId, mergeRequestIid, noteId);\n if (note.system || note.type === 'DiffNote') return null;\n return toCommentReview(webBaseUrl(context), input.sourceId, mergeRequestIid, note);\n } catch (error) {\n if (error instanceof GitLabApiError && error.status === 404) return null;\n throw error;\n }\n };\n\n const createReview: VersionControl['createReview'] = async input =>\n submitReviewAction(deps, {\n connection: input.connection,\n sourceId: input.sourceId,\n pullRequestId: input.pullRequestId,\n event: input.event,\n body: input.body,\n commitId: input.commitId,\n });\n\n const updateReview: VersionControl['updateReview'] = async () => {\n // FLAGGED FOR MANUAL REVIEW (spec §6.2)\n throw notSupported('GitLab does not expose mutable pending review objects.');\n };\n\n const submitReview: VersionControl['submitReview'] = async input =>\n submitReviewAction(deps, {\n connection: input.connection,\n sourceId: input.sourceId,\n pullRequestId: input.pullRequestId,\n event: input.event,\n body: input.body,\n });\n\n const dismissReview: VersionControl['dismissReview'] = async () => {\n // FLAGGED FOR MANUAL REVIEW (spec §6.2)\n throw notSupported('GitLab approval dismissal has no GitHub review equivalent.');\n };\n\n const deletePendingReview: VersionControl['deletePendingReview'] = async () => {\n // FLAGGED FOR MANUAL REVIEW (spec §6.2)\n throw notSupported('GitLab does not expose pending review objects.');\n };\n\n const listReviewComments: VersionControl['listReviewComments'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const page = parsePositiveCursor(input.cursor);\n const discussions = await context.api.listMergeRequestDiscussions(input.sourceId, mergeRequestIid, { page });\n return {\n comments: discussions.flatMap(discussion => {\n const position = discussionPosition(discussion.notes);\n if (!position) return [];\n const root = discussion.notes.find(note => note.position) ?? discussion.notes[0];\n const replyToId = root ? packDiscussionNoteId(mergeRequestIid, discussion.id, root.id) : null;\n return discussion.notes\n .filter(note => !note.system)\n .map(note =>\n toReviewComment(\n webBaseUrl(context),\n input.sourceId,\n mergeRequestIid,\n discussion.id,\n note,\n note === root ? null : replyToId,\n position,\n ),\n );\n }),\n nextCursor: discussions.length === GITLAB_DISCUSSIONS_PAGE_SIZE ? String(page + 1) : null,\n };\n };\n\n const createReviewComment: VersionControl['createReviewComment'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n if (input.replyToId) {\n const thread = parseReviewReplyId(input.replyToId);\n if (thread.mergeRequestIid !== mergeRequestIid) {\n throw new GitLabApiError('GitLab discussion does not belong to the requested merge request.', 400);\n }\n const discussion = await context.api.getMergeRequestDiscussion(\n input.sourceId,\n mergeRequestIid,\n thread.discussionId,\n );\n const position = discussionPosition(discussion.notes);\n if (!position) throw new GitLabApiError('GitLab discussion is not anchored to a diff.', 400);\n const root = discussion.notes.find(note => note.position) ?? discussion.notes[0];\n if (!root) throw new GitLabApiError('GitLab discussion response did not include a note.', 502);\n const note = await context.api.addMergeRequestDiscussionNote(\n input.sourceId,\n mergeRequestIid,\n thread.discussionId,\n input.body,\n );\n return toReviewComment(\n webBaseUrl(context),\n input.sourceId,\n mergeRequestIid,\n thread.discussionId,\n note,\n packDiscussionNoteId(mergeRequestIid, thread.discussionId, root.id),\n position,\n );\n }\n\n const mergeRequest = await context.api.getMergeRequest(input.sourceId, mergeRequestIid);\n if (!mergeRequest.diff_refs) {\n throw new GitLabApiError('GitLab merge request diff refs are not ready.', 409);\n }\n if (mergeRequest.diff_refs.head_sha !== input.commitId) {\n throw new GitLabApiError('GitLab merge request changed since this review comment was prepared.', 409);\n }\n const { path, line, side } = input;\n if (typeof path !== 'string' || typeof line !== 'number' || (side !== 'left' && side !== 'right')) {\n throw new GitLabApiError('GitLab diff review comment position is invalid.', 400);\n }\n if ((input.startLine === undefined) !== (input.startSide === undefined)) {\n throw new GitLabApiError('A multi-line GitLab review comment requires both startLine and startSide.', 400);\n }\n const position: GitLabDiscussionPosition = {\n position_type: 'text',\n ...mergeRequest.diff_refs,\n old_path: path,\n new_path: path,\n old_line: side === 'left' ? line : undefined,\n new_line: side === 'right' ? line : undefined,\n ...(input.startLine !== undefined && input.startSide\n ? {\n line_range: {\n start: await discussionLine(path, input.startLine, input.startSide),\n end: await discussionLine(path, line, side),\n },\n }\n : {}),\n };\n const discussion = await context.api.createMergeRequestDiscussion(input.sourceId, mergeRequestIid, {\n body: input.body,\n commitId: input.commitId,\n position,\n });\n const note = discussion.notes.find(candidate => candidate.position) ?? discussion.notes[0];\n if (!note) throw new GitLabApiError('GitLab discussion response did not include a note.', 502);\n return toReviewComment(webBaseUrl(context), input.sourceId, mergeRequestIid, discussion.id, note, null, position);\n };\n\n const updateReviewComment: VersionControl['updateReviewComment'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const reference = parseDiscussionNoteId(input.commentId);\n const discussion = await context.api.getMergeRequestDiscussion(\n input.sourceId,\n reference.mergeRequestIid,\n reference.discussionId,\n );\n const position = discussionPosition(discussion.notes);\n if (!position) throw new GitLabApiError('GitLab discussion is not anchored to a diff.', 400);\n const root = discussion.notes.find(candidate => candidate.position) ?? discussion.notes[0];\n if (!root) throw new GitLabApiError('GitLab discussion response did not include a note.', 502);\n const note = await context.api.updateMergeRequestDiscussionNote(\n input.sourceId,\n reference.mergeRequestIid,\n reference.discussionId,\n reference.noteId,\n input.body,\n );\n return toReviewComment(\n webBaseUrl(context),\n input.sourceId,\n reference.mergeRequestIid,\n reference.discussionId,\n note,\n note.id === root.id ? null : packDiscussionNoteId(reference.mergeRequestIid, reference.discussionId, root.id),\n position,\n );\n };\n\n const deleteReviewComment: VersionControl['deleteReviewComment'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const reference = parseDiscussionNoteId(input.commentId);\n await context.api.deleteMergeRequestDiscussionNote(\n input.sourceId,\n reference.mergeRequestIid,\n reference.discussionId,\n reference.noteId,\n );\n };\n\n const resolveReviewThread: NonNullable<VersionControl['resolveReviewThread']> = async input => {\n const context = await deps.contextForConnection(input.connection);\n const reference = parseDiscussionNoteId(input.commentId);\n await context.api.resolveMergeRequestDiscussion(\n input.sourceId,\n reference.mergeRequestIid,\n reference.discussionId,\n input.resolved,\n );\n };\n\n const publishCommitCheck: NonNullable<VersionControl['publishCommitCheck']> = async input => {\n const context = await deps.contextForConnection(input.connection);\n const body = {\n state: GITLAB_COMMIT_STATUS_STATE[input.status],\n name: input.name,\n ...(input.ref !== undefined ? { ref: input.ref } : {}),\n // GitLab commit statuses carry a single short description, so the title is the only text published.\n description: input.title.slice(0, GITLAB_COMMIT_STATUS_DESCRIPTION_LIMIT),\n };\n // GitLab answers 409 when two updates to the same status race; a short bounded retry settles it.\n let status;\n for (let attempt = 1; ; attempt++) {\n try {\n status = await context.api.setCommitStatus(input.sourceId, input.headSha, body);\n break;\n } catch (error) {\n if (attempt >= 3 || (error as { status?: number } | null)?.status !== 409) throw error;\n await new Promise(resolve => setTimeout(resolve, 250 * attempt));\n }\n }\n return { id: String(status.id), name: status.name, headSha: status.sha, status: input.status, url: status.target_url };\n };\n\n const listRequestedReviewers: VersionControl['listRequestedReviewers'] = async input => {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequest = await context.api.getMergeRequest(\n input.sourceId,\n requirePositiveId(input.pullRequestId, 'merge request'),\n );\n return toRequestedReviewers(mergeRequest);\n };\n\n const requestReviewers: VersionControl['requestReviewers'] = async input => {\n rejectTeamReviewers(input.teams);\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const mergeRequest = await context.api.getMergeRequest(input.sourceId, mergeRequestIid);\n const requestedMembers = await resolveMembers(context.api, input.sourceId, input.users ?? []);\n const currentIds = await reviewerIds(context.api, input.sourceId, mergeRequest.reviewers ?? []);\n const reviewerIdsToSet = [...new Set([...currentIds, ...requestedMembers.map(member => member.id)])];\n return toRequestedReviewers(\n await context.api.setMergeRequestReviewers(input.sourceId, mergeRequestIid, reviewerIdsToSet),\n );\n };\n\n const removeRequestedReviewers: VersionControl['removeRequestedReviewers'] = async input => {\n rejectTeamReviewers(input.teams);\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n const mergeRequest = await context.api.getMergeRequest(input.sourceId, mergeRequestIid);\n const removals = new Set((input.users ?? []).map(username => username.toLowerCase()));\n const retained = (mergeRequest.reviewers ?? []).filter(user => !removals.has(user.username.toLowerCase()));\n const retainedIds = await reviewerIds(context.api, input.sourceId, retained);\n return toRequestedReviewers(\n await context.api.setMergeRequestReviewers(input.sourceId, mergeRequestIid, retainedIds),\n );\n };\n\n return {\n initialize: input => {\n storage = input.storage;\n },\n registerInstallation: async ({ orgId, userId, installation }) => {\n const requestedConnection = parseConnection(installation.metadata?.connection);\n if (!requestedConnection) {\n throw new GitLabApiError('GitLab installation metadata must include a valid connection.', 400);\n }\n const context = await deps.contextForConnection(requestedConnection);\n return sourceControlStorage().installations.upsert({\n orgId,\n connectedByUserId: userId,\n externalId: installation.externalId,\n accountName: installation.accountName,\n accountType: installation.accountType,\n providerMetadata: {\n ...installation.metadata,\n connection: context.connection,\n host: normalizeHost(context.host),\n },\n });\n },\n registerRepositories: async ({ orgId, installationId, repositories }) => {\n const normalizedRepositories = repositories.map(repository => ({\n ...repository,\n slug: normalizeSlug(repository.slug),\n }));\n return await Promise.all(\n normalizedRepositories.map(repository =>\n sourceControlStorage().repositories.upsert({\n orgId,\n input: {\n installationId,\n externalId: repository.externalId,\n slug: repository.slug,\n defaultBranch: repository.defaultBranch,\n providerMetadata: repository.metadata,\n },\n }),\n ),\n );\n },\n getRepositoryTarget: async ({ orgId, repositoryId }) => {\n const repository = await sourceControlStorage().repositories.get({ orgId, id: repositoryId });\n if (!repository) throw new Error('Version-control repository not found.');\n const installation = await sourceControlStorage().installations.get({\n orgId,\n id: repository.installationId,\n });\n if (!installation) throw new Error('Version-control installation not found.');\n const connection = parseConnection(installation.providerMetadata.connection);\n if (!connection) throw new GitLabApiError('GitLab installation connection metadata is invalid.', 500);\n const context = await (deps.contextForStoredInstallation ?? deps.contextForConnection)(\n connection,\n typeof installation.providerMetadata.host === 'string' ? installation.providerMetadata.host : undefined,\n );\n // The API uses GitLab's immutable numeric project ID because Platform's\n // proxy normalizes encoded path slashes; retain the slug for browser URLs.\n return { connection: context.connection, sourceId: `${repository.externalId}:${repository.slug}` };\n },\n getRepositoryAccess: async ({ orgId, repositoryId }) => {\n const repository = await sourceControlStorage().repositories.get({ orgId, id: repositoryId });\n if (!repository) throw new Error('Version-control repository not found.');\n const installation = await sourceControlStorage().installations.get({\n orgId,\n id: repository.installationId,\n });\n if (!installation) throw new Error('Version-control installation not found.');\n const connection = parseConnection(installation.providerMetadata.connection);\n if (!connection) throw new GitLabApiError('GitLab installation connection metadata is invalid.', 500);\n const context = await (deps.contextForStoredInstallation ?? deps.contextForConnection)(\n connection,\n typeof installation.providerMetadata.host === 'string' ? installation.providerMetadata.host : undefined,\n );\n if (!context.repositoryAccessToken) {\n throw notSupported('This GitLab connection does not expose credentials for repository cloning.');\n }\n const token = await context.repositoryAccessToken();\n const baseUrl = webBaseUrl(context);\n const slug = normalizeSlug(repository.slug);\n return {\n cloneUrl: `${baseUrl}/${slug}.git`,\n authorization: { scheme: 'bearer', token, username: 'oauth2' },\n };\n },\n listPullRequests,\n getPullRequest,\n createPullRequest,\n updatePullRequest,\n closePullRequest,\n mergePullRequest,\n listComments,\n resolveReviewThread,\n createComment,\n updateComment,\n deleteComment,\n listReviews,\n getReview,\n createReview,\n updateReview,\n submitReview,\n dismissReview,\n deletePendingReview,\n listReviewComments,\n createReviewComment,\n updateReviewComment,\n deleteReviewComment,\n listRequestedReviewers,\n requestReviewers,\n removeRequestedReviewers,\n publishCommitCheck,\n };\n}\n\nconst GITLAB_COMMIT_STATUS_DESCRIPTION_LIMIT = 255;\n\n// GitLab has no neutral state; an informational result is reported as skipped rather than as a pass.\nconst GITLAB_COMMIT_STATUS_STATE: Record<CommitCheckStatus, GitLabCommitStatusState> = {\n 'in-progress': 'running',\n success: 'success',\n failure: 'failed',\n neutral: 'skipped',\n cancelled: 'canceled',\n skipped: 'skipped',\n};\n\nasync function submitReviewAction(\n deps: GitLabVersionControlDependencies,\n input: {\n connection: IntegrationConnection;\n sourceId: string;\n pullRequestId: string;\n event: 'approve' | 'request-changes' | 'comment' | undefined;\n body?: string;\n commitId?: string;\n },\n): Promise<Review> {\n const context = await deps.contextForConnection(input.connection);\n const mergeRequestIid = requirePositiveId(input.pullRequestId, 'merge request');\n if (input.event === 'request-changes') {\n // FLAGGED FOR MANUAL REVIEW (spec §6.2)\n throw notSupported('GitLab has no first-class request-changes review event.');\n }\n if (input.event === undefined) {\n // FLAGGED FOR MANUAL REVIEW (spec §6.2)\n throw notSupported('GitLab has no first-class pending review object.');\n }\n if (input.event === 'approve') {\n const body = input.body?.trim();\n await context.api.approveMergeRequest(input.sourceId, mergeRequestIid, input.commitId);\n const comment = body\n ? toPullRequestComment(\n webBaseUrl(context),\n input.sourceId,\n mergeRequestIid,\n await context.api.createMergeRequestNote(input.sourceId, mergeRequestIid, body),\n )\n : null;\n return {\n id: String(mergeRequestIid) + ':approval',\n url: comment?.url ?? mergeRequestUrl(webBaseUrl(context), input.sourceId, mergeRequestIid),\n author: comment?.author ?? null,\n body: comment?.body ?? null,\n state: 'approved',\n commitId: null,\n submittedAt: comment?.createdAt ?? null,\n };\n }\n const body = input.body?.trim();\n if (!body) throw new GitLabApiError('GitLab comment reviews require a body.', 400);\n const note = await context.api.createMergeRequestNote(input.sourceId, mergeRequestIid, body);\n return toCommentReview(webBaseUrl(context), input.sourceId, mergeRequestIid, note);\n}\n\nfunction toCommentReview(host: string, sourceId: string, mergeRequestIid: number, note: GitLabNote): Review {\n const comment = toPullRequestComment(host, sourceId, mergeRequestIid, note);\n return {\n id: `${mergeRequestIid}:comment:${note.id}`,\n url: comment.url,\n author: comment.author,\n body: comment.body,\n state: 'commented',\n commitId: null,\n submittedAt: note.created_at,\n };\n}\n\nfunction toApprovalReview(host: string, sourceId: string, mergeRequestIid: number, user: GitLabUser): Review {\n return {\n id: `${mergeRequestIid}:approval:${user.id ?? user.username}`,\n url: mergeRequestUrl(host, sourceId, mergeRequestIid),\n author: displayName(user),\n body: null,\n state: 'approved',\n commitId: null,\n submittedAt: null,\n };\n}\n\nfunction toReviewComment(\n host: string,\n sourceId: string,\n mergeRequestIid: number,\n discussionId: string,\n note: GitLabDiscussionNote,\n replyToId: string | null,\n fallbackPosition?: GitLabDiscussionPosition,\n): ReviewComment {\n const position = note.position ?? fallbackPosition;\n if (!position) throw new GitLabApiError('GitLab review comment is missing its diff position.', 502);\n const base = toPullRequestComment(host, sourceId, mergeRequestIid, note);\n const side = position.new_line !== null && position.new_line !== undefined ? 'right' : 'left';\n return {\n ...base,\n id: packDiscussionNoteId(mergeRequestIid, discussionId, note.id),\n path: side === 'right' ? position.new_path : position.old_path,\n line: side === 'right' ? (position.new_line ?? null) : (position.old_line ?? null),\n side,\n commitId: position.head_sha,\n replyToId,\n };\n}\n\nfunction mergeRequestUrl(host: string, sourceId: string, mergeRequestIid: number): string {\n return `${host}/${sourcePath(sourceId)}/-/merge_requests/${mergeRequestIid}`;\n}\n\nfunction webBaseUrl(context: GitLabVersionControlContext): string {\n const host = normalizeHost(context.host);\n if (!context.webBaseUrl) return `https://${host}`;\n let url: URL;\n try {\n url = new URL(context.webBaseUrl);\n } catch {\n throw new GitLabApiError('GitLab web base URL is invalid.', 400);\n }\n const loopback =\n url.hostname === 'localhost' || url.hostname === '[::1]' || /^127(?:\\.\\d{1,3}){3}$/.test(url.hostname);\n if (\n url.host !== host ||\n (url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) ||\n url.username ||\n url.password ||\n url.search ||\n url.hash\n ) {\n throw new GitLabApiError('GitLab web base URL is invalid.', 400);\n }\n return `${url.origin}${url.pathname.replace(/\\/+$/, '')}`;\n}\n\nfunction sourcePath(sourceId: string): string {\n const match = /^\\d+:(.+)$/.exec(sourceId);\n return normalizeSlug(match?.[1] ?? sourceId);\n}\n\nfunction packDiscussionId(mergeRequestIid: number, discussionId: string): string {\n if (!discussionId || discussionId.includes(':')) {\n throw new GitLabApiError('GitLab discussion id is invalid.', 400);\n }\n return `${mergeRequestIid}:${discussionId}`;\n}\n\nfunction packDiscussionNoteId(mergeRequestIid: number, discussionId: string, noteId: number): string {\n return `${packDiscussionId(mergeRequestIid, discussionId)}:${noteId}`;\n}\n\nfunction parseReviewReplyId(value: string): { mergeRequestIid: number; discussionId: string } {\n const parts = value.split(':');\n if (parts.length === 2) return parseDiscussionId(value);\n if (parts.length === 3 && parts[1]) {\n requirePositiveId(parts[2]!, 'discussion note');\n return {\n mergeRequestIid: requirePositiveId(parts[0]!, 'merge request'),\n discussionId: parts[1],\n };\n }\n throw new GitLabApiError('GitLab review reply id is invalid.', 400);\n}\n\nfunction parseDiscussionId(value: string): { mergeRequestIid: number; discussionId: string } {\n const parts = value.split(':');\n if (parts.length !== 2 || !parts[1]) throw new GitLabApiError('GitLab discussion id is invalid.', 400);\n return {\n mergeRequestIid: requirePositiveId(parts[0]!, 'merge request'),\n discussionId: parts[1],\n };\n}\n\nfunction parseDiscussionNoteId(value: string): { mergeRequestIid: number; discussionId: string; noteId: number } {\n const parts = value.split(':');\n if (parts.length !== 3 || !parts[1]) throw new GitLabApiError('GitLab discussion note id is invalid.', 400);\n return {\n mergeRequestIid: requirePositiveId(parts[0]!, 'merge request'),\n discussionId: parts[1],\n noteId: requirePositiveId(parts[2]!, 'discussion note'),\n };\n}\n\nfunction discussionPosition(notes: GitLabDiscussionNote[]): GitLabDiscussionPosition | undefined {\n return notes.find(note => note.position)?.position ?? undefined;\n}\n\nasync function discussionLine(path: string, line: number, side: 'left' | 'right') {\n const pathHash = Buffer.from(await globalThis.crypto.subtle.digest('SHA-1', new TextEncoder().encode(path))).toString(\n 'hex',\n );\n const oldLine = side === 'left' ? line : undefined;\n const newLine = side === 'right' ? line : undefined;\n return {\n line_code: `${pathHash}_${oldLine ?? 0}_${newLine ?? 0}`,\n type: side === 'left' ? ('old' as const) : ('new' as const),\n old_line: oldLine,\n new_line: newLine,\n };\n}\n\nfunction toRequestedReviewers(mergeRequest: GitLabMergeRequest): RequestedReviewers {\n return {\n users: (mergeRequest.reviewers ?? []).map(user => user.username),\n teams: [],\n };\n}\n\nasync function resolveMembers(api: GitLabApiClient, sourceId: string, usernames: string[]): Promise<GitLabMember[]> {\n return Promise.all(usernames.map(username => resolveMember(api, sourceId, username)));\n}\n\nasync function resolveMember(api: GitLabApiClient, sourceId: string, username: string): Promise<GitLabMember> {\n const normalized = username.trim();\n if (!normalized) throw new GitLabApiError('GitLab reviewer username is invalid.', 400);\n const members = await api.listProjectMembers(sourceId, { query: normalized });\n const member = members.find(candidate => candidate.username.toLowerCase() === normalized.toLowerCase());\n if (!member) throw new GitLabApiError(`GitLab reviewer ${normalized} is not a project member.`, 404);\n return member;\n}\n\nasync function reviewerIds(api: GitLabApiClient, sourceId: string, users: GitLabUser[]): Promise<number[]> {\n return Promise.all(users.map(async user => user.id ?? (await resolveMember(api, sourceId, user.username)).id));\n}\n\nfunction rejectTeamReviewers(teams: string[] | undefined): void {\n if (!teams?.length) return;\n // FLAGGED FOR MANUAL REVIEW (spec §6.2)\n throw notSupported('GitLab merge requests do not have a direct team-reviewer equivalent.');\n}\n\nfunction notSupported(message: string): GitLabApiError {\n return new GitLabApiError(message, 501);\n}\n\nfunction toPullRequest(mergeRequest: GitLabMergeRequest): PullRequest {\n return {\n id: String(mergeRequest.iid),\n title: mergeRequest.title,\n url: mergeRequest.web_url,\n author: displayName(mergeRequest.author),\n assignees: mergeRequest.assignees?.map(user => user.username),\n requestedReviewers: mergeRequest.reviewers?.map(user => user.username),\n labels: mergeRequest.labels,\n body: mergeRequest.description?.trim() ? mergeRequest.description : null,\n state: mergeRequest.state === 'closed' || mergeRequest.state === 'merged' ? 'closed' : 'open',\n draft: isDraft(mergeRequest),\n merged: mergeRequest.state === 'merged' || Boolean(mergeRequest.merged_at),\n mergeable: mergeableState(mergeRequest.merge_status),\n baseBranch: mergeRequest.target_branch,\n headBranch: mergeRequest.source_branch,\n headSha: mergeRequest.sha,\n createdAt: mergeRequest.created_at,\n updatedAt: mergeRequest.updated_at,\n };\n}\n\nfunction toPullRequestComment(\n host: string,\n sourceId: string,\n mergeRequestIid: number,\n note: GitLabNote,\n): PullRequestComment {\n return {\n id: `${mergeRequestIid}:${note.id}`,\n url: `${mergeRequestUrl(host, sourceId, mergeRequestIid)}#note_${note.id}`,\n author: displayName(note.author),\n body: note.body,\n createdAt: note.created_at,\n updatedAt: note.updated_at ?? note.created_at,\n };\n}\n\nfunction displayName(user: { name?: string | null; username: string } | null | undefined): string | null {\n return user?.username || user?.name?.trim() || null;\n}\n\nfunction isDraft(mergeRequest: GitLabMergeRequest): boolean {\n return mergeRequest.draft ?? mergeRequest.work_in_progress ?? /^(?:draft:|\\[draft\\])/i.test(mergeRequest.title);\n}\n\nfunction mergeableState(status: string | undefined): boolean | null {\n if (status === 'can_be_merged') return true;\n if (status === 'cannot_be_merged') return false;\n return null;\n}\n\nfunction combinedCommitMessage(title: string | undefined, body: string | undefined): string | undefined {\n const parts = [title?.trim(), body?.trim()].filter((part): part is string => Boolean(part));\n return parts.length > 0 ? parts.join('\\n\\n') : undefined;\n}\n\nfunction parseNoteId(value: string): { mergeRequestIid: number; noteId: number } {\n const parts = value.split(':');\n if (parts.length !== 2) throw new GitLabApiError('GitLab merge request note id is invalid.', 400);\n return {\n mergeRequestIid: requirePositiveId(parts[0]!, 'merge request'),\n noteId: requirePositiveId(parts[1]!, 'note'),\n };\n}\n\nfunction parsePositiveCursor(cursor: string | undefined): number {\n if (cursor === undefined) return 1;\n const page = parsePositiveInteger(cursor);\n if (page === null) throw new GitLabApiError('GitLab cursor must be a positive page number.', 400);\n return page;\n}\n\nfunction requirePositiveId(value: string, resource: string): number {\n const parsed = parsePositiveInteger(value);\n if (parsed === null) throw new GitLabApiError(`GitLab ${resource} id must be a positive integer.`, 400);\n return parsed;\n}\n\nfunction parsePositiveInteger(value: string): number | null {\n if (!/^\\d+$/.test(value)) return null;\n const parsed = Number(value);\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null;\n}\n\nfunction parseConnection(value: unknown): IntegrationConnection | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n const connection = value as Record<string, unknown>;\n if (connection.type === 'oauth' && typeof connection.accessToken === 'string' && connection.accessToken.length > 0) {\n return { type: 'oauth', accessToken: connection.accessToken };\n }\n if (\n connection.type === 'app-installation' &&\n Number.isSafeInteger(connection.installationId) &&\n Number(connection.installationId) > 0\n ) {\n return { type: 'app-installation', installationId: Number(connection.installationId) };\n }\n return null;\n}\n\nfunction normalizeHost(value: string): string {\n const host = value.trim();\n if (!host || host.includes('/') || host.includes('@')) throw new GitLabApiError('GitLab host is invalid.', 400);\n let parsed: URL;\n try {\n parsed = new URL(`https://${host}`);\n } catch {\n throw new GitLabApiError('GitLab host is invalid.', 400);\n }\n if (parsed.host !== host) throw new GitLabApiError('GitLab host is invalid.', 400);\n return host;\n}\n\nfunction normalizeSlug(value: string): string {\n const slug = value.replace(/^\\/+|\\/+$/g, '');\n const segments = slug.split('/');\n if (!slug || segments.some(segment => !/^[A-Za-z0-9_.-]+$/.test(segment) || segment === '.' || segment === '..')) {\n throw new GitLabApiError('GitLab repository slug is invalid.', 400);\n }\n return slug;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../../src/integrations/platform/github/integration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,OAAO,KAAK,EAEV,MAAM,EAIP,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../../src/integrations/platform/github/integration.ts"],"names":[],"mappings":"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"}
|