@mastra/factory 0.16.0-alpha.10 → 0.16.0-alpha.12
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 +37 -0
- package/dist/auth.js +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/boards/review.d.ts.map +1 -1
- package/dist/boards/review.js +19 -8
- package/dist/boards/review.js.map +1 -1
- package/dist/boards/work.d.ts.map +1 -1
- package/dist/boards/work.js +31 -3
- package/dist/boards/work.js.map +1 -1
- package/dist/capabilities/intake.d.ts +4 -0
- package/dist/capabilities/intake.d.ts.map +1 -1
- package/dist/capabilities/version-control.d.ts +15 -0
- package/dist/capabilities/version-control.d.ts.map +1 -1
- package/dist/factory.d.ts +7 -7
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +100 -40
- package/dist/factory.js.map +1 -1
- package/dist/integrations/base.d.ts +3 -0
- package/dist/integrations/base.d.ts.map +1 -1
- package/dist/integrations/github/integration.d.ts.map +1 -1
- package/dist/integrations/github/integration.js +21 -0
- package/dist/integrations/github/integration.js.map +1 -1
- package/dist/integrations/github/routes.js +2 -1
- package/dist/integrations/github/routes.js.map +1 -1
- package/dist/integrations/github/sandbox.d.ts +41 -42
- package/dist/integrations/github/sandbox.d.ts.map +1 -1
- package/dist/integrations/github/sandbox.js +416 -227
- package/dist/integrations/github/sandbox.js.map +1 -1
- package/dist/integrations/github/webhook.d.ts +2 -5
- package/dist/integrations/github/webhook.d.ts.map +1 -1
- package/dist/integrations/github/webhook.js +8 -48
- package/dist/integrations/github/webhook.js.map +1 -1
- package/dist/integrations/gitlab/agent-tools.d.ts +14 -0
- package/dist/integrations/gitlab/agent-tools.d.ts.map +1 -0
- package/dist/integrations/gitlab/agent-tools.js +42 -0
- package/dist/integrations/gitlab/agent-tools.js.map +1 -0
- package/dist/integrations/gitlab/api.d.ts +222 -0
- package/dist/integrations/gitlab/api.d.ts.map +1 -0
- package/dist/integrations/gitlab/api.js +274 -0
- package/dist/integrations/gitlab/api.js.map +1 -0
- package/dist/integrations/gitlab/default-rules.d.ts +125 -0
- package/dist/integrations/gitlab/default-rules.d.ts.map +1 -0
- package/dist/integrations/gitlab/default-rules.js +172 -0
- package/dist/integrations/gitlab/default-rules.js.map +1 -0
- package/dist/integrations/gitlab/integration.d.ts +138 -0
- package/dist/integrations/gitlab/integration.d.ts.map +1 -0
- package/dist/integrations/gitlab/integration.js +705 -0
- package/dist/integrations/gitlab/integration.js.map +1 -0
- package/dist/integrations/gitlab/issue-reconciler.d.ts +6 -0
- package/dist/integrations/gitlab/issue-reconciler.d.ts.map +1 -0
- package/dist/integrations/gitlab/issue-reconciler.js +123 -0
- package/dist/integrations/gitlab/issue-reconciler.js.map +1 -0
- package/dist/integrations/gitlab/merge-request-reconciler.d.ts +6 -0
- package/dist/integrations/gitlab/merge-request-reconciler.d.ts.map +1 -0
- package/dist/integrations/gitlab/merge-request-reconciler.js +267 -0
- package/dist/integrations/gitlab/merge-request-reconciler.js.map +1 -0
- package/dist/integrations/gitlab/reconciler.d.ts +5 -0
- package/dist/integrations/gitlab/reconciler.d.ts.map +1 -0
- package/dist/integrations/gitlab/reconciler.js +31 -0
- package/dist/integrations/gitlab/reconciler.js.map +1 -0
- package/dist/integrations/gitlab/reconciliation-config.d.ts +3 -0
- package/dist/integrations/gitlab/reconciliation-config.d.ts.map +1 -0
- package/dist/integrations/gitlab/reconciliation-config.js +17 -0
- package/dist/integrations/gitlab/reconciliation-config.js.map +1 -0
- package/dist/integrations/gitlab/routes.d.ts +20 -0
- package/dist/integrations/gitlab/routes.d.ts.map +1 -0
- package/dist/integrations/gitlab/routes.js +473 -0
- package/dist/integrations/gitlab/routes.js.map +1 -0
- package/dist/integrations/gitlab/rules.d.ts +35 -0
- package/dist/integrations/gitlab/rules.d.ts.map +1 -0
- package/dist/integrations/gitlab/rules.js +391 -0
- package/dist/integrations/gitlab/rules.js.map +1 -0
- package/dist/integrations/gitlab/session-subscriptions.d.ts +32 -0
- package/dist/integrations/gitlab/session-subscriptions.d.ts.map +1 -0
- package/dist/integrations/gitlab/session-subscriptions.js +192 -0
- package/dist/integrations/gitlab/session-subscriptions.js.map +1 -0
- package/dist/integrations/gitlab/subscriptions.d.ts +70 -0
- package/dist/integrations/gitlab/subscriptions.d.ts.map +1 -0
- package/dist/integrations/gitlab/subscriptions.js +76 -0
- package/dist/integrations/gitlab/subscriptions.js.map +1 -0
- package/dist/integrations/gitlab/version-control.d.ts +16 -0
- package/dist/integrations/gitlab/version-control.d.ts.map +1 -0
- package/dist/integrations/gitlab/version-control.js +622 -0
- package/dist/integrations/gitlab/version-control.js.map +1 -0
- package/dist/integrations/gitlab/webhook-dispatch.d.ts +75 -0
- package/dist/integrations/gitlab/webhook-dispatch.d.ts.map +1 -0
- package/dist/integrations/gitlab/webhook-dispatch.js +235 -0
- package/dist/integrations/gitlab/webhook-dispatch.js.map +1 -0
- package/dist/integrations/gitlab/webhook.d.ts +72 -0
- package/dist/integrations/gitlab/webhook.d.ts.map +1 -0
- package/dist/integrations/gitlab/webhook.js +201 -0
- package/dist/integrations/gitlab/webhook.js.map +1 -0
- package/dist/integrations/incidentio/integration.js +1 -1
- package/dist/integrations/issue-reconciler.d.ts +3 -3
- package/dist/integrations/issue-reconciler.d.ts.map +1 -1
- package/dist/integrations/issue-reconciler.js +22 -2
- package/dist/integrations/issue-reconciler.js.map +1 -1
- package/dist/integrations/platform/github/integration.d.ts.map +1 -1
- package/dist/integrations/platform/github/integration.js +21 -0
- package/dist/integrations/platform/github/integration.js.map +1 -1
- package/dist/integrations/platform/gitlab/event-worker.d.ts +64 -0
- package/dist/integrations/platform/gitlab/event-worker.d.ts.map +1 -0
- package/dist/integrations/platform/gitlab/event-worker.js +306 -0
- package/dist/integrations/platform/gitlab/event-worker.js.map +1 -0
- package/dist/integrations/platform/gitlab/integration.d.ts +57 -0
- package/dist/integrations/platform/gitlab/integration.d.ts.map +1 -0
- package/dist/integrations/platform/gitlab/integration.js +125 -0
- package/dist/integrations/platform/gitlab/integration.js.map +1 -0
- package/dist/integrations/platform/incidentio/integration.js +1 -1
- package/dist/integrations/slack/integration.d.ts.map +1 -1
- package/dist/integrations/slack/integration.js +3 -3
- package/dist/integrations/slack/integration.js.map +1 -1
- package/dist/integrations/slack/slack.d.ts +2 -0
- package/dist/integrations/slack/slack.d.ts.map +1 -1
- package/dist/integrations/slack/slack.js +21 -7
- package/dist/integrations/slack/slack.js.map +1 -1
- package/dist/integrations/subscription-session.d.ts +37 -0
- package/dist/integrations/subscription-session.d.ts.map +1 -0
- package/dist/integrations/subscription-session.js +83 -0
- package/dist/integrations/subscription-session.js.map +1 -0
- package/dist/packages/_internals/workspace/dist/index.js +1 -11
- package/dist/packages/_internals/workspace/dist/index.js.map +1 -1
- package/dist/routes/intake.d.ts.map +1 -1
- package/dist/routes/intake.js +4 -2
- package/dist/routes/intake.js.map +1 -1
- package/dist/routes/oauth.js +1 -1
- package/dist/routes/projects.d.ts +1 -0
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +1 -0
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/source-control-sessions.d.ts +20 -0
- package/dist/routes/source-control-sessions.d.ts.map +1 -0
- package/dist/routes/source-control-sessions.js +319 -0
- package/dist/routes/source-control-sessions.js.map +1 -0
- package/dist/routes/source-control-settings.d.ts +10 -0
- package/dist/routes/source-control-settings.d.ts.map +1 -0
- package/dist/routes/source-control-settings.js +87 -0
- package/dist/routes/source-control-settings.js.map +1 -0
- package/dist/routes/surface.d.ts +3 -3
- package/dist/routes/surface.d.ts.map +1 -1
- package/dist/routes/surface.js +55 -13
- package/dist/routes/surface.js.map +1 -1
- package/dist/routes/tenant-credentials.d.ts +8 -0
- package/dist/routes/tenant-credentials.d.ts.map +1 -1
- package/dist/routes/tenant-credentials.js +20 -3
- package/dist/routes/tenant-credentials.js.map +1 -1
- package/dist/routes/work-items.d.ts.map +1 -1
- package/dist/routes/work-items.js +1 -1
- package/dist/routes/work-items.js.map +1 -1
- package/dist/rules/dispatcher.d.ts.map +1 -1
- package/dist/rules/dispatcher.js +7 -1
- package/dist/rules/dispatcher.js.map +1 -1
- package/dist/rules/start-coordinator.d.ts +1 -1
- package/dist/rules/start-coordinator.d.ts.map +1 -1
- package/dist/rules/start-coordinator.js +3 -2
- package/dist/rules/start-coordinator.js.map +1 -1
- package/dist/rules/transition-service.d.ts.map +1 -1
- package/dist/rules/transition-service.js +6 -3
- package/dist/rules/transition-service.js.map +1 -1
- package/dist/rules/types.d.ts +67 -3
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/rules/types.js +23 -2
- package/dist/rules/types.js.map +1 -1
- package/dist/rules/validation.d.ts.map +1 -1
- package/dist/rules/validation.js +2 -0
- package/dist/rules/validation.js.map +1 -1
- package/dist/sandbox/git-ref.d.ts +7 -0
- package/dist/sandbox/git-ref.d.ts.map +1 -0
- package/dist/sandbox/git-ref.js +15 -0
- package/dist/sandbox/git-ref.js.map +1 -0
- package/dist/sandbox/session-retirement.js +1 -1
- package/dist/sandbox/workdir.d.ts.map +1 -1
- package/dist/sandbox/workdir.js +6 -6
- package/dist/sandbox/workdir.js.map +1 -1
- package/dist/session/factory-session.d.ts +31 -1
- package/dist/session/factory-session.d.ts.map +1 -1
- package/dist/session/factory-session.js +60 -1
- package/dist/session/factory-session.js.map +1 -1
- package/dist/session/source-control-tools.d.ts +16 -0
- package/dist/session/source-control-tools.d.ts.map +1 -0
- package/dist/session/source-control-tools.js +464 -0
- package/dist/session/source-control-tools.js.map +1 -0
- package/dist/storage/domains/intake/base.d.ts +18 -0
- package/dist/storage/domains/intake/base.d.ts.map +1 -1
- package/dist/storage/domains/intake/base.js +77 -0
- package/dist/storage/domains/intake/base.js.map +1 -1
- package/dist/work-item-branch.d.ts +3 -1
- package/dist/work-item-branch.d.ts.map +1 -1
- package/dist/work-item-branch.js +22 -4
- package/dist/work-item-branch.js.map +1 -1
- package/dist/workspace.d.ts +15 -1
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +57 -23
- package/dist/workspace.js.map +1 -1
- package/factory-skills/factory-gitlab-rereview/SKILL.md +19 -0
- package/factory-skills/factory-gitlab-review/SKILL.md +30 -0
- package/factory-skills/factory-rereview/SKILL.md +13 -6
- package/factory-skills/factory-review/SKILL.md +13 -6
- package/factory-skills/factory-review/references/archaeology.md +225 -0
- package/factory-skills/factory-review/references/categories/README.md +34 -0
- package/factory-skills/factory-review/references/categories/behavior-change.md +36 -0
- package/factory-skills/factory-review/references/categories/bug-fix.md +37 -0
- package/factory-skills/factory-review/references/categories/docs.md +32 -0
- package/factory-skills/factory-review/references/categories/experimental-flagged.md +34 -0
- package/factory-skills/factory-review/references/categories/infra-tooling.md +37 -0
- package/factory-skills/factory-review/references/categories/internal-capability.md +35 -0
- package/factory-skills/factory-review/references/categories/large-cross-cutting.md +35 -0
- package/factory-skills/factory-review/references/categories/mechanical.md +36 -0
- package/factory-skills/factory-review/references/categories/performance.md +33 -0
- package/factory-skills/factory-review/references/categories/public-api.md +38 -0
- package/factory-skills/factory-review/references/categories/refactor.md +35 -0
- package/factory-skills/factory-review/references/categories/revert.md +31 -0
- package/factory-skills/factory-review/references/categories/schema-storage.md +39 -0
- package/factory-skills/factory-review/references/categories/security.md +35 -0
- package/factory-skills/factory-review/references/categories/tests-only.md +38 -0
- package/package.json +9 -9
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { GitLabApiError } from "./api.js";
|
|
2
|
+
import { createTool } from "@mastra/core/tools";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
//#region src/integrations/gitlab/agent-tools.ts
|
|
5
|
+
function createGitLabGetIssueTool(gitlab, scope) {
|
|
6
|
+
return createTool({
|
|
7
|
+
id: "gitlab_get_issue",
|
|
8
|
+
description: "Fetch a GitLab issue's full details, including description, state, assignees, labels, and discussion notes. Pass a project-qualified issue such as group/project#42, a GitLab issue URL, or an encoded issue reference from Factory intake.",
|
|
9
|
+
inputSchema: z.object({ issue: z.string().trim().min(1).describe("A project-qualified GitLab issue (for example, \"group/project#42\") or GitLab issue URL.") }),
|
|
10
|
+
execute: async ({ issue }) => {
|
|
11
|
+
try {
|
|
12
|
+
const detail = await gitlab.getIssueForFactoryProject({
|
|
13
|
+
orgId: scope.orgId,
|
|
14
|
+
factoryProjectId: scope.factoryProjectId,
|
|
15
|
+
issueId: issue
|
|
16
|
+
});
|
|
17
|
+
if (!detail) return { error: `GitLab issue "${issue}" was not found.` };
|
|
18
|
+
return detail;
|
|
19
|
+
} catch (error) {
|
|
20
|
+
if (error instanceof GitLabApiError && error.code === "gitlab_auth_failed") return { error: gitlab.authFailureMessage() };
|
|
21
|
+
return { error: `Failed to fetch GitLab issue: ${error instanceof Error ? error.message : String(error)}` };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async function buildGitLabAgentTools({ requestContext, gitlab }) {
|
|
27
|
+
if (!gitlab.authEnabled) return {};
|
|
28
|
+
const ctx = requestContext.get("controller");
|
|
29
|
+
if (!ctx) return {};
|
|
30
|
+
const projectId = ctx.getState().factoryProjectId ?? ctx.resourceId;
|
|
31
|
+
if (!projectId) return {};
|
|
32
|
+
const orgId = await gitlab.resolveOrgId(projectId);
|
|
33
|
+
if (!orgId || !await gitlab.hasActiveConnections()) return {};
|
|
34
|
+
return { gitlab_get_issue: createGitLabGetIssueTool(gitlab, {
|
|
35
|
+
orgId,
|
|
36
|
+
factoryProjectId: projectId
|
|
37
|
+
}) };
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { buildGitLabAgentTools };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=agent-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tools.js","names":[],"sources":["../../../src/integrations/gitlab/agent-tools.ts"],"sourcesContent":["import type { AgentControllerRequestContext } from '@mastra/core/agent-controller';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\n\nimport { GitLabApiError } from './api.js';\nimport type { GitLabIntegrationBase } from './integration.js';\n\nfunction createGitLabGetIssueTool(gitlab: GitLabIntegrationBase, scope: { orgId: string; factoryProjectId: string }) {\n return createTool({\n id: 'gitlab_get_issue',\n description:\n \"Fetch a GitLab issue's full details, including description, state, assignees, labels, and discussion notes. Pass a project-qualified issue such as group/project#42, a GitLab issue URL, or an encoded issue reference from Factory intake.\",\n inputSchema: z.object({\n issue: z\n .string()\n .trim()\n .min(1)\n .describe('A project-qualified GitLab issue (for example, \"group/project#42\") or GitLab issue URL.'),\n }),\n execute: async ({ issue }: { issue: string }) => {\n try {\n const detail = await gitlab.getIssueForFactoryProject({\n orgId: scope.orgId,\n factoryProjectId: scope.factoryProjectId,\n issueId: issue,\n });\n if (!detail) return { error: `GitLab issue \"${issue}\" was not found.` };\n return detail;\n } catch (error) {\n if (error instanceof GitLabApiError && error.code === 'gitlab_auth_failed') {\n return { error: gitlab.authFailureMessage() };\n }\n return { error: `Failed to fetch GitLab issue: ${error instanceof Error ? error.message : String(error)}` };\n }\n },\n });\n}\n\nexport async function buildGitLabAgentTools({\n requestContext,\n gitlab,\n}: {\n requestContext: RequestContext;\n gitlab: GitLabIntegrationBase;\n}): Promise<Record<string, ReturnType<typeof createGitLabGetIssueTool>>> {\n if (!gitlab.authEnabled) return {};\n const ctx = requestContext.get('controller') as\n AgentControllerRequestContext<{ factoryProjectId?: string }> | undefined;\n if (!ctx) return {};\n const projectId = ctx.getState().factoryProjectId ?? ctx.resourceId;\n if (!projectId) return {};\n const orgId = await gitlab.resolveOrgId(projectId);\n if (!orgId || !(await gitlab.hasActiveConnections())) return {};\n return { gitlab_get_issue: createGitLabGetIssueTool(gitlab, { orgId, factoryProjectId: projectId }) };\n}\n"],"mappings":";;;;AAQA,SAAS,yBAAyB,QAA+B,OAAoD;CACnH,OAAO,WAAW;EAChB,IAAI;EACJ,aACE;EACF,aAAa,EAAE,OAAO,EACpB,OAAO,EACJ,OAAO,CAAC,CACR,KAAK,CAAC,CACN,IAAI,CAAC,CAAC,CACN,SAAS,2FAAyF,EACvG,CAAC;EACD,SAAS,OAAO,EAAE,YAA+B;GAC/C,IAAI;IACF,MAAM,SAAS,MAAM,OAAO,0BAA0B;KACpD,OAAO,MAAM;KACb,kBAAkB,MAAM;KACxB,SAAS;IACX,CAAC;IACD,IAAI,CAAC,QAAQ,OAAO,EAAE,OAAO,iBAAiB,MAAM,kBAAkB;IACtE,OAAO;GACT,SAAS,OAAO;IACd,IAAI,iBAAiB,kBAAkB,MAAM,SAAS,sBACpD,OAAO,EAAE,OAAO,OAAO,mBAAmB,EAAE;IAE9C,OAAO,EAAE,OAAO,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,IAAI;GAC5G;EACF;CACF,CAAC;AACH;AAEA,eAAsB,sBAAsB,EAC1C,gBACA,UAIuE;CACvE,IAAI,CAAC,OAAO,aAAa,OAAO,CAAC;CACjC,MAAM,MAAM,eAAe,IAAI,YAAY;CAE3C,IAAI,CAAC,KAAK,OAAO,CAAC;CAClB,MAAM,YAAY,IAAI,SAAS,CAAC,CAAC,oBAAoB,IAAI;CACzD,IAAI,CAAC,WAAW,OAAO,CAAC;CACxB,MAAM,QAAQ,MAAM,OAAO,aAAa,SAAS;CACjD,IAAI,CAAC,SAAS,CAAE,MAAM,OAAO,qBAAqB,GAAI,OAAO,CAAC;CAC9D,OAAO,EAAE,kBAAkB,yBAAyB,QAAQ;EAAE;EAAO,kBAAkB;CAAU,CAAC,EAAE;AACtG"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { PlatformApiClient } from '../platform/api-client.js';
|
|
2
|
+
export declare const GITLAB_PROJECTS_PAGE_SIZE = 100;
|
|
3
|
+
export declare const GITLAB_ISSUES_PAGE_SIZE = 30;
|
|
4
|
+
export declare const GITLAB_NOTES_PAGE_SIZE = 100;
|
|
5
|
+
export declare const GITLAB_MIN_ACCESS_LEVEL = 20;
|
|
6
|
+
export declare const GITLAB_MERGE_REQUESTS_PAGE_SIZE = 30;
|
|
7
|
+
export declare const GITLAB_DISCUSSIONS_PAGE_SIZE = 100;
|
|
8
|
+
export type GitLabApiErrorCode = 'gitlab_auth_failed' | 'gitlab_request_failed';
|
|
9
|
+
export declare class GitLabApiError extends Error {
|
|
10
|
+
readonly status: number | null;
|
|
11
|
+
readonly code: GitLabApiErrorCode;
|
|
12
|
+
constructor(message: string, status: number | null);
|
|
13
|
+
}
|
|
14
|
+
export interface GitLabProject {
|
|
15
|
+
id: number;
|
|
16
|
+
name: string;
|
|
17
|
+
path_with_namespace: string;
|
|
18
|
+
web_url: string;
|
|
19
|
+
default_branch?: string | null;
|
|
20
|
+
}
|
|
21
|
+
export interface GitLabUser {
|
|
22
|
+
id?: number;
|
|
23
|
+
name?: string | null;
|
|
24
|
+
username: string;
|
|
25
|
+
}
|
|
26
|
+
export interface GitLabLabelDetail {
|
|
27
|
+
name: string;
|
|
28
|
+
color: string;
|
|
29
|
+
text_color?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface GitLabIssue {
|
|
32
|
+
id: number;
|
|
33
|
+
iid: number;
|
|
34
|
+
project_id: number;
|
|
35
|
+
title: string;
|
|
36
|
+
description?: string | null;
|
|
37
|
+
state: 'opened' | 'closed';
|
|
38
|
+
web_url: string;
|
|
39
|
+
author?: GitLabUser | null;
|
|
40
|
+
assignee?: GitLabUser | null;
|
|
41
|
+
assignees?: GitLabUser[];
|
|
42
|
+
labels?: string[];
|
|
43
|
+
labelDetails?: GitLabLabelDetail[];
|
|
44
|
+
weight?: number | null;
|
|
45
|
+
user_notes_count?: number;
|
|
46
|
+
created_at: string;
|
|
47
|
+
updated_at: string;
|
|
48
|
+
}
|
|
49
|
+
export interface GitLabNote {
|
|
50
|
+
id: number;
|
|
51
|
+
body: string;
|
|
52
|
+
type?: string | null;
|
|
53
|
+
author?: GitLabUser | null;
|
|
54
|
+
created_at: string;
|
|
55
|
+
updated_at?: string;
|
|
56
|
+
system?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export interface GitLabDiffRefs {
|
|
59
|
+
base_sha: string;
|
|
60
|
+
start_sha: string;
|
|
61
|
+
head_sha: string;
|
|
62
|
+
}
|
|
63
|
+
export interface GitLabMergeRequest {
|
|
64
|
+
id: number;
|
|
65
|
+
iid: number;
|
|
66
|
+
project_id: number;
|
|
67
|
+
title: string;
|
|
68
|
+
description?: string | null;
|
|
69
|
+
state: 'opened' | 'closed' | 'merged' | 'locked';
|
|
70
|
+
web_url: string;
|
|
71
|
+
author?: GitLabUser | null;
|
|
72
|
+
assignees?: GitLabUser[];
|
|
73
|
+
reviewers?: GitLabUser[];
|
|
74
|
+
labels?: string[];
|
|
75
|
+
source_branch: string;
|
|
76
|
+
target_branch: string;
|
|
77
|
+
sha: string;
|
|
78
|
+
merge_commit_sha?: string | null;
|
|
79
|
+
squash_commit_sha?: string | null;
|
|
80
|
+
diff_refs?: GitLabDiffRefs | null;
|
|
81
|
+
merge_status?: string;
|
|
82
|
+
detailed_merge_status?: string;
|
|
83
|
+
draft?: boolean;
|
|
84
|
+
work_in_progress?: boolean;
|
|
85
|
+
merged_at?: string | null;
|
|
86
|
+
user_notes_count?: number;
|
|
87
|
+
created_at: string;
|
|
88
|
+
updated_at: string;
|
|
89
|
+
}
|
|
90
|
+
export interface GitLabMergeResult extends GitLabMergeRequest {
|
|
91
|
+
message?: string;
|
|
92
|
+
}
|
|
93
|
+
export interface GitLabDiscussionPosition {
|
|
94
|
+
position_type: 'text';
|
|
95
|
+
base_sha: string;
|
|
96
|
+
start_sha: string;
|
|
97
|
+
head_sha: string;
|
|
98
|
+
old_path: string;
|
|
99
|
+
new_path: string;
|
|
100
|
+
old_line?: number | null;
|
|
101
|
+
new_line?: number | null;
|
|
102
|
+
line_range?: {
|
|
103
|
+
start: GitLabDiscussionLine;
|
|
104
|
+
end: GitLabDiscussionLine;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export interface GitLabDiscussionLine {
|
|
108
|
+
line_code: string;
|
|
109
|
+
type: 'old' | 'new';
|
|
110
|
+
old_line?: number | null;
|
|
111
|
+
new_line?: number | null;
|
|
112
|
+
}
|
|
113
|
+
export interface GitLabDiscussionNote extends GitLabNote {
|
|
114
|
+
position?: GitLabDiscussionPosition | null;
|
|
115
|
+
resolvable?: boolean;
|
|
116
|
+
resolved?: boolean;
|
|
117
|
+
}
|
|
118
|
+
export interface GitLabDiscussion {
|
|
119
|
+
id: string;
|
|
120
|
+
individual_note?: boolean;
|
|
121
|
+
notes: GitLabDiscussionNote[];
|
|
122
|
+
}
|
|
123
|
+
export interface GitLabMergeRequestApprovals {
|
|
124
|
+
approved: boolean;
|
|
125
|
+
approvals_required?: number;
|
|
126
|
+
approvals_left?: number;
|
|
127
|
+
approved_by?: Array<{
|
|
128
|
+
user: GitLabUser;
|
|
129
|
+
}>;
|
|
130
|
+
}
|
|
131
|
+
export interface GitLabMember {
|
|
132
|
+
id: number;
|
|
133
|
+
username: string;
|
|
134
|
+
name?: string | null;
|
|
135
|
+
state?: string;
|
|
136
|
+
access_level?: number;
|
|
137
|
+
}
|
|
138
|
+
export interface GitLabApiClientConfig {
|
|
139
|
+
baseUrl: string;
|
|
140
|
+
accessToken: string;
|
|
141
|
+
fetchImpl?: typeof fetch;
|
|
142
|
+
}
|
|
143
|
+
export interface PlatformGitLabApiClientConfig {
|
|
144
|
+
client: PlatformApiClient;
|
|
145
|
+
connectionId: string;
|
|
146
|
+
}
|
|
147
|
+
export declare class GitLabApiClient {
|
|
148
|
+
#private;
|
|
149
|
+
constructor(config: GitLabApiClientConfig | PlatformGitLabApiClientConfig);
|
|
150
|
+
getCurrentUser(): Promise<GitLabUser>;
|
|
151
|
+
getProject(projectId: string): Promise<GitLabProject>;
|
|
152
|
+
listProjects(options?: {
|
|
153
|
+
page?: number;
|
|
154
|
+
}): Promise<GitLabProject[]>;
|
|
155
|
+
listIssues(projectId: string, options?: {
|
|
156
|
+
page?: number;
|
|
157
|
+
labels?: string[];
|
|
158
|
+
}): Promise<GitLabIssue[]>;
|
|
159
|
+
getIssue(projectId: string, issueIid: number): Promise<GitLabIssue>;
|
|
160
|
+
listNotes(projectId: string, issueIid: number, options?: {
|
|
161
|
+
page?: number;
|
|
162
|
+
}): Promise<GitLabNote[]>;
|
|
163
|
+
createNote(projectId: string, issueIid: number, body: string): Promise<GitLabNote>;
|
|
164
|
+
updateIssueState(projectId: string, issueIid: number, stateEvent: 'close' | 'reopen'): Promise<GitLabIssue>;
|
|
165
|
+
listMergeRequests(projectId: string, options?: {
|
|
166
|
+
page?: number;
|
|
167
|
+
state?: 'opened' | 'closed' | 'merged' | 'all';
|
|
168
|
+
}): Promise<GitLabMergeRequest[]>;
|
|
169
|
+
getMergeRequest(projectId: string, mergeRequestIid: number): Promise<GitLabMergeRequest>;
|
|
170
|
+
createMergeRequest(projectId: string, input: {
|
|
171
|
+
sourceBranch: string;
|
|
172
|
+
targetBranch: string;
|
|
173
|
+
title: string;
|
|
174
|
+
description?: string;
|
|
175
|
+
removeSourceBranch?: boolean;
|
|
176
|
+
squash?: boolean;
|
|
177
|
+
}): Promise<GitLabMergeRequest>;
|
|
178
|
+
updateMergeRequest(projectId: string, mergeRequestIid: number, input: {
|
|
179
|
+
title?: string;
|
|
180
|
+
description?: string;
|
|
181
|
+
targetBranch?: string;
|
|
182
|
+
stateEvent?: 'close' | 'reopen';
|
|
183
|
+
removeSourceBranch?: boolean;
|
|
184
|
+
squash?: boolean;
|
|
185
|
+
reviewerIds?: number[];
|
|
186
|
+
}): Promise<GitLabMergeRequest>;
|
|
187
|
+
mergeMergeRequest(projectId: string, mergeRequestIid: number, options?: {
|
|
188
|
+
squash?: boolean;
|
|
189
|
+
mergeCommitMessage?: string;
|
|
190
|
+
squashCommitMessage?: string;
|
|
191
|
+
shouldRemoveSourceBranch?: boolean;
|
|
192
|
+
}): Promise<GitLabMergeResult>;
|
|
193
|
+
listMergeRequestNotes(projectId: string, mergeRequestIid: number, options?: {
|
|
194
|
+
page?: number;
|
|
195
|
+
}): Promise<GitLabNote[]>;
|
|
196
|
+
createMergeRequestNote(projectId: string, mergeRequestIid: number, body: string): Promise<GitLabNote>;
|
|
197
|
+
getMergeRequestNote(projectId: string, mergeRequestIid: number, noteId: number): Promise<GitLabNote>;
|
|
198
|
+
updateMergeRequestNote(projectId: string, mergeRequestIid: number, noteId: number, body: string): Promise<GitLabNote>;
|
|
199
|
+
deleteMergeRequestNote(projectId: string, mergeRequestIid: number, noteId: number): Promise<void>;
|
|
200
|
+
listMergeRequestDiscussions(projectId: string, mergeRequestIid: number, options?: {
|
|
201
|
+
page?: number;
|
|
202
|
+
}): Promise<GitLabDiscussion[]>;
|
|
203
|
+
getMergeRequestDiscussion(projectId: string, mergeRequestIid: number, discussionId: string): Promise<GitLabDiscussion>;
|
|
204
|
+
resolveMergeRequestDiscussion(projectId: string, mergeRequestIid: number, discussionId: string, resolved: boolean): Promise<GitLabDiscussion>;
|
|
205
|
+
createMergeRequestDiscussion(projectId: string, mergeRequestIid: number, input: {
|
|
206
|
+
body: string;
|
|
207
|
+
commitId?: string;
|
|
208
|
+
position?: GitLabDiscussionPosition;
|
|
209
|
+
}): Promise<GitLabDiscussion>;
|
|
210
|
+
addMergeRequestDiscussionNote(projectId: string, mergeRequestIid: number, discussionId: string, body: string): Promise<GitLabDiscussionNote>;
|
|
211
|
+
updateMergeRequestDiscussionNote(projectId: string, mergeRequestIid: number, discussionId: string, noteId: number, body: string): Promise<GitLabDiscussionNote>;
|
|
212
|
+
deleteMergeRequestDiscussionNote(projectId: string, mergeRequestIid: number, discussionId: string, noteId: number): Promise<void>;
|
|
213
|
+
getMergeRequestApprovals(projectId: string, mergeRequestIid: number): Promise<GitLabMergeRequestApprovals>;
|
|
214
|
+
approveMergeRequest(projectId: string, mergeRequestIid: number, sha?: string): Promise<GitLabMergeRequest>;
|
|
215
|
+
unapproveMergeRequest(projectId: string, mergeRequestIid: number): Promise<GitLabMergeRequest>;
|
|
216
|
+
setMergeRequestReviewers(projectId: string, mergeRequestIid: number, reviewerIds: number[]): Promise<GitLabMergeRequest>;
|
|
217
|
+
listProjectMembers(projectId: string, options?: {
|
|
218
|
+
query?: string;
|
|
219
|
+
page?: number;
|
|
220
|
+
}): Promise<GitLabMember[]>;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/integrations/gitlab/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { PlatformApiError } from "../platform/api-client.js";
|
|
2
|
+
//#region src/integrations/gitlab/api.ts
|
|
3
|
+
const GITLAB_PROJECTS_PAGE_SIZE = 100;
|
|
4
|
+
const GITLAB_ISSUES_PAGE_SIZE = 30;
|
|
5
|
+
const GITLAB_NOTES_PAGE_SIZE = 100;
|
|
6
|
+
const GITLAB_MIN_ACCESS_LEVEL = 20;
|
|
7
|
+
const GITLAB_MERGE_REQUESTS_PAGE_SIZE = 30;
|
|
8
|
+
const GITLAB_DISCUSSIONS_PAGE_SIZE = 100;
|
|
9
|
+
var GitLabApiError = class extends Error {
|
|
10
|
+
status;
|
|
11
|
+
code;
|
|
12
|
+
constructor(message, status) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "GitLabApiError";
|
|
15
|
+
this.status = status;
|
|
16
|
+
this.code = status === 401 || status === 403 ? "gitlab_auth_failed" : "gitlab_request_failed";
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
var GitLabApiClient = class {
|
|
20
|
+
#direct;
|
|
21
|
+
#platform;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
if ("client" in config) {
|
|
24
|
+
if (!config.connectionId.trim()) throw new Error("GitLabApiClient is missing required config: connectionId.");
|
|
25
|
+
this.#direct = null;
|
|
26
|
+
this.#platform = config;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const accessToken = config.accessToken.trim();
|
|
30
|
+
if (!accessToken) throw new Error("GitLabApiClient is missing required config: accessToken.");
|
|
31
|
+
let url;
|
|
32
|
+
try {
|
|
33
|
+
url = new URL(config.baseUrl);
|
|
34
|
+
} catch {
|
|
35
|
+
throw new Error("GitLabApiClient baseUrl must be an absolute HTTP(S) URL.");
|
|
36
|
+
}
|
|
37
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") throw new Error("GitLabApiClient baseUrl must be an absolute HTTP(S) URL.");
|
|
38
|
+
if (url.username || url.password || url.search || url.hash) throw new Error("GitLabApiClient baseUrl must not include credentials, query, or fragment.");
|
|
39
|
+
const hostname = url.hostname.replace(/^\[|\]$/g, "").toLowerCase();
|
|
40
|
+
const isLoopback = hostname === "localhost" || hostname === "::1" || /^127(?:\.\d{1,3}){3}$/.test(hostname);
|
|
41
|
+
if (url.protocol === "http:" && !isLoopback) throw new Error("GitLabApiClient baseUrl must use HTTPS unless it targets a loopback host.");
|
|
42
|
+
this.#direct = {
|
|
43
|
+
baseUrl: config.baseUrl.replace(/\/+$/, ""),
|
|
44
|
+
accessToken,
|
|
45
|
+
fetch: config.fetchImpl ?? globalThis.fetch
|
|
46
|
+
};
|
|
47
|
+
this.#platform = null;
|
|
48
|
+
}
|
|
49
|
+
async getCurrentUser() {
|
|
50
|
+
return this.#request("GET", "/api/v4/user");
|
|
51
|
+
}
|
|
52
|
+
async getProject(projectId) {
|
|
53
|
+
return this.#request("GET", `/api/v4/projects/${encodeURIComponent(projectId)}`);
|
|
54
|
+
}
|
|
55
|
+
async listProjects(options = {}) {
|
|
56
|
+
return this.#request("GET", "/api/v4/projects", { query: {
|
|
57
|
+
membership: "true",
|
|
58
|
+
simple: "true",
|
|
59
|
+
with_issues_enabled: "true",
|
|
60
|
+
min_access_level: 20,
|
|
61
|
+
order_by: "last_activity_at",
|
|
62
|
+
sort: "desc",
|
|
63
|
+
page: options.page ?? 1,
|
|
64
|
+
per_page: 100
|
|
65
|
+
} });
|
|
66
|
+
}
|
|
67
|
+
async listIssues(projectId, options = {}) {
|
|
68
|
+
return (await this.#request("GET", `/api/v4/projects/${encodeURIComponent(projectId)}/issues`, { query: {
|
|
69
|
+
state: "opened",
|
|
70
|
+
scope: "all",
|
|
71
|
+
order_by: "updated_at",
|
|
72
|
+
sort: "desc",
|
|
73
|
+
page: options.page ?? 1,
|
|
74
|
+
per_page: 30,
|
|
75
|
+
labels: options.labels?.length ? options.labels.join(",") : void 0,
|
|
76
|
+
with_labels_details: "true"
|
|
77
|
+
} })).map(normalizeIssue);
|
|
78
|
+
}
|
|
79
|
+
async getIssue(projectId, issueIid) {
|
|
80
|
+
const issue = (await this.#request("GET", `/api/v4/projects/${encodeURIComponent(projectId)}/issues`, { query: {
|
|
81
|
+
"iids[]": issueIid,
|
|
82
|
+
state: "all",
|
|
83
|
+
scope: "all",
|
|
84
|
+
with_labels_details: "true"
|
|
85
|
+
} })).find((candidate) => candidate.iid === issueIid);
|
|
86
|
+
if (!issue) throw new GitLabApiError(`GitLab issue ${issueIid} was not found`, 404);
|
|
87
|
+
return normalizeIssue(issue);
|
|
88
|
+
}
|
|
89
|
+
async listNotes(projectId, issueIid, options = {}) {
|
|
90
|
+
return this.#request("GET", `/api/v4/projects/${encodeURIComponent(projectId)}/issues/${issueIid}/notes`, { query: {
|
|
91
|
+
order_by: "created_at",
|
|
92
|
+
sort: "asc",
|
|
93
|
+
page: options.page ?? 1,
|
|
94
|
+
per_page: 100
|
|
95
|
+
} });
|
|
96
|
+
}
|
|
97
|
+
async createNote(projectId, issueIid, body) {
|
|
98
|
+
return this.#request("POST", `/api/v4/projects/${encodeURIComponent(projectId)}/issues/${issueIid}/notes`, { body: { body } });
|
|
99
|
+
}
|
|
100
|
+
async updateIssueState(projectId, issueIid, stateEvent) {
|
|
101
|
+
return this.#request("PUT", `/api/v4/projects/${encodeURIComponent(projectId)}/issues/${issueIid}`, { body: { state_event: stateEvent } });
|
|
102
|
+
}
|
|
103
|
+
async listMergeRequests(projectId, options = {}) {
|
|
104
|
+
return this.#request("GET", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests`, { query: {
|
|
105
|
+
state: options.state ?? "opened",
|
|
106
|
+
order_by: "updated_at",
|
|
107
|
+
sort: "desc",
|
|
108
|
+
page: options.page ?? 1,
|
|
109
|
+
per_page: 30
|
|
110
|
+
} });
|
|
111
|
+
}
|
|
112
|
+
async getMergeRequest(projectId, mergeRequestIid) {
|
|
113
|
+
return this.#request("GET", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}`);
|
|
114
|
+
}
|
|
115
|
+
async createMergeRequest(projectId, input) {
|
|
116
|
+
return this.#request("POST", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests`, { body: {
|
|
117
|
+
source_branch: input.sourceBranch,
|
|
118
|
+
target_branch: input.targetBranch,
|
|
119
|
+
title: input.title,
|
|
120
|
+
description: input.description,
|
|
121
|
+
remove_source_branch: input.removeSourceBranch,
|
|
122
|
+
squash: input.squash
|
|
123
|
+
} });
|
|
124
|
+
}
|
|
125
|
+
async updateMergeRequest(projectId, mergeRequestIid, input) {
|
|
126
|
+
return this.#request("PUT", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}`, { body: {
|
|
127
|
+
title: input.title,
|
|
128
|
+
description: input.description,
|
|
129
|
+
target_branch: input.targetBranch,
|
|
130
|
+
state_event: input.stateEvent,
|
|
131
|
+
remove_source_branch: input.removeSourceBranch,
|
|
132
|
+
squash: input.squash,
|
|
133
|
+
reviewer_ids: input.reviewerIds
|
|
134
|
+
} });
|
|
135
|
+
}
|
|
136
|
+
async mergeMergeRequest(projectId, mergeRequestIid, options = {}) {
|
|
137
|
+
return this.#request("PUT", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/merge`, { body: {
|
|
138
|
+
squash: options.squash,
|
|
139
|
+
merge_commit_message: options.mergeCommitMessage,
|
|
140
|
+
squash_commit_message: options.squashCommitMessage,
|
|
141
|
+
should_remove_source_branch: options.shouldRemoveSourceBranch
|
|
142
|
+
} });
|
|
143
|
+
}
|
|
144
|
+
async listMergeRequestNotes(projectId, mergeRequestIid, options = {}) {
|
|
145
|
+
return this.#request("GET", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes`, { query: {
|
|
146
|
+
order_by: "created_at",
|
|
147
|
+
sort: "asc",
|
|
148
|
+
page: options.page ?? 1,
|
|
149
|
+
per_page: 100
|
|
150
|
+
} });
|
|
151
|
+
}
|
|
152
|
+
async createMergeRequestNote(projectId, mergeRequestIid, body) {
|
|
153
|
+
return this.#request("POST", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes`, { body: { body } });
|
|
154
|
+
}
|
|
155
|
+
async getMergeRequestNote(projectId, mergeRequestIid, noteId) {
|
|
156
|
+
return this.#request("GET", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes/${noteId}`);
|
|
157
|
+
}
|
|
158
|
+
async updateMergeRequestNote(projectId, mergeRequestIid, noteId, body) {
|
|
159
|
+
return this.#request("PUT", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes/${noteId}`, { body: { body } });
|
|
160
|
+
}
|
|
161
|
+
async deleteMergeRequestNote(projectId, mergeRequestIid, noteId) {
|
|
162
|
+
await this.#request("DELETE", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes/${noteId}`);
|
|
163
|
+
}
|
|
164
|
+
async listMergeRequestDiscussions(projectId, mergeRequestIid, options = {}) {
|
|
165
|
+
return this.#request("GET", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions`, { query: {
|
|
166
|
+
page: options.page ?? 1,
|
|
167
|
+
per_page: 100
|
|
168
|
+
} });
|
|
169
|
+
}
|
|
170
|
+
async getMergeRequestDiscussion(projectId, mergeRequestIid, discussionId) {
|
|
171
|
+
return this.#request("GET", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}`);
|
|
172
|
+
}
|
|
173
|
+
async resolveMergeRequestDiscussion(projectId, mergeRequestIid, discussionId, resolved) {
|
|
174
|
+
return this.#request("PUT", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}`, { body: { resolved } });
|
|
175
|
+
}
|
|
176
|
+
async createMergeRequestDiscussion(projectId, mergeRequestIid, input) {
|
|
177
|
+
return this.#request("POST", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions`, { body: {
|
|
178
|
+
body: input.body,
|
|
179
|
+
commit_id: input.commitId,
|
|
180
|
+
position: input.position
|
|
181
|
+
} });
|
|
182
|
+
}
|
|
183
|
+
async addMergeRequestDiscussionNote(projectId, mergeRequestIid, discussionId, body) {
|
|
184
|
+
return this.#request("POST", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}/notes`, { body: { body } });
|
|
185
|
+
}
|
|
186
|
+
async updateMergeRequestDiscussionNote(projectId, mergeRequestIid, discussionId, noteId, body) {
|
|
187
|
+
return this.#request("PUT", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}/notes/${noteId}`, { body: { body } });
|
|
188
|
+
}
|
|
189
|
+
async deleteMergeRequestDiscussionNote(projectId, mergeRequestIid, discussionId, noteId) {
|
|
190
|
+
await this.#request("DELETE", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions/${encodeURIComponent(discussionId)}/notes/${noteId}`);
|
|
191
|
+
}
|
|
192
|
+
async getMergeRequestApprovals(projectId, mergeRequestIid) {
|
|
193
|
+
return this.#request("GET", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/approvals`);
|
|
194
|
+
}
|
|
195
|
+
async approveMergeRequest(projectId, mergeRequestIid, sha) {
|
|
196
|
+
return this.#request("POST", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/approve`, sha ? { body: { sha } } : void 0);
|
|
197
|
+
}
|
|
198
|
+
async unapproveMergeRequest(projectId, mergeRequestIid) {
|
|
199
|
+
return this.#request("POST", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/unapprove`);
|
|
200
|
+
}
|
|
201
|
+
async setMergeRequestReviewers(projectId, mergeRequestIid, reviewerIds) {
|
|
202
|
+
return this.#request("PUT", `/api/v4/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}`, { body: { reviewer_ids: reviewerIds } });
|
|
203
|
+
}
|
|
204
|
+
async listProjectMembers(projectId, options = {}) {
|
|
205
|
+
return this.#request("GET", `/api/v4/projects/${encodeURIComponent(projectId)}/members/all`, { query: {
|
|
206
|
+
query: options.query,
|
|
207
|
+
page: options.page ?? 1,
|
|
208
|
+
per_page: 100
|
|
209
|
+
} });
|
|
210
|
+
}
|
|
211
|
+
async #request(method, path, options = {}) {
|
|
212
|
+
const query = new URLSearchParams();
|
|
213
|
+
for (const [key, value] of Object.entries(options.query ?? {})) if (value !== void 0) query.set(key, String(value));
|
|
214
|
+
const suffix = query.size > 0 ? `?${query.toString()}` : "";
|
|
215
|
+
const apiPath = path.replace(/^\/api\/v4\/projects\/([^/]+)/, (full, encoded) => {
|
|
216
|
+
const target = decodeURIComponent(encoded);
|
|
217
|
+
const match = /^(\d+):(.+)$/.exec(target);
|
|
218
|
+
return match ? `/api/v4/projects/${encodeURIComponent(match[1])}` : full;
|
|
219
|
+
});
|
|
220
|
+
if (this.#platform) {
|
|
221
|
+
const proxyPath = `/v2/connections/${encodeURIComponent(this.#platform.connectionId)}/proxy${apiPath}${suffix}`;
|
|
222
|
+
try {
|
|
223
|
+
return await this.#platform.client.request(method, proxyPath, options.body);
|
|
224
|
+
} catch (error) {
|
|
225
|
+
if (error instanceof PlatformApiError) throw new GitLabApiError(error.message, error.status);
|
|
226
|
+
throw new GitLabApiError(error instanceof Error ? error.message : String(error), null);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const direct = this.#direct;
|
|
230
|
+
const headers = {
|
|
231
|
+
accept: "application/json",
|
|
232
|
+
"private-token": direct.accessToken
|
|
233
|
+
};
|
|
234
|
+
const init = {
|
|
235
|
+
method,
|
|
236
|
+
headers,
|
|
237
|
+
signal: AbortSignal.timeout(15e3)
|
|
238
|
+
};
|
|
239
|
+
if (options.body !== void 0) {
|
|
240
|
+
headers["content-type"] = "application/json";
|
|
241
|
+
init.body = JSON.stringify(options.body);
|
|
242
|
+
}
|
|
243
|
+
let response;
|
|
244
|
+
try {
|
|
245
|
+
response = await direct.fetch(`${direct.baseUrl}${apiPath}${suffix}`, init);
|
|
246
|
+
} catch (error) {
|
|
247
|
+
throw new GitLabApiError((error instanceof Error ? error.message : String(error)).split(direct.accessToken).join("[REDACTED]"), null);
|
|
248
|
+
}
|
|
249
|
+
if (!response.ok) throw new GitLabApiError((await extractError(response)).split(direct.accessToken).join("[REDACTED]"), response.status);
|
|
250
|
+
if (response.status === 204) return void 0;
|
|
251
|
+
return await response.json();
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
async function extractError(response) {
|
|
255
|
+
try {
|
|
256
|
+
const data = await response.clone().json();
|
|
257
|
+
if (typeof data.message === "string" && data.message) return data.message;
|
|
258
|
+
if (typeof data.error === "string" && data.error) return data.error;
|
|
259
|
+
} catch {}
|
|
260
|
+
return `GitLab API request failed (${response.status})`;
|
|
261
|
+
}
|
|
262
|
+
function normalizeIssue(response) {
|
|
263
|
+
const { labels, ...issue } = response;
|
|
264
|
+
const labelDetails = (labels ?? []).filter((label) => typeof label !== "string");
|
|
265
|
+
return {
|
|
266
|
+
...issue,
|
|
267
|
+
labels: (labels ?? []).map((label) => typeof label === "string" ? label : label.name),
|
|
268
|
+
...labelDetails.length > 0 ? { labelDetails } : {}
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
//#endregion
|
|
272
|
+
export { GITLAB_DISCUSSIONS_PAGE_SIZE, GITLAB_ISSUES_PAGE_SIZE, GITLAB_MERGE_REQUESTS_PAGE_SIZE, GITLAB_MIN_ACCESS_LEVEL, GITLAB_NOTES_PAGE_SIZE, GITLAB_PROJECTS_PAGE_SIZE, GitLabApiClient, GitLabApiError };
|
|
273
|
+
|
|
274
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +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[]>(\n 'GET',\n `/api/v4/projects/${encodeURIComponent(projectId)}/members/all`,\n {\n query: {\n query: options.query,\n page: options.page ?? 1,\n per_page: GITLAB_DISCUSSIONS_PAGE_SIZE,\n },\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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"}
|