@loop_ouroboros/mcp-hub-lite 1.1.0 → 1.1.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 (64) hide show
  1. package/dist/client/assets/{HomeView-Bu2joUvW.js → HomeView-BBwvy1oj.js} +1 -1
  2. package/dist/client/assets/{ResourceDetailView-BvrhDCD1.js → ResourceDetailView-CZ2aB73w.js} +1 -1
  3. package/dist/client/assets/{ResourcesView-LjqioF_s.js → ResourcesView-CN1NlhWs.js} +1 -1
  4. package/dist/client/assets/{ServerDashboard-FhHJFvUi.js → ServerDashboard-k652Vw4Z.js} +1 -1
  5. package/dist/client/assets/{ServerDetail-BKV-M4qT.js → ServerDetail-BLQ-a4cO.js} +1 -1
  6. package/dist/client/assets/{ServerListView-BXgtDyt3.js → ServerListView-BHrsFD5i.js} +4 -4
  7. package/dist/client/assets/{ServerStatusTags.vue_vue_type_script_setup_true_lang-D-ooYNdN.js → ServerStatusTags.vue_vue_type_script_setup_true_lang-BHhwEuGe.js} +1 -1
  8. package/dist/client/assets/{SettingsView-CMFG91Z4.js → SettingsView-CUOFNXrz.js} +1 -1
  9. package/dist/client/assets/{ToolCallDialog-Bf4Xe4gH.js → ToolCallDialog-BfPjLxfV.js} +1 -1
  10. package/dist/client/assets/ToolsView-BxgXvPC3.css +1 -0
  11. package/dist/client/assets/ToolsView-CyuhYAE2.js +1 -0
  12. package/dist/client/assets/{_baseClone-Bp9Rjwd7.js → _baseClone-DO5qfalW.js} +1 -1
  13. package/dist/client/assets/{el-form-item-DdSUWYsl.js → el-form-item-CcGsD2K_.js} +2 -2
  14. package/dist/client/assets/{el-input-99gMrutP.js → el-input-tYgeiaCT.js} +1 -1
  15. package/dist/client/assets/{el-loading-CIQ5pD5u.js → el-loading-Dwl9E_Vr.js} +1 -1
  16. package/dist/client/assets/{el-overlay-BVM6msGX.js → el-overlay-kqX_BABo.js} +1 -1
  17. package/dist/client/assets/{el-radio-group-DhXWy7ry.js → el-radio-group-D8aWBVOT.js} +1 -1
  18. package/dist/client/assets/el-skeleton-item-BRwIFspE.js +1 -0
  19. package/dist/client/assets/{el-switch-Bu8AQ5uM.js → el-switch-BF8c-xeU.js} +1 -1
  20. package/dist/client/assets/{el-tab-pane-BnGMaV56.js → el-tab-pane-C4Ep94cd.js} +1 -1
  21. package/dist/client/assets/{el-table-column-BMWOaLS_.js → el-table-column-Cog6uCh-.js} +1 -1
  22. package/dist/client/assets/{index-C2V-ZGji.js → index-ByNBhPAR.js} +1 -1
  23. package/dist/client/assets/index-CTB6oe-9.js +2 -0
  24. package/dist/client/assets/omit-CUnDT6sS.js +1 -0
  25. package/dist/client/assets/{raf-C2wXzaVU.js → raf-CmzeRPMd.js} +1 -1
  26. package/dist/client/assets/{vue-vendor-BLHLXXJK.js → vue-vendor-CbgVSHIh.js} +3 -3
  27. package/dist/client/index.html +2 -2
  28. package/dist/server/src/api/mcp/debug-response-wrapper.js +2 -2
  29. package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
  30. package/dist/server/src/api/mcp/gateway.js +17 -3
  31. package/dist/server/src/api/mcp/session-context-extractor.d.ts.map +1 -1
  32. package/dist/server/src/api/mcp/session-context-extractor.js +14 -5
  33. package/dist/server/src/cli/commands/server.d.ts +57 -0
  34. package/dist/server/src/cli/commands/server.d.ts.map +1 -0
  35. package/dist/server/src/cli/commands/server.js +169 -0
  36. package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
  37. package/dist/server/src/services/gateway/gateway.service.js +38 -4
  38. package/dist/server/src/services/gateway/global-transport.d.ts +14 -5
  39. package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -1
  40. package/dist/server/src/services/gateway/global-transport.js +54 -30
  41. package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
  42. package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +12 -1
  43. package/dist/server/src/services/gateway/request-handlers/tools-handler.d.ts.map +1 -1
  44. package/dist/server/src/services/gateway/request-handlers/tools-handler.js +3 -4
  45. package/dist/server/src/services/search/search-core.service.d.ts +5 -5
  46. package/dist/server/src/services/search/search-core.service.js +11 -11
  47. package/dist/server/src/services/session/session-manager.d.ts +256 -12
  48. package/dist/server/src/services/session/session-manager.d.ts.map +1 -1
  49. package/dist/server/src/services/session/session-manager.js +585 -23
  50. package/dist/server/src/services/session-tracker.service.d.ts +10 -2
  51. package/dist/server/src/services/session-tracker.service.d.ts.map +1 -1
  52. package/dist/server/src/services/session-tracker.service.js +53 -2
  53. package/dist/server/src/utils/request-context.d.ts +18 -0
  54. package/dist/server/src/utils/request-context.d.ts.map +1 -1
  55. package/dist/server/src/utils/request-context.js +20 -0
  56. package/dist/server/tests/evaluation/evaluation.test.js +9 -10
  57. package/dist/server/tests/integration/api/gateway.test.js +2 -2
  58. package/dist/server/tests/unit/utils/request-context.test.js +24 -5
  59. package/package.json +3 -1
  60. package/dist/client/assets/ToolsView-DFpha1z0.js +0 -1
  61. package/dist/client/assets/ToolsView-E3Ps9c7i.css +0 -1
  62. package/dist/client/assets/el-skeleton-item-DJz-Us12.js +0 -1
  63. package/dist/client/assets/index-vhkqgpmN.js +0 -2
  64. package/dist/client/assets/omit-CqPQN3XP.js +0 -1
