@ttpears/gitlab-mcp-server 1.19.0 → 2.0.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/README.md CHANGED
@@ -158,7 +158,7 @@ mcpServers:
158
158
  timeout: 120000
159
159
  headers:
160
160
  Authorization: "Bearer {{GITLAB_PAT}}"
161
- X-GitLab-Url: "{{GITLAB_URL_OVERRIDE}}" # optional; lets a user point at a different GitLab
161
+ X-GitLab-Url: "{{GITLAB_URL_OVERRIDE}}" # only honored when GITLAB_PIN_HOST=false (default pins to GITLAB_URL)
162
162
  customUserVars:
163
163
  GITLAB_PAT:
164
164
  title: "GitLab Personal Access Token"
@@ -256,6 +256,51 @@ The `Authorization` and `Mcp-Session-Id` headers must pass through unchanged. Mo
256
256
 
257
257
  ---
258
258
 
259
+ ## OAuth for remote users
260
+
261
+ For a publicly hosted instance where each user signs in with **their own GitLab
262
+ identity** — and modern MCP clients (Claude.ai, Claude Code) connect with **no
263
+ manual token setup** — enable brokered OAuth 2.1. The server then acts as its own
264
+ OAuth Authorization Server in front of GitLab:
265
+
266
+ - advertises Protected Resource Metadata (RFC 9728) and Authorization Server
267
+ Metadata (RFC 8414) at the standard `.well-known` endpoints,
268
+ - supports Dynamic Client Registration (RFC 7591), so clients self-register,
269
+ - runs authorization-code + PKCE against both the MCP client **and** GitLab
270
+ (dual-PKCE) behind **one** fixed GitLab callback,
271
+ - gates the MCP endpoints with bearer validation — unauthenticated requests get
272
+ `401` + `WWW-Authenticate` pointing at the resource metadata (the discovery trigger),
273
+ - mints its own opaque tokens and keeps each user's GitLab token server-side
274
+ (no token passthrough).
275
+
276
+ **Setup**
277
+
278
+ 1. Register **one** GitLab application (instance/group/user → **Applications**):
279
+ - Redirect URI: `https://<your-host>/gitlab/callback`
280
+ - Scopes: `api` (read + write) or `read_api`
281
+ - Confidential: yes (recommended) → you get a client secret; or mark it public for PKCE-only.
282
+ 2. Run the server (HTTP mode) with **no** `GITLAB_TOKEN` — identity comes from each user's OAuth login:
283
+
284
+ ```bash
285
+ MCP_TRANSPORT=http GITLAB_MCP_PORT=8008 \
286
+ GITLAB_URL=https://gitlab.example.com \
287
+ GITLAB_MCP_OAUTH=true \
288
+ MCP_SERVER_URL=https://gitlab-mcp.example.com \
289
+ GITLAB_OAUTH_CLIENT_ID=<application id> \
290
+ GITLAB_OAUTH_CLIENT_SECRET=<application secret> \
291
+ GITLAB_OAUTH_SCOPES=api \
292
+ npx -y @ttpears/gitlab-mcp-server
293
+ ```
294
+
295
+ 3. Point an MCP client at `https://gitlab-mcp.example.com/` — it discovers the
296
+ metadata, registers, and walks the user through GitLab sign-in automatically.
297
+
298
+ `MCP_SERVER_URL` must be HTTPS (terminate TLS at your reverse proxy) and must
299
+ match the host the GitLab redirect URI is registered under. Token/registration
300
+ state is in-memory, so run a single instance (or add a shared store) per issuer.
301
+
302
+ ---
303
+
259
304
  ## How this differs from GitLab's official MCP server
260
305
 
261
306
  GitLab ships an [official MCP server](https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_server/) (Beta) that requires **Premium/Ultimate** and **GitLab Duo**.
