@lyrra/mcp-server 1.1.2 → 1.1.5

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 (105) hide show
  1. package/README.md +59 -242
  2. package/dist/auth-session.js +160 -0
  3. package/dist/eduflow-block-docs.js +438 -0
  4. package/dist/index.js +179 -12
  5. package/dist/lyrra-http.js +80 -0
  6. package/dist/openapi-parse.js +61 -0
  7. package/dist/register-eduflow-block-tools.js +31 -0
  8. package/package.json +36 -13
  9. package/Dockerfile +0 -16
  10. package/dist/client.d.ts +0 -23
  11. package/dist/client.d.ts.map +0 -1
  12. package/dist/client.js +0 -92
  13. package/dist/client.js.map +0 -1
  14. package/dist/config.d.ts +0 -8
  15. package/dist/config.d.ts.map +0 -1
  16. package/dist/config.js +0 -8
  17. package/dist/config.js.map +0 -1
  18. package/dist/http-server.d.ts +0 -8
  19. package/dist/http-server.d.ts.map +0 -1
  20. package/dist/http-server.js +0 -476
  21. package/dist/http-server.js.map +0 -1
  22. package/dist/index.d.ts +0 -3
  23. package/dist/index.d.ts.map +0 -1
  24. package/dist/index.js.map +0 -1
  25. package/dist/resources/block-types.d.ts +0 -318
  26. package/dist/resources/block-types.d.ts.map +0 -1
  27. package/dist/resources/block-types.js +0 -297
  28. package/dist/resources/block-types.js.map +0 -1
  29. package/dist/resources/flow-schema.d.ts +0 -147
  30. package/dist/resources/flow-schema.d.ts.map +0 -1
  31. package/dist/resources/flow-schema.js +0 -143
  32. package/dist/resources/flow-schema.js.map +0 -1
  33. package/dist/server-factory.d.ts +0 -8
  34. package/dist/server-factory.d.ts.map +0 -1
  35. package/dist/server-factory.js +0 -82
  36. package/dist/server-factory.js.map +0 -1
  37. package/dist/tools/admin.d.ts +0 -265
  38. package/dist/tools/admin.d.ts.map +0 -1
  39. package/dist/tools/admin.js +0 -118
  40. package/dist/tools/admin.js.map +0 -1
  41. package/dist/tools/ai-designer.d.ts +0 -297
  42. package/dist/tools/ai-designer.d.ts.map +0 -1
  43. package/dist/tools/ai-designer.js +0 -89
  44. package/dist/tools/ai-designer.js.map +0 -1
  45. package/dist/tools/analytics.d.ts +0 -95
  46. package/dist/tools/analytics.d.ts.map +0 -1
  47. package/dist/tools/analytics.js +0 -44
  48. package/dist/tools/analytics.js.map +0 -1
  49. package/dist/tools/auth.d.ts +0 -61
  50. package/dist/tools/auth.d.ts.map +0 -1
  51. package/dist/tools/auth.js +0 -36
  52. package/dist/tools/auth.js.map +0 -1
  53. package/dist/tools/blocks.d.ts +0 -401
  54. package/dist/tools/blocks.d.ts.map +0 -1
  55. package/dist/tools/blocks.js +0 -167
  56. package/dist/tools/blocks.js.map +0 -1
  57. package/dist/tools/connections.d.ts +0 -173
  58. package/dist/tools/connections.d.ts.map +0 -1
  59. package/dist/tools/connections.js +0 -81
  60. package/dist/tools/connections.js.map +0 -1
  61. package/dist/tools/eduflow.d.ts +0 -409
  62. package/dist/tools/eduflow.d.ts.map +0 -1
  63. package/dist/tools/eduflow.js +0 -139
  64. package/dist/tools/eduflow.js.map +0 -1
  65. package/dist/tools/participants.d.ts +0 -221
  66. package/dist/tools/participants.d.ts.map +0 -1
  67. package/dist/tools/participants.js +0 -70
  68. package/dist/tools/participants.js.map +0 -1
  69. package/dist/tools/presentation.d.ts +0 -233
  70. package/dist/tools/presentation.d.ts.map +0 -1
  71. package/dist/tools/presentation.js +0 -57
  72. package/dist/tools/presentation.js.map +0 -1
  73. package/dist/tools/projects.d.ts +0 -131
  74. package/dist/tools/projects.d.ts.map +0 -1
  75. package/dist/tools/projects.js +0 -55
  76. package/dist/tools/projects.js.map +0 -1
  77. package/dist/tools/resources.d.ts +0 -93
  78. package/dist/tools/resources.d.ts.map +0 -1
  79. package/dist/tools/resources.js +0 -37
  80. package/dist/tools/resources.js.map +0 -1
  81. package/dist/tools/store.d.ts +0 -125
  82. package/dist/tools/store.d.ts.map +0 -1
  83. package/dist/tools/store.js +0 -66
  84. package/dist/tools/store.js.map +0 -1
  85. package/mcp-config.example.json +0 -14
  86. package/src/client.ts +0 -106
  87. package/src/config.ts +0 -7
  88. package/src/http-server.ts +0 -591
  89. package/src/index.ts +0 -23
  90. package/src/resources/block-types.ts +0 -298
  91. package/src/resources/flow-schema.ts +0 -148
  92. package/src/server-factory.ts +0 -109
  93. package/src/tools/admin.ts +0 -128
  94. package/src/tools/ai-designer.ts +0 -97
  95. package/src/tools/analytics.ts +0 -49
  96. package/src/tools/auth.ts +0 -39
  97. package/src/tools/blocks.ts +0 -180
  98. package/src/tools/connections.ts +0 -83
  99. package/src/tools/eduflow.ts +0 -150
  100. package/src/tools/participants.ts +0 -77
  101. package/src/tools/presentation.ts +0 -61
  102. package/src/tools/projects.ts +0 -61
  103. package/src/tools/resources.ts +0 -41
  104. package/src/tools/store.ts +0 -67
  105. package/tsconfig.json +0 -19
