db-mcp 1.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 (208) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +860 -0
  3. package/dist/adapters/DatabaseAdapter.d.ts +141 -0
  4. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -0
  5. package/dist/adapters/DatabaseAdapter.js +131 -0
  6. package/dist/adapters/DatabaseAdapter.js.map +1 -0
  7. package/dist/adapters/sqlite/SchemaManager.d.ts +58 -0
  8. package/dist/adapters/sqlite/SchemaManager.d.ts.map +1 -0
  9. package/dist/adapters/sqlite/SchemaManager.js +187 -0
  10. package/dist/adapters/sqlite/SchemaManager.js.map +1 -0
  11. package/dist/adapters/sqlite/SqliteAdapter.d.ts +161 -0
  12. package/dist/adapters/sqlite/SqliteAdapter.d.ts.map +1 -0
  13. package/dist/adapters/sqlite/SqliteAdapter.js +741 -0
  14. package/dist/adapters/sqlite/SqliteAdapter.js.map +1 -0
  15. package/dist/adapters/sqlite/index.d.ts +9 -0
  16. package/dist/adapters/sqlite/index.d.ts.map +1 -0
  17. package/dist/adapters/sqlite/index.js +8 -0
  18. package/dist/adapters/sqlite/index.js.map +1 -0
  19. package/dist/adapters/sqlite/json-utils.d.ts +100 -0
  20. package/dist/adapters/sqlite/json-utils.d.ts.map +1 -0
  21. package/dist/adapters/sqlite/json-utils.js +274 -0
  22. package/dist/adapters/sqlite/json-utils.js.map +1 -0
  23. package/dist/adapters/sqlite/output-schemas.d.ts +1187 -0
  24. package/dist/adapters/sqlite/output-schemas.d.ts.map +1 -0
  25. package/dist/adapters/sqlite/output-schemas.js +1337 -0
  26. package/dist/adapters/sqlite/output-schemas.js.map +1 -0
  27. package/dist/adapters/sqlite/prompts.d.ts +13 -0
  28. package/dist/adapters/sqlite/prompts.d.ts.map +1 -0
  29. package/dist/adapters/sqlite/prompts.js +605 -0
  30. package/dist/adapters/sqlite/prompts.js.map +1 -0
  31. package/dist/adapters/sqlite/resources.d.ts +13 -0
  32. package/dist/adapters/sqlite/resources.d.ts.map +1 -0
  33. package/dist/adapters/sqlite/resources.js +251 -0
  34. package/dist/adapters/sqlite/resources.js.map +1 -0
  35. package/dist/adapters/sqlite/tools/admin.d.ts +14 -0
  36. package/dist/adapters/sqlite/tools/admin.d.ts.map +1 -0
  37. package/dist/adapters/sqlite/tools/admin.js +788 -0
  38. package/dist/adapters/sqlite/tools/admin.js.map +1 -0
  39. package/dist/adapters/sqlite/tools/core.d.ts +25 -0
  40. package/dist/adapters/sqlite/tools/core.d.ts.map +1 -0
  41. package/dist/adapters/sqlite/tools/core.js +359 -0
  42. package/dist/adapters/sqlite/tools/core.js.map +1 -0
  43. package/dist/adapters/sqlite/tools/fts.d.ts +13 -0
  44. package/dist/adapters/sqlite/tools/fts.d.ts.map +1 -0
  45. package/dist/adapters/sqlite/tools/fts.js +347 -0
  46. package/dist/adapters/sqlite/tools/fts.js.map +1 -0
  47. package/dist/adapters/sqlite/tools/geo.d.ts +14 -0
  48. package/dist/adapters/sqlite/tools/geo.d.ts.map +1 -0
  49. package/dist/adapters/sqlite/tools/geo.js +252 -0
  50. package/dist/adapters/sqlite/tools/geo.js.map +1 -0
  51. package/dist/adapters/sqlite/tools/index.d.ts +30 -0
  52. package/dist/adapters/sqlite/tools/index.d.ts.map +1 -0
  53. package/dist/adapters/sqlite/tools/index.js +61 -0
  54. package/dist/adapters/sqlite/tools/index.js.map +1 -0
  55. package/dist/adapters/sqlite/tools/json-helpers.d.ts +14 -0
  56. package/dist/adapters/sqlite/tools/json-helpers.d.ts.map +1 -0
  57. package/dist/adapters/sqlite/tools/json-helpers.js +477 -0
  58. package/dist/adapters/sqlite/tools/json-helpers.js.map +1 -0
  59. package/dist/adapters/sqlite/tools/json-operations.d.ts +14 -0
  60. package/dist/adapters/sqlite/tools/json-operations.d.ts.map +1 -0
  61. package/dist/adapters/sqlite/tools/json-operations.js +839 -0
  62. package/dist/adapters/sqlite/tools/json-operations.js.map +1 -0
  63. package/dist/adapters/sqlite/tools/stats.d.ts +15 -0
  64. package/dist/adapters/sqlite/tools/stats.d.ts.map +1 -0
  65. package/dist/adapters/sqlite/tools/stats.js +1219 -0
  66. package/dist/adapters/sqlite/tools/stats.js.map +1 -0
  67. package/dist/adapters/sqlite/tools/text.d.ts +14 -0
  68. package/dist/adapters/sqlite/tools/text.d.ts.map +1 -0
  69. package/dist/adapters/sqlite/tools/text.js +1141 -0
  70. package/dist/adapters/sqlite/tools/text.js.map +1 -0
  71. package/dist/adapters/sqlite/tools/vector.d.ts +14 -0
  72. package/dist/adapters/sqlite/tools/vector.d.ts.map +1 -0
  73. package/dist/adapters/sqlite/tools/vector.js +613 -0
  74. package/dist/adapters/sqlite/tools/vector.js.map +1 -0
  75. package/dist/adapters/sqlite/tools/virtual.d.ts +13 -0
  76. package/dist/adapters/sqlite/tools/virtual.d.ts.map +1 -0
  77. package/dist/adapters/sqlite/tools/virtual.js +930 -0
  78. package/dist/adapters/sqlite/tools/virtual.js.map +1 -0
  79. package/dist/adapters/sqlite/types.d.ts +207 -0
  80. package/dist/adapters/sqlite/types.d.ts.map +1 -0
  81. package/dist/adapters/sqlite/types.js +186 -0
  82. package/dist/adapters/sqlite/types.js.map +1 -0
  83. package/dist/adapters/sqlite-native/NativeSqliteAdapter.d.ts +163 -0
  84. package/dist/adapters/sqlite-native/NativeSqliteAdapter.d.ts.map +1 -0
  85. package/dist/adapters/sqlite-native/NativeSqliteAdapter.js +748 -0
  86. package/dist/adapters/sqlite-native/NativeSqliteAdapter.js.map +1 -0
  87. package/dist/adapters/sqlite-native/index.d.ts +11 -0
  88. package/dist/adapters/sqlite-native/index.d.ts.map +1 -0
  89. package/dist/adapters/sqlite-native/index.js +11 -0
  90. package/dist/adapters/sqlite-native/index.js.map +1 -0
  91. package/dist/adapters/sqlite-native/tools/spatialite.d.ts +19 -0
  92. package/dist/adapters/sqlite-native/tools/spatialite.d.ts.map +1 -0
  93. package/dist/adapters/sqlite-native/tools/spatialite.js +628 -0
  94. package/dist/adapters/sqlite-native/tools/spatialite.js.map +1 -0
  95. package/dist/adapters/sqlite-native/tools/transactions.d.ts +12 -0
  96. package/dist/adapters/sqlite-native/tools/transactions.d.ts.map +1 -0
  97. package/dist/adapters/sqlite-native/tools/transactions.js +255 -0
  98. package/dist/adapters/sqlite-native/tools/transactions.js.map +1 -0
  99. package/dist/adapters/sqlite-native/tools/window.d.ts +12 -0
  100. package/dist/adapters/sqlite-native/tools/window.d.ts.map +1 -0
  101. package/dist/adapters/sqlite-native/tools/window.js +370 -0
  102. package/dist/adapters/sqlite-native/tools/window.js.map +1 -0
  103. package/dist/auth/AuthorizationServerDiscovery.d.ts +90 -0
  104. package/dist/auth/AuthorizationServerDiscovery.d.ts.map +1 -0
  105. package/dist/auth/AuthorizationServerDiscovery.js +204 -0
  106. package/dist/auth/AuthorizationServerDiscovery.js.map +1 -0
  107. package/dist/auth/OAuthResourceServer.d.ts +65 -0
  108. package/dist/auth/OAuthResourceServer.d.ts.map +1 -0
  109. package/dist/auth/OAuthResourceServer.js +121 -0
  110. package/dist/auth/OAuthResourceServer.js.map +1 -0
  111. package/dist/auth/TokenValidator.d.ts +60 -0
  112. package/dist/auth/TokenValidator.d.ts.map +1 -0
  113. package/dist/auth/TokenValidator.js +235 -0
  114. package/dist/auth/TokenValidator.js.map +1 -0
  115. package/dist/auth/errors.d.ts +74 -0
  116. package/dist/auth/errors.d.ts.map +1 -0
  117. package/dist/auth/errors.js +133 -0
  118. package/dist/auth/errors.js.map +1 -0
  119. package/dist/auth/index.d.ts +13 -0
  120. package/dist/auth/index.d.ts.map +1 -0
  121. package/dist/auth/index.js +15 -0
  122. package/dist/auth/index.js.map +1 -0
  123. package/dist/auth/middleware.d.ts +81 -0
  124. package/dist/auth/middleware.d.ts.map +1 -0
  125. package/dist/auth/middleware.js +291 -0
  126. package/dist/auth/middleware.js.map +1 -0
  127. package/dist/auth/scopes.d.ts +136 -0
  128. package/dist/auth/scopes.d.ts.map +1 -0
  129. package/dist/auth/scopes.js +349 -0
  130. package/dist/auth/scopes.js.map +1 -0
  131. package/dist/auth/types.d.ts +257 -0
  132. package/dist/auth/types.d.ts.map +1 -0
  133. package/dist/auth/types.js +8 -0
  134. package/dist/auth/types.js.map +1 -0
  135. package/dist/cli.d.ts +8 -0
  136. package/dist/cli.d.ts.map +1 -0
  137. package/dist/cli.js +236 -0
  138. package/dist/cli.js.map +1 -0
  139. package/dist/constants/ServerInstructions.d.ts +45 -0
  140. package/dist/constants/ServerInstructions.d.ts.map +1 -0
  141. package/dist/constants/ServerInstructions.js +356 -0
  142. package/dist/constants/ServerInstructions.js.map +1 -0
  143. package/dist/filtering/ToolConstants.d.ts +34 -0
  144. package/dist/filtering/ToolConstants.d.ts.map +1 -0
  145. package/dist/filtering/ToolConstants.js +174 -0
  146. package/dist/filtering/ToolConstants.js.map +1 -0
  147. package/dist/filtering/ToolFilter.d.ts +82 -0
  148. package/dist/filtering/ToolFilter.d.ts.map +1 -0
  149. package/dist/filtering/ToolFilter.js +296 -0
  150. package/dist/filtering/ToolFilter.js.map +1 -0
  151. package/dist/index.d.ts +13 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +17 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/server/McpServer.d.ts +61 -0
  156. package/dist/server/McpServer.d.ts.map +1 -0
  157. package/dist/server/McpServer.js +270 -0
  158. package/dist/server/McpServer.js.map +1 -0
  159. package/dist/transports/http.d.ts +134 -0
  160. package/dist/transports/http.d.ts.map +1 -0
  161. package/dist/transports/http.js +516 -0
  162. package/dist/transports/http.js.map +1 -0
  163. package/dist/transports/index.d.ts +5 -0
  164. package/dist/transports/index.d.ts.map +1 -0
  165. package/dist/transports/index.js +5 -0
  166. package/dist/transports/index.js.map +1 -0
  167. package/dist/types/index.d.ts +380 -0
  168. package/dist/types/index.d.ts.map +1 -0
  169. package/dist/types/index.js +68 -0
  170. package/dist/types/index.js.map +1 -0
  171. package/dist/utils/annotations.d.ts +44 -0
  172. package/dist/utils/annotations.d.ts.map +1 -0
  173. package/dist/utils/annotations.js +77 -0
  174. package/dist/utils/annotations.js.map +1 -0
  175. package/dist/utils/errors.d.ts +155 -0
  176. package/dist/utils/errors.d.ts.map +1 -0
  177. package/dist/utils/errors.js +329 -0
  178. package/dist/utils/errors.js.map +1 -0
  179. package/dist/utils/identifiers.d.ts +121 -0
  180. package/dist/utils/identifiers.d.ts.map +1 -0
  181. package/dist/utils/identifiers.js +319 -0
  182. package/dist/utils/identifiers.js.map +1 -0
  183. package/dist/utils/index.d.ts +7 -0
  184. package/dist/utils/index.d.ts.map +1 -0
  185. package/dist/utils/index.js +7 -0
  186. package/dist/utils/index.js.map +1 -0
  187. package/dist/utils/insightsManager.d.ts +39 -0
  188. package/dist/utils/insightsManager.d.ts.map +1 -0
  189. package/dist/utils/insightsManager.js +63 -0
  190. package/dist/utils/insightsManager.js.map +1 -0
  191. package/dist/utils/logger.d.ts +189 -0
  192. package/dist/utils/logger.d.ts.map +1 -0
  193. package/dist/utils/logger.js +394 -0
  194. package/dist/utils/logger.js.map +1 -0
  195. package/dist/utils/progress-utils.d.ts +54 -0
  196. package/dist/utils/progress-utils.d.ts.map +1 -0
  197. package/dist/utils/progress-utils.js +74 -0
  198. package/dist/utils/progress-utils.js.map +1 -0
  199. package/dist/utils/resourceAnnotations.d.ts +36 -0
  200. package/dist/utils/resourceAnnotations.d.ts.map +1 -0
  201. package/dist/utils/resourceAnnotations.js +57 -0
  202. package/dist/utils/resourceAnnotations.js.map +1 -0
  203. package/dist/utils/where-clause.d.ts +41 -0
  204. package/dist/utils/where-clause.d.ts.map +1 -0
  205. package/dist/utils/where-clause.js +116 -0
  206. package/dist/utils/where-clause.js.map +1 -0
  207. package/package.json +83 -0
  208. package/server.json +53 -0