@@ -264,9 +309,9 @@ GitLab ships an [official MCP server](https://docs.gitlab.com/user/gitlab_duo/mo
264
309
  |---|---|---|
265
310
  | **GitLab tier** | Free, Premium, Ultimate | Premium / Ultimate only |
266
311
  | **GitLab Duo required** | No | Yes |
267
- | **Auth** | Personal Access Token | OAuth 2.0 Dynamic Client Registration |
312
+ | **Auth** | PAT, or brokered OAuth 2.1 + Dynamic Client Registration | OAuth 2.0 Dynamic Client Registration |
268
313
  | **Transport** | stdio + streamable HTTP | stdio + HTTP |
269
- | **Multi-user** | Per-call PAT or service-account fallback | OAuth per-user |
314
+ | **Multi-user** | Per-call PAT, OAuth per-user, or service-account fallback | OAuth per-user |
270
315
  | **GraphQL schema discovery** | Yes — introspect & run custom queries | No |
271
316
  | **Repository browsing & file reading** | Yes | No |
272
317
  | **Update issues / MRs / notes** | Yes | No (create only) |
@@ -280,9 +325,9 @@ GitLab ships an [official MCP server](https://docs.gitlab.com/user/gitlab_duo/mo
280
325
  | **Group member listing** | Yes | No |
281
326
  | **Semantic code search** | No | Yes (requires additional setup) |
282
327
 
283
- **Choose this server** for Free/CE, GraphQL flexibility, or LibreChat
284
- multi-user. **Choose the official server** for Premium+Duo with semantic
285
- code search, or if you prefer OAuth.
328
+ **Choose this server** for Free/CE, GraphQL flexibility, LibreChat multi-user,
329
+ or brokered OAuth without GitLab Duo. **Choose the official server** for
330
+ Premium+Duo with semantic code search.
286
331
 
287
332
  ---
288
333
 
@@ -362,10 +407,19 @@ code search, or if you prefer OAuth.
362
407
  | `GITLAB_URL` | GitLab instance URL | `https://gitlab.com` |
363
408
  | `GITLAB_TOKEN` | Full-access fallback token (reads + writes) | — |
364
409
  | `GITLAB_READ_TOKEN` | Read-only fallback token (writes always rejected) | — |
410
+ | `GITLAB_PIN_HOST` | Force every request to `GITLAB_URL`, ignoring per-call/header `gitlabUrl` (SSRF guard). Set `false` to serve multiple instances | `true` |
411
+ | `GITLAB_ALLOW_SHARED_ESCAPE_HATCH` | Allow `execute_custom_query` / `execute_rest_read` / `execute_rest_write` to run on the shared token (otherwise they require per-call credentials) | `false` |
365
412
  | `GITLAB_MAX_PAGE_SIZE` | Maximum items per page (1–100) | `50` |
366
413
  | `GITLAB_TIMEOUT` | Request timeout in milliseconds | `30000` |
367
414
  | `GITLAB_MCP_PORT` | HTTP server port | `8008` |
368
415
  | `MCP_TRANSPORT` | Transport mode (`http` for LibreChat) | `stdio` |
416
+ | `TRUST_PROXY` | Express `trust proxy` when behind a reverse proxy (hop count like `1`, boolean, or IP/subnet list). Needed for correct per-IP OAuth rate limiting behind traefik/nginx | unset |
417
+ | `GITLAB_MCP_OAUTH` | Enable brokered OAuth 2.1 (HTTP mode) — see [OAuth for remote users](#oauth-for-remote-users) | `false` |
418
+ | `MCP_SERVER_URL` | Public HTTPS URL of this server (OAuth issuer/resource id) — required when OAuth is on | — |
419
+ | `GITLAB_OAUTH_CLIENT_ID` | GitLab application id — required when OAuth is on | — |
420
+ | `GITLAB_OAUTH_CLIENT_SECRET` | GitLab application secret (omit for a public/PKCE-only app) | — |
421
+ | `GITLAB_OAUTH_SCOPES` | Space-separated GitLab scopes to request | `api` |
422
+ | `GITLAB_OAUTH_CALLBACK_PATH` | Path of the fixed GitLab redirect URI | `/gitlab/callback` |
369
423
 
370
424
  `GITLAB_TOKEN` and `GITLAB_READ_TOKEN` are **mutually exclusive**; setting both is a startup error.
371
425
 
package/dist/config.d.ts CHANGED
@@ -5,10 +5,14 @@ export declare const ConfigSchema: z.ZodObject<{
5
5
  readToken: z.ZodOptional<z.ZodString>;
6
6
  maxPageSize: z.ZodDefault<z.ZodNumber>;
7
7
  defaultTimeout: z.ZodDefault<z.ZodNumber>;
8
+ pinHost: z.ZodDefault<z.ZodBoolean>;
9
+ allowSharedEscapeHatch: z.ZodDefault<z.ZodBoolean>;
8
10
  }, "strip", z.ZodTypeAny, {
9
11
  gitlabUrl: string;
10
12
  maxPageSize: number;
11
13
  defaultTimeout: number;
14
+ pinHost: boolean;
15
+ allowSharedEscapeHatch: boolean;
12
16
  token?: string | undefined;
13
17
  readToken?: string | undefined;
14
18
  }, {
@@ -17,6 +21,8 @@ export declare const ConfigSchema: z.ZodObject<{
17
21
  readToken?: string | undefined;
18
22
  maxPageSize?: number | undefined;
19
23
  defaultTimeout?: number | undefined;
24
+ pinHost?: boolean | undefined;
25
+ allowSharedEscapeHatch?: boolean | undefined;
20
26
  }>;
21
27
  export type Config = z.infer<typeof ConfigSchema>;
22
28
  export declare const UserConfigSchema: z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;EAUvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,eAAO,MAAM,gBAAgB;;;;;;;;;EAG3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,wBAAgB,UAAU,IAAI,MAAM,CAkCnC;AAED,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,GAAG,GAAG,UAAU,CAEnE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;EAqBvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAelD,eAAO,MAAM,gBAAgB;;;;;;;;;EAG3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,wBAAgB,UAAU,IAAI,MAAM,CAoCnC;AAED,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,GAAG,GAAG,UAAU,CAEnE"}
package/dist/config.js CHANGED
@@ -9,7 +9,33 @@ export const ConfigSchema = z.object({
9
9
  readToken: z.string().optional(),
10
10
  maxPageSize: z.number().min(1).max(100).default(50),
11
11
  defaultTimeout: z.number().min(1000).default(30000),
12
+ // When true (default), per-call/header-supplied gitlabUrl is ignored and every
13
+ // request targets the configured gitlabUrl. This closes the SSRF vector where a
14
+ // caller points the server at internal/metadata hosts via X-GitLab-Url. Set
15
+ // GITLAB_PIN_HOST=false only if you intentionally serve multiple GitLab instances.
16
+ pinHost: z.boolean().default(true),
17
+ // The open-ended escape-hatch tools (execute_custom_query, execute_rest_read,
18
+ // execute_rest_write) require per-call user credentials by default — they will not
19
+ // run on the shared GITLAB_TOKEN unless this is enabled. Set
20
+ // GITLAB_ALLOW_SHARED_ESCAPE_HATCH=true for single-operator/stdio setups where the
21
+ // shared token is the operator's own.
22
+ allowSharedEscapeHatch: z.boolean().default(false),
12
23
  });
24
+ /**
25
+ * Parse a boolean environment variable. Unset/empty → fallback. Recognizes
26
+ * "false"/"0"/"no"/"off" (case-insensitive) as false and "true"/"1"/"yes"/"on"
27
+ * as true; anything else falls back to the default.
28
+ */
29
+ function parseBoolEnv(value, fallback) {
30
+ if (value === undefined || value.trim() === '')
31
+ return fallback;
32
+ const v = value.trim().toLowerCase();
33
+ if (['false', '0', 'no', 'off'].includes(v))
34
+ return false;
35
+ if (['true', '1', 'yes', 'on'].includes(v))
36
+ return true;
37
+ return fallback;
38
+ }
13
39
  export const UserConfigSchema = z.object({
14
40
  accessToken: z.string().min(1, 'User access token is required'),
15
41
  gitlabUrl: z.string().url().optional(),
@@ -36,6 +62,8 @@ export function loadConfig() {
36
62
  readToken,
37
63
  maxPageSize: parseInt(process.env.GITLAB_MAX_PAGE_SIZE || '50'),
38
64
  defaultTimeout: parseInt(process.env.GITLAB_TIMEOUT || '30000'),
65
+ pinHost: parseBoolEnv(process.env.GITLAB_PIN_HOST, true),
66
+ allowSharedEscapeHatch: parseBoolEnv(process.env.GITLAB_ALLOW_SHARED_ESCAPE_HATCH, false),
39
67
  };
40
68
  return ConfigSchema.parse(config);
41
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACzD,2EAA2E;IAC3E,oEAAoE;IACpE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,2EAA2E;IAC3E,iCAAiC;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACnD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;CACpD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC;IAC/D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU;IACxB,qEAAqE;IACrE,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CACX,oEAAoE;YACpE,0EAA0E,CAC3E,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CACX,8EAA8E;YAC9E,mFAAmF,CACpF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,SAAS,CAAC;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,SAAS,CAAC;IAE7D,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,kFAAkF;YAClF,uFAAuF,CACxF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG;QACb,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,oBAAoB;QACzD,KAAK;QACL,SAAS;QACT,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,IAAI,CAAC;QAC/D,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC;KAChE,CAAC;IAEF,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,eAAoB;IACrD,OAAO,gBAAgB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,7 @@ export interface PaginatedResult<T> {
45
45
  pageInfo: PageInfo;
46
46
  }
47
47
  export declare class GitLabGraphQLClient {
48
+ private static readonly MAX_USER_CLIENTS;
48
49
  private fullAccessClient?;
49
50
  private readClient?;
50
51
  private config;
@@ -60,10 +61,37 @@ export declare class GitLabGraphQLClient {
60
61
  * Execute request with exponential backoff retry
61
62
  */
62
63
  private executeWithRetry;
64
+ /**
65
+ * Resolve the GitLab base URL to use for a request. When host-pinning is on
66
+ * (the default), any per-call/header-supplied gitlabUrl is ignored and the
67
+ * configured gitlabUrl is always used — this prevents a caller from steering
68
+ * the server at internal/metadata hosts (SSRF). With pinning off, the
69
+ * per-call gitlabUrl wins, falling back to the configured one.
70
+ */
71
+ private effectiveBaseUrl;
63
72
  private getUserClient;
73
+ /**
74
+ * Guard the open-ended escape-hatch tools (custom GraphQL, arbitrary REST).
75
+ * They run on a user's own credentials by default; using the shared
76
+ * GITLAB_TOKEN for them requires GITLAB_ALLOW_SHARED_ESCAPE_HATCH=true.
77
+ */
78
+ private assertEscapeHatchAllowed;
64
79
  private getClient;
65
80
  introspectSchema(userConfig?: UserConfig): Promise<void>;
66
81
  query<T = any>(query: string, variables?: any, userConfig?: UserConfig, requiresWrite?: boolean): Promise<T>;
82
+ /**
83
+ * Detect whether a GraphQL document contains a mutation operation. Used to
84
+ * force write-gating regardless of a caller-supplied flag. Unparseable input
85
+ * returns false — it will fail at GitLab with a clear syntax error.
86
+ */
87
+ private documentHasMutation;
88
+ /**
89
+ * Open-ended GraphQL escape hatch. Requires per-call credentials by default
90
+ * (see assertEscapeHatchAllowed) and derives write-gating from the document
91
+ * itself — a caller cannot run a mutation against a read-only token by leaving
92
+ * the requiresWrite flag false.
93
+ */
94
+ executeCustomQuery<T = any>(query: string, variables?: any, userConfig?: UserConfig, declaredWrite?: boolean): Promise<T>;
67
95
  fetchAllPages<T = any>(query: string, variables: Record<string, any>, connectionPath: string, options?: {
68
96
  maxItems?: number;
69
97
  pageSize?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"gitlab-client.d.ts","sourceRoot":"","sources":["../src/gitlab-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,QAAQ,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC3D,CAAC;CACH;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpC,SAAgB,WAAW,EAAE,OAAO,CAAC;IACrC,SAAgB,aAAa,EAAE,OAAO,CAAC;IACvC,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpC,SAAgB,aAAa,CAAC,EAAE,KAAK,CAAC;gBAGpC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,KAAK,CAAC;KAClB;CAWT;AAWD,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,qBAAa,mBAAmB;IAE9B,OAAO,CAAC,gBAAgB,CAAC,CAAgB;IACzC,OAAO,CAAC,UAAU,CAAC,CAAgB;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,WAAW,CAAyC;gBAEhD,MAAM,EAAE,MAAM;IAU1B,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,OAAO,CAAC,UAAU;IA0GlB;;OAEG;YACW,gBAAgB;IAgD9B,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,SAAS;IA4BX,gBAAgB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxD,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,aAAa,UAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;IAQ1G,aAAa,CAAC,CAAC,GAAG,GAAG,EACzB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,UAAU,CAAC;KACpB,GACL,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAqCxB,cAAc,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAerD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IA4BnE,WAAW,CAAC,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,UAAQ,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA4BvH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,UAAQ,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAgC1I,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,UAAQ,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAmCjJ,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAqD9D,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;QACJ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACV,EACN,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAkDT,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IA8C5G,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAkDf,SAAS;IAIT,mBAAmB,IAAI,MAAM,EAAE;IAS/B,qBAAqB,IAAI,MAAM,EAAE;IAS3B,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IA8BT,qBAAqB,CACzB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAwCT,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IActF,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAgBpG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAkBhH,oBAAoB,CACxB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,EACD,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAiET,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAc7F,2BAA2B,CAC/B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,EACD,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAgFf,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAQnC,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAkC5G,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAY,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;QACnG,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;KAC9B,CAAC;IAwBI,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,UAAQ,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IA6BrI,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,aAAa;IAOf,YAAY,CAChB,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,UAAQ,EAChB,UAAU,CAAC,EAAE,UAAU,EACvB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAC5B,cAAc,CAAC,EAAE,MAAM,EACvB,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,GAAG,CAAC;IA8HT,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,UAAQ,EAChB,UAAU,CAAC,EAAE,UAAU,EACvB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,GAAG,CAAC;IAsIT,qBAAqB,CACzB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAmCT,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAqCxG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IA6B1H,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IA2BT,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,UAAQ,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAiC5H,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,UAAQ,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAoC7H,wBAAwB,CAC5B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,UAAQ,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAkDT,eAAe,CACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,UAAQ,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAiDT,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAcjG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,GAAG,QAAQ,EAC1B,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAiDT,oBAAoB,CACxB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IA2BT,sBAAsB,CAC1B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,UAAQ,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAmCT,QAAQ,CACZ,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,GAAG,eAAe,EACvC,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,UAAQ,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAuET,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,GAAG,eAAe,EACvC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,OAAe,EACzB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IA2Cf;;;;OAIG;IACG,YAAY,CAChB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,IAAI,CAAC;IAQhB;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAsBhC;;OAEG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAqBjF,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,gBAAgB,GAAE,OAAe,EACjC,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,UAAQ,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IA0FT,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,UAAQ,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAkDT,eAAe,CACnB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,GAAG,eAAe,EACvC,GAAG,EAAE,MAAM,EACX,eAAe,GAAE,OAAc,EAC/B,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IA0DT,wBAAwB,CAC5B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IA0CT,oBAAoB,CACxB,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAuDT,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,UAAQ,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IA+CT,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,GAAE,MAAW,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,UAAQ,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IA4Df;;;;OAIG;YACW,eAAe;IAU7B;;OAEG;YACW,iBAAiB;IAU/B;;;;;;OAMG;IACG,WAAW,CACf,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,EACD,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAgOf;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAsB5E;;;;;;;OAOG;IACG,gBAAgB,CACpB,MAAM,GAAE;QACN,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACV,EACN,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IA2C7E;;;OAGG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAsB5E;;;OAGG;IACH,OAAO,CAAC,eAAe;IA0BvB;;;OAGG;YACW,WAAW;IAwDzB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;;;;OAKG;IACG,eAAe,CAAC,CAAC,GAAG,GAAG,EAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,CAAC,CAAC;IAIb;;;;;OAKG;IACG,gBAAgB,CAAC,CAAC,GAAG,GAAG,EAC5B,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,EAC3C,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAO,EACzD,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,CAAC,CAAC;IASP,qBAAqB,CAAC,IAAI,SAAI,EAAE,OAAO,SAAK,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAOpF,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAItE,sBAAsB,CAAC,KAAK,EAAE;QAClC,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;QAChC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,QAAQ,GAAG,cAAc,CAAC;QAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAInC,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;QAChC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,QAAQ,GAAG,cAAc,CAAC;QAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAInC,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAIzE,YAAY,CAChB,MAAM,EAAE;QACN,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,EACD,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAgBT,cAAc,CAClB,gBAAgB,EAAE,MAAM,GAAG,MAAM,EACjC,MAAM,EAAE;QACN,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,EACD,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAeT,iBAAiB,CACrB,eAAe,EAAE,MAAM,GAAG,MAAM,EAChC,MAAM,EAAE;QACN,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,EACD,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,CAAC;IAeT,4BAA4B,CAChC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,EAAE,CAAC;IAOX,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,EAAE,CAAC;IAOX,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,EAAE,CAAC;IAOX,2BAA2B,CAC/B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,EAAE,CAAC;IAOX,WAAW,CACf,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;QACtC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,EACD,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,GAAG,EAAE,CAAC;IAgBX,6BAA6B,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;QAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,EAC5D,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,eAAe,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAmBvD,mCAAmC,CACvC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EACtD,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,EAChC,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;CAyDjC"}
1
+ {"version":3,"file":"gitlab-client.d.ts","sourceRoot":"","sources":["../src/gitlab-client.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { GraphQLClient, gql, ClientError } from 'graphql-request';
2
- import { buildClientSchema, getIntrospectionQuery } from 'graphql';
2
+ import { buildClientSchema, getIntrospectionQuery, parse } from 'graphql';
3
3
  export class GitLabAPIError extends Error {
4
4
  code;
5
5
  statusCode;
@@ -27,6 +27,8 @@ const RETRY_CONFIG = {
27
27
  retryableErrorCodes: ['ECONNRESET', 'ETIMEDOUT', 'ENOTFOUND', 'ECONNREFUSED', 'EAI_AGAIN'],
28
28
  };
29
29
  export class GitLabGraphQLClient {
30
+ // Upper bound on the per-user client cache (see getUserClient). LRU-evicted.
31
+ static MAX_USER_CLIENTS = 500;
30
32
  // Cached clients keyed by token role. At most one of these is set.
31
33
  fullAccessClient;
32
34
  readClient;
@@ -153,13 +155,53 @@ export class GitLabGraphQLClient {
153
155
  // TypeScript: should never reach here, but just in case
154
156
  throw lastError || new GitLabAPIError('Unknown error during retry');
155
157
  }
158
+ /**
159
+ * Resolve the GitLab base URL to use for a request. When host-pinning is on
160
+ * (the default), any per-call/header-supplied gitlabUrl is ignored and the
161
+ * configured gitlabUrl is always used — this prevents a caller from steering
162
+ * the server at internal/metadata hosts (SSRF). With pinning off, the
163
+ * per-call gitlabUrl wins, falling back to the configured one.
164
+ */
165
+ effectiveBaseUrl(userConfig) {
166
+ if (this.config.pinHost)
167
+ return this.config.gitlabUrl;
168
+ return userConfig?.gitlabUrl || this.config.gitlabUrl;
169
+ }
156
170
  getUserClient(userConfig) {
157
- const userKey = `${userConfig.gitlabUrl || this.config.gitlabUrl}:${userConfig.accessToken}`;
158
- if (!this.userClients.has(userKey)) {
159
- const client = this.createClient(userConfig.gitlabUrl || this.config.gitlabUrl, userConfig.accessToken);
171
+ const baseUrl = this.effectiveBaseUrl(userConfig);
172
+ const userKey = `${baseUrl}:${userConfig.accessToken}`;
173
+ let client = this.userClients.get(userKey);
174
+ if (!client) {
175
+ // Bound the cache: evict the oldest entry once we exceed the cap so a
176
+ // public multi-user server can't grow one client per distinct token forever.
177
+ if (this.userClients.size >= GitLabGraphQLClient.MAX_USER_CLIENTS) {
178
+ const oldestKey = this.userClients.keys().next().value;
179
+ if (oldestKey !== undefined)
180
+ this.userClients.delete(oldestKey);
181
+ }
182
+ client = this.createClient(baseUrl, userConfig.accessToken);
183
+ this.userClients.set(userKey, client);
184
+ }
185
+ else {
186
+ // Refresh LRU recency: re-insert so it becomes the most-recently-used.
187
+ this.userClients.delete(userKey);
160
188
  this.userClients.set(userKey, client);
161
189
  }
162
- return this.userClients.get(userKey);
190
+ return client;
191
+ }
192
+ /**
193
+ * Guard the open-ended escape-hatch tools (custom GraphQL, arbitrary REST).
194
+ * They run on a user's own credentials by default; using the shared
195
+ * GITLAB_TOKEN for them requires GITLAB_ALLOW_SHARED_ESCAPE_HATCH=true.
196
+ */
197
+ assertEscapeHatchAllowed(userConfig) {
198
+ if (userConfig)
199
+ return;
200
+ if (this.config.allowSharedEscapeHatch)
201
+ return;
202
+ throw new Error('This open-ended tool requires per-call user credentials. Provide a token via ' +
203
+ 'Authorization: Bearer (HTTP) or userCredentials (stdio). To allow it to use the ' +
204
+ 'shared GITLAB_TOKEN instead, set GITLAB_ALLOW_SHARED_ESCAPE_HATCH=true.');
163
205
  }
164
206
  getClient(userConfig, requiresWrite = false) {
165
207
  // 1. Per-call user credentials always win.
@@ -199,6 +241,30 @@ export class GitLabGraphQLClient {
199
241
  const client = this.getClient(userConfig, requiresWrite);
200
242
  return this.executeWithRetry(() => client.request(query, variables), 'GraphQL query');
201
243
  }
244
+ /**
245
+ * Detect whether a GraphQL document contains a mutation operation. Used to
246
+ * force write-gating regardless of a caller-supplied flag. Unparseable input
247
+ * returns false — it will fail at GitLab with a clear syntax error.
248
+ */
249
+ documentHasMutation(query) {
250
+ try {
251
+ return parse(query).definitions.some((def) => def.kind === 'OperationDefinition' && def.operation === 'mutation');
252
+ }
253
+ catch {
254
+ return false;
255
+ }
256
+ }
257
+ /**
258
+ * Open-ended GraphQL escape hatch. Requires per-call credentials by default
259
+ * (see assertEscapeHatchAllowed) and derives write-gating from the document
260
+ * itself — a caller cannot run a mutation against a read-only token by leaving
261
+ * the requiresWrite flag false.
262
+ */
263
+ async executeCustomQuery(query, variables, userConfig, declaredWrite = false) {
264
+ this.assertEscapeHatchAllowed(userConfig);
265
+ const requiresWrite = declaredWrite || this.documentHasMutation(query);
266
+ return this.query(query, variables, userConfig, requiresWrite);
267
+ }
202
268
  async fetchAllPages(query, variables, connectionPath, options = {}) {
203
269
  const maxItems = options.maxItems ?? 100;
204
270
  const pageSize = Math.min(options.pageSize ?? 50, this.config.maxPageSize);
@@ -270,6 +336,9 @@ export class GitLabGraphQLClient {
270
336
  return this.query(query, { fullPath }, userConfig);
271
337
  }
272
338
  async getProjects(first = 20, after, fetchAll = false, userConfig, sort) {
339
+ // Recency bias by default. Note the projects sort vocabulary is GitLab's
340
+ // string form (e.g. latest_activity_desc), not the IssueSort UPDATED_DESC enum.
341
+ const effectiveSort = sort || 'latest_activity_desc';
273
342
  const query = gql `
274
343
  query getProjects($first: Int!, $after: String, $sort: String) {
275
344
  projects(first: $first, after: $after, sort: $sort) {
@@ -286,13 +355,13 @@ export class GitLabGraphQLClient {
286
355
  }
287
356
  `;
288
357
  if (fetchAll) {
289
- return this.fetchAllPages(query, { sort }, 'projects', {
358
+ return this.fetchAllPages(query, { sort: effectiveSort }, 'projects', {
290
359
  maxItems: first,
291
360
  pageSize: this.config.maxPageSize,
292
361
  userConfig,
293
362
  });
294
363
  }
295
- return this.query(query, { first: Math.min(first, this.config.maxPageSize), after, sort }, userConfig);
364
+ return this.query(query, { first: Math.min(first, this.config.maxPageSize), after, sort: effectiveSort }, userConfig);
296
365
  }
297
366
  async getIssues(projectPath, first = 20, after, fetchAll = false, userConfig, sort) {
298
367
  const query = gql `
@@ -936,7 +1005,7 @@ export class GitLabGraphQLClient {
936
1005
  }
937
1006
  async searchIssues(searchTerm, projectPath, state, first = 20, after, fetchAll = false, userConfig, assigneeUsernames, authorUsername, labelNames, sort) {
938
1007
  await this.introspectSchema(userConfig);
939
- const mappedState = state && state.toLowerCase() !== 'all' ? state.toUpperCase() : undefined;
1008
+ const cappedFirst = Math.min(first, this.config.maxPageSize);
940
1009
  if (projectPath) {
941
1010
  const projectType = this.schema.getType('Project');
942
1011
  const projFields = projectType?.getFields?.() || {};
@@ -986,7 +1055,7 @@ export class GitLabGraphQLClient {
986
1055
  projectPath,
987
1056
  search: searchTerm,
988
1057
  state: mapped,
989
- first,
1058
+ first: cappedFirst,
990
1059
  after,
991
1060
  assigneeUsernames,
992
1061
  authorUsername,
@@ -1046,7 +1115,7 @@ export class GitLabGraphQLClient {
1046
1115
  return this.query(query, {
1047
1116
  search: searchTerm,
1048
1117
  state: mapped,
1049
- first, // Respect user's requested limit - no forced cap
1118
+ first: cappedFirst,
1050
1119
  after,
1051
1120
  assigneeUsernames,
1052
1121
  authorUsername,
@@ -1691,7 +1760,7 @@ export class GitLabGraphQLClient {
1691
1760
  */
1692
1761
  async destroyIssue(projectPath, iid, userConfig) {
1693
1762
  const encodedPath = encodeURIComponent(projectPath);
1694
- await this.restRequest('DELETE', `/projects/${encodedPath}/issues/${iid}`, {
1763
+ await this.restRequest('DELETE', `/projects/${encodedPath}/issues/${encodeURIComponent(iid)}`, {
1695
1764
  userConfig,
1696
1765
  requiresWrite: true,
1697
1766
  });
@@ -2467,7 +2536,7 @@ export class GitLabGraphQLClient {
2467
2536
  resolveRestAuth(userConfig, requiresWrite = false) {
2468
2537
  if (userConfig) {
2469
2538
  return {
2470
- baseUrl: userConfig.gitlabUrl || this.config.gitlabUrl,
2539
+ baseUrl: this.effectiveBaseUrl(userConfig),
2471
2540
  token: userConfig.accessToken,
2472
2541
  };
2473
2542
  }
@@ -2492,6 +2561,12 @@ export class GitLabGraphQLClient {
2492
2561
  async restRequest(method, path, options = {}) {
2493
2562
  const { baseUrl, token } = this.resolveRestAuth(options.userConfig, options.requiresWrite);
2494
2563
  const url = new URL(`${baseUrl.replace(/\/$/, '')}/api/v4${path}`);
2564
+ // Defense in depth: the URL constructor normalizes any ".." segments, so a
2565
+ // path that tried to traverse above /api/v4 would resolve elsewhere. Reject
2566
+ // anything that no longer sits under the API root before we issue the request.
2567
+ if (url.pathname !== '/api/v4' && !url.pathname.startsWith('/api/v4/')) {
2568
+ throw new Error(`Refusing REST request that escapes /api/v4: ${path}`);
2569
+ }
2495
2570
  if (options.query) {
2496
2571
  for (const [k, v] of Object.entries(options.query)) {
2497
2572
  if (v !== undefined && v !== null)
@@ -2568,6 +2643,7 @@ export class GitLabGraphQLClient {
2568
2643
  * GITLAB_READ_TOKEN).
2569
2644
  */
2570
2645
  async executeRestRead(path, query, userConfig) {
2646
+ this.assertEscapeHatchAllowed(userConfig);
2571
2647
  return this.restRequest('GET', this.validateRestPath(path), { query, userConfig });
2572
2648
  }
2573
2649
  /**
@@ -2577,6 +2653,7 @@ export class GitLabGraphQLClient {
2577
2653
  * token resolution rejects GITLAB_READ_TOKEN-only setups.
2578
2654
  */
2579
2655
  async executeRestWrite(method, path, options = {}, userConfig) {
2656
+ this.assertEscapeHatchAllowed(userConfig);
2580
2657
  return this.restRequest(method, this.validateRestPath(path), {
2581
2658
  body: options.body,
2582
2659
  query: options.query,
@@ -2647,25 +2724,25 @@ export class GitLabGraphQLClient {
2647
2724
  }
2648
2725
  async getIssueRelatedMergeRequests(projectPath, iid, userConfig) {
2649
2726
  const encodedPath = encodeURIComponent(projectPath);
2650
- return this.restRequest('GET', `/projects/${encodedPath}/issues/${iid}/related_merge_requests`, {
2727
+ return this.restRequest('GET', `/projects/${encodedPath}/issues/${encodeURIComponent(iid)}/related_merge_requests`, {
2651
2728
  userConfig,
2652
2729
  });
2653
2730
  }
2654
2731
  async getIssueClosedBy(projectPath, iid, userConfig) {
2655
2732
  const encodedPath = encodeURIComponent(projectPath);
2656
- return this.restRequest('GET', `/projects/${encodedPath}/issues/${iid}/closed_by`, {
2733
+ return this.restRequest('GET', `/projects/${encodedPath}/issues/${encodeURIComponent(iid)}/closed_by`, {
2657
2734
  userConfig,
2658
2735
  });
2659
2736
  }
2660
2737
  async getIssueLinks(projectPath, iid, userConfig) {
2661
2738
  const encodedPath = encodeURIComponent(projectPath);
2662
- return this.restRequest('GET', `/projects/${encodedPath}/issues/${iid}/links`, {
2739
+ return this.restRequest('GET', `/projects/${encodedPath}/issues/${encodeURIComponent(iid)}/links`, {
2663
2740
  userConfig,
2664
2741
  });
2665
2742
  }
2666
2743
  async getMergeRequestClosesIssues(projectPath, iid, userConfig) {
2667
2744
  const encodedPath = encodeURIComponent(projectPath);
2668
- return this.restRequest('GET', `/projects/${encodedPath}/merge_requests/${iid}/closes_issues`, {
2745
+ return this.restRequest('GET', `/projects/${encodedPath}/merge_requests/${encodeURIComponent(iid)}/closes_issues`, {
2669
2746
  userConfig,
2670
2747
  });
2671
2748
  }