@172ai/containers-mcp-server 1.12.3 → 1.12.4

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.
@@ -0,0 +1,570 @@
1
+ import { authManager } from '../auth.js';
2
+ import { ErrorHandler, ApiError } from '../utils/errorHandler.js';
3
+ import { EnhancedMCPErrorHandler, MCP_ERROR_CODES, MCPError } from '../utils/enhancedErrorHandler.js';
4
+ import { streamingService } from './streamingService.js';
5
+ /**
6
+ * Generate a unique request ID
7
+ */
8
+ function generateRequestId() {
9
+ return `mcp_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
10
+ }
11
+ export class ImportService {
12
+ constructor() {
13
+ this.mcpServer = null;
14
+ // Real-time streaming management
15
+ this.activeStreams = new Map();
16
+ this.progressUpdates = new Map();
17
+ this.streamAnalytics = {
18
+ totalImports: 0,
19
+ activeImports: 0,
20
+ completedImports: 0,
21
+ failedImports: 0,
22
+ averageImportTime: 0,
23
+ notificationsSent: 0,
24
+ errorsEncountered: 0,
25
+ lastActivity: new Date().toISOString()
26
+ };
27
+ this.httpClient = authManager.getHttpClient();
28
+ }
29
+ /**
30
+ * Set MCP server reference for progress notifications
31
+ */
32
+ setMCPServer(server) {
33
+ this.mcpServer = server;
34
+ }
35
+ /**
36
+ * Get stream analytics and monitoring information
37
+ */
38
+ getStreamAnalytics() {
39
+ return {
40
+ ...this.streamAnalytics,
41
+ activeStreams: Array.from(this.activeStreams.values())
42
+ };
43
+ }
44
+ /**
45
+ * Get progress update for a specific token
46
+ */
47
+ getProgressUpdate(progressToken) {
48
+ const update = this.progressUpdates.get(progressToken);
49
+ if (!update)
50
+ return null;
51
+ // Check if expired (clean up stale data)
52
+ if (update.expiresAt && Date.now() > update.expiresAt) {
53
+ this.progressUpdates.delete(progressToken);
54
+ return null;
55
+ }
56
+ return update;
57
+ }
58
+ /**
59
+ * Cancel import monitoring for a specific token
60
+ */
61
+ async cancelImportMonitoring(progressToken, reason = 'User requested cancellation') {
62
+ const stream = this.activeStreams.get(progressToken);
63
+ if (!stream) {
64
+ return false;
65
+ }
66
+ console.log(`[Import] Cancelling monitoring for import job ${stream.jobId} with token ${progressToken}`);
67
+ try {
68
+ // Update progress with cancellation notice
69
+ await this.storeProgressUpdate(progressToken, stream.lastProgress, 100, `Import monitoring cancelled: ${reason}`);
70
+ // Unsubscribe from stream
71
+ await streamingService.unsubscribeFromStream(stream.streamId);
72
+ // Cleanup
73
+ this.completeStream(progressToken, 'cancelled');
74
+ return true;
75
+ }
76
+ catch (error) {
77
+ console.error(`[Import] Error cancelling monitoring for token ${progressToken}:`, error);
78
+ return false;
79
+ }
80
+ }
81
+ /**
82
+ * Start a container import with real-time streaming progress
83
+ */
84
+ async importContainer(params, progressToken) {
85
+ try {
86
+ const { sourceType, sourceUrl, name, dockerfilePath, dockerHubUsername, dockerHubToken } = params;
87
+ if (!sourceType || !sourceUrl) {
88
+ throw ErrorHandler.createValidationError('Source type and URL are required');
89
+ }
90
+ // Initialize progress tracking with streaming notifications
91
+ if (progressToken) {
92
+ console.log(`[Import] Starting import with streaming progress token: ${progressToken}`);
93
+ await this.storeProgressUpdate(progressToken, 0, 100, 'Import initialization started');
94
+ }
95
+ const importRequest = {
96
+ sourceType,
97
+ sourceUrl
98
+ };
99
+ // Add optional parameters
100
+ if (name)
101
+ importRequest.name = name;
102
+ if (dockerfilePath)
103
+ importRequest.dockerfilePath = dockerfilePath;
104
+ if (dockerHubUsername)
105
+ importRequest.dockerHubUsername = dockerHubUsername;
106
+ if (dockerHubToken)
107
+ importRequest.dockerHubToken = dockerHubToken;
108
+ // Start the import via API
109
+ const response = await this.httpClient.post('/v1/containers/import', importRequest);
110
+ if (!response.data) {
111
+ throw ErrorHandler.createServerError('Invalid response from import API');
112
+ }
113
+ const data = response.data;
114
+ const importResult = {
115
+ jobId: data.jobId,
116
+ status: data.status || 'pending',
117
+ sourceType: data.sourceType,
118
+ sourceUrl: data.sourceUrl,
119
+ progress: data.progress,
120
+ containerId: data.containerId,
121
+ errors: data.errors || [],
122
+ createdAt: data.createdAt,
123
+ updatedAt: data.updatedAt,
124
+ completedAt: data.completedAt,
125
+ metadata: data.metadata,
126
+ tokenCost: data.tokenCost,
127
+ estimatedDuration: data.estimatedDuration
128
+ };
129
+ // Set up real-time streaming for progress updates
130
+ if (progressToken) {
131
+ await this.storeProgressUpdate(progressToken, 10, 100, `Import job created - ID: ${importResult.jobId}`);
132
+ // Create streaming subscription
133
+ await this.setupStreamingMonitoring(importResult.jobId, sourceType, sourceUrl, progressToken);
134
+ }
135
+ return importResult;
136
+ }
137
+ catch (error) {
138
+ // Use enhanced error handling for import operations
139
+ const context = {
140
+ operation: 'import_container',
141
+ sourceType: params.sourceType,
142
+ sourceUrl: params.sourceUrl,
143
+ importStage: 'initialization',
144
+ progressToken: progressToken,
145
+ requestId: generateRequestId()
146
+ };
147
+ if (error instanceof ApiError && error.status === 402) {
148
+ throw new MCPError(MCP_ERROR_CODES.API_QUOTA_EXCEEDED, error.message || 'Insufficient tokens for import', context);
149
+ }
150
+ if (error instanceof ApiError && error.status === 400) {
151
+ throw new MCPError(MCP_ERROR_CODES.CONTAINER_STATE_INVALID, error.message || 'Invalid import request', context);
152
+ }
153
+ const enhancedError = EnhancedMCPErrorHandler.processError(error, context);
154
+ throw new ApiError(enhancedError.message, enhancedError.status, enhancedError.code, enhancedError, context.requestId, context.operation);
155
+ }
156
+ }
157
+ /**
158
+ * Set up real-time streaming monitoring for import progress
159
+ */
160
+ async setupStreamingMonitoring(jobId, sourceType, sourceUrl, progressToken) {
161
+ try {
162
+ console.log(`[Import] Setting up real-time streaming for import job ${jobId} with token ${progressToken}`);
163
+ // Create import stream
164
+ const streamSession = await streamingService.createStream({
165
+ streamType: 'user-notifications',
166
+ resourceId: jobId,
167
+ eventFilters: [
168
+ 'import-started',
169
+ 'import-validating',
170
+ 'import-pulling',
171
+ 'import-cloning',
172
+ 'import-inspecting',
173
+ 'import-extracting',
174
+ 'import-files-ingested',
175
+ 'import-files-imported',
176
+ 'import-validation-completed',
177
+ 'import-creating',
178
+ 'import-finalizing',
179
+ 'import-completed',
180
+ 'import-failed'
181
+ ],
182
+ ttlMinutes: 120, // 2 hours
183
+ metadata: {
184
+ jobId,
185
+ progressToken,
186
+ sourceType,
187
+ sourceUrl
188
+ }
189
+ });
190
+ // Track active stream
191
+ const activeStream = {
192
+ jobId,
193
+ sourceType,
194
+ sourceUrl,
195
+ progressToken,
196
+ streamId: streamSession.streamId,
197
+ startTime: Date.now(),
198
+ lastProgress: 10,
199
+ status: 'active'
200
+ };
201
+ this.activeStreams.set(progressToken, activeStream);
202
+ this.streamAnalytics.totalImports++;
203
+ this.streamAnalytics.activeImports++;
204
+ // Subscribe to stream events
205
+ await streamingService.subscribeToStream(streamSession.streamId, (event) => {
206
+ this.handleImportStreamEvent(event, progressToken);
207
+ });
208
+ console.log(`[Import] Real-time streaming active for import job ${jobId} (stream: ${streamSession.streamId})`);
209
+ }
210
+ catch (error) {
211
+ console.error(`[Import] Failed to setup streaming monitoring for job ${jobId}:`, {
212
+ error: error?.message || error,
213
+ stack: error?.stack,
214
+ jobId,
215
+ progressToken
216
+ });
217
+ // Fallback to basic progress tracking if streaming fails
218
+ await this.storeProgressUpdate(progressToken, 10, 100, `Import started - streaming unavailable: ${error?.message || 'Unknown error'}`);
219
+ // Start fallback polling mechanism
220
+ await this.startFallbackProgressPolling(jobId, progressToken);
221
+ }
222
+ }
223
+ /**
224
+ * Start fallback polling mechanism when streaming fails
225
+ */
226
+ async startFallbackProgressPolling(jobId, progressToken) {
227
+ console.log(`[Import] Starting fallback polling for import job ${jobId} with token ${progressToken}`);
228
+ const stream = this.activeStreams.get(progressToken);
229
+ if (!stream) {
230
+ console.error(`[Import] No stream found for token ${progressToken}`);
231
+ return;
232
+ }
233
+ // Start polling every 10 seconds
234
+ const pollInterval = setInterval(async () => {
235
+ try {
236
+ const importStatus = await this.getImportStatus(jobId);
237
+ if (!this.activeStreams.has(progressToken)) {
238
+ clearInterval(pollInterval);
239
+ return;
240
+ }
241
+ const currentStream = this.activeStreams.get(progressToken);
242
+ let progress = currentStream.lastProgress;
243
+ let message = `Import ${importStatus.status}`;
244
+ // Map import status to progress
245
+ switch (importStatus.status) {
246
+ case 'pending':
247
+ case 'queued':
248
+ progress = 20;
249
+ message = 'Import queued and waiting to start';
250
+ break;
251
+ case 'processing':
252
+ case 'validating':
253
+ progress = 40;
254
+ message = importStatus.progress?.message || 'Validating import source';
255
+ break;
256
+ case 'pulling':
257
+ case 'cloning':
258
+ progress = 60;
259
+ message = importStatus.progress?.message || 'Downloading source files';
260
+ break;
261
+ case 'extracting':
262
+ case 'creating':
263
+ progress = 80;
264
+ message = importStatus.progress?.message || 'Creating container';
265
+ break;
266
+ case 'completed':
267
+ progress = 100;
268
+ message = importStatus.containerId
269
+ ? `Import completed! Container created: ${importStatus.containerId}`
270
+ : 'Import completed successfully!';
271
+ break;
272
+ case 'failed':
273
+ message = `Import failed: ${importStatus.errors?.[0] || 'Unknown error'}`;
274
+ break;
275
+ }
276
+ // Update progress
277
+ currentStream.lastProgress = progress;
278
+ await this.storeProgressUpdate(progressToken, progress, 100, message, {
279
+ jobId,
280
+ status: importStatus.status,
281
+ fallbackMode: true
282
+ });
283
+ // Complete if finished
284
+ if (['completed', 'failed'].includes(importStatus.status)) {
285
+ const completionTime = Date.now() - currentStream.startTime;
286
+ this.completeStream(progressToken, importStatus.status === 'completed' ? 'completed' : 'failed', completionTime);
287
+ clearInterval(pollInterval);
288
+ }
289
+ }
290
+ catch (error) {
291
+ console.error(`[Import] Error in fallback polling for ${jobId}:`, error);
292
+ }
293
+ }, 10000); // Poll every 10 seconds
294
+ // Auto-cleanup after 30 minutes
295
+ setTimeout(() => {
296
+ if (this.activeStreams.has(progressToken)) {
297
+ console.log(`[Import] Auto-cleaning up fallback polling for ${jobId} after 30 minutes`);
298
+ clearInterval(pollInterval);
299
+ this.completeStream(progressToken, 'timeout');
300
+ }
301
+ }, 30 * 60 * 1000);
302
+ }
303
+ /**
304
+ * Handle real-time import stream events
305
+ */
306
+ async handleImportStreamEvent(event, progressToken) {
307
+ try {
308
+ const stream = this.activeStreams.get(progressToken);
309
+ if (!stream) {
310
+ console.warn(`[Import] Received event for unknown progress token: ${progressToken}`);
311
+ return;
312
+ }
313
+ console.log(`[Import] Processing ${event.eventType} for import job ${stream.jobId}: ${event.data.message || event.data.data?.message || ''}`);
314
+ // Convert stream event to progress update
315
+ const progressUpdate = this.convertStreamEventToProgress(event, progressToken, stream);
316
+ // Store progress update
317
+ await this.storeProgressUpdate(progressToken, progressUpdate.progress, progressUpdate.total, progressUpdate.message, progressUpdate.metadata);
318
+ // Update stream tracking
319
+ stream.lastProgress = progressUpdate.progress;
320
+ // Handle completion events
321
+ if (['import-completed', 'import-failed'].includes(event.eventType)) {
322
+ const completionTime = Date.now() - stream.startTime;
323
+ this.completeStream(progressToken, event.eventType.replace('import-', ''), completionTime);
324
+ }
325
+ }
326
+ catch (error) {
327
+ console.error(`[Import] Error handling stream event:`, error);
328
+ this.streamAnalytics.errorsEncountered++;
329
+ }
330
+ }
331
+ /**
332
+ * Convert stream event to progress update format
333
+ */
334
+ convertStreamEventToProgress(event, progressToken, stream) {
335
+ const baseProgress = {
336
+ progressToken,
337
+ total: 100,
338
+ timestamp: event.timestamp,
339
+ metadata: {
340
+ eventType: event.eventType,
341
+ jobId: stream.jobId,
342
+ sourceType: stream.sourceType,
343
+ sourceUrl: stream.sourceUrl,
344
+ streamId: stream.streamId,
345
+ ...event.data.data
346
+ }
347
+ };
348
+ const eventData = event.data.data || event.data;
349
+ switch (event.eventType) {
350
+ case 'import-started':
351
+ return {
352
+ ...baseProgress,
353
+ progress: 10,
354
+ message: eventData.message || 'Import started'
355
+ };
356
+ case 'import-validating':
357
+ return {
358
+ ...baseProgress,
359
+ progress: 20,
360
+ message: eventData.message || 'Validating import source'
361
+ };
362
+ case 'import-pulling':
363
+ case 'import-cloning':
364
+ return {
365
+ ...baseProgress,
366
+ progress: 40,
367
+ message: eventData.message || 'Downloading source files'
368
+ };
369
+ case 'import-inspecting':
370
+ return {
371
+ ...baseProgress,
372
+ progress: 50,
373
+ message: eventData.message || 'Inspecting repository structure'
374
+ };
375
+ case 'import-extracting':
376
+ return {
377
+ ...baseProgress,
378
+ progress: 60,
379
+ message: eventData.message || 'Extracting files and metadata'
380
+ };
381
+ case 'import-files-ingested':
382
+ return {
383
+ ...baseProgress,
384
+ progress: 65,
385
+ message: eventData.message || `Ingested ${eventData.fileCount || 0} files`
386
+ };
387
+ case 'import-files-imported':
388
+ return {
389
+ ...baseProgress,
390
+ progress: 70,
391
+ message: eventData.message || `Imported ${eventData.extractedFileCount || 0} files`
392
+ };
393
+ case 'import-validation-completed':
394
+ return {
395
+ ...baseProgress,
396
+ progress: 75,
397
+ message: eventData.message || 'Validation completed'
398
+ };
399
+ case 'import-creating':
400
+ return {
401
+ ...baseProgress,
402
+ progress: 85,
403
+ message: eventData.message || 'Creating container document'
404
+ };
405
+ case 'import-finalizing':
406
+ return {
407
+ ...baseProgress,
408
+ progress: 95,
409
+ message: eventData.message || 'Finalizing import'
410
+ };
411
+ case 'import-completed':
412
+ return {
413
+ ...baseProgress,
414
+ progress: 100,
415
+ message: eventData.message || `Import completed! Container: ${eventData.containerId || 'unknown'}`
416
+ };
417
+ case 'import-failed':
418
+ return {
419
+ ...baseProgress,
420
+ progress: Math.max(stream.lastProgress, 0),
421
+ message: eventData.message || eventData.error || 'Import failed'
422
+ };
423
+ default:
424
+ return {
425
+ ...baseProgress,
426
+ progress: Math.max(stream.lastProgress, 0),
427
+ message: eventData.message || `Unknown event: ${event.eventType}`
428
+ };
429
+ }
430
+ }
431
+ /**
432
+ * Store progress update with expiration
433
+ */
434
+ async storeProgressUpdate(progressToken, progress, total = 100, message, metadata) {
435
+ if (!progressToken)
436
+ return;
437
+ try {
438
+ const notificationData = {
439
+ progressToken,
440
+ progress,
441
+ total,
442
+ message,
443
+ timestamp: new Date().toISOString(),
444
+ expiresAt: Date.now() + (30 * 60 * 1000), // 30-minute expiration
445
+ ...(metadata && { metadata })
446
+ };
447
+ this.progressUpdates.set(progressToken, notificationData);
448
+ this.streamAnalytics.notificationsSent++;
449
+ this.streamAnalytics.lastActivity = new Date().toISOString();
450
+ console.log(`[Import] Progress stored: ${progress}/${total} - ${message} (token: ${progressToken})`);
451
+ }
452
+ catch (error) {
453
+ console.error(`[Import] Failed to store progress update:`, error);
454
+ this.streamAnalytics.errorsEncountered++;
455
+ }
456
+ }
457
+ /**
458
+ * Complete stream monitoring and update analytics
459
+ */
460
+ completeStream(progressToken, reason, completionTime) {
461
+ const stream = this.activeStreams.get(progressToken);
462
+ if (!stream)
463
+ return;
464
+ // Unsubscribe from stream
465
+ streamingService.unsubscribeFromStream(stream.streamId).catch(error => {
466
+ console.error(`[Import] Error unsubscribing from stream ${stream.streamId}:`, error);
467
+ });
468
+ // Update analytics
469
+ this.streamAnalytics.activeImports = Math.max(0, this.streamAnalytics.activeImports - 1);
470
+ if (reason === 'completed') {
471
+ this.streamAnalytics.completedImports++;
472
+ if (completionTime) {
473
+ const currentAvg = this.streamAnalytics.averageImportTime;
474
+ const totalCompleted = this.streamAnalytics.completedImports;
475
+ this.streamAnalytics.averageImportTime =
476
+ ((currentAvg * (totalCompleted - 1)) + completionTime) / totalCompleted;
477
+ }
478
+ }
479
+ else if (reason === 'failed') {
480
+ this.streamAnalytics.failedImports++;
481
+ }
482
+ // Clean up
483
+ this.activeStreams.delete(progressToken);
484
+ console.log(`[Import] Stream monitoring completed for ${stream.jobId} (${reason})`);
485
+ }
486
+ /**
487
+ * Get import job status
488
+ */
489
+ async getImportStatus(jobId) {
490
+ try {
491
+ if (!jobId) {
492
+ throw ErrorHandler.createValidationError('Job ID is required');
493
+ }
494
+ // Get import status via container import status endpoint
495
+ // Note: We need to get the container ID first, or use a jobs endpoint
496
+ const response = await this.httpClient.get(`/v1/containers/imports?limit=100`);
497
+ if (!response.data || !response.data.imports) {
498
+ throw ErrorHandler.createNotFoundError(`Import job ${jobId} not found`);
499
+ }
500
+ const job = response.data.imports.find((j) => j.jobId === jobId);
501
+ if (!job) {
502
+ throw ErrorHandler.createNotFoundError(`Import job ${jobId} not found`);
503
+ }
504
+ return {
505
+ jobId: job.jobId,
506
+ status: job.status,
507
+ sourceType: job.sourceType,
508
+ sourceUrl: job.sourceUrl,
509
+ progress: job.progress,
510
+ containerId: job.containerId,
511
+ errors: job.errors || [],
512
+ createdAt: job.createdAt,
513
+ updatedAt: job.updatedAt,
514
+ completedAt: job.completedAt
515
+ };
516
+ }
517
+ catch (error) {
518
+ if (error instanceof ApiError && error.status === 404) {
519
+ throw ErrorHandler.createNotFoundError(`Import job ${jobId} not found`);
520
+ }
521
+ throw ErrorHandler.processError(error, 'ImportService.getImportStatus');
522
+ }
523
+ }
524
+ /**
525
+ * List import jobs
526
+ */
527
+ async listImportJobs(params = {}) {
528
+ try {
529
+ const queryParams = new URLSearchParams();
530
+ if (params.status)
531
+ queryParams.append('status', params.status);
532
+ if (params.limit)
533
+ queryParams.append('limit', params.limit.toString());
534
+ if (params.offset)
535
+ queryParams.append('offset', params.offset.toString());
536
+ const endpoint = `/v1/containers/imports`;
537
+ const response = await this.httpClient.get(`${endpoint}?${queryParams.toString()}`);
538
+ if (!response.data) {
539
+ throw ErrorHandler.createServerError('Invalid response format from imports list API');
540
+ }
541
+ const data = response.data;
542
+ return {
543
+ imports: (data.imports || []).map((job) => ({
544
+ jobId: job.jobId,
545
+ status: job.status,
546
+ sourceType: job.sourceType,
547
+ sourceUrl: job.sourceUrl,
548
+ progress: job.progress,
549
+ containerId: job.containerId,
550
+ errors: job.errors || [],
551
+ createdAt: job.createdAt,
552
+ updatedAt: job.updatedAt,
553
+ completedAt: job.completedAt
554
+ })),
555
+ pagination: data.pagination || {
556
+ limit: params.limit || 50,
557
+ offset: params.offset || 0,
558
+ total: data.imports?.length || 0,
559
+ hasMore: false
560
+ }
561
+ };
562
+ }
563
+ catch (error) {
564
+ throw ErrorHandler.processError(error, 'ImportService.listImportJobs');
565
+ }
566
+ }
567
+ }
568
+ // Export singleton instance
569
+ export const importService = new ImportService();
570
+ //# sourceMappingURL=importService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importService.js","sourceRoot":"","sources":["../../src/services/importService.ts"],"names":[],"mappings":"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"}
@@ -43,6 +43,19 @@ export interface LogEventData {
43
43
  to: string;
44
44
  };
45
45
  }
46
+ export interface ImportEventData {
47
+ importJobId: string;
48
+ sourceType: string;
49
+ sourceUrl: string;
50
+ containerId?: string;
51
+ containerName?: string;
52
+ status: string;
53
+ message: string;
54
+ progress?: number;
55
+ tokenCost?: number;
56
+ newTokenBalance?: number;
57
+ details?: Record<string, any>;
58
+ }
46
59
  export type NotificationEventHandler = (eventType: string, data: any) => void;
47
60
  export declare class UserNotificationManager {
48
61
  private streamSession;
@@ -88,6 +101,10 @@ export declare class UserNotificationManager {
88
101
  * Handle execution event
89
102
  */
90
103
  private handleExecutionEvent;
104
+ /**
105
+ * Handle import event
106
+ */
107
+ private handleImportEvent;
91
108
  /**
92
109
  * Handle log event with buffering and deduplication
93
110
  */
@@ -124,6 +141,7 @@ export declare class UserNotificationManager {
124
141
  totalEventsReceived: number;
125
142
  buildEvents: number;
126
143
  executionEvents: number;
144
+ importEvents: number;
127
145
  logEvents: number;
128
146
  logsReceived: number;
129
147
  duplicatesFiltered: number;
@@ -1 +1 @@
1
- {"version":3,"file":"userNotificationManager.d.ts","sourceRoot":"","sources":["../../src/services/userNotificationManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAiC,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAa,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAI5D,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;CACH;AAED,MAAM,MAAM,wBAAwB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;AAO9E,qBAAa,uBAAuB;IAClC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,eAAe,CAA4C;IACnE,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,KAAK,CAQX;IAEF;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmD/C;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,aAAa,IAAI,aAAa,GAAG,IAAI;IAIrC;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAIhD;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAc5E;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAK9C;;OAEG;YACW,iBAAiB;IA8B/B;;OAEG;YACW,gBAAgB;IAmB9B;;OAEG;YACW,oBAAoB;IAyBlC;;OAEG;YACW,cAAc;IA2C5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAe9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAgBvB;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE;IAIjE;;OAEG;IACH,WAAW;IAIX;;OAEG;IACH,QAAQ;;;;;;;;;;;;qBAnTe,MAAM,GAAG,IAAI;;IA8TpC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CA8B/B;AAGD,eAAO,MAAM,uBAAuB,yBAAgC,CAAC"}
1
+ {"version":3,"file":"userNotificationManager.d.ts","sourceRoot":"","sources":["../../src/services/userNotificationManager.ts"],"names":[],"mappings":"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"}