@@ -0,0 +1,291 @@
1
+ /**
2
+ * db-mcp - OAuth Middleware
3
+ *
4
+ * Express middleware for OAuth 2.0 authentication and authorization.
5
+ * Extracts Bearer tokens, validates them, and enforces scope requirements.
6
+ */
7
+ import { TokenMissingError, InvalidTokenError, InsufficientScopeError, isOAuthError, } from "./errors.js";
8
+ import { scopesGrantToolAccess } from "./scopes.js";
9
+ import { createModuleLogger, ERROR_CODES } from "../utils/logger.js";
10
+ const logger = createModuleLogger("AUTH");
11
+ // =============================================================================
12
+ // Token Extraction
13
+ // =============================================================================
14
+ /**
15
+ * Extract Bearer token from Authorization header
16
+ *
17
+ * @param authHeader - Authorization header value
18
+ * @returns The token or null if not present/invalid
19
+ */
20
+ export function extractBearerToken(authHeader) {
21
+ if (!authHeader) {
22
+ return null;
23
+ }
24
+ // Check for Bearer scheme (case-insensitive)
25
+ const parts = authHeader.split(" ");
26
+ const scheme = parts[0];
27
+ const tokenPart = parts[1];
28
+ if (parts.length !== 2 || scheme?.toLowerCase() !== "bearer") {
29
+ return null;
30
+ }
31
+ if (tokenPart === undefined) {
32
+ return null;
33
+ }
34
+ const token = tokenPart.trim();
35
+ return token.length > 0 ? token : null;
36
+ }
37
+ // =============================================================================
38
+ // Path Matching
39
+ // =============================================================================
40
+ /**
41
+ * Check if a path matches any of the public path patterns
42
+ *
43
+ * Supports:
44
+ * - Exact matches: '/health' matches '/health'
45
+ * - Wildcard suffix: '/api/*' matches '/api/users', '/api/posts/1'
46
+ * - Well-known paths are always public
47
+ */
48
+ function isPublicPath(path, publicPaths) {
49
+ // Well-known paths are always public (RFC requirement)
50
+ if (path.startsWith("/.well-known/")) {
51
+ return true;
52
+ }
53
+ for (const pattern of publicPaths) {
54
+ // Exact match
55
+ if (pattern === path) {
56
+ return true;
57
+ }
58
+ // Wildcard match
59
+ if (pattern.endsWith("/*")) {
60
+ const prefix = pattern.slice(0, -2);
61
+ if (path === prefix || path.startsWith(prefix + "/")) {
62
+ return true;
63
+ }
64
+ }
65
+ }
66
+ return false;
67
+ }
68
+ // =============================================================================
69
+ // Main Authentication Middleware
70
+ // =============================================================================
71
+ /**
72
+ * Create the main authentication middleware
73
+ *
74
+ * This middleware:
75
+ * 1. Skips authentication for public paths (e.g., /.well-known/*)
76
+ * 2. Extracts Bearer token from Authorization header
77
+ * 3. Validates the token using the TokenValidator
78
+ * 4. Attaches validated claims to req.auth
79
+ * 5. Returns 401 with WWW-Authenticate header on failure
80
+ */
81
+ export function createAuthMiddleware(config) {
82
+ const { tokenValidator, resourceServer, publicPaths = [] } = config;
83
+ return async (req, res, next) => {
84
+ // Generate request ID for tracing
85
+ const requestId = crypto.randomUUID();
86
+ req.requestId = requestId;
87
+ // Check if path is public
88
+ if (isPublicPath(req.path, publicPaths)) {
89
+ logger.info(`Public path accessed: ${req.path}`, {
90
+ code: "AUTH_PUBLIC_PATH",
91
+ requestId,
92
+ path: req.path,
93
+ });
94
+ next();
95
+ return;
96
+ }
97
+ // Extract Bearer token
98
+ const token = extractBearerToken(req.headers.authorization);
99
+ if (!token) {
100
+ const error = new TokenMissingError(resourceServer.getResourceUri());
101
+ logger.warning("No access token provided", {
102
+ code: ERROR_CODES.AUTH.TOKEN_MISSING.full,
103
+ requestId,
104
+ path: req.path,
105
+ });
106
+ res.status(error.httpStatus);
107
+ res.setHeader("WWW-Authenticate", error.wwwAuthenticate ?? "");
108
+ res.json({
109
+ error: "unauthorized",
110
+ error_description: error.message,
111
+ });
112
+ return;
113
+ }
114
+ // Validate token
115
+ const result = await tokenValidator.validate(token);
116
+ if (!result.valid) {
117
+ // Create error for logging (variable intentionally used only for type check)
118
+ new InvalidTokenError(result.error);
119
+ logger.warning(`Token validation failed: ${result.error ?? "Unknown error"}`, {
120
+ code: result.errorCode ?? ERROR_CODES.AUTH.TOKEN_INVALID.full,
121
+ requestId,
122
+ path: req.path,
123
+ });
124
+ res.status(401);
125
+ res.setHeader("WWW-Authenticate", resourceServer.getWWWAuthenticateHeader("invalid_token", result.error));
126
+ res.json({
127
+ error: "invalid_token",
128
+ error_description: result.error,
129
+ });
130
+ return;
131
+ }
132
+ // Attach claims to request (claims is guaranteed defined when valid is true)
133
+ const claims = result.claims;
134
+ if (!claims) {
135
+ // Should not happen when valid is true, but satisfies TypeScript
136
+ res.status(500).json({ error: "internal_error" });
137
+ return;
138
+ }
139
+ req.auth = claims;
140
+ req.accessToken = token;
141
+ logger.info(`Request authenticated: ${claims.sub}`, {
142
+ code: "AUTH_SUCCESS",
143
+ requestId,
144
+ sub: claims.sub,
145
+ scopes: claims.scopes.length,
146
+ path: req.path,
147
+ });
148
+ next();
149
+ };
150
+ }
151
+ // =============================================================================
152
+ // Scope Enforcement Middleware
153
+ // =============================================================================
154
+ /**
155
+ * Middleware factory that requires a specific scope
156
+ *
157
+ * @param scope - Required scope
158
+ * @returns Express middleware
159
+ */
160
+ export function requireScope(scope) {
161
+ return (req, res, next) => {
162
+ if (!req.auth) {
163
+ // Should not happen if auth middleware is applied first
164
+ res.status(401).json({
165
+ error: "unauthorized",
166
+ error_description: "Authentication required",
167
+ });
168
+ return;
169
+ }
170
+ const hasScope = req.auth.scopes.includes(scope) || req.auth.scopes.includes("admin"); // Admin scope grants all
171
+ if (!hasScope) {
172
+ const error = new InsufficientScopeError(scope, req.auth.scopes);
173
+ logger.warning(`Insufficient scope: required ${scope}`, {
174
+ code: ERROR_CODES.AUTH.SCOPE_DENIED.full,
175
+ requestId: req.requestId,
176
+ requiredScope: scope,
177
+ providedScopes: req.auth.scopes,
178
+ });
179
+ res.status(error.httpStatus);
180
+ res.setHeader("WWW-Authenticate", error.wwwAuthenticate ?? "");
181
+ res.json({
182
+ error: "insufficient_scope",
183
+ error_description: error.message,
184
+ required_scope: scope,
185
+ });
186
+ return;
187
+ }
188
+ next();
189
+ };
190
+ }
191
+ /**
192
+ * Middleware factory that requires any of the specified scopes
193
+ *
194
+ * @param scopes - Array of acceptable scopes (user must have at least one)
195
+ * @returns Express middleware
196
+ */
197
+ export function requireAnyScope(scopes) {
198
+ return (req, res, next) => {
199
+ if (!req.auth) {
200
+ res.status(401).json({
201
+ error: "unauthorized",
202
+ error_description: "Authentication required",
203
+ });
204
+ return;
205
+ }
206
+ // Admin scope grants all
207
+ if (req.auth.scopes.includes("admin")) {
208
+ next();
209
+ return;
210
+ }
211
+ const hasAnyScope = scopes.some((scope) => req.auth?.scopes.includes(scope));
212
+ if (!hasAnyScope) {
213
+ const error = new InsufficientScopeError(scopes, req.auth.scopes);
214
+ logger.warning(`Insufficient scope: required one of [${scopes.join(", ")}]`, {
215
+ code: ERROR_CODES.AUTH.SCOPE_DENIED.full,
216
+ requestId: req.requestId,
217
+ requiredScopes: scopes,
218
+ providedScopes: req.auth.scopes,
219
+ });
220
+ res.status(error.httpStatus);
221
+ res.setHeader("WWW-Authenticate", error.wwwAuthenticate ?? "");
222
+ res.json({
223
+ error: "insufficient_scope",
224
+ error_description: error.message,
225
+ required_scopes: scopes,
226
+ });
227
+ return;
228
+ }
229
+ next();
230
+ };
231
+ }
232
+ /**
233
+ * Middleware factory that requires scope for a specific tool
234
+ *
235
+ * @param toolName - Name of the tool being accessed
236
+ * @returns Express middleware
237
+ */
238
+ export function requireToolScope(toolName) {
239
+ return (req, res, next) => {
240
+ if (!req.auth) {
241
+ res.status(401).json({
242
+ error: "unauthorized",
243
+ error_description: "Authentication required",
244
+ });
245
+ return;
246
+ }
247
+ const hasAccess = scopesGrantToolAccess(req.auth.scopes, toolName);
248
+ if (!hasAccess) {
249
+ const error = new InsufficientScopeError(`Tool access: ${toolName}`, req.auth.scopes);
250
+ logger.warning(`Insufficient scope for tool: ${toolName}`, {
251
+ code: ERROR_CODES.AUTH.SCOPE_DENIED.full,
252
+ requestId: req.requestId,
253
+ toolName,
254
+ providedScopes: req.auth.scopes,
255
+ });
256
+ res.status(error.httpStatus);
257
+ res.setHeader("WWW-Authenticate", error.wwwAuthenticate ?? "");
258
+ res.json({
259
+ error: "insufficient_scope",
260
+ error_description: `Access to tool '${toolName}' denied`,
261
+ tool: toolName,
262
+ });
263
+ return;
264
+ }
265
+ next();
266
+ };
267
+ }
268
+ // =============================================================================
269
+ // Error Handler
270
+ // =============================================================================
271
+ /**
272
+ * Error handler middleware for OAuth errors
273
+ *
274
+ * Should be added after all routes to catch OAuth-related errors
275
+ */
276
+ export function oauthErrorHandler(error, _req, res, next) {
277
+ if (isOAuthError(error)) {
278
+ res.status(error.httpStatus);
279
+ if (error.wwwAuthenticate) {
280
+ res.setHeader("WWW-Authenticate", error.wwwAuthenticate);
281
+ }
282
+ res.json({
283
+ error: error.code,
284
+ error_description: error.message,
285
+ });
286
+ return;
287
+ }
288
+ // Pass to next error handler
289
+ next(error);
290
+ }
291
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAErE,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAuC1C,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAA8B;IAE9B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6CAA6C;IAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC;AAED,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,WAAqB;IACvD,uDAAuD;IACvD,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,cAAc;QACd,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iBAAiB;QACjB,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;gBACrD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gFAAgF;AAChF,iCAAiC;AACjC,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAA4B;IAE5B,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAEpE,OAAO,KAAK,EACV,GAAY,EACZ,GAAa,EACb,IAAkB,EACH,EAAE;QACjB,kCAAkC;QAClC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACtC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;QAE1B,0BAA0B;QAC1B,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,yBAAyB,GAAG,CAAC,IAAI,EAAE,EAAE;gBAC/C,IAAI,EAAE,kBAAkB;gBACxB,SAAS;gBACT,IAAI,EAAE,GAAG,CAAC,IAAI;aACf,CAAC,CAAC;YACH,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,uBAAuB;QACvB,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAE5D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC;YAErE,MAAM,CAAC,OAAO,CAAC,0BAA0B,EAAE;gBACzC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI;gBACzC,SAAS;gBACT,IAAI,EAAE,GAAG,CAAC,IAAI;aACf,CAAC,CAAC;YAEH,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;YAC/D,GAAG,CAAC,IAAI,CAAC;gBACP,KAAK,EAAE,cAAc;gBACrB,iBAAiB,EAAE,KAAK,CAAC,OAAO;aACjC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,iBAAiB;QACjB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEpD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,6EAA6E;YAC7E,IAAI,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEpC,MAAM,CAAC,OAAO,CACZ,4BAA4B,MAAM,CAAC,KAAK,IAAI,eAAe,EAAE,EAC7D;gBACE,IAAI,EAAE,MAAM,CAAC,SAAS,IAAI,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI;gBAC7D,SAAS;gBACT,IAAI,EAAE,GAAG,CAAC,IAAI;aACf,CACF,CAAC;YAEF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChB,GAAG,CAAC,SAAS,CACX,kBAAkB,EAClB,cAAc,CAAC,wBAAwB,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,CACvE,CAAC;YACF,GAAG,CAAC,IAAI,CAAC;gBACP,KAAK,EAAE,eAAe;gBACtB,iBAAiB,EAAE,MAAM,CAAC,KAAK;aAChC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,6EAA6E;QAC7E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,iEAAiE;YACjE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC;QAClB,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;QAExB,MAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,GAAG,EAAE,EAAE;YAClD,IAAI,EAAE,cAAc;YACpB,SAAS;YACT,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,+BAA+B;AAC/B,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,wDAAwD;YACxD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,cAAc;gBACrB,iBAAiB,EAAE,yBAAyB;aAC7C,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GACZ,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB;QAEjG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,IAAI,sBAAsB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEjE,MAAM,CAAC,OAAO,CAAC,gCAAgC,KAAK,EAAE,EAAE;gBACtD,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI;gBACxC,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,aAAa,EAAE,KAAK;gBACpB,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;aAChC,CAAC,CAAC;YAEH,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;YAC/D,GAAG,CAAC,IAAI,CAAC;gBACP,KAAK,EAAE,oBAAoB;gBAC3B,iBAAiB,EAAE,KAAK,CAAC,OAAO;gBAChC,cAAc,EAAE,KAAK;aACtB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAgB;IAC9C,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,cAAc;gBACrB,iBAAiB,EAAE,yBAAyB;aAC7C,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACxC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CACjC,CAAC;QAEF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,IAAI,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAElE,MAAM,CAAC,OAAO,CACZ,wCAAwC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAC5D;gBACE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI;gBACxC,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,cAAc,EAAE,MAAM;gBACtB,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;aAChC,CACF,CAAC;YAEF,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;YAC/D,GAAG,CAAC,IAAI,CAAC;gBACP,KAAK,EAAE,oBAAoB;gBAC3B,iBAAiB,EAAE,KAAK,CAAC,OAAO;gBAChC,eAAe,EAAE,MAAM;aACxB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,cAAc;gBACrB,iBAAiB,EAAE,yBAAyB;aAC7C,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEnE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,sBAAsB,CACtC,gBAAgB,QAAQ,EAAE,EAC1B,GAAG,CAAC,IAAI,CAAC,MAAM,CAChB,CAAC;YAEF,MAAM,CAAC,OAAO,CAAC,gCAAgC,QAAQ,EAAE,EAAE;gBACzD,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI;gBACxC,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,QAAQ;gBACR,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;aAChC,CAAC,CAAC;YAEH,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;YAC/D,GAAG,CAAC,IAAI,CAAC;gBACP,KAAK,EAAE,oBAAoB;gBAC3B,iBAAiB,EAAE,mBAAmB,QAAQ,UAAU;gBACxD,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAY,EACZ,IAAa,EACb,GAAa,EACb,IAAkB;IAElB,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAE7B,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;QAC3D,CAAC;QAED,GAAG,CAAC,IAAI,CAAC;YACP,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,iBAAiB,EAAE,KAAK,CAAC,OAAO;SACjC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC,KAAK,CAAC,CAAC;AACd,CAAC"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * db-mcp - OAuth Scopes
3
+ *
4
+ * Scope definitions and enforcement utilities for
5
+ * granular access control.
6
+ *
7
+ * Scope Patterns:
8
+ * - read : Read-only access to all databases
9
+ * - write : Read and write access to all databases
10
+ * - admin : Full administrative access
11
+ * - db:{name} : Access to specific database only
12
+ * - table:{db}:{table} : Access to specific table only
13
+ */
14
+ import type { ToolGroup } from "../types/index.js";
15
+ /**
16
+ * Base scopes supported by the server
17
+ */
18
+ export declare const BASE_SCOPES: readonly ["read", "write", "admin"];
19
+ /**
20
+ * Scope patterns (regex patterns for validation)
21
+ */
22
+ export declare const SCOPE_PATTERNS: {
23
+ /** Read-only access */
24
+ readonly READ: "read";
25
+ /** Read and write access */
26
+ readonly WRITE: "write";
27
+ /** Full admin access */
28
+ readonly ADMIN: "admin";
29
+ /** Database-specific access pattern */
30
+ readonly DATABASE: RegExp;
31
+ /** Table-specific access pattern */
32
+ readonly TABLE: RegExp;
33
+ };
34
+ /**
35
+ * All supported scope patterns for metadata
36
+ */
37
+ export declare const SUPPORTED_SCOPES: readonly ["read", "write", "admin", "db:{database}", "table:{database}:{table}"];
38
+ /**
39
+ * Tool groups accessible with read scope (read-only operations)
40
+ */
41
+ export declare const READ_SCOPE_GROUPS: ToolGroup[];
42
+ /**
43
+ * Tool groups accessible with write scope (read + write operations)
44
+ */
45
+ export declare const WRITE_SCOPE_GROUPS: ToolGroup[];
46
+ /**
47
+ * Tool groups accessible with admin scope (all operations)
48
+ */
49
+ export declare const ADMIN_SCOPE_GROUPS: ToolGroup[];
50
+ /**
51
+ * Read-only tools within the core group
52
+ * (used when scope is 'read' to filter write operations)
53
+ */
54
+ export declare const READ_ONLY_TOOLS: Set<string>;
55
+ /**
56
+ * Write tools that require 'write' scope
57
+ */
58
+ export declare const WRITE_TOOLS: Set<string>;
59
+ /**
60
+ * Admin tools that require 'admin' scope
61
+ */
62
+ export declare const ADMIN_TOOLS: Set<string>;
63
+ /**
64
+ * Parse a scope string (space-delimited) into an array
65
+ */
66
+ export declare function parseScopes(scopeString: string): string[];
67
+ /**
68
+ * Parse a database-specific scope
69
+ * @returns The database name or null if not a database scope
70
+ */
71
+ export declare function parseDatabaseScope(scope: string): string | null;
72
+ /**
73
+ * Parse a table-specific scope
74
+ * @returns Object with database and table names, or null if not a table scope
75
+ */
76
+ export declare function parseTableScope(scope: string): {
77
+ database: string;
78
+ table: string;
79
+ } | null;
80
+ /**
81
+ * Check if a scope is valid (matches known patterns)
82
+ */
83
+ export declare function isValidScope(scope: string): boolean;
84
+ /**
85
+ * Check if scopes include admin access
86
+ */
87
+ export declare function hasAdminScope(scopes: string[]): boolean;
88
+ /**
89
+ * Check if scopes include write access
90
+ */
91
+ export declare function hasWriteScope(scopes: string[]): boolean;
92
+ /**
93
+ * Check if scopes include read access
94
+ */
95
+ export declare function hasReadScope(scopes: string[]): boolean;
96
+ /**
97
+ * Check if a scope grants access to a specific tool
98
+ */
99
+ export declare function scopeGrantsToolAccess(scope: string, toolName: string): boolean;
100
+ /**
101
+ * Check if any of the scopes grants access to a tool
102
+ */
103
+ export declare function scopesGrantToolAccess(scopes: string[], toolName: string): boolean;
104
+ /**
105
+ * Check if a scope grants access to a specific database
106
+ */
107
+ export declare function scopeGrantsDatabaseAccess(scope: string, databaseName: string): boolean;
108
+ /**
109
+ * Check if any of the scopes grants access to a database
110
+ */
111
+ export declare function scopesGrantDatabaseAccess(scopes: string[], databaseName: string): boolean;
112
+ /**
113
+ * Check if a scope grants access to a specific table
114
+ */
115
+ export declare function scopeGrantsTableAccess(scope: string, databaseName: string, tableName: string): boolean;
116
+ /**
117
+ * Check if any of the scopes grants access to a table
118
+ */
119
+ export declare function scopesGrantTableAccess(scopes: string[], databaseName: string, tableName: string): boolean;
120
+ /**
121
+ * Get the required minimum scope for a tool group
122
+ */
123
+ export declare function getRequiredScopeForGroup(group: ToolGroup): string;
124
+ /**
125
+ * Get the required minimum scope for a tool
126
+ */
127
+ export declare function getRequiredScopeForTool(toolName: string): string;
128
+ /**
129
+ * Get tool groups accessible with given scopes
130
+ */
131
+ export declare function getAccessibleToolGroups(scopes: string[]): ToolGroup[];
132
+ /**
133
+ * Get all tools accessible with given scopes
134
+ */
135
+ export declare function getAccessibleTools(scopes: string[]): string[];
136
+ //# sourceMappingURL=scopes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../../src/auth/scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAOnD;;GAEG;AACH,eAAO,MAAM,WAAW,qCAAsC,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB,uBAAuB;;IAEvB,4BAA4B;;IAE5B,wBAAwB;;IAExB,uCAAuC;;IAEvC,oCAAoC;;CAE5B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,gBAAgB,kFAMnB,CAAC;AAMX;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,EAExC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,EAMzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,EAGzC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,aAe1B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,aActB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,aAYtB,CAAC;AAMH;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAKzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,GACZ;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQ5C;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAiBnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAEtD;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAsBT;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GACnB,OAAO,CAmBT;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EAAE,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAmBT;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EAAE,EAChB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAIT;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAcjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQhE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAWrE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAmB7D"}