gitlab-mcp 1.4.1 → 1.5.1

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/dist/http.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { createServer } from "node:http";
3
3
  import { env } from "./config/env.js";
4
4
  import { GitLabClient } from "./lib/gitlab-client.js";
5
+ import { assertSafeHttpAuthConfig } from "./lib/http-auth-guard.js";
5
6
  import { logger } from "./lib/logger.js";
6
7
  import { configureNetworkRuntime } from "./lib/network.js";
7
8
  import { OutputFormatter } from "./lib/output.js";
@@ -12,15 +13,23 @@ import { setupMcpHttpApp } from "./http-app.js";
12
13
  /* ------------------------------------------------------------------ */
13
14
  /* Module entry point */
14
15
  /* ------------------------------------------------------------------ */
16
+ assertSafeHttpAuthConfig(env);
15
17
  const requestRuntime = new GitLabRequestRuntime(env, logger);
16
18
  configureNetworkRuntime(env, logger);
19
+ const defaultToken = env.GITLAB_PERSONAL_ACCESS_TOKEN ?? env.GITLAB_JOB_TOKEN;
20
+ const defaultAuthHeader = env.GITLAB_PERSONAL_ACCESS_TOKEN
21
+ ? undefined
22
+ : env.GITLAB_JOB_TOKEN
23
+ ? "job-token"
24
+ : undefined;
17
25
  const context = {
18
26
  env,
19
27
  logger,
20
- gitlab: new GitLabClient(env.GITLAB_API_URL, env.GITLAB_PERSONAL_ACCESS_TOKEN, {
28
+ gitlab: new GitLabClient(env.GITLAB_API_URL, defaultToken, {
21
29
  apiUrls: env.GITLAB_API_URLS,
22
30
  timeoutMs: env.GITLAB_HTTP_TIMEOUT_MS,
23
31
  maxLocalFileBytes: env.GITLAB_MAX_LOCAL_FILE_BYTES,
32
+ defaultAuthHeader,
24
33
  beforeRequest: (requestContext) => requestRuntime.beforeRequest(requestContext)
25
34
  }),
26
35
  policy: new ToolPolicyEngine({
package/dist/http.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -13,13 +13,20 @@ async function main() {
13
13
  const deniedToolsRegex = compileDeniedToolsRegex(env.GITLAB_DENIED_TOOLS_REGEX, logger);
14
14
  configureNetworkRuntime(env, logger);
15
15
  const requestRuntime = new GitLabRequestRuntime(env, logger);
16
+ const defaultToken = env.GITLAB_PERSONAL_ACCESS_TOKEN ?? env.GITLAB_JOB_TOKEN;
17
+ const defaultAuthHeader = env.GITLAB_PERSONAL_ACCESS_TOKEN
18
+ ? undefined
19
+ : env.GITLAB_JOB_TOKEN
20
+ ? "job-token"
21
+ : undefined;
16
22
  const context = {
17
23
  env,
18
24
  logger,
19
- gitlab: new GitLabClient(env.GITLAB_API_URL, env.GITLAB_PERSONAL_ACCESS_TOKEN, {
25
+ gitlab: new GitLabClient(env.GITLAB_API_URL, defaultToken, {
20
26
  apiUrls: env.GITLAB_API_URLS,
21
27
  timeoutMs: env.GITLAB_HTTP_TIMEOUT_MS,
22
28
  maxLocalFileBytes: env.GITLAB_MAX_LOCAL_FILE_BYTES,
29
+ defaultAuthHeader,
23
30
  beforeRequest: (requestContext) => requestRuntime.beforeRequest(requestContext)
24
31
  }),
25
32
  policy: new ToolPolicyEngine({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { GitLabAuthHeader } from "../types/auth.js";
2
+ export interface DownloadTokenAuth {
3
+ header: GitLabAuthHeader;
4
+ token: string;
5
+ apiUrl?: string;
6
+ }
7
+ export interface DownloadTokenResource {
8
+ type: string;
9
+ params: Record<string, string>;
10
+ }
11
+ export interface DownloadTokenPayload extends DownloadTokenAuth {
12
+ expiresAt: number;
13
+ resource: DownloadTokenResource;
14
+ }
15
+ export declare function createDownloadToken(auth: DownloadTokenAuth, resource: DownloadTokenResource, options: {
16
+ secret?: string;
17
+ ttlSeconds: number;
18
+ now?: number;
19
+ }): string;
20
+ export declare function decryptDownloadToken(token: string, options: {
21
+ secret?: string;
22
+ now?: number;
23
+ }): DownloadTokenPayload | undefined;
24
+ export declare function downloadTokenResourceMatches(payload: DownloadTokenPayload, resource: DownloadTokenResource): boolean;
@@ -0,0 +1,84 @@
1
+ import { createCipheriv, createDecipheriv, createHash, randomBytes } from "node:crypto";
2
+ export function createDownloadToken(auth, resource, options) {
3
+ const key = deriveDownloadTokenKey(options.secret);
4
+ const iv = randomBytes(12);
5
+ const cipher = createCipheriv("aes-256-gcm", key, iv);
6
+ const payload = JSON.stringify({
7
+ h: auth.header,
8
+ t: auth.token,
9
+ u: auth.apiUrl,
10
+ e: Math.floor((options.now ?? Date.now()) / 1000) + options.ttlSeconds,
11
+ r: resource.type,
12
+ p: resource.params
13
+ });
14
+ const encrypted = Buffer.concat([cipher.update(payload, "utf8"), cipher.final()]);
15
+ const tag = cipher.getAuthTag();
16
+ return Buffer.concat([iv, tag, encrypted]).toString("base64url");
17
+ }
18
+ export function decryptDownloadToken(token, options) {
19
+ try {
20
+ const bytes = Buffer.from(token, "base64url");
21
+ if (bytes.length < 29) {
22
+ return undefined;
23
+ }
24
+ const key = deriveDownloadTokenKey(options.secret);
25
+ const iv = bytes.subarray(0, 12);
26
+ const tag = bytes.subarray(12, 28);
27
+ const encrypted = bytes.subarray(28);
28
+ const decipher = createDecipheriv("aes-256-gcm", key, iv);
29
+ decipher.setAuthTag(tag);
30
+ const raw = Buffer.concat([decipher.update(encrypted), decipher.final()]).toString("utf8");
31
+ const parsed = JSON.parse(raw);
32
+ if (!isGitLabAuthHeader(parsed.h) || typeof parsed.t !== "string") {
33
+ return undefined;
34
+ }
35
+ if (typeof parsed.e !== "number") {
36
+ return undefined;
37
+ }
38
+ if (Math.floor((options.now ?? Date.now()) / 1000) > parsed.e) {
39
+ return undefined;
40
+ }
41
+ if (typeof parsed.r !== "string" || !isStringRecord(parsed.p)) {
42
+ return undefined;
43
+ }
44
+ return {
45
+ header: parsed.h,
46
+ token: parsed.t,
47
+ apiUrl: typeof parsed.u === "string" ? parsed.u : undefined,
48
+ expiresAt: parsed.e,
49
+ resource: {
50
+ type: parsed.r,
51
+ params: parsed.p
52
+ }
53
+ };
54
+ }
55
+ catch {
56
+ return undefined;
57
+ }
58
+ }
59
+ export function downloadTokenResourceMatches(payload, resource) {
60
+ if (payload.resource.type !== resource.type) {
61
+ return false;
62
+ }
63
+ return stableStringify(payload.resource.params) === stableStringify(resource.params);
64
+ }
65
+ function deriveDownloadTokenKey(secret) {
66
+ if (secret && secret.trim().length > 0) {
67
+ return createHash("sha256").update(secret).digest();
68
+ }
69
+ return processKey;
70
+ }
71
+ function isGitLabAuthHeader(value) {
72
+ return value === "authorization" || value === "private-token" || value === "job-token";
73
+ }
74
+ function isStringRecord(value) {
75
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
76
+ return false;
77
+ }
78
+ return Object.values(value).every((item) => typeof item === "string");
79
+ }
80
+ function stableStringify(value) {
81
+ return JSON.stringify(Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right))));
82
+ }
83
+ const processKey = randomBytes(32);
84
+ //# sourceMappingURL=download-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download-token.js","sourceRoot":"","sources":["../../src/lib/download-token.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export interface GitLabClientOptions {
6
6
  maxAttachmentBytes?: number;
7
7
  maxLocalFileBytes?: number;
8
8
  maxResponseBodyBytes?: number;
9
+ defaultAuthHeader?: GitLabAuthHeader;
9
10
  beforeRequest?: (context: GitLabBeforeRequestContext) => Promise<GitLabBeforeRequestResult | void>;
10
11
  }
11
12
  export interface GitLabRequestOptions {
@@ -89,6 +90,7 @@ export declare class GitLabClient {
89
90
  private readonly apiUrls;
90
91
  private nextApiUrlIndex;
91
92
  private readonly defaultToken?;
93
+ private readonly defaultAuthHeader?;
92
94
  private readonly timeoutMs;
93
95
  private readonly maxAttachmentBytes;
94
96
  private readonly maxLocalFileBytes;
@@ -106,6 +108,13 @@ export declare class GitLabClient {
106
108
  namespace_id?: string | number;
107
109
  default_branch?: string;
108
110
  }, options?: GitLabRequestOptions): Promise<unknown>;
111
+ createGroup(payload: {
112
+ name: string;
113
+ path: string;
114
+ description?: string;
115
+ visibility?: "private" | "internal" | "public";
116
+ parent_id?: number;
117
+ }, options?: GitLabRequestOptions): Promise<unknown>;
109
118
  listProjectMembers(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
110
119
  listGroupProjects(groupId: string, options?: GitLabRequestOptions): Promise<unknown>;
111
120
  forkRepository(projectId: string, payload?: {
@@ -119,9 +128,12 @@ export declare class GitLabClient {
119
128
  }, options?: GitLabRequestOptions): Promise<unknown>;
120
129
  searchProjects(search: string, limit?: number, options?: GitLabRequestOptions): Promise<unknown>;
121
130
  searchRepositories(search: string, options?: GitLabRequestOptions): Promise<unknown>;
131
+ searchCode(search: string, options?: GitLabRequestOptions): Promise<unknown>;
122
132
  searchCodeBlobs(projectId: string, search: string, options?: GitLabRequestOptions): Promise<unknown>;
133
+ searchGroupCodeBlobs(groupId: string, search: string, options?: GitLabRequestOptions): Promise<unknown>;
123
134
  getRepositoryTree(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
124
135
  getFileContents(projectId: string, filePath: string, ref: string, options?: GitLabRequestOptions): Promise<unknown>;
136
+ getFileBlame(projectId: string, filePath: string, ref: string, options?: GitLabRequestOptions): Promise<unknown>;
125
137
  createOrUpdateFile(projectId: string, filePath: string, payload: {
126
138
  branch: string;
127
139
  content: string;
@@ -146,6 +158,9 @@ export declare class GitLabClient {
146
158
  branch: string;
147
159
  ref: string;
148
160
  }, options?: GitLabRequestOptions): Promise<unknown>;
161
+ listBranches(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
162
+ getBranch(projectId: string, branch: string, options?: GitLabRequestOptions): Promise<unknown>;
163
+ deleteBranch(projectId: string, branch: string, options?: GitLabRequestOptions): Promise<unknown>;
149
164
  getBranchDiffs(projectId: string, payload: {
150
165
  from: string;
151
166
  to: string;
@@ -154,9 +169,14 @@ export declare class GitLabClient {
154
169
  listCommits(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
155
170
  getCommit(projectId: string, sha: string, options?: GitLabRequestOptions): Promise<unknown>;
156
171
  getCommitDiff(projectId: string, sha: string, options?: GitLabRequestOptions): Promise<unknown>;
172
+ listCommitStatuses(projectId: string, sha: string, options?: GitLabRequestOptions): Promise<unknown>;
173
+ createCommitStatus(projectId: string, sha: string, payload: Record<string, string | number | boolean | null | undefined>, options?: GitLabRequestOptions): Promise<unknown>;
157
174
  listMergeRequests(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
158
175
  listGlobalMergeRequests(options?: GitLabRequestOptions): Promise<unknown>;
159
176
  getMergeRequest(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
177
+ countMergeRequestCommits(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<number>;
178
+ listMergeRequestCommits(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
179
+ listMergeRequestPipelines(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
160
180
  createMergeRequest(projectId: string, payload: {
161
181
  source_branch: string;
162
182
  target_branch: string;
@@ -200,6 +220,20 @@ export declare class GitLabClient {
200
220
  listMergeRequestNotes(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
201
221
  getMergeRequestNote(projectId: string, mergeRequestIid: string, noteId: string, options?: GitLabRequestOptions): Promise<unknown>;
202
222
  createMergeRequestNote(projectId: string, mergeRequestIid: string, body: string, options?: GitLabRequestOptions): Promise<unknown>;
223
+ listMergeRequestEmojiReactions(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
224
+ createMergeRequestEmojiReaction(projectId: string, mergeRequestIid: string, name: string, options?: GitLabRequestOptions): Promise<unknown>;
225
+ deleteMergeRequestEmojiReaction(projectId: string, mergeRequestIid: string, awardId: string, options?: GitLabRequestOptions): Promise<unknown>;
226
+ listMergeRequestNoteEmojiReactions(projectId: string, mergeRequestIid: string, noteId: string, payload?: {
227
+ discussion_id?: string;
228
+ }, options?: GitLabRequestOptions): Promise<unknown>;
229
+ createMergeRequestNoteEmojiReaction(projectId: string, mergeRequestIid: string, noteId: string, payload: {
230
+ name: string;
231
+ discussion_id?: string;
232
+ }, options?: GitLabRequestOptions): Promise<unknown>;
233
+ deleteMergeRequestNoteEmojiReaction(projectId: string, mergeRequestIid: string, noteId: string, payload: {
234
+ award_id: string;
235
+ discussion_id?: string;
236
+ }, options?: GitLabRequestOptions): Promise<unknown>;
203
237
  getDraftNote(projectId: string, mergeRequestIid: string, draftNoteId: string, options?: GitLabRequestOptions): Promise<unknown>;
204
238
  listDraftNotes(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
205
239
  createDraftNote(projectId: string, mergeRequestIid: string, payload: {
@@ -247,12 +281,29 @@ export declare class GitLabClient {
247
281
  page?: number;
248
282
  scope?: string;
249
283
  }, options?: GitLabRequestOptions): Promise<unknown>;
284
+ listTodos(options?: GitLabRequestOptions): Promise<unknown>;
285
+ markTodoDone(todoId: string, options?: GitLabRequestOptions): Promise<unknown>;
286
+ markAllTodosDone(options?: GitLabRequestOptions): Promise<unknown>;
250
287
  listIssueDiscussions(projectId: string, issueIid: string, options?: GitLabRequestOptions): Promise<unknown>;
251
288
  createIssueNote(projectId: string, issueIid: string, payload: {
252
289
  body: string;
253
290
  discussion_id?: string;
254
291
  created_at?: string;
255
292
  }, options?: GitLabRequestOptions): Promise<unknown>;
293
+ listIssueEmojiReactions(projectId: string, issueIid: string, options?: GitLabRequestOptions): Promise<unknown>;
294
+ createIssueEmojiReaction(projectId: string, issueIid: string, name: string, options?: GitLabRequestOptions): Promise<unknown>;
295
+ deleteIssueEmojiReaction(projectId: string, issueIid: string, awardId: string, options?: GitLabRequestOptions): Promise<unknown>;
296
+ listIssueNoteEmojiReactions(projectId: string, issueIid: string, noteId: string, payload?: {
297
+ discussion_id?: string;
298
+ }, options?: GitLabRequestOptions): Promise<unknown>;
299
+ createIssueNoteEmojiReaction(projectId: string, issueIid: string, noteId: string, payload: {
300
+ name: string;
301
+ discussion_id?: string;
302
+ }, options?: GitLabRequestOptions): Promise<unknown>;
303
+ deleteIssueNoteEmojiReaction(projectId: string, issueIid: string, noteId: string, payload: {
304
+ award_id: string;
305
+ discussion_id?: string;
306
+ }, options?: GitLabRequestOptions): Promise<unknown>;
256
307
  updateIssueNote(projectId: string, issueIid: string, discussionId: string, noteId: string, payload: {
257
308
  body?: string;
258
309
  resolved?: boolean;
@@ -278,6 +329,11 @@ export declare class GitLabClient {
278
329
  format?: "markdown" | "rdoc" | "asciidoc" | "org";
279
330
  }, options?: GitLabRequestOptions): Promise<unknown>;
280
331
  deleteWikiPage(projectId: string, slug: string, options?: GitLabRequestOptions): Promise<unknown>;
332
+ listGroupWikiPages(groupId: string, options?: GitLabRequestOptions): Promise<unknown>;
333
+ getGroupWikiPage(groupId: string, slug: string, options?: GitLabRequestOptions): Promise<unknown>;
334
+ createGroupWikiPage(groupId: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
335
+ updateGroupWikiPage(groupId: string, slug: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
336
+ deleteGroupWikiPage(groupId: string, slug: string, options?: GitLabRequestOptions): Promise<unknown>;
281
337
  listPipelines(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
282
338
  getPipeline(projectId: string, pipelineId: string, options?: GitLabRequestOptions): Promise<unknown>;
283
339
  listDeployments(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
@@ -288,6 +344,8 @@ export declare class GitLabClient {
288
344
  listPipelineTriggerJobs(projectId: string, pipelineId: string, options?: GitLabRequestOptions): Promise<unknown>;
289
345
  getPipelineJob(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<unknown>;
290
346
  getPipelineJobOutput(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<unknown>;
347
+ validateCiLint(projectId: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
348
+ validateProjectCiLint(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
291
349
  listJobArtifacts(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<unknown>;
292
350
  downloadJobArtifacts(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<GitLabDownloadedFile>;
293
351
  saveJobArtifacts(projectId: string, jobId: string, localPath?: string, options?: GitLabRequestOptions): Promise<GitLabSavedFile>;
@@ -327,7 +385,12 @@ export declare class GitLabClient {
327
385
  updateRelease(projectId: string, tagName: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
328
386
  deleteRelease(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
329
387
  createReleaseEvidence(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
330
- downloadReleaseAsset(projectId: string, tagName: string, directAssetPath: string, options?: GitLabRequestOptions): Promise<unknown>;
388
+ downloadReleaseAsset(projectId: string, tagName: string, directAssetPath: string, options?: GitLabRequestOptions): Promise<GitLabDownloadedFile>;
389
+ listTags(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
390
+ getTag(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
391
+ createTag(projectId: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
392
+ deleteTag(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
393
+ getTagSignature(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
331
394
  listLabels(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
332
395
  getLabel(projectId: string, labelId: string, options?: GitLabRequestOptions): Promise<unknown>;
333
396
  createLabel(projectId: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
@@ -338,8 +401,18 @@ export declare class GitLabClient {
338
401
  getNamespace(namespaceIdOrPath: string, options?: GitLabRequestOptions): Promise<unknown>;
339
402
  verifyNamespace(pathName: string, options?: GitLabRequestOptions): Promise<unknown>;
340
403
  getUsers(options?: GitLabRequestOptions): Promise<unknown>;
404
+ getUser(userId: string, options?: GitLabRequestOptions): Promise<unknown>;
405
+ whoami(options?: GitLabRequestOptions): Promise<unknown>;
341
406
  listEvents(options?: GitLabRequestOptions): Promise<unknown>;
342
407
  getProjectEvents(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
408
+ listWebhooks(scope: {
409
+ projectId?: string;
410
+ groupId?: string;
411
+ }, options?: GitLabRequestOptions): Promise<unknown>;
412
+ listWebhookEvents(scope: {
413
+ projectId?: string;
414
+ groupId?: string;
415
+ }, hookId: string, options?: GitLabRequestOptions): Promise<unknown>;
343
416
  uploadMarkdown(projectId: string, content: string, filename: string, options?: GitLabRequestOptions): Promise<unknown>;
344
417
  uploadMarkdownFile(projectId: string, filePath: string, options?: GitLabRequestOptions): Promise<unknown>;
345
418
  downloadAttachment(urlOrPath: string, options?: GitLabRequestOptions): Promise<GitLabDownloadedFile>;
@@ -355,9 +428,13 @@ export declare class GitLabClient {
355
428
  delete(path: string, options?: GitLabRequestOptions): Promise<unknown>;
356
429
  private request;
357
430
  private rawRequest;
431
+ private parseApiResponse;
358
432
  private parseResponseBody;
359
433
  private resolveRequestConfig;
360
434
  private pickApiUrl;
435
+ private webhookBasePath;
436
+ private awardEmojiPath;
437
+ private createAwardEmoji;
361
438
  private resolveAbsoluteUrl;
362
439
  private resolveAttachmentUrl;
363
440
  private attachAuth;