@structured-world/gitlab-mcp 6.62.1 → 7.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.
Files changed (435) hide show
  1. package/README.md +22 -1
  2. package/README.md.in +21 -0
  3. package/dist/generated/prisma/client.js.map +1 -1
  4. package/dist/generated/prisma/internal/class.js +2 -2
  5. package/dist/generated/prisma/internal/class.js.map +1 -1
  6. package/dist/generated/prisma/internal/prismaNamespace.js +2 -2
  7. package/dist/generated/prisma/models/AuthCodeFlowState.d.ts +1 -2
  8. package/dist/generated/prisma/models/AuthorizationCode.d.ts +1 -2
  9. package/dist/generated/prisma/models/DeviceFlowState.d.ts +1 -2
  10. package/dist/generated/prisma/models/McpSessionMapping.d.ts +1 -2
  11. package/dist/generated/prisma/models/OAuthSession.d.ts +1 -2
  12. package/dist/src/cli/docker/container-runtime.d.ts +1 -1
  13. package/dist/src/cli/docker/container-runtime.js +14 -14
  14. package/dist/src/cli/docker/docker-command.d.ts +1 -1
  15. package/dist/src/cli/docker/docker-command.js +113 -113
  16. package/dist/src/cli/docker/docker-command.js.map +1 -1
  17. package/dist/src/cli/docker/docker-utils.d.ts +3 -3
  18. package/dist/src/cli/docker/docker-utils.js +74 -74
  19. package/dist/src/cli/docker/docker-utils.js.map +1 -1
  20. package/dist/src/cli/docker/index.d.ts +4 -4
  21. package/dist/src/cli/docker/types.d.ts +3 -3
  22. package/dist/src/cli/docker/types.js +5 -5
  23. package/dist/src/cli/init/browser.js +2 -2
  24. package/dist/src/cli/init/config-generator.d.ts +2 -2
  25. package/dist/src/cli/init/config-generator.js +22 -22
  26. package/dist/src/cli/init/connection.d.ts +1 -1
  27. package/dist/src/cli/init/connection.js +27 -27
  28. package/dist/src/cli/init/connection.js.map +1 -1
  29. package/dist/src/cli/init/index.d.ts +4 -4
  30. package/dist/src/cli/init/types.d.ts +3 -3
  31. package/dist/src/cli/init/types.js +36 -36
  32. package/dist/src/cli/init/wizard.js +80 -80
  33. package/dist/src/cli/init/wizard.js.map +1 -1
  34. package/dist/src/cli/inject-tool-refs.js +47 -47
  35. package/dist/src/cli/inject-tool-refs.js.map +1 -1
  36. package/dist/src/cli/install/backup.d.ts +1 -1
  37. package/dist/src/cli/install/backup.js +3 -3
  38. package/dist/src/cli/install/detector.d.ts +2 -2
  39. package/dist/src/cli/install/detector.js +18 -18
  40. package/dist/src/cli/install/detector.js.map +1 -1
  41. package/dist/src/cli/install/index.d.ts +5 -5
  42. package/dist/src/cli/install/install-command.d.ts +2 -2
  43. package/dist/src/cli/install/install-command.js +68 -68
  44. package/dist/src/cli/install/install-command.js.map +1 -1
  45. package/dist/src/cli/install/installers.d.ts +2 -2
  46. package/dist/src/cli/install/installers.js +55 -55
  47. package/dist/src/cli/install/installers.js.map +1 -1
  48. package/dist/src/cli/install/types.d.ts +4 -4
  49. package/dist/src/cli/install/types.js +48 -48
  50. package/dist/src/cli/instances/index.d.ts +2 -2
  51. package/dist/src/cli/instances/instances-command.d.ts +1 -1
  52. package/dist/src/cli/instances/instances-command.js +70 -66
  53. package/dist/src/cli/instances/instances-command.js.map +1 -1
  54. package/dist/src/cli/list-tools.js +396 -396
  55. package/dist/src/cli/list-tools.js.map +1 -1
  56. package/dist/src/cli/setup/discovery.d.ts +1 -1
  57. package/dist/src/cli/setup/discovery.js +10 -10
  58. package/dist/src/cli/setup/discovery.js.map +1 -1
  59. package/dist/src/cli/setup/flows/configure-existing.d.ts +1 -1
  60. package/dist/src/cli/setup/flows/configure-existing.js +57 -57
  61. package/dist/src/cli/setup/flows/configure-existing.js.map +1 -1
  62. package/dist/src/cli/setup/flows/local-setup.d.ts +1 -1
  63. package/dist/src/cli/setup/flows/local-setup.js +51 -51
  64. package/dist/src/cli/setup/flows/local-setup.js.map +1 -1
  65. package/dist/src/cli/setup/flows/server-setup.d.ts +1 -1
  66. package/dist/src/cli/setup/flows/server-setup.js +50 -50
  67. package/dist/src/cli/setup/flows/server-setup.js.map +1 -1
  68. package/dist/src/cli/setup/flows/tool-selection.d.ts +1 -1
  69. package/dist/src/cli/setup/flows/tool-selection.js +94 -94
  70. package/dist/src/cli/setup/flows/tool-selection.js.map +1 -1
  71. package/dist/src/cli/setup/index.d.ts +4 -4
  72. package/dist/src/cli/setup/presets.d.ts +1 -1
  73. package/dist/src/cli/setup/presets.js +157 -157
  74. package/dist/src/cli/setup/presets.js.map +1 -1
  75. package/dist/src/cli/setup/types.d.ts +7 -7
  76. package/dist/src/cli/setup/wizard.d.ts +1 -1
  77. package/dist/src/cli/setup/wizard.js +25 -25
  78. package/dist/src/cli/utils/index.d.ts +1 -1
  79. package/dist/src/cli/utils/path-utils.js +3 -3
  80. package/dist/src/cli-utils.d.ts +2 -2
  81. package/dist/src/cli-utils.js +46 -46
  82. package/dist/src/config/index.d.ts +4 -4
  83. package/dist/src/config/instances-loader.d.ts +3 -3
  84. package/dist/src/config/instances-loader.js +53 -53
  85. package/dist/src/config/instances-loader.js.map +1 -1
  86. package/dist/src/config/instances-schema.d.ts +1 -1
  87. package/dist/src/config/instances-schema.js +33 -33
  88. package/dist/src/config/instances-schema.js.map +1 -1
  89. package/dist/src/config.d.ts +11 -4
  90. package/dist/src/config.js +112 -111
  91. package/dist/src/config.js.map +1 -1
  92. package/dist/src/dashboard/handler.d.ts +2 -2
  93. package/dist/src/dashboard/handler.js +7 -7
  94. package/dist/src/dashboard/html-template.d.ts +1 -1
  95. package/dist/src/dashboard/html-template.js +44 -44
  96. package/dist/src/dashboard/html-template.js.map +1 -1
  97. package/dist/src/dashboard/index.d.ts +4 -4
  98. package/dist/src/dashboard/metrics.d.ts +3 -3
  99. package/dist/src/dashboard/metrics.js +42 -42
  100. package/dist/src/discovery/auto.d.ts +3 -3
  101. package/dist/src/discovery/auto.js +28 -28
  102. package/dist/src/discovery/git-remote.d.ts +2 -2
  103. package/dist/src/discovery/git-remote.js +18 -18
  104. package/dist/src/discovery/index.d.ts +3 -3
  105. package/dist/src/discovery/profile-matcher.d.ts +2 -2
  106. package/dist/src/discovery/profile-matcher.js +8 -8
  107. package/dist/src/discovery/profile-matcher.js.map +1 -1
  108. package/dist/src/entities/context/context-manager.d.ts +3 -3
  109. package/dist/src/entities/context/context-manager.js +34 -34
  110. package/dist/src/entities/context/context-manager.js.map +1 -1
  111. package/dist/src/entities/context/handlers.d.ts +2 -2
  112. package/dist/src/entities/context/handlers.js +8 -8
  113. package/dist/src/entities/context/index.d.ts +8 -8
  114. package/dist/src/entities/context/index.js +1 -1
  115. package/dist/src/entities/context/registry.d.ts +1 -1
  116. package/dist/src/entities/context/registry.js +4 -4
  117. package/dist/src/entities/context/schema.d.ts +1 -1
  118. package/dist/src/entities/context/schema.js +19 -19
  119. package/dist/src/entities/context/types.d.ts +9 -9
  120. package/dist/src/entities/context/whoami.d.ts +1 -1
  121. package/dist/src/entities/context/whoami.js +31 -31
  122. package/dist/src/entities/context/whoami.js.map +1 -1
  123. package/dist/src/entities/core/index.d.ts +5 -5
  124. package/dist/src/entities/core/index.js +1 -1
  125. package/dist/src/entities/core/registry.d.ts +1 -1
  126. package/dist/src/entities/core/registry.js +194 -194
  127. package/dist/src/entities/core/registry.js.map +1 -1
  128. package/dist/src/entities/core/schema-readonly.d.ts +1 -1
  129. package/dist/src/entities/core/schema-readonly.js +117 -117
  130. package/dist/src/entities/core/schema.d.ts +1 -1
  131. package/dist/src/entities/core/schema.js +67 -67
  132. package/dist/src/entities/files/index.d.ts +5 -5
  133. package/dist/src/entities/files/index.js +1 -1
  134. package/dist/src/entities/files/registry.d.ts +1 -1
  135. package/dist/src/entities/files/registry.js +45 -45
  136. package/dist/src/entities/files/registry.js.map +1 -1
  137. package/dist/src/entities/files/schema-readonly.d.ts +1 -1
  138. package/dist/src/entities/files/schema-readonly.js +13 -13
  139. package/dist/src/entities/files/schema.d.ts +1 -1
  140. package/dist/src/entities/files/schema.js +29 -29
  141. package/dist/src/entities/index.d.ts +17 -17
  142. package/dist/src/entities/integrations/index.d.ts +4 -4
  143. package/dist/src/entities/integrations/registry.d.ts +1 -1
  144. package/dist/src/entities/integrations/registry.js +17 -17
  145. package/dist/src/entities/integrations/registry.js.map +1 -1
  146. package/dist/src/entities/integrations/schema-readonly.d.ts +1 -1
  147. package/dist/src/entities/integrations/schema-readonly.js +5 -5
  148. package/dist/src/entities/integrations/schema.d.ts +1 -1
  149. package/dist/src/entities/integrations/schema.js +69 -69
  150. package/dist/src/entities/iterations/index.d.ts +2 -2
  151. package/dist/src/entities/iterations/registry.d.ts +1 -1
  152. package/dist/src/entities/iterations/registry.js +13 -13
  153. package/dist/src/entities/iterations/registry.js.map +1 -1
  154. package/dist/src/entities/iterations/schema-readonly.d.ts +1 -1
  155. package/dist/src/entities/iterations/schema-readonly.js +9 -9
  156. package/dist/src/entities/labels/index.d.ts +5 -5
  157. package/dist/src/entities/labels/index.js +1 -1
  158. package/dist/src/entities/labels/registry.d.ts +1 -1
  159. package/dist/src/entities/labels/registry.js +19 -19
  160. package/dist/src/entities/labels/registry.js.map +1 -1
  161. package/dist/src/entities/labels/schema-readonly.d.ts +1 -1
  162. package/dist/src/entities/labels/schema-readonly.js +8 -8
  163. package/dist/src/entities/labels/schema.d.ts +1 -1
  164. package/dist/src/entities/labels/schema.js +11 -11
  165. package/dist/src/entities/members/index.d.ts +3 -3
  166. package/dist/src/entities/members/registry.d.ts +1 -1
  167. package/dist/src/entities/members/registry.js +26 -26
  168. package/dist/src/entities/members/registry.js.map +1 -1
  169. package/dist/src/entities/members/schema-readonly.d.ts +1 -1
  170. package/dist/src/entities/members/schema-readonly.js +32 -32
  171. package/dist/src/entities/members/schema-readonly.js.map +1 -1
  172. package/dist/src/entities/members/schema.d.ts +1 -1
  173. package/dist/src/entities/members/schema.js +28 -28
  174. package/dist/src/entities/milestones/index.d.ts +5 -5
  175. package/dist/src/entities/milestones/index.js +1 -1
  176. package/dist/src/entities/milestones/registry.d.ts +1 -1
  177. package/dist/src/entities/milestones/registry.js +25 -25
  178. package/dist/src/entities/milestones/registry.js.map +1 -1
  179. package/dist/src/entities/milestones/schema-readonly.d.ts +2 -2
  180. package/dist/src/entities/milestones/schema-readonly.js +15 -15
  181. package/dist/src/entities/milestones/schema.d.ts +1 -1
  182. package/dist/src/entities/milestones/schema.js +16 -16
  183. package/dist/src/entities/milestones/schema.js.map +1 -1
  184. package/dist/src/entities/mrs/index.d.ts +5 -5
  185. package/dist/src/entities/mrs/index.js +1 -1
  186. package/dist/src/entities/mrs/registry.d.ts +1 -1
  187. package/dist/src/entities/mrs/registry.js +102 -102
  188. package/dist/src/entities/mrs/registry.js.map +1 -1
  189. package/dist/src/entities/mrs/schema-readonly.d.ts +1 -1
  190. package/dist/src/entities/mrs/schema-readonly.js +126 -126
  191. package/dist/src/entities/mrs/schema-readonly.js.map +1 -1
  192. package/dist/src/entities/mrs/schema.d.ts +1 -1
  193. package/dist/src/entities/mrs/schema.js +111 -111
  194. package/dist/src/entities/mrs/schema.js.map +1 -1
  195. package/dist/src/entities/pipelines/index.d.ts +5 -5
  196. package/dist/src/entities/pipelines/index.js +1 -1
  197. package/dist/src/entities/pipelines/registry.d.ts +1 -1
  198. package/dist/src/entities/pipelines/registry.js +45 -45
  199. package/dist/src/entities/pipelines/registry.js.map +1 -1
  200. package/dist/src/entities/pipelines/schema-readonly.d.ts +2 -2
  201. package/dist/src/entities/pipelines/schema-readonly.js +73 -73
  202. package/dist/src/entities/pipelines/schema.d.ts +1 -1
  203. package/dist/src/entities/pipelines/schema.js +21 -21
  204. package/dist/src/entities/refs/index.d.ts +3 -3
  205. package/dist/src/entities/refs/registry.d.ts +1 -1
  206. package/dist/src/entities/refs/registry.js +31 -31
  207. package/dist/src/entities/refs/registry.js.map +1 -1
  208. package/dist/src/entities/refs/schema-readonly.d.ts +1 -1
  209. package/dist/src/entities/refs/schema-readonly.js +21 -21
  210. package/dist/src/entities/refs/schema.d.ts +1 -1
  211. package/dist/src/entities/refs/schema.js +56 -56
  212. package/dist/src/entities/releases/index.d.ts +3 -3
  213. package/dist/src/entities/releases/registry.d.ts +1 -1
  214. package/dist/src/entities/releases/registry.js +21 -21
  215. package/dist/src/entities/releases/registry.js.map +1 -1
  216. package/dist/src/entities/releases/schema-readonly.d.ts +1 -1
  217. package/dist/src/entities/releases/schema-readonly.js +13 -13
  218. package/dist/src/entities/releases/schema.d.ts +1 -1
  219. package/dist/src/entities/releases/schema.js +21 -21
  220. package/dist/src/entities/search/index.d.ts +2 -2
  221. package/dist/src/entities/search/registry.d.ts +1 -1
  222. package/dist/src/entities/search/registry.js +13 -13
  223. package/dist/src/entities/search/schema-readonly.d.ts +1 -1
  224. package/dist/src/entities/search/schema-readonly.js +23 -23
  225. package/dist/src/entities/shared.d.ts +1 -1
  226. package/dist/src/entities/shared.js +5 -5
  227. package/dist/src/entities/snippets/index.d.ts +5 -5
  228. package/dist/src/entities/snippets/index.js +1 -1
  229. package/dist/src/entities/snippets/registry.d.ts +1 -1
  230. package/dist/src/entities/snippets/registry.js +24 -24
  231. package/dist/src/entities/snippets/registry.js.map +1 -1
  232. package/dist/src/entities/snippets/schema-readonly.d.ts +1 -1
  233. package/dist/src/entities/snippets/schema-readonly.js +11 -11
  234. package/dist/src/entities/snippets/schema.d.ts +1 -1
  235. package/dist/src/entities/snippets/schema.js +27 -27
  236. package/dist/src/entities/snippets/schema.js.map +1 -1
  237. package/dist/src/entities/utils.d.ts +2 -2
  238. package/dist/src/entities/utils.js +8 -8
  239. package/dist/src/entities/utils.js.map +1 -1
  240. package/dist/src/entities/variables/index.d.ts +5 -5
  241. package/dist/src/entities/variables/index.js +1 -1
  242. package/dist/src/entities/variables/registry.d.ts +1 -1
  243. package/dist/src/entities/variables/registry.js +22 -22
  244. package/dist/src/entities/variables/registry.js.map +1 -1
  245. package/dist/src/entities/variables/schema-readonly.d.ts +1 -1
  246. package/dist/src/entities/variables/schema-readonly.js +6 -6
  247. package/dist/src/entities/variables/schema.d.ts +1 -1
  248. package/dist/src/entities/variables/schema.js +21 -21
  249. package/dist/src/entities/variables/schema.js.map +1 -1
  250. package/dist/src/entities/webhooks/index.d.ts +4 -4
  251. package/dist/src/entities/webhooks/registry.d.ts +1 -1
  252. package/dist/src/entities/webhooks/registry.js +29 -29
  253. package/dist/src/entities/webhooks/registry.js.map +1 -1
  254. package/dist/src/entities/webhooks/schema-readonly.d.ts +1 -1
  255. package/dist/src/entities/webhooks/schema-readonly.js +9 -9
  256. package/dist/src/entities/webhooks/schema.d.ts +1 -1
  257. package/dist/src/entities/webhooks/schema.js +59 -59
  258. package/dist/src/entities/wiki/index.d.ts +5 -5
  259. package/dist/src/entities/wiki/index.js +1 -1
  260. package/dist/src/entities/wiki/registry.d.ts +1 -1
  261. package/dist/src/entities/wiki/registry.js +19 -19
  262. package/dist/src/entities/wiki/registry.js.map +1 -1
  263. package/dist/src/entities/wiki/schema-readonly.d.ts +1 -1
  264. package/dist/src/entities/wiki/schema-readonly.js +6 -6
  265. package/dist/src/entities/wiki/schema.d.ts +1 -1
  266. package/dist/src/entities/wiki/schema.js +12 -12
  267. package/dist/src/entities/workitems/index.d.ts +5 -5
  268. package/dist/src/entities/workitems/index.js +1 -1
  269. package/dist/src/entities/workitems/registry.d.ts +1 -1
  270. package/dist/src/entities/workitems/registry.js +101 -101
  271. package/dist/src/entities/workitems/registry.js.map +1 -1
  272. package/dist/src/entities/workitems/schema-readonly.d.ts +1 -1
  273. package/dist/src/entities/workitems/schema-readonly.js +27 -27
  274. package/dist/src/entities/workitems/schema-readonly.js.map +1 -1
  275. package/dist/src/entities/workitems/schema.d.ts +1 -1
  276. package/dist/src/entities/workitems/schema.js +58 -58
  277. package/dist/src/graphql/DynamicWorkItemsQuery.d.ts +2 -2
  278. package/dist/src/graphql/DynamicWorkItemsQuery.js +47 -47
  279. package/dist/src/graphql/DynamicWorkItemsQuery.js.map +1 -1
  280. package/dist/src/graphql/client.d.ts +1 -1
  281. package/dist/src/graphql/client.js +4 -4
  282. package/dist/src/graphql/client.js.map +1 -1
  283. package/dist/src/graphql/index.d.ts +2 -2
  284. package/dist/src/graphql/workItems.d.ts +38 -38
  285. package/dist/src/graphql/workItems.js +30 -30
  286. package/dist/src/handlers.d.ts +2 -1
  287. package/dist/src/handlers.js +258 -86
  288. package/dist/src/handlers.js.map +1 -1
  289. package/dist/src/http-client.js +3 -3
  290. package/dist/src/logger.js +25 -25
  291. package/dist/src/logging/access-log.d.ts +2 -2
  292. package/dist/src/logging/access-log.js +25 -25
  293. package/dist/src/logging/connection-tracker.d.ts +1 -1
  294. package/dist/src/logging/connection-tracker.js +3 -3
  295. package/dist/src/logging/index.d.ts +5 -5
  296. package/dist/src/logging/request-tracker.d.ts +3 -3
  297. package/dist/src/logging/request-tracker.js +4 -4
  298. package/dist/src/logging/types.d.ts +3 -3
  299. package/dist/src/logging/types.js +1 -1
  300. package/dist/src/logging/types.js.map +1 -1
  301. package/dist/src/main.js +28 -28
  302. package/dist/src/middleware/index.d.ts +3 -2
  303. package/dist/src/middleware/index.js +3 -1
  304. package/dist/src/middleware/index.js.map +1 -1
  305. package/dist/src/middleware/oauth-auth.d.ts +1 -1
  306. package/dist/src/middleware/oauth-auth.js +17 -17
  307. package/dist/src/middleware/rate-limiter.d.ts +1 -1
  308. package/dist/src/middleware/rate-limiter.js +32 -32
  309. package/dist/src/middleware/response-write-timeout.d.ts +2 -0
  310. package/dist/src/middleware/response-write-timeout.js +62 -0
  311. package/dist/src/middleware/response-write-timeout.js.map +1 -0
  312. package/dist/src/oauth/config.d.ts +1 -1
  313. package/dist/src/oauth/config.js +18 -18
  314. package/dist/src/oauth/config.js.map +1 -1
  315. package/dist/src/oauth/endpoints/authorize.d.ts +1 -1
  316. package/dist/src/oauth/endpoints/authorize.js +32 -32
  317. package/dist/src/oauth/endpoints/callback.d.ts +1 -1
  318. package/dist/src/oauth/endpoints/callback.js +26 -26
  319. package/dist/src/oauth/endpoints/index.d.ts +5 -5
  320. package/dist/src/oauth/endpoints/metadata.d.ts +1 -1
  321. package/dist/src/oauth/endpoints/metadata.js +12 -12
  322. package/dist/src/oauth/endpoints/register.d.ts +1 -1
  323. package/dist/src/oauth/endpoints/register.js +9 -9
  324. package/dist/src/oauth/endpoints/token.d.ts +1 -1
  325. package/dist/src/oauth/endpoints/token.js +28 -28
  326. package/dist/src/oauth/gitlab-device-flow.d.ts +2 -2
  327. package/dist/src/oauth/gitlab-device-flow.js +73 -68
  328. package/dist/src/oauth/gitlab-device-flow.js.map +1 -1
  329. package/dist/src/oauth/index.d.ts +10 -10
  330. package/dist/src/oauth/session-store.d.ts +2 -2
  331. package/dist/src/oauth/session-store.js +40 -40
  332. package/dist/src/oauth/session-store.js.map +1 -1
  333. package/dist/src/oauth/storage/factory.d.ts +2 -2
  334. package/dist/src/oauth/storage/factory.js +16 -16
  335. package/dist/src/oauth/storage/file.d.ts +2 -2
  336. package/dist/src/oauth/storage/file.js +22 -22
  337. package/dist/src/oauth/storage/file.js.map +1 -1
  338. package/dist/src/oauth/storage/index.d.ts +5 -5
  339. package/dist/src/oauth/storage/memory.d.ts +2 -2
  340. package/dist/src/oauth/storage/memory.js +18 -18
  341. package/dist/src/oauth/storage/memory.js.map +1 -1
  342. package/dist/src/oauth/storage/postgresql.d.ts +2 -2
  343. package/dist/src/oauth/storage/postgresql.js +11 -11
  344. package/dist/src/oauth/storage/postgresql.js.map +1 -1
  345. package/dist/src/oauth/storage/types.d.ts +3 -3
  346. package/dist/src/oauth/token-context.d.ts +1 -1
  347. package/dist/src/oauth/token-context.js +1 -1
  348. package/dist/src/oauth/token-utils.d.ts +1 -1
  349. package/dist/src/oauth/token-utils.js +20 -20
  350. package/dist/src/oauth/types.d.ts +3 -3
  351. package/dist/src/profiles/applicator.d.ts +1 -1
  352. package/dist/src/profiles/applicator.js +48 -48
  353. package/dist/src/profiles/index.d.ts +5 -5
  354. package/dist/src/profiles/loader.d.ts +3 -3
  355. package/dist/src/profiles/loader.js +25 -25
  356. package/dist/src/profiles/loader.js.map +1 -1
  357. package/dist/src/profiles/project-loader.d.ts +1 -1
  358. package/dist/src/profiles/project-loader.js +23 -23
  359. package/dist/src/profiles/project-loader.js.map +1 -1
  360. package/dist/src/profiles/scope-enforcer.d.ts +2 -2
  361. package/dist/src/profiles/scope-enforcer.js +25 -25
  362. package/dist/src/profiles/scope-enforcer.js.map +1 -1
  363. package/dist/src/profiles/types.d.ts +2 -2
  364. package/dist/src/profiles/types.js +50 -48
  365. package/dist/src/profiles/types.js.map +1 -1
  366. package/dist/src/registry-manager.d.ts +19 -11
  367. package/dist/src/registry-manager.js +257 -172
  368. package/dist/src/registry-manager.js.map +1 -1
  369. package/dist/src/server.js +165 -149
  370. package/dist/src/server.js.map +1 -1
  371. package/dist/src/services/ConnectionManager.d.ts +33 -24
  372. package/dist/src/services/ConnectionManager.js +304 -179
  373. package/dist/src/services/ConnectionManager.js.map +1 -1
  374. package/dist/src/services/GitLabVersionDetector.d.ts +2 -2
  375. package/dist/src/services/GitLabVersionDetector.js +45 -45
  376. package/dist/src/services/GitLabVersionDetector.js.map +1 -1
  377. package/dist/src/services/HealthMonitor.d.ts +42 -0
  378. package/dist/src/services/HealthMonitor.js +544 -0
  379. package/dist/src/services/HealthMonitor.js.map +1 -0
  380. package/dist/src/services/InstanceConnectionPool.d.ts +2 -2
  381. package/dist/src/services/InstanceConnectionPool.js +13 -13
  382. package/dist/src/services/InstanceConnectionPool.js.map +1 -1
  383. package/dist/src/services/InstanceRateLimiter.js +6 -6
  384. package/dist/src/services/InstanceRateLimiter.js.map +1 -1
  385. package/dist/src/services/InstanceRegistry.d.ts +4 -5
  386. package/dist/src/services/InstanceRegistry.js +29 -41
  387. package/dist/src/services/InstanceRegistry.js.map +1 -1
  388. package/dist/src/services/NamespaceTierDetector.d.ts +2 -2
  389. package/dist/src/services/NamespaceTierDetector.js +30 -30
  390. package/dist/src/services/NamespaceTierDetector.js.map +1 -1
  391. package/dist/src/services/SchemaIntrospector.d.ts +2 -1
  392. package/dist/src/services/SchemaIntrospector.js +45 -42
  393. package/dist/src/services/SchemaIntrospector.js.map +1 -1
  394. package/dist/src/services/TokenScopeDetector.d.ts +4 -4
  395. package/dist/src/services/TokenScopeDetector.js +133 -110
  396. package/dist/src/services/TokenScopeDetector.js.map +1 -1
  397. package/dist/src/services/ToolAvailability.d.ts +15 -11
  398. package/dist/src/services/ToolAvailability.js +150 -130
  399. package/dist/src/services/ToolAvailability.js.map +1 -1
  400. package/dist/src/services/WidgetAvailability.d.ts +5 -5
  401. package/dist/src/services/WidgetAvailability.js +40 -39
  402. package/dist/src/services/WidgetAvailability.js.map +1 -1
  403. package/dist/src/session-manager.d.ts +3 -2
  404. package/dist/src/session-manager.js +17 -14
  405. package/dist/src/session-manager.js.map +1 -1
  406. package/dist/src/types.js +4 -4
  407. package/dist/src/utils/description-utils.js +4 -4
  408. package/dist/src/utils/description-utils.js.map +1 -1
  409. package/dist/src/utils/error-handler.d.ts +19 -10
  410. package/dist/src/utils/error-handler.js +272 -187
  411. package/dist/src/utils/error-handler.js.map +1 -1
  412. package/dist/src/utils/fetch.d.ts +7 -0
  413. package/dist/src/utils/fetch.js +136 -122
  414. package/dist/src/utils/fetch.js.map +1 -1
  415. package/dist/src/utils/gitlab-api.d.ts +1 -1
  416. package/dist/src/utils/gitlab-api.js +29 -26
  417. package/dist/src/utils/gitlab-api.js.map +1 -1
  418. package/dist/src/utils/idConversion.js +47 -47
  419. package/dist/src/utils/idConversion.js.map +1 -1
  420. package/dist/src/utils/namespace.d.ts +2 -2
  421. package/dist/src/utils/namespace.js +15 -15
  422. package/dist/src/utils/projectIdentifier.js +4 -4
  423. package/dist/src/utils/request-logger.d.ts +4 -4
  424. package/dist/src/utils/request-logger.js +5 -5
  425. package/dist/src/utils/schema-utils.js +24 -24
  426. package/dist/src/utils/schema-utils.js.map +1 -1
  427. package/dist/src/utils/smart-user-search.d.ts +1 -1
  428. package/dist/src/utils/smart-user-search.js +10 -10
  429. package/dist/src/utils/url.d.ts +1 -0
  430. package/dist/src/utils/url.js +38 -0
  431. package/dist/src/utils/url.js.map +1 -0
  432. package/dist/src/utils/version.js +1 -1
  433. package/dist/tsconfig.build.tsbuildinfo +1 -1
  434. package/package.json +22 -31
  435. package/dist/structured-world-gitlab-mcp-6.62.1.tgz +0 -0