@@ -1,476 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * LYRRA Studio MCP HTTP Server
4
- * Provides Streamable HTTP transport with OAuth 2.0 for Claude.ai integration.
5
- * All endpoints are under /mcp/ for clean nginx routing.
6
- */
7
- import crypto from 'crypto';
8
- import express from 'express';
9
- import cors from 'cors';
10
- import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
11
- import { createMcpServer } from './server-factory.js';
12
- import { LyrraClient } from './client.js';
13
- // ─── Configuration ───────────────────────────────────────────────────────────
14
- const PORT = parseInt(process.env.MCP_HTTP_PORT || '3002', 10);
15
- const BASE_URL = process.env.MCP_BASE_URL || 'https://lyrrastudio.com';
16
- const LYRRA_API_URL = process.env.LYRRA_API_URL || 'http://localhost:3001/api';
17
- const registeredClients = new Map();
18
- const authCodes = new Map();
19
- const accessTokens = new Map();
20
- const refreshTokens = new Map();
21
- const mcpSessions = new Map();
22
- // ─── Helper: Validate LYRRA API key ─────────────────────────────────────────
23
- async function validateApiKey(apiKey) {
24
- try {
25
- const res = await fetch(`${LYRRA_API_URL}/auth/me`, {
26
- headers: { 'Content-Type': 'application/json', 'X-API-Key': apiKey },
27
- });
28
- return res.ok;
29
- }
30
- catch {
31
- return false;
32
- }
33
- }
34
- // ─── Helper: Verify PKCE ────────────────────────────────────────────────────
35
- function verifyPkce(codeVerifier, codeChallenge, method) {
36
- if (method === 'S256') {
37
- const hash = crypto.createHash('sha256').update(codeVerifier).digest('base64url');
38
- return hash === codeChallenge;
39
- }
40
- return codeVerifier === codeChallenge; // plain
41
- }
42
- // ─── Helper: Verify Bearer token ─────────────────────────────────────────────
43
- function verifyBearerToken(req) {
44
- const auth = req.headers.authorization;
45
- if (!auth?.startsWith('Bearer '))
46
- return null;
47
- const token = auth.slice(7);
48
- const data = accessTokens.get(token);
49
- if (!data)
50
- return null;
51
- if (Date.now() > data.expiresAt) {
52
- accessTokens.delete(token);
53
- return null;
54
- }
55
- return data;
56
- }
57
- // ─── Authorize page HTML ─────────────────────────────────────────────────────
58
- function renderAuthorizePage(pendingToken, showError = false) {
59
- return `<!DOCTYPE html>
60
- <html lang="fr">
61
- <head>
62
- <meta charset="UTF-8">
63
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
64
- <title>LYRRA Studio - Autorisation MCP</title>
65
- <style>
66
- * { margin: 0; padding: 0; box-sizing: border-box; }
67
- body {
68
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
69
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
70
- min-height: 100vh; display: flex; align-items: center; justify-content: center;
71
- }
72
- .card {
73
- background: white; border-radius: 16px; padding: 40px;
74
- max-width: 440px; width: 100%; box-shadow: 0 20px 60px rgba(0,0,0,0.2);
75
- }
76
- .logo { text-align: center; margin-bottom: 24px; }
77
- .logo h1 { font-size: 28px; color: #333; }
78
- .logo span { color: #667eea; }
79
- .subtitle { text-align: center; color: #666; margin-bottom: 32px; font-size: 14px; line-height: 1.5; }
80
- label { display: block; font-size: 13px; font-weight: 600; color: #444; margin-bottom: 6px; }
81
- input {
82
- width: 100%; padding: 12px 16px; border: 2px solid #e2e8f0;
83
- border-radius: 8px; font-size: 14px; transition: border-color 0.2s;
84
- margin-bottom: 16px; outline: none;
85
- }
86
- input:focus { border-color: #667eea; }
87
- button {
88
- width: 100%; padding: 14px; background: #667eea; color: white;
89
- border: none; border-radius: 8px; font-size: 16px; font-weight: 600;
90
- cursor: pointer; transition: background 0.2s;
91
- }
92
- button:hover { background: #5a6fd6; }
93
- button:disabled { background: #a0aec0; cursor: not-allowed; }
94
- .error { color: #e53e3e; font-size: 13px; margin-bottom: 16px; display: ${showError ? 'block' : 'none'}; }
95
- .info { font-size: 12px; color: #888; text-align: center; margin-top: 16px; line-height: 1.5; }
96
- </style>
97
- </head>
98
- <body>
99
- <div class="card">
100
- <div class="logo"><h1><span>LYRRA</span> Studio</h1></div>
101
- <p class="subtitle">
102
- Une application souhaite accéder à votre compte LYRRA Studio via MCP.<br>
103
- Entrez vos identifiants API pour autoriser l'accès.
104
- </p>
105
- <form id="authForm" method="POST" action="/mcp/approve">
106
- <input type="hidden" name="pending_token" value="${pendingToken}">
107
- <label for="apiKey">Clé API (Client Secret)</label>
108
- <input type="password" id="apiKey" name="api_key" placeholder="rak_XXXXXXXX_..." required>
109
- <div class="error" id="error">Clé API invalide. Vérifiez votre Client Secret dans le tableau de bord.</div>
110
- <button type="submit" id="submitBtn">Autoriser l'accès</button>
111
- </form>
112
- <p class="info">
113
- Votre clé API est disponible dans le tableau de bord de votre institution,<br>
114
- section « Serveur MCP » → Client Secret (visible uniquement à la création).
115
- </p>
116
- </div>
117
- <script>
118
- document.getElementById('authForm').addEventListener('submit', function() {
119
- document.getElementById('submitBtn').disabled = true;
120
- document.getElementById('submitBtn').textContent = 'Vérification...';
121
- });
122
- </script>
123
- </body>
124
- </html>`;
125
- }
126
- // ─── Create Express app ──────────────────────────────────────────────────────
127
- const app = express();
128
- app.use(cors({ origin: true, credentials: true, exposedHeaders: ['mcp-session-id'] }));
129
- app.use(express.json());
130
- app.use(express.urlencoded({ extended: true }));
131
- // ─── OAuth Protected Resource Metadata (RFC 9728) ────────────────────────────
132
- // Claude.ai fetches this to discover the authorization server
133
- app.get('/.well-known/oauth-protected-resource/mcp', (_req, res) => {
134
- res.json({
135
- resource: `${BASE_URL}/mcp`,
136
- authorization_servers: [`${BASE_URL}/mcp`],
137
- scopes_supported: ['mcp'],
138
- resource_name: 'LYRRA Studio MCP',
139
- resource_documentation: `${BASE_URL}/docs/mcp`,
140
- });
141
- });
142
- app.get('/.well-known/oauth-protected-resource', (_req, res) => {
143
- res.json({
144
- resource: `${BASE_URL}/mcp`,
145
- authorization_servers: [`${BASE_URL}/mcp`],
146
- scopes_supported: ['mcp'],
147
- resource_name: 'LYRRA Studio MCP',
148
- });
149
- });
150
- // ─── OAuth Authorization Server Metadata (RFC 8414) ──────────────────────────
151
- const asMetadata = {
152
- issuer: `${BASE_URL}/mcp`,
153
- authorization_endpoint: `${BASE_URL}/mcp/authorize`,
154
- token_endpoint: `${BASE_URL}/mcp/token`,
155
- registration_endpoint: `${BASE_URL}/mcp/register`,
156
- revocation_endpoint: `${BASE_URL}/mcp/revoke`,
157
- response_types_supported: ['code'],
158
- grant_types_supported: ['authorization_code', 'refresh_token'],
159
- code_challenge_methods_supported: ['S256'],
160
- token_endpoint_auth_methods_supported: ['client_secret_post', 'none'],
161
- scopes_supported: ['mcp'],
162
- service_documentation: `${BASE_URL}/docs/mcp`,
163
- };
164
- // RFC 8414 compliant path: /.well-known/oauth-authorization-server/{path}
165
- app.get('/.well-known/oauth-authorization-server/mcp', (_req, res) => {
166
- res.json(asMetadata);
167
- });
168
- // Also serve at /mcp/.well-known/... for backward compatibility
169
- app.get('/mcp/.well-known/oauth-authorization-server', (_req, res) => {
170
- res.json(asMetadata);
171
- });
172
- // ─── Dynamic Client Registration (RFC 7591) ──────────────────────────────────
173
- app.post('/mcp/register', (req, res) => {
174
- const { redirect_uris, grant_types, response_types, token_endpoint_auth_method, client_name } = req.body;
175
- const clientId = `mcp_${crypto.randomBytes(16).toString('hex')}`;
176
- const clientSecret = crypto.randomBytes(32).toString('hex');
177
- const client = {
178
- client_id: clientId,
179
- client_secret: clientSecret,
180
- client_id_issued_at: Math.floor(Date.now() / 1000),
181
- redirect_uris: redirect_uris || [],
182
- grant_types: grant_types || ['authorization_code', 'refresh_token'],
183
- response_types: response_types || ['code'],
184
- token_endpoint_auth_method: token_endpoint_auth_method || 'client_secret_post',
185
- };
186
- registeredClients.set(clientId, client);
187
- console.log(`[MCP OAuth] Registered client: ${clientId} (${client_name || 'unnamed'})`);
188
- res.status(201).json({
189
- client_id: clientId,
190
- client_secret: clientSecret,
191
- client_id_issued_at: client.client_id_issued_at,
192
- client_secret_expires_at: 0,
193
- redirect_uris: client.redirect_uris,
194
- grant_types: client.grant_types,
195
- response_types: client.response_types,
196
- token_endpoint_auth_method: client.token_endpoint_auth_method,
197
- });
198
- });
199
- // ─── Authorization endpoint ──────────────────────────────────────────────────
200
- app.get('/mcp/authorize', (req, res) => {
201
- const { client_id, redirect_uri, response_type, state, code_challenge, code_challenge_method, scope } = req.query;
202
- if (response_type !== 'code') {
203
- res.status(400).json({ error: 'unsupported_response_type' });
204
- return;
205
- }
206
- if (!client_id || !redirect_uri || !code_challenge) {
207
- res.status(400).json({ error: 'invalid_request', error_description: 'Missing required parameters' });
208
- return;
209
- }
210
- // Verify client is registered
211
- const client = registeredClients.get(client_id);
212
- if (!client) {
213
- res.status(400).json({ error: 'invalid_client', error_description: 'Client not registered' });
214
- return;
215
- }
216
- // Encode auth params for the form
217
- const pendingData = {
218
- oauthClientId: client_id,
219
- redirectUri: redirect_uri,
220
- codeChallenge: code_challenge,
221
- codeChallengeMethod: code_challenge_method || 'S256',
222
- state: state,
223
- };
224
- const pendingToken = Buffer.from(JSON.stringify(pendingData)).toString('base64url');
225
- res.setHeader('Content-Type', 'text/html; charset=utf-8');
226
- res.send(renderAuthorizePage(pendingToken));
227
- });
228
- // ─── Approve endpoint (form POST from authorize page) ────────────────────────
229
- app.post('/mcp/approve', async (req, res) => {
230
- try {
231
- const { pending_token, api_key } = req.body;
232
- if (!pending_token || !api_key) {
233
- res.status(400).send('Paramètres manquants');
234
- return;
235
- }
236
- let pendingData;
237
- try {
238
- pendingData = JSON.parse(Buffer.from(pending_token, 'base64url').toString('utf-8'));
239
- }
240
- catch {
241
- res.status(400).send('Token invalide');
242
- return;
243
- }
244
- // Validate the LYRRA API key
245
- const isValid = await validateApiKey(api_key);
246
- if (!isValid) {
247
- res.setHeader('Content-Type', 'text/html; charset=utf-8');
248
- res.send(renderAuthorizePage(pending_token, true));
249
- return;
250
- }
251
- // Generate authorization code
252
- const authCode = crypto.randomBytes(32).toString('hex');
253
- authCodes.set(authCode, {
254
- oauthClientId: pendingData.oauthClientId,
255
- codeChallenge: pendingData.codeChallenge,
256
- codeChallengeMethod: pendingData.codeChallengeMethod,
257
- redirectUri: pendingData.redirectUri,
258
- state: pendingData.state,
259
- apiKey: api_key,
260
- expiresAt: Date.now() + 10 * 60 * 1000,
261
- });
262
- // Redirect back with authorization code
263
- const redirectUrl = new URL(pendingData.redirectUri);
264
- redirectUrl.searchParams.set('code', authCode);
265
- if (pendingData.state) {
266
- redirectUrl.searchParams.set('state', pendingData.state);
267
- }
268
- console.log(`[MCP OAuth] Authorization granted, redirecting...`);
269
- res.redirect(redirectUrl.toString());
270
- }
271
- catch (error) {
272
- console.error('[MCP OAuth] Approve error:', error);
273
- res.status(500).send('Erreur interne');
274
- }
275
- });
276
- // ─── Token endpoint ──────────────────────────────────────────────────────────
277
- app.post('/mcp/token', (req, res) => {
278
- const { grant_type, code, redirect_uri, code_verifier, client_id, client_secret, refresh_token } = req.body;
279
- if (grant_type === 'authorization_code') {
280
- if (!code || !code_verifier) {
281
- res.status(400).json({ error: 'invalid_request' });
282
- return;
283
- }
284
- const authCode = authCodes.get(code);
285
- if (!authCode) {
286
- res.status(400).json({ error: 'invalid_grant', error_description: 'Invalid authorization code' });
287
- return;
288
- }
289
- if (Date.now() > authCode.expiresAt) {
290
- authCodes.delete(code);
291
- res.status(400).json({ error: 'invalid_grant', error_description: 'Authorization code expired' });
292
- return;
293
- }
294
- // Verify PKCE
295
- if (!verifyPkce(code_verifier, authCode.codeChallenge, authCode.codeChallengeMethod)) {
296
- res.status(400).json({ error: 'invalid_grant', error_description: 'PKCE verification failed' });
297
- return;
298
- }
299
- // Verify redirect_uri matches
300
- if (redirect_uri && redirect_uri !== authCode.redirectUri) {
301
- res.status(400).json({ error: 'invalid_grant', error_description: 'Redirect URI mismatch' });
302
- return;
303
- }
304
- // Consume the code
305
- authCodes.delete(code);
306
- // Issue tokens
307
- const accessToken = `at_${crypto.randomBytes(32).toString('hex')}`;
308
- const newRefreshToken = `rt_${crypto.randomBytes(32).toString('hex')}`;
309
- const expiresIn = 86400; // 24h
310
- accessTokens.set(accessToken, {
311
- oauthClientId: authCode.oauthClientId,
312
- apiKey: authCode.apiKey,
313
- expiresAt: Date.now() + expiresIn * 1000,
314
- });
315
- refreshTokens.set(newRefreshToken, {
316
- oauthClientId: authCode.oauthClientId,
317
- apiKey: authCode.apiKey,
318
- });
319
- console.log(`[MCP OAuth] Issued tokens for client ${authCode.oauthClientId}`);
320
- res.json({
321
- access_token: accessToken,
322
- token_type: 'bearer',
323
- expires_in: expiresIn,
324
- refresh_token: newRefreshToken,
325
- });
326
- }
327
- else if (grant_type === 'refresh_token') {
328
- if (!refresh_token) {
329
- res.status(400).json({ error: 'invalid_request' });
330
- return;
331
- }
332
- const rtData = refreshTokens.get(refresh_token);
333
- if (!rtData) {
334
- res.status(400).json({ error: 'invalid_grant', error_description: 'Invalid refresh token' });
335
- return;
336
- }
337
- const accessToken = `at_${crypto.randomBytes(32).toString('hex')}`;
338
- const expiresIn = 86400;
339
- accessTokens.set(accessToken, {
340
- oauthClientId: rtData.oauthClientId,
341
- apiKey: rtData.apiKey,
342
- expiresAt: Date.now() + expiresIn * 1000,
343
- });
344
- console.log(`[MCP OAuth] Refreshed token for client ${rtData.oauthClientId}`);
345
- res.json({
346
- access_token: accessToken,
347
- token_type: 'bearer',
348
- expires_in: expiresIn,
349
- refresh_token: refresh_token,
350
- });
351
- }
352
- else {
353
- res.status(400).json({ error: 'unsupported_grant_type' });
354
- }
355
- });
356
- // ─── Token revocation ────────────────────────────────────────────────────────
357
- app.post('/mcp/revoke', (req, res) => {
358
- const { token } = req.body;
359
- if (token) {
360
- accessTokens.delete(token);
361
- refreshTokens.delete(token);
362
- }
363
- res.status(200).json({});
364
- });
365
- // ─── Bearer auth middleware ──────────────────────────────────────────────────
366
- function requireAuth(req, res) {
367
- const tokenData = verifyBearerToken(req);
368
- if (!tokenData) {
369
- res.status(401)
370
- .set('WWW-Authenticate', `Bearer resource_metadata="${BASE_URL}/.well-known/oauth-protected-resource"`)
371
- .json({
372
- error: 'invalid_token',
373
- error_description: 'Invalid or expired access token',
374
- });
375
- return null;
376
- }
377
- return tokenData;
378
- }
379
- // ─── MCP Protocol endpoint (Streamable HTTP) ────────────────────────────────
380
- app.post('/mcp', async (req, res) => {
381
- // Check if this is an OAuth/metadata request (no Authorization header = not an MCP protocol request)
382
- const hasAuth = req.headers.authorization?.startsWith('Bearer ');
383
- if (!hasAuth) {
384
- res.status(401)
385
- .set('WWW-Authenticate', `Bearer resource_metadata="${BASE_URL}/.well-known/oauth-protected-resource"`)
386
- .json({ error: 'unauthorized' });
387
- return;
388
- }
389
- const tokenData = requireAuth(req, res);
390
- if (!tokenData)
391
- return;
392
- try {
393
- const sessionId = req.headers['mcp-session-id'];
394
- if (sessionId && mcpSessions.has(sessionId)) {
395
- const session = mcpSessions.get(sessionId);
396
- await session.transport.handleRequest(req, res, req.body);
397
- }
398
- else {
399
- // New session with user's API key
400
- const client = new LyrraClient({
401
- clientSecret: tokenData.apiKey,
402
- apiUrl: LYRRA_API_URL,
403
- eduflowUrl: process.env.LYRRA_EDUFLOW_API_URL || LYRRA_API_URL.replace('/api', '/eduflow'),
404
- });
405
- const server = createMcpServer(client);
406
- const transport = new StreamableHTTPServerTransport({
407
- sessionIdGenerator: () => crypto.randomUUID(),
408
- });
409
- transport.onclose = () => {
410
- const sid = transport.sessionId;
411
- if (sid)
412
- mcpSessions.delete(sid);
413
- console.log(`[MCP HTTP] Session closed: ${sid}`);
414
- };
415
- await server.connect(transport);
416
- if (transport.sessionId) {
417
- mcpSessions.set(transport.sessionId, { transport, server });
418
- console.log(`[MCP HTTP] New session: ${transport.sessionId}`);
419
- }
420
- await transport.handleRequest(req, res, req.body);
421
- }
422
- }
423
- catch (error) {
424
- console.error('[MCP HTTP] POST error:', error);
425
- if (!res.headersSent) {
426
- res.status(500).json({ error: 'Internal server error' });
427
- }
428
- }
429
- });
430
- // Handle GET (SSE stream)
431
- app.get('/mcp', async (req, res) => {
432
- // Check if it's a .well-known or authorize request (no auth needed)
433
- // Those are handled by earlier routes, this is only for SSE
434
- const tokenData = requireAuth(req, res);
435
- if (!tokenData)
436
- return;
437
- const sessionId = req.headers['mcp-session-id'];
438
- if (!sessionId || !mcpSessions.has(sessionId)) {
439
- res.status(400).json({ error: 'Invalid or missing session ID' });
440
- return;
441
- }
442
- const session = mcpSessions.get(sessionId);
443
- await session.transport.handleRequest(req, res);
444
- });
445
- // Handle DELETE (close session)
446
- app.delete('/mcp', async (req, res) => {
447
- const tokenData = requireAuth(req, res);
448
- if (!tokenData)
449
- return;
450
- const sessionId = req.headers['mcp-session-id'];
451
- if (!sessionId || !mcpSessions.has(sessionId)) {
452
- res.status(404).json({ error: 'Session not found' });
453
- return;
454
- }
455
- const session = mcpSessions.get(sessionId);
456
- await session.transport.handleRequest(req, res);
457
- mcpSessions.delete(sessionId);
458
- });
459
- // ─── Health check ────────────────────────────────────────────────────────────
460
- app.get('/mcp/health', (_req, res) => {
461
- res.json({
462
- status: 'ok',
463
- service: 'LYRRA Studio MCP HTTP Server',
464
- sessions: mcpSessions.size,
465
- registeredClients: registeredClients.size,
466
- timestamp: new Date().toISOString(),
467
- });
468
- });
469
- // ─── Start server ────────────────────────────────────────────────────────────
470
- app.listen(PORT, () => {
471
- console.log(`🚀 LYRRA Studio MCP HTTP Server running on port ${PORT}`);
472
- console.log(` OAuth metadata: ${BASE_URL}/mcp/.well-known/oauth-authorization-server`);
473
- console.log(` MCP endpoint: ${BASE_URL}/mcp`);
474
- console.log(` Health check: ${BASE_URL}/mcp/health`);
475
- });
476
- //# sourceMappingURL=http-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAEnG,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,gFAAgF;AAEhF,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,yBAAyB,CAAC;AACvE,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,2BAA2B,CAAC;AAa/E,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAuB,CAAC;AAWzD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;AAOlD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAqB,CAAC;AAClD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAqD,CAAC;AAEnF,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2E,CAAC;AAEvG,+EAA+E;AAE/E,KAAK,UAAU,cAAc,CAAC,MAAc;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,aAAa,UAAU,EAAE;YAClD,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,EAAE;SACrE,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,SAAS,UAAU,CAAC,YAAoB,EAAE,aAAqB,EAAE,MAAc;IAC7E,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClF,OAAO,IAAI,KAAK,aAAa,CAAC;IAChC,CAAC;IACD,OAAO,YAAY,KAAK,aAAa,CAAC,CAAC,QAAQ;AACjD,CAAC;AAED,gFAAgF;AAEhF,SAAS,iBAAiB,CAAC,GAAY;IACrC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IACvC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAEhF,SAAS,mBAAmB,CAAC,YAAoB,EAAE,SAAS,GAAG,KAAK;IAClE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8EAmCqE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;;;;;;;;;;;;yDAYjD,YAAY;;;;;;;;;;;;;;;;;;QAkB7D,CAAC;AACT,CAAC;AAED,gFAAgF;AAEhF,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AAEtB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;AACvF,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACxB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAEhD,gFAAgF;AAChF,8DAA8D;AAE9D,GAAG,CAAC,GAAG,CAAC,2CAA2C,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IACpF,GAAG,CAAC,IAAI,CAAC;QACP,QAAQ,EAAE,GAAG,QAAQ,MAAM;QAC3B,qBAAqB,EAAE,CAAC,GAAG,QAAQ,MAAM,CAAC;QAC1C,gBAAgB,EAAE,CAAC,KAAK,CAAC;QACzB,aAAa,EAAE,kBAAkB;QACjC,sBAAsB,EAAE,GAAG,QAAQ,WAAW;KAC/C,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,GAAG,CAAC,uCAAuC,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAChF,GAAG,CAAC,IAAI,CAAC;QACP,QAAQ,EAAE,GAAG,QAAQ,MAAM;QAC3B,qBAAqB,EAAE,CAAC,GAAG,QAAQ,MAAM,CAAC;QAC1C,gBAAgB,EAAE,CAAC,KAAK,CAAC;QACzB,aAAa,EAAE,kBAAkB;KAClC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,MAAM,UAAU,GAAG;IACjB,MAAM,EAAE,GAAG,QAAQ,MAAM;IACzB,sBAAsB,EAAE,GAAG,QAAQ,gBAAgB;IACnD,cAAc,EAAE,GAAG,QAAQ,YAAY;IACvC,qBAAqB,EAAE,GAAG,QAAQ,eAAe;IACjD,mBAAmB,EAAE,GAAG,QAAQ,aAAa;IAC7C,wBAAwB,EAAE,CAAC,MAAM,CAAC;IAClC,qBAAqB,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;IAC9D,gCAAgC,EAAE,CAAC,MAAM,CAAC;IAC1C,qCAAqC,EAAE,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACrE,gBAAgB,EAAE,CAAC,KAAK,CAAC;IACzB,qBAAqB,EAAE,GAAG,QAAQ,WAAW;CAC9C,CAAC;AAEF,0EAA0E;AAC1E,GAAG,CAAC,GAAG,CAAC,6CAA6C,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IACtF,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,gEAAgE;AAChE,GAAG,CAAC,GAAG,CAAC,6CAA6C,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IACtF,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IACxD,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,0BAA0B,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;IAEzG,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACjE,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAgB;QAC1B,SAAS,EAAE,QAAQ;QACnB,aAAa,EAAE,YAAY;QAC3B,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAClD,aAAa,EAAE,aAAa,IAAI,EAAE;QAClC,WAAW,EAAE,WAAW,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAAC;QACnE,cAAc,EAAE,cAAc,IAAI,CAAC,MAAM,CAAC;QAC1C,0BAA0B,EAAE,0BAA0B,IAAI,oBAAoB;KAC/E,CAAC;IAEF,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,kCAAkC,QAAQ,KAAK,WAAW,IAAI,SAAS,GAAG,CAAC,CAAC;IAExF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,SAAS,EAAE,QAAQ;QACnB,aAAa,EAAE,YAAY;QAC3B,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,wBAAwB,EAAE,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,0BAA0B,EAAE,MAAM,CAAC,0BAA0B;KAC9D,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IACxD,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;IAElH,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,IAAI,CAAC,cAAc,EAAE,CAAC;QACnD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,CAAC,CAAC;QACrG,OAAO;IACT,CAAC;IAED,8BAA8B;IAC9B,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAmB,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAC9F,OAAO;IACT,CAAC;IAED,kCAAkC;IAClC,MAAM,WAAW,GAAG;QAClB,aAAa,EAAE,SAAmB;QAClC,WAAW,EAAE,YAAsB;QACnC,aAAa,EAAE,cAAwB;QACvC,mBAAmB,EAAG,qBAAgC,IAAI,MAAM;QAChE,KAAK,EAAE,KAA2B;KACnC,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpF,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;IAC1D,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAE5C,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,IAAI,WAMH,CAAC;QAEF,IAAI,CAAC;YACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACtF,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,6BAA6B;QAC7B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxD,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE;YACtB,aAAa,EAAE,WAAW,CAAC,aAAa;YACxC,aAAa,EAAE,WAAW,CAAC,aAAa;YACxC,mBAAmB,EAAE,WAAW,CAAC,mBAAmB;YACpD,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;SACvC,CAAC,CAAC;QAEH,wCAAwC;QACxC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACrD,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACtB,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACnD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IACrD,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;IAE5G,IAAI,UAAU,KAAK,oBAAoB,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,CAAC,CAAC;YAClG,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;YACpC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,CAAC,CAAC;YAClG,OAAO;QACT,CAAC;QAED,cAAc;QACd,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACrF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,CAAC,CAAC;YAChG,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,IAAI,YAAY,IAAI,YAAY,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC1D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,eAAe;QACf,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM;QAE/B,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE;YAC5B,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI;SACzC,CAAC,CAAC;QAEH,aAAa,CAAC,GAAG,CAAC,eAAe,EAAE;YACjC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,MAAM,EAAE,QAAQ,CAAC,MAAM;SACxB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,wCAAwC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;QAE9E,GAAG,CAAC,IAAI,CAAC;YACP,YAAY,EAAE,WAAW;YACzB,UAAU,EAAE,QAAQ;YACpB,UAAU,EAAE,SAAS;YACrB,aAAa,EAAE,eAAe;SAC/B,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,UAAU,KAAK,eAAe,EAAE,CAAC;QAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,SAAS,GAAG,KAAK,CAAC;QAExB,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE;YAC5B,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI;SACzC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,0CAA0C,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAE9E,GAAG,CAAC,IAAI,CAAC;YACP,YAAY,EAAE,WAAW;YACzB,UAAU,EAAE,QAAQ;YACpB,UAAU,EAAE,SAAS;YACrB,aAAa,EAAE,aAAa;SAC7B,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IACtD,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;IAC3B,IAAI,KAAK,EAAE,CAAC;QACV,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,SAAS,WAAW,CAAC,GAAY,EAAE,GAAa;IAC9C,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;aACZ,GAAG,CAAC,kBAAkB,EAAE,6BAA6B,QAAQ,wCAAwC,CAAC;aACtG,IAAI,CAAC;YACJ,KAAK,EAAE,eAAe;YACtB,iBAAiB,EAAE,iCAAiC;SACrD,CAAC,CAAC;QACL,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+EAA+E;AAE/E,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACrD,qGAAqG;IACrG,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IACjE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;aACZ,GAAG,CAAC,kBAAkB,EAAE,6BAA6B,QAAQ,wCAAwC,CAAC;aACtG,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS;QAAE,OAAO;IAEvB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QAEtE,IAAI,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YAC5C,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,kCAAkC;YAClC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;gBAC7B,YAAY,EAAE,SAAS,CAAC,MAAM;gBAC9B,MAAM,EAAE,aAAa;gBACrB,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC;aAC3F,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;gBAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE;aAC9C,CAAC,CAAC;YAEH,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;gBACvB,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC;gBAChC,IAAI,GAAG;oBAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;YACnD,CAAC,CAAC;YAEF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAEhC,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC5D,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,0BAA0B;AAC1B,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACpD,oEAAoE;IACpE,4DAA4D;IAE5D,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS;QAAE,OAAO;IAEvB,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;IACtE,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;IAC5C,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,gCAAgC;AAChC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACvD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS;QAAE,OAAO;IAEvB,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;IACtE,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;IAC5C,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChD,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IACtD,GAAG,CAAC,IAAI,CAAC;QACP,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,8BAA8B;QACvC,QAAQ,EAAE,WAAW,CAAC,IAAI;QAC1B,iBAAiB,EAAE,iBAAiB,CAAC,IAAI;QACzC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,mDAAmD,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,6CAA6C,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,MAAM,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,aAAa,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC"}
package/dist/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,oCAAoC;AACpC,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,kGAAkG,CAAC,CAAC;IACpH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}