@@ -101,16 +101,16 @@ export class SearchCoreService {
101
101
  *
102
102
  * This method first checks if tools are available in the cache. If cached data exists,
103
103
  * it returns the cached tools immediately. Otherwise, it fetches tools from all connected
104
- * MCP servers, applies server-level filtering based on aggregatedTools configuration,
104
+ * MCP servers, applies server-level filtering based on allowedTools configuration,
105
105
  * caches the result, and returns the filtered tools.
106
106
  *
107
107
  * @returns A promise that resolves to an array of Tool objects from all connected servers.
108
108
  *
109
109
  * @remarks
110
- * - Tools are filtered based on each server's aggregatedTools configuration
111
- * - If aggregatedTools is null or undefined, all tools from that server are included
112
- * - If aggregatedTools is an empty array, no tools from that server are included
113
- * - Tools are filtered using strict name matching against the aggregatedTools list
110
+ * - Tools are filtered based on each server's allowedTools configuration
111
+ * - If allowedTools is null or undefined, all tools from that server are included
112
+ * - If allowedTools is an empty array, no tools from that server are included
113
+ * - Tools are filtered using strict name matching against the allowedTools list
114
114
  */
115
115
  async getToolsWithCache() {
116
116
  const cached = this.cacheService.get();
@@ -119,17 +119,17 @@ export class SearchCoreService {
119
119
  }
120
120
  // Use new server name-level cache to get all tools
121
121
  const tools = mcpConnectionManager.getAllToolsByServerName();
122
- // Get configuration based on server name and apply aggregatedTools filtering
122
+ // Get configuration based on server name and apply allowedTools filtering
123
123
  const filteredTools = tools.filter((tool) => {
124
124
  const serverConfig = hubManager.getServerByName(tool.serverName);
125
125
  if (!serverConfig)
126
126
  return true;
127
- const aggregated = serverConfig.template.aggregatedTools;
128
- if (aggregated == null)
129
- return false; // No aggregatedTools configured, don't show any tools
130
- if (aggregated.length === 0)
127
+ const allowed = serverConfig.allowedTools;
128
+ if (allowed == null)
129
+ return true; // No allowedTools configured, show all tools
130
+ if (allowed.length === 0)
131
131
  return false; // Empty array, don't show any tools
132
- return aggregated.includes(tool.name); // Strict filtering
132
+ return allowed.includes(tool.name); // Strict filtering
133
133
  });
134
134
  this.cacheService.set(filteredTools);
135
135
  return filteredTools;
@@ -1,16 +1,28 @@
1
+ import { SessionState } from '../../../shared/models/session.model.js';
1
2
  import type { Session } from './types.js';
2
3
  /**
3
- * Lightweight MCP Session Manager with in-memory session management only.
4
+ * Enhanced MCP Session Manager with comprehensive persistence and lifecycle management.
4
5
  *
5
- * This service manages MCP sessions with basic in-memory storage and automatic
6
- * cleanup of stale sessions. It provides session isolation through unique
6
+ * This service manages MCP sessions with full state persistence, automatic cleanup,
7
+ * and graceful shutdown handling. It provides session isolation through unique
7
8
  * server and transport instances per session while maintaining shared resources
8
9
  * for efficiency.
9
10
  *
10
- * Key features:
11
- * - In-memory session storage only (no persistence)
11
+ * Key features include:
12
+ * - Session state persistence to disk with individual session files and index
13
+ * - Dirty tracking with 5-second batch flushing to minimize I/O operations
12
14
  * - Automatic cleanup of stale sessions based on configurable timeout (default 30 minutes)
13
- * - Session ID generation for internal use
15
+ * - Graceful shutdown handling with SIGTERM/SIGINT signal capture
16
+ * - Client metadata integration from client tracker service
17
+ * - Environment variable controlled debugging (SESSION_DEBUG)
18
+ *
19
+ * Session storage structure:
20
+ * ```
21
+ * ~/.mcp-hub-lite/
22
+ * └── sessions/
23
+ * ├── index.json # Session index file
24
+ * └── {sessionId}.json # Individual session state files
25
+ * ```
14
26
  *
15
27
  * @example
16
28
  * ```typescript
@@ -19,19 +31,200 @@ import type { Session } from './types.js';
19
31
  * // Use session.server and session.transport for MCP communication
20
32
  * ```
21
33
  *
22
- * @since 2.0.0
34
+ * @since 1.0.0
23
35
  */
24
36
  export declare class McpSessionManager {
25
37
  private sessions;
38
+ private sessionStates;
39
+ private dirtySessions;
40
+ private sessionsPath;
41
+ private flushTimeout;
42
+ private isInitialized;
26
43
  private get SESSION_TIMEOUT();
27
44
  private get CLEANUP_INTERVAL();
28
45
  constructor();
46
+ /**
47
+ * Registers process shutdown handlers for graceful session cleanup.
48
+ *
49
+ * This method sets up event listeners for SIGTERM and SIGINT signals to ensure
50
+ * that all dirty sessions are flushed to disk before the process terminates.
51
+ * This prevents data loss during unexpected shutdowns or service restarts.
52
+ *
53
+ * The shutdown handler performs a final flush of all dirty sessions and
54
+ * clears any pending flush timeouts to ensure clean termination.
55
+ *
56
+ * @returns {void}
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * // Called automatically in constructor
61
+ * sessionManager.registerShutdownHandler();
62
+ * ```
63
+ */
64
+ private registerShutdownHandler;
65
+ /**
66
+ * Marks a session as dirty, indicating it needs to be persisted to disk.
67
+ *
68
+ * This method adds the session ID to the dirty sessions set and initiates
69
+ * a delayed batch flush operation with a 5-second timeout. This optimization
70
+ * prevents excessive I/O operations by batching multiple session updates
71
+ * that occur in quick succession.
72
+ *
73
+ * When the SESSION_DEBUG environment variable is set, detailed logging
74
+ * is enabled for debugging session persistence behavior.
75
+ *
76
+ * @param {string} sessionId - Unique identifier of the session to mark as dirty
77
+ * @returns {void}
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * sessionManager.markAsDirty('my-session-id');
82
+ * // Session will be flushed to disk within 5 seconds
83
+ * ```
84
+ */
85
+ private markAsDirty;
86
+ /**
87
+ * Loads the complete session store from disk, including all individual session files.
88
+ *
89
+ * This method reads the sessions index file and loads each individual session state
90
+ * file, validating each session state against the SessionStateSchema. Invalid
91
+ * session states are skipped with warning logs, ensuring robust recovery from
92
+ * corrupted data.
93
+ *
94
+ * The method creates the sessions directory and index file if they don't exist,
95
+ * providing a clean initialization path for first-time usage.
96
+ *
97
+ * @returns {Promise<SessionStore>} Complete session store with all valid sessions
98
+ * @throws {Error} If critical I/O operations fail (non-recoverable errors)
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * const store = await sessionManager.loadSessionStore();
103
+ * console.log(`Loaded ${Object.keys(store.sessions).length} sessions`);
104
+ * ```
105
+ */
106
+ private loadSessionStore;
107
+ /**
108
+ * Saves the complete session store to disk, writing individual session files and index.
109
+ *
110
+ * This method persists all session states by writing individual JSON files for each
111
+ * session and updating the sessions index file. The operation is atomic at the
112
+ * file level, ensuring data integrity even if the process is interrupted.
113
+ *
114
+ * @param {SessionStore} store - Complete session store to persist
115
+ * @returns {Promise<void>} Resolves when all files are successfully written
116
+ * @throws {Error} If any file write operations fail
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * await sessionManager.saveSessionStore(mySessionStore);
121
+ * console.log('Session store saved successfully');
122
+ * ```
123
+ */
124
+ private saveSessionStore;
125
+ /**
126
+ * Restores all sessions from disk during service startup.
127
+ *
128
+ * This method is called automatically during initialization to recover session states
129
+ * from persistent storage. It loads the session store, validates each session state,
130
+ * and populates the in-memory session state cache. Invalid sessions are skipped
131
+ * with warning logs to ensure robust startup even with corrupted data.
132
+ *
133
+ * The method ensures idempotent execution by checking the initialization flag,
134
+ * preventing multiple restoration attempts.
135
+ *
136
+ * @returns {Promise<void>} Resolves when all valid sessions are restored
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * await sessionManager.restoreSessions();
141
+ * console.log('Sessions restored from disk');
142
+ * ```
143
+ */
144
+ restoreSessions(): Promise<void>;
145
+ /**
146
+ * Flushes all dirty sessions to disk in a single batch operation.
147
+ *
148
+ * This method collects all sessions marked as dirty, loads the current session store,
149
+ * updates it with the dirty sessions, and saves the complete store back to disk.
150
+ * This batch approach minimizes I/O operations and ensures data consistency.
151
+ *
152
+ * The method includes comprehensive error handling to prevent partial writes and
153
+ * maintains detailed logging for debugging and monitoring purposes.
154
+ *
155
+ * @returns {Promise<void>} Resolves when all dirty sessions are successfully flushed
156
+ *
157
+ * @example
158
+ * ```typescript
159
+ * await sessionManager.flushDirtySessions();
160
+ * console.log('All dirty sessions flushed to disk');
161
+ * ```
162
+ */
163
+ private flushDirtySessions;
164
+ /**
165
+ * Updates session metadata by retrieving client information from the client tracker service.
166
+ *
167
+ * This method fetches current client information including name, version, working directory,
168
+ * and project context from the client tracker service and returns a partial session state
169
+ * update object containing only the relevant metadata fields.
170
+ *
171
+ * @param {string} sessionId - Unique identifier of the session to update
172
+ * @returns {Partial<SessionState>} Partial session state with updated client metadata
173
+ *
174
+ * @example
175
+ * ```typescript
176
+ * const metadata = sessionManager.updateSessionMetadataFromClient('my-session-id');
177
+ * console.log('Updated client metadata:', metadata);
178
+ * ```
179
+ */
180
+ private updateSessionMetadataFromClient;
181
+ /**
182
+ * Creates or updates a session state with current metadata and timestamps.
183
+ *
184
+ * This method merges existing session state (if any) with current client metadata
185
+ * from the client tracker service, updates access timestamps, and ensures proper
186
+ * session state structure. The updated state is stored in memory and marked as dirty
187
+ * for persistence.
188
+ *
189
+ * @param {string} sessionId - Unique identifier of the session to create or update
190
+ * @returns {SessionState} Complete updated session state object
191
+ *
192
+ * @example
193
+ * ```typescript
194
+ * const state = sessionManager.upsertSessionState('my-session-id');
195
+ * console.log('Session state updated:', state);
196
+ * ```
197
+ */
198
+ private upsertSessionState;
199
+ /**
200
+ * Updates session metadata explicitly with provided key-value pairs.
201
+ *
202
+ * This method merges the provided metadata object with existing session metadata,
203
+ * updates the last accessed timestamp, and marks the session as dirty for persistence.
204
+ * It's useful for storing custom session-specific information that needs to be persisted.
205
+ *
206
+ * @param {string} sessionId - Unique identifier of the session to update
207
+ * @param {Record<string, unknown>} metadata - Key-value pairs to merge into session metadata
208
+ * @returns {Promise<void>} Resolves when metadata is updated and marked for persistence
209
+ *
210
+ * @example
211
+ * ```typescript
212
+ * await sessionManager.updateSessionMetadata('my-session-id', {
213
+ * userPreferences: { theme: 'dark' },
214
+ * lastProject: 'my-project'
215
+ * });
216
+ * ```
217
+ */
218
+ updateSessionMetadata(sessionId: string, metadata: Record<string, unknown>): Promise<void>;
29
219
  /**
30
220
  * Retrieves an existing session or creates a new one if it doesn't exist.
31
221
  *
32
222
  * This method provides access to active sessions, creating new ones on demand with
33
223
  * proper initialization based on the requireInitialize parameter. It updates session
34
- * access timestamps.
224
+ * access timestamps and persists session state changes to ensure data consistency.
225
+ *
226
+ * The method includes optimization to prevent excessive timestamp updates for rapid
227
+ * successive requests by only updating when at least 100ms have passed since the last access.
35
228
  *
36
229
  * @param {string} sessionId - Unique identifier of the session to retrieve or create
37
230
  * @param {boolean} [requireInitialize=true] - Whether to require MCP protocol initialization
@@ -41,9 +234,47 @@ export declare class McpSessionManager {
41
234
  * ```typescript
42
235
  * // Get or create session with default initialization
43
236
  * const session = await sessionManager.getSession('my-session-id');
237
+ *
238
+ * // Get or create session without requiring initialization (for restored sessions)
239
+ * const restoredSession = await sessionManager.getSession('restored-session-id', false);
44
240
  * ```
45
241
  */
46
242
  getSession(sessionId: string, requireInitialize?: boolean): Promise<Session>;
243
+ /**
244
+ * Retrieves all persisted session states for API exposure.
245
+ *
246
+ * This method returns an array of all current session states, providing a complete
247
+ * snapshot of all active sessions and their metadata. It's primarily used by the
248
+ * web API to expose session information to clients.
249
+ *
250
+ * @returns {SessionState[]} Array of all current session states
251
+ *
252
+ * @example
253
+ * ```typescript
254
+ * const allStates = sessionManager.getAllSessionStates();
255
+ * console.log(`Total active sessions: ${allStates.length}`);
256
+ * ```
257
+ */
258
+ getAllSessionStates(): SessionState[];
259
+ /**
260
+ * Retrieves a specific session state by session ID for API exposure.
261
+ *
262
+ * This method returns the current state of a specific session or undefined if
263
+ * the session doesn't exist. It's primarily used by the web API to provide
264
+ * detailed information about individual sessions.
265
+ *
266
+ * @param {string} sessionId - Unique identifier of the session to retrieve
267
+ * @returns {SessionState | undefined} Session state object or undefined if not found
268
+ *
269
+ * @example
270
+ * ```typescript
271
+ * const state = sessionManager.getSessionState('my-session-id');
272
+ * if (state) {
273
+ * console.log('Session client:', state.clientName);
274
+ * }
275
+ * ```
276
+ */
277
+ getSessionState(sessionId: string): SessionState | undefined;
47
278
  /**
48
279
  * Checks if a session object exists in the active sessions map.
49
280
  *
@@ -52,9 +283,11 @@ export declare class McpSessionManager {
52
283
  */
53
284
  hasSession(sessionId: string): boolean;
54
285
  /**
55
- * Deletes a session from memory.
286
+ * Deletes a session and removes it from persistent storage.
56
287
  *
57
- * This method gracefully closes the session's MCP server and removes it from memory.
288
+ * This method gracefully closes the session's MCP server, removes it from memory,
289
+ * and ensures it's removed from persistent storage by marking it as dirty and
290
+ * performing an immediate flush. It returns true if the session existed and was deleted.
58
291
  *
59
292
  * @param {string} sessionId - Unique identifier of the session to delete
60
293
  * @returns {Promise<boolean>} True if session existed and was deleted, false otherwise
@@ -72,7 +305,15 @@ export declare class McpSessionManager {
72
305
  * Creates a new MCP session with proper initialization and transport setup.
73
306
  *
74
307
  * This method sets up a complete MCP session including server, transport, and
75
- * communication logging.
308
+ * communication logging. It handles both fresh sessions and restored sessions,
309
+ * with special logic for skipping initialization when appropriate.
310
+ *
311
+ * Key features:
312
+ * - Creates StreamableHTTPServerTransport with custom session ID generation
313
+ * - Sets up comprehensive message logging for debugging
314
+ * - Handles restored sessions by manually initializing transport state
315
+ * - Integrates with client tracker service for metadata
316
+ * - Creates/updates session state and marks as dirty for persistence
76
317
  *
77
318
  * @param {string} sessionId - Unique identifier for the new session
78
319
  * @param {boolean} [requireInitialize=true] - Whether to require MCP protocol initialization
@@ -89,11 +330,14 @@ export declare class McpSessionManager {
89
330
  /**
90
331
  * Cleans up stale sessions based on the configured session timeout.
91
332
  *
92
- * This method is called periodically to identify and close
333
+ * This method is called periodically (every 60 seconds) to identify and close
93
334
  * sessions that haven't been accessed within the configured timeout period
94
335
  * (default 30 minutes). It gracefully closes MCP servers and removes sessions
95
336
  * from memory to prevent resource leaks.
96
337
  *
338
+ * The method logs detailed information about cleaned sessions and maintains
339
+ * active session count for monitoring purposes.
340
+ *
97
341
  * @returns {void}
98
342
  *
99
343
  * @example
@@ -1 +1 @@
1
- {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../../../../src/services/session/session-manager.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAA4B,OAAO,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAmC;IAEnD,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,KAAK,gBAAgB,GAE3B;;IAOD;;;;;;;;;;;;;;;;OAgBG;IACU,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAE,OAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAkE/F;;;;;OAKG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;;;;;;;;;;;;;;;OAeG;IACU,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc/D;;;;;;;;;;;;;;;;OAgBG;YACW,aAAa;IA0G3B;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,OAAO;CA4BhB;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../../../../src/services/session/session-manager.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,YAAY,EAIb,MAAM,iCAAiC,CAAC;AAMzC,OAAO,KAAK,EAA4B,OAAO,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,KAAK,gBAAgB,GAE3B;;IA4BD;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,uBAAuB;IAiB/B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,WAAW;IAgBnB;;;;;;;;;;;;;;;;;;;OAmBG;YACW,gBAAgB;IA8D9B;;;;;;;;;;;;;;;;OAgBG;YACW,gBAAgB;IA8B9B;;;;;;;;;;;;;;;;;;OAkBG;IACU,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IA6D7C;;;;;;;;;;;;;;;;;OAiBG;YACW,kBAAkB;IA+ChC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,+BAA+B;IAcvC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;;;;;;;;;;;;;;;;;OAkBG;IACU,qBAAqB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;IAqBhB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACU,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAE,OAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IA0F/F;;;;;;;;;;;;;;OAcG;IACI,mBAAmB,IAAI,YAAY,EAAE;IAI5C;;;;;;;;;;;;;;;;;OAiBG;IACI,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAInE;;;;;OAKG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;;;;;;;;;;;;;;;;;OAiBG;IACU,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB/D;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;YACW,aAAa;IA8I3B;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,OAAO;CAqDhB;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}