@@ -14,36 +14,36 @@ const config_2 = require("../config");
14
14
  async function oauthAuthMiddleware(req, res, next) {
15
15
  const config = (0, config_1.loadOAuthConfig)();
16
16
  if (!config) {
17
- sendUnauthorized(req, res, "server_error", "OAuth not configured");
17
+ sendUnauthorized(req, res, 'server_error', 'OAuth not configured');
18
18
  return;
19
19
  }
20
20
  const authHeader = req.headers.authorization;
21
21
  if (!authHeader) {
22
- sendUnauthorized(req, res, "unauthorized", "Missing Authorization header");
22
+ sendUnauthorized(req, res, 'unauthorized', 'Missing Authorization header');
23
23
  return;
24
24
  }
25
- if (!authHeader.startsWith("Bearer ")) {
26
- sendUnauthorized(req, res, "unauthorized", "Invalid Authorization header format. Expected: Bearer <token>");
25
+ if (!authHeader.startsWith('Bearer ')) {
26
+ sendUnauthorized(req, res, 'unauthorized', 'Invalid Authorization header format. Expected: Bearer <token>');
27
27
  return;
28
28
  }
29
29
  const token = authHeader.slice(7);
30
30
  if (!token) {
31
- sendUnauthorized(req, res, "unauthorized", "Empty Bearer token");
31
+ sendUnauthorized(req, res, 'unauthorized', 'Empty Bearer token');
32
32
  return;
33
33
  }
34
34
  const payload = (0, token_utils_1.verifyMCPToken)(token, config.sessionSecret);
35
35
  if (!payload) {
36
- sendUnauthorized(req, res, "invalid_token", "Token is invalid or expired");
36
+ sendUnauthorized(req, res, 'invalid_token', 'Token is invalid or expired');
37
37
  return;
38
38
  }
39
39
  const sessionId = payload.sid;
40
40
  const session = session_store_1.sessionStore.getSession(sessionId);
41
41
  if (!session) {
42
- sendUnauthorized(req, res, "invalid_token", "Session not found or expired");
42
+ sendUnauthorized(req, res, 'invalid_token', 'Session not found or expired');
43
43
  return;
44
44
  }
45
45
  if (session.mcpAccessToken !== token) {
46
- sendUnauthorized(req, res, "invalid_token", "Token has been superseded");
46
+ sendUnauthorized(req, res, 'invalid_token', 'Token has been superseded');
47
47
  return;
48
48
  }
49
49
  if ((0, token_utils_1.isTokenExpiringSoon)(session.gitlabTokenExpiry)) {
@@ -54,19 +54,19 @@ async function oauthAuthMiddleware(req, res, next) {
54
54
  gitlabRefreshToken: newTokens.refresh_token,
55
55
  gitlabTokenExpiry: (0, token_utils_1.calculateTokenExpiry)(newTokens.expires_in),
56
56
  });
57
- (0, logger_1.logDebug)("GitLab token refreshed during request", {
57
+ (0, logger_1.logDebug)('GitLab token refreshed during request', {
58
58
  sessionId: (0, logger_1.truncateId)(sessionId),
59
59
  });
60
60
  }
61
61
  catch (error) {
62
- (0, logger_1.logError)("Failed to refresh GitLab token during request", { err: error });
63
- sendUnauthorized(req, res, "invalid_token", "GitLab token refresh failed. Please re-authenticate.");
62
+ (0, logger_1.logError)('Failed to refresh GitLab token during request', { err: error });
63
+ sendUnauthorized(req, res, 'invalid_token', 'GitLab token refresh failed. Please re-authenticate.');
64
64
  return;
65
65
  }
66
66
  }
67
67
  const updatedSession = session_store_1.sessionStore.getSession(sessionId);
68
68
  if (!updatedSession) {
69
- sendUnauthorized(req, res, "invalid_token", "Session lost during token refresh");
69
+ sendUnauthorized(req, res, 'invalid_token', 'Session lost during token refresh');
70
70
  return;
71
71
  }
72
72
  res.locals.oauthSessionId = updatedSession.id;
@@ -75,7 +75,7 @@ async function oauthAuthMiddleware(req, res, next) {
75
75
  res.locals.gitlabUsername = updatedSession.gitlabUsername;
76
76
  res.locals.gitlabApiUrl = updatedSession.gitlabApiUrl ?? config_2.GITLAB_BASE_URL;
77
77
  res.locals.instanceLabel = updatedSession.instanceLabel;
78
- (0, logger_1.logDebug)("OAuth session validated, passing to route handler", {
78
+ (0, logger_1.logDebug)('OAuth session validated, passing to route handler', {
79
79
  sessionId: (0, logger_1.truncateId)(updatedSession.id),
80
80
  method: req.method,
81
81
  path: req.path,
@@ -92,7 +92,7 @@ async function optionalOAuthMiddleware(req, res, next) {
92
92
  return;
93
93
  }
94
94
  const authHeader = req.headers.authorization;
95
- if (!authHeader?.startsWith("Bearer ")) {
95
+ if (!authHeader?.startsWith('Bearer ')) {
96
96
  next();
97
97
  return;
98
98
  }
@@ -120,8 +120,8 @@ async function optionalOAuthMiddleware(req, res, next) {
120
120
  next();
121
121
  }
122
122
  function sendUnauthorized(req, res, error, description) {
123
- (0, logger_1.logWarn)("Authentication rejected", {
124
- event: "auth_rejected",
123
+ (0, logger_1.logWarn)('Authentication rejected', {
124
+ event: 'auth_rejected',
125
125
  ...(0, request_logger_1.getMinimalRequestContext)(req),
126
126
  reason: error,
127
127
  description,
@@ -131,7 +131,7 @@ function sendUnauthorized(req, res, error, description) {
131
131
  error_description: description,
132
132
  };
133
133
  const baseUrl = (0, metadata_1.getBaseUrl)(req);
134
- res.setHeader("WWW-Authenticate", `Bearer realm="gitlab-mcp", resource_metadata="${baseUrl}/.well-known/oauth-protected-resource"`);
134
+ res.setHeader('WWW-Authenticate', `Bearer realm="gitlab-mcp", resource_metadata="${baseUrl}/.well-known/oauth-protected-resource"`);
135
135
  res.status(401).json(response);
136
136
  }
137
137
  //# sourceMappingURL=oauth-auth.js.map
@@ -1,4 +1,4 @@
1
- import { RequestHandler } from "express";
1
+ import { RequestHandler } from 'express';
2
2
  export declare function stopCleanup(): void;
3
3
  export declare function rateLimiterMiddleware(): RequestHandler;
4
4
  export declare function getRateLimitStats(): {
@@ -22,7 +22,7 @@ function startCleanup() {
22
22
  }
23
23
  }
24
24
  if (cleaned > 0) {
25
- (0, logger_1.logDebug)("Rate limiter cleanup: removed expired entries", { cleaned });
25
+ (0, logger_1.logDebug)('Rate limiter cleanup: removed expired entries', { cleaned });
26
26
  }
27
27
  }, CLEANUP_INTERVAL_MS);
28
28
  cleanupInterval.unref();
@@ -34,14 +34,14 @@ function stopCleanup() {
34
34
  }
35
35
  }
36
36
  function getIpAddress(req) {
37
- return req.ip ?? req.socket.remoteAddress ?? "unknown";
37
+ return req.ip ?? req.socket.remoteAddress ?? 'unknown';
38
38
  }
39
39
  function isAuthenticated(req, res) {
40
40
  const oauthSessionId = res.locals.oauthSessionId;
41
41
  if (oauthSessionId) {
42
42
  return true;
43
43
  }
44
- const mcpSessionId = req.headers["mcp-session-id"];
44
+ const mcpSessionId = req.headers['mcp-session-id'];
45
45
  if (mcpSessionId) {
46
46
  return true;
47
47
  }
@@ -70,14 +70,14 @@ function checkRateLimit(key, windowMs, maxRequests) {
70
70
  };
71
71
  }
72
72
  function setRateLimitHeaders(res, info) {
73
- res.set("X-RateLimit-Limit", info.total.toString());
74
- res.set("X-RateLimit-Remaining", info.remaining.toString());
75
- res.set("X-RateLimit-Reset", Math.ceil(info.resetAt / 1000).toString());
73
+ res.set('X-RateLimit-Limit', info.total.toString());
74
+ res.set('X-RateLimit-Remaining', info.remaining.toString());
75
+ res.set('X-RateLimit-Reset', Math.ceil(info.resetAt / 1000).toString());
76
76
  }
77
77
  function rateLimiterMiddleware() {
78
78
  startCleanup();
79
79
  return (req, res, next) => {
80
- if (req.path === "/health") {
80
+ if (req.path === '/health') {
81
81
  next();
82
82
  return;
83
83
  }
@@ -87,33 +87,33 @@ function rateLimiterMiddleware() {
87
87
  next();
88
88
  return;
89
89
  }
90
- const sessionId = res.locals.oauthSessionId || req.headers["mcp-session-id"];
90
+ const sessionId = res.locals.oauthSessionId || req.headers['mcp-session-id'];
91
91
  const key = `session:${sessionId}`;
92
92
  const info = checkRateLimit(key, config_1.RATE_LIMIT_SESSION_WINDOW_MS, config_1.RATE_LIMIT_SESSION_MAX_REQUESTS);
93
93
  setRateLimitHeaders(res, info);
94
94
  const usagePercent = (info.used / info.total) * 100;
95
95
  if (info.allowed && usagePercent >= 80) {
96
- const rateLimitInfo = (0, request_logger_1.buildRateLimitInfo)("session", sessionId, info.used, info.total, info.resetAt);
97
- (0, logger_1.logDebug)("Approaching session rate limit threshold", {
98
- event: "rate_limit_warning",
96
+ const rateLimitInfo = (0, request_logger_1.buildRateLimitInfo)('session', sessionId, info.used, info.total, info.resetAt);
97
+ (0, logger_1.logDebug)('Approaching session rate limit threshold', {
98
+ event: 'rate_limit_warning',
99
99
  ...(0, request_logger_1.getMinimalRequestContext)(req),
100
100
  rateLimit: rateLimitInfo,
101
101
  });
102
102
  }
103
103
  if (!info.allowed) {
104
104
  const retryAfter = Math.ceil((info.resetAt - Date.now()) / 1000);
105
- const rateLimitInfo = (0, request_logger_1.buildRateLimitInfo)("session", sessionId, info.used, info.total, info.resetAt);
106
- (0, logger_1.logWarn)("Session rate limit exceeded", {
107
- event: "rate_limit_exceeded",
105
+ const rateLimitInfo = (0, request_logger_1.buildRateLimitInfo)('session', sessionId, info.used, info.total, info.resetAt);
106
+ (0, logger_1.logWarn)('Session rate limit exceeded', {
107
+ event: 'rate_limit_exceeded',
108
108
  ...(0, request_logger_1.getMinimalRequestContext)(req),
109
109
  rateLimit: rateLimitInfo,
110
110
  hasOAuthSession: !!res.locals.oauthSessionId,
111
- hasMcpSessionHeader: !!req.headers["mcp-session-id"],
111
+ hasMcpSessionHeader: !!req.headers['mcp-session-id'],
112
112
  });
113
- res.set("Retry-After", retryAfter.toString());
113
+ res.set('Retry-After', retryAfter.toString());
114
114
  res.status(429).json({
115
- error: "Too Many Requests",
116
- message: "Session rate limit exceeded. Please slow down your requests.",
115
+ error: 'Too Many Requests',
116
+ message: 'Session rate limit exceeded. Please slow down your requests.',
117
117
  retryAfter,
118
118
  limit: info.total,
119
119
  remaining: info.remaining,
@@ -134,31 +134,31 @@ function rateLimiterMiddleware() {
134
134
  setRateLimitHeaders(res, info);
135
135
  const usagePercent = (info.used / info.total) * 100;
136
136
  if (info.allowed && usagePercent >= 80) {
137
- const rateLimitInfo = (0, request_logger_1.buildRateLimitInfo)("ip", ip, info.used, info.total, info.resetAt);
138
- (0, logger_1.logDebug)("Approaching IP rate limit threshold", {
139
- event: "rate_limit_warning",
137
+ const rateLimitInfo = (0, request_logger_1.buildRateLimitInfo)('ip', ip, info.used, info.total, info.resetAt);
138
+ (0, logger_1.logDebug)('Approaching IP rate limit threshold', {
139
+ event: 'rate_limit_warning',
140
140
  ...(0, request_logger_1.getMinimalRequestContext)(req),
141
141
  rateLimit: rateLimitInfo,
142
- authClassification: "anonymous",
143
- authReason: "no OAuth session and no MCP-Session-Id header",
142
+ authClassification: 'anonymous',
143
+ authReason: 'no OAuth session and no MCP-Session-Id header',
144
144
  });
145
145
  }
146
146
  if (!info.allowed) {
147
147
  const retryAfter = Math.ceil((info.resetAt - Date.now()) / 1000);
148
- const rateLimitInfo = (0, request_logger_1.buildRateLimitInfo)("ip", ip, info.used, info.total, info.resetAt);
149
- const mcpSessionHeader = req.headers["mcp-session-id"];
150
- (0, logger_1.logWarn)("IP rate limit exceeded", {
151
- event: "rate_limit_exceeded",
148
+ const rateLimitInfo = (0, request_logger_1.buildRateLimitInfo)('ip', ip, info.used, info.total, info.resetAt);
149
+ const mcpSessionHeader = req.headers['mcp-session-id'];
150
+ (0, logger_1.logWarn)('IP rate limit exceeded', {
151
+ event: 'rate_limit_exceeded',
152
152
  ...(0, request_logger_1.getMinimalRequestContext)(req),
153
153
  rateLimit: rateLimitInfo,
154
- authClassification: "anonymous",
155
- authReason: "no OAuth session and no MCP-Session-Id header",
154
+ authClassification: 'anonymous',
155
+ authReason: 'no OAuth session and no MCP-Session-Id header',
156
156
  mcpSessionId: (0, request_logger_1.truncateId)(mcpSessionHeader),
157
157
  });
158
- res.set("Retry-After", retryAfter.toString());
158
+ res.set('Retry-After', retryAfter.toString());
159
159
  res.status(429).json({
160
- error: "Too Many Requests",
161
- message: "Rate limit exceeded. Please authenticate or slow down your requests.",
160
+ error: 'Too Many Requests',
161
+ message: 'Rate limit exceeded. Please authenticate or slow down your requests.',
162
162
  retryAfter,
163
163
  limit: info.total,
164
164
  remaining: info.remaining,
@@ -0,0 +1,2 @@
1
+ import type { Request, Response, NextFunction } from 'express';
2
+ export declare function responseWriteTimeoutMiddleware(): (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.responseWriteTimeoutMiddleware = responseWriteTimeoutMiddleware;
4
+ const zod_1 = require("zod");
5
+ const config_1 = require("../config");
6
+ const logger_1 = require("../logger");
7
+ const mcpSessionIdSchema = zod_1.z
8
+ .union([zod_1.z.string(), zod_1.z.array(zod_1.z.string())])
9
+ .optional()
10
+ .transform((value) => (Array.isArray(value) ? value[0] : value));
11
+ function normalizeContentType(value) {
12
+ if (typeof value === 'string')
13
+ return value.toLowerCase();
14
+ if (Array.isArray(value))
15
+ return value.join(',').toLowerCase();
16
+ return '';
17
+ }
18
+ function responseWriteTimeoutMiddleware() {
19
+ return (req, res, next) => {
20
+ if (config_1.RESPONSE_WRITE_TIMEOUT_MS <= 0) {
21
+ next();
22
+ return;
23
+ }
24
+ let writeTimer;
25
+ const originalWriteHead = res.writeHead.bind(res);
26
+ res.writeHead = (...args) => {
27
+ const result = originalWriteHead(...args);
28
+ if (!writeTimer) {
29
+ const isSSE = normalizeContentType(res.getHeader('content-type')).includes('text/event-stream');
30
+ if (!isSSE) {
31
+ writeTimer = setTimeout(() => {
32
+ if (!res.writableFinished && !res.destroyed) {
33
+ res.locals = res.locals ?? {};
34
+ res.locals.writeTimedOut = true;
35
+ const parsedSessionId = mcpSessionIdSchema.safeParse(req.headers['mcp-session-id']);
36
+ const sessionId = parsedSessionId.success ? parsedSessionId.data : undefined;
37
+ (0, logger_1.logWarn)('Response write timeout — destroying zombie connection', {
38
+ method: req.method,
39
+ path: req.path,
40
+ timeoutMs: config_1.RESPONSE_WRITE_TIMEOUT_MS,
41
+ sessionId,
42
+ reason: 'write_timeout',
43
+ });
44
+ res.destroy();
45
+ }
46
+ }, config_1.RESPONSE_WRITE_TIMEOUT_MS);
47
+ }
48
+ }
49
+ return result;
50
+ };
51
+ const cleanup = () => {
52
+ if (writeTimer) {
53
+ clearTimeout(writeTimer);
54
+ writeTimer = undefined;
55
+ }
56
+ };
57
+ res.on('finish', cleanup);
58
+ res.on('close', cleanup);
59
+ next();
60
+ };
61
+ }
62
+ //# sourceMappingURL=response-write-timeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-write-timeout.js","sourceRoot":"","sources":["../../../src/middleware/response-write-timeout.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { z } from "zod";
1
+ import { z } from 'zod';
2
2
  declare const OAuthConfigSchema: z.ZodObject<{
3
3
  enabled: z.ZodLiteral<true>;
4
4
  sessionSecret: z.ZodString;
@@ -12,10 +12,10 @@ const zod_1 = require("zod");
12
12
  const logger_1 = require("../logger");
13
13
  const OAuthConfigSchema = zod_1.z.object({
14
14
  enabled: zod_1.z.literal(true),
15
- sessionSecret: zod_1.z.string().min(32, "OAUTH_SESSION_SECRET must be at least 32 characters"),
16
- gitlabClientId: zod_1.z.string().min(1, "GITLAB_OAUTH_CLIENT_ID is required"),
15
+ sessionSecret: zod_1.z.string().min(32, 'OAUTH_SESSION_SECRET must be at least 32 characters'),
16
+ gitlabClientId: zod_1.z.string().min(1, 'GITLAB_OAUTH_CLIENT_ID is required'),
17
17
  gitlabClientSecret: zod_1.z.string().optional(),
18
- gitlabScopes: zod_1.z.string().default("api,read_user"),
18
+ gitlabScopes: zod_1.z.string().default('api,read_user'),
19
19
  tokenTtl: zod_1.z.number().positive().default(3600),
20
20
  refreshTokenTtl: zod_1.z.number().positive().default(604800),
21
21
  devicePollInterval: zod_1.z.number().positive().default(5),
@@ -26,7 +26,7 @@ function loadOAuthConfig() {
26
26
  if (cachedOAuthConfig !== undefined) {
27
27
  return cachedOAuthConfig;
28
28
  }
29
- if (process.env.OAUTH_ENABLED !== "true") {
29
+ if (process.env.OAUTH_ENABLED !== 'true') {
30
30
  cachedOAuthConfig = null;
31
31
  (0, logger_1.logDebug)("OAuth mode disabled (OAUTH_ENABLED !== 'true')");
32
32
  return null;
@@ -36,27 +36,27 @@ function loadOAuthConfig() {
36
36
  sessionSecret: process.env.OAUTH_SESSION_SECRET,
37
37
  gitlabClientId: process.env.GITLAB_OAUTH_CLIENT_ID,
38
38
  gitlabClientSecret: process.env.GITLAB_OAUTH_CLIENT_SECRET,
39
- gitlabScopes: process.env.GITLAB_OAUTH_SCOPES ?? "api,read_user",
40
- tokenTtl: parseInt(process.env.OAUTH_TOKEN_TTL ?? "3600", 10),
41
- refreshTokenTtl: parseInt(process.env.OAUTH_REFRESH_TOKEN_TTL ?? "604800", 10),
42
- devicePollInterval: parseInt(process.env.OAUTH_DEVICE_POLL_INTERVAL ?? "5", 10),
43
- deviceTimeout: parseInt(process.env.OAUTH_DEVICE_TIMEOUT ?? "300", 10),
39
+ gitlabScopes: process.env.GITLAB_OAUTH_SCOPES ?? 'api,read_user',
40
+ tokenTtl: parseInt(process.env.OAUTH_TOKEN_TTL ?? '3600', 10),
41
+ refreshTokenTtl: parseInt(process.env.OAUTH_REFRESH_TOKEN_TTL ?? '604800', 10),
42
+ devicePollInterval: parseInt(process.env.OAUTH_DEVICE_POLL_INTERVAL ?? '5', 10),
43
+ deviceTimeout: parseInt(process.env.OAUTH_DEVICE_TIMEOUT ?? '300', 10),
44
44
  });
45
45
  if (!result.success) {
46
46
  const errorMessages = result.error.issues
47
- .map(e => `${e.path.join(".")}: ${e.message}`)
48
- .join(", ");
47
+ .map((e) => `${e.path.join('.')}: ${e.message}`)
48
+ .join(', ');
49
49
  throw new Error(`Invalid OAuth configuration: ${errorMessages}`);
50
50
  }
51
51
  cachedOAuthConfig = result.data;
52
- (0, logger_1.logInfo)("OAuth mode enabled with valid configuration");
52
+ (0, logger_1.logInfo)('OAuth mode enabled with valid configuration');
53
53
  return result.data;
54
54
  }
55
55
  class ConfigurationError extends Error {
56
56
  guidance;
57
57
  constructor(guidance) {
58
- super("Missing required configuration");
59
- this.name = "ConfigurationError";
58
+ super('Missing required configuration');
59
+ this.name = 'ConfigurationError';
60
60
  this.guidance = guidance;
61
61
  }
62
62
  }
@@ -83,7 +83,7 @@ function validateStaticConfig() {
83
83
  if (!process.env.GITLAB_TOKEN) {
84
84
  throw new ConfigurationError(MISSING_TOKEN_GUIDANCE);
85
85
  }
86
- (0, logger_1.logDebug)("Static token mode: GITLAB_TOKEN configured");
86
+ (0, logger_1.logDebug)('Static token mode: GITLAB_TOKEN configured');
87
87
  }
88
88
  function isOAuthEnabled() {
89
89
  return loadOAuthConfig() !== null;
@@ -93,12 +93,12 @@ function resetOAuthConfigCache() {
93
93
  }
94
94
  function getAuthModeDescription() {
95
95
  if (isOAuthEnabled()) {
96
- return "OAuth mode (per-user authentication via GitLab Device Flow)";
96
+ return 'OAuth mode (per-user authentication via GitLab Device Flow)';
97
97
  }
98
98
  if (process.env.GITLAB_TOKEN) {
99
- return "Static token mode (shared GITLAB_TOKEN)";
99
+ return 'Static token mode (shared GITLAB_TOKEN)';
100
100
  }
101
- return "Unauthenticated mode (tools/list only, tool calls require GITLAB_TOKEN)";
101
+ return 'Unauthenticated mode (tools/list only, tool calls require GITLAB_TOKEN)';
102
102
  }
103
103
  function isStaticTokenConfigured() {
104
104
  return !!process.env.GITLAB_TOKEN;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/oauth/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/oauth/config.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { Request, Response } from "express";
1
+ import { Request, Response } from 'express';
2
2
  export declare function authorizeHandler(req: Request, res: Response): Promise<void>;
3
3
  export declare function pollHandler(req: Request, res: Response): Promise<void>;
@@ -13,31 +13,31 @@ const request_logger_1 = require("../../utils/request-logger");
13
13
  async function authorizeHandler(req, res) {
14
14
  const config = (0, config_1.loadOAuthConfig)();
15
15
  if (!config) {
16
- sendError(req, res, 500, "server_error", "OAuth not configured");
16
+ sendError(req, res, 500, 'server_error', 'OAuth not configured');
17
17
  return;
18
18
  }
19
19
  const { client_id, redirect_uri, response_type, state, code_challenge, code_challenge_method } = req.query;
20
- if (response_type !== "code") {
21
- sendError(req, res, 400, "unsupported_response_type", 'Only "code" response type is supported');
20
+ if (response_type !== 'code') {
21
+ sendError(req, res, 400, 'unsupported_response_type', 'Only "code" response type is supported');
22
22
  return;
23
23
  }
24
24
  if (!client_id) {
25
- sendError(req, res, 400, "invalid_request", "client_id is required");
25
+ sendError(req, res, 400, 'invalid_request', 'client_id is required');
26
26
  return;
27
27
  }
28
28
  if (!code_challenge) {
29
- sendError(req, res, 400, "invalid_request", "code_challenge is required (PKCE)");
29
+ sendError(req, res, 400, 'invalid_request', 'code_challenge is required (PKCE)');
30
30
  return;
31
31
  }
32
- if (code_challenge_method !== "S256") {
33
- sendError(req, res, 400, "invalid_request", 'code_challenge_method must be "S256"');
32
+ if (code_challenge_method !== 'S256') {
33
+ sendError(req, res, 400, 'invalid_request', 'code_challenge_method must be "S256"');
34
34
  return;
35
35
  }
36
36
  if (redirect_uri) {
37
37
  await handleAuthorizationCodeFlow(req, res, config, {
38
38
  clientId: client_id,
39
39
  redirectUri: redirect_uri,
40
- state: state ?? "",
40
+ state: state ?? '',
41
41
  codeChallenge: code_challenge,
42
42
  codeChallengeMethod: code_challenge_method,
43
43
  });
@@ -45,7 +45,7 @@ async function authorizeHandler(req, res) {
45
45
  else {
46
46
  await handleDeviceFlow(req, res, config, {
47
47
  clientId: client_id,
48
- state: state ?? "",
48
+ state: state ?? '',
49
49
  codeChallenge: code_challenge,
50
50
  codeChallengeMethod: code_challenge_method,
51
51
  });
@@ -66,7 +66,7 @@ async function handleAuthorizationCodeFlow(req, res, config, params) {
66
66
  expiresAt: Date.now() + 10 * 60 * 1000,
67
67
  });
68
68
  const gitlabAuthUrl = (0, gitlab_device_flow_1.buildGitLabAuthUrl)(config, callbackUri, internalState);
69
- (0, logger_1.logInfo)("Authorization Code Flow initiated, redirecting to GitLab", {
69
+ (0, logger_1.logInfo)('Authorization Code Flow initiated, redirecting to GitLab', {
70
70
  internalState: (0, logger_1.truncateId)(internalState),
71
71
  clientRedirectUri: params.redirectUri,
72
72
  });
@@ -89,7 +89,7 @@ async function handleDeviceFlow(req, res, config, params) {
89
89
  state: params.state,
90
90
  redirectUri: undefined,
91
91
  });
92
- (0, logger_1.logInfo)("Device flow initiated for authorization", {
92
+ (0, logger_1.logInfo)('Device flow initiated for authorization', {
93
93
  flowState: (0, logger_1.truncateId)(flowState),
94
94
  userCode: deviceResponse.user_code,
95
95
  });
@@ -102,37 +102,37 @@ async function handleDeviceFlow(req, res, config, params) {
102
102
  pollUrl: `${baseUrl}/oauth/poll`,
103
103
  expiresIn: deviceResponse.expires_in,
104
104
  });
105
- res.setHeader("Content-Type", "text/html");
105
+ res.setHeader('Content-Type', 'text/html');
106
106
  res.send(html);
107
107
  }
108
108
  catch (error) {
109
- (0, logger_1.logError)("Failed to initiate device flow", { err: error });
110
- sendError(req, res, 500, "server_error", "Failed to initiate authentication");
109
+ (0, logger_1.logError)('Failed to initiate device flow', { err: error });
110
+ sendError(req, res, 500, 'server_error', 'Failed to initiate authentication');
111
111
  }
112
112
  }
113
113
  async function pollHandler(req, res) {
114
114
  const config = (0, config_1.loadOAuthConfig)();
115
115
  if (!config) {
116
- res.status(500).json({ error: "server_error" });
116
+ res.status(500).json({ error: 'server_error' });
117
117
  return;
118
118
  }
119
119
  const { flow_state } = req.query;
120
120
  if (!flow_state) {
121
121
  res
122
122
  .status(400)
123
- .json({ status: "failed", error: "Missing flow_state" });
123
+ .json({ status: 'failed', error: 'Missing flow_state' });
124
124
  return;
125
125
  }
126
126
  const flow = session_store_1.sessionStore.getDeviceFlow(flow_state);
127
127
  if (!flow) {
128
- res.status(400).json({ status: "expired", error: "Flow not found" });
128
+ res.status(400).json({ status: 'expired', error: 'Flow not found' });
129
129
  return;
130
130
  }
131
131
  if (Date.now() > flow.expiresAt) {
132
132
  session_store_1.sessionStore.deleteDeviceFlow(flow_state);
133
133
  res
134
134
  .status(400)
135
- .json({ status: "expired", error: "Device code expired" });
135
+ .json({ status: 'expired', error: 'Device code expired' });
136
136
  return;
137
137
  }
138
138
  try {
@@ -153,8 +153,8 @@ async function pollHandler(req, res) {
153
153
  });
154
154
  session_store_1.sessionStore.createSession({
155
155
  id: sessionId,
156
- mcpAccessToken: "",
157
- mcpRefreshToken: "",
156
+ mcpAccessToken: '',
157
+ mcpRefreshToken: '',
158
158
  mcpTokenExpiry: 0,
159
159
  gitlabAccessToken: tokenResponse.access_token,
160
160
  gitlabRefreshToken: tokenResponse.refresh_token,
@@ -164,18 +164,18 @@ async function pollHandler(req, res) {
164
164
  gitlabApiUrl: flow.selectedInstance ?? config_2.GITLAB_BASE_URL,
165
165
  instanceLabel: flow.selectedInstanceLabel,
166
166
  clientId: flow.clientId,
167
- scopes: ["mcp:tools", "mcp:resources"],
167
+ scopes: ['mcp:tools', 'mcp:resources'],
168
168
  createdAt: now,
169
169
  updatedAt: now,
170
170
  });
171
171
  session_store_1.sessionStore.deleteDeviceFlow(flow_state);
172
- (0, logger_1.logInfo)("Device flow authorization completed", {
172
+ (0, logger_1.logInfo)('Device flow authorization completed', {
173
173
  sessionId: (0, logger_1.truncateId)(sessionId),
174
174
  userId: userInfo.id,
175
175
  username: userInfo.username,
176
176
  });
177
177
  const response = {
178
- status: "complete",
178
+ status: 'complete',
179
179
  redirect_uri: flow.redirectUri,
180
180
  code: authCode,
181
181
  state: flow.state ? flow.state : undefined,
@@ -183,25 +183,25 @@ async function pollHandler(req, res) {
183
183
  res.json(response);
184
184
  }
185
185
  else {
186
- res.json({ status: "pending" });
186
+ res.json({ status: 'pending' });
187
187
  }
188
188
  }
189
189
  catch (error) {
190
- const message = error instanceof Error ? error.message : "Unknown error";
191
- if (message.includes("expired") || message.includes("denied") || message.includes("invalid")) {
190
+ const message = error instanceof Error ? error.message : 'Unknown error';
191
+ if (message.includes('expired') || message.includes('denied') || message.includes('invalid')) {
192
192
  session_store_1.sessionStore.deleteDeviceFlow(flow_state);
193
- res.json({ status: "failed", error: message });
193
+ res.json({ status: 'failed', error: message });
194
194
  }
195
195
  else {
196
- (0, logger_1.logWarn)("Device flow poll error", { err: error });
197
- res.json({ status: "pending" });
196
+ (0, logger_1.logWarn)('Device flow poll error', { err: error });
197
+ res.json({ status: 'pending' });
198
198
  }
199
199
  }
200
200
  }
201
201
  function sendError(req, res, status, error, description) {
202
- (0, logger_1.logWarn)("OAuth authorize request failed", {
203
- event: "oauth_error",
204
- endpoint: "/authorize",
202
+ (0, logger_1.logWarn)('OAuth authorize request failed', {
203
+ event: 'oauth_error',
204
+ endpoint: '/authorize',
205
205
  ip: (0, request_logger_1.getIpAddress)(req),
206
206
  error,
207
207
  description,
@@ -1,2 +1,2 @@
1
- import { Request, Response } from "express";
1
+ import { Request, Response } from 'express';
2
2
  export declare function callbackHandler(req: Request, res: Response): Promise<void>;