@memberjunction/ng-dashboards 5.28.0 → 5.29.0
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.
- package/dist/Archiving/components/archive-config-resource.component.d.ts +20 -0
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -0
- package/dist/Archiving/components/archive-config-resource.component.js +46 -0
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -0
- package/dist/Archiving/components/archive-runs-resource.component.d.ts +20 -0
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -0
- package/dist/Archiving/components/archive-runs-resource.component.js +46 -0
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -0
- package/dist/MCP/components/mcp-connection-dialog.component.js +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +170 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +2471 -679
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-filter-panel.component.d.ts +16 -1
- package/dist/MCP/mcp-filter-panel.component.d.ts.map +1 -1
- package/dist/MCP/mcp-filter-panel.component.js +187 -60
- package/dist/MCP/mcp-filter-panel.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts +0 -9
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +1 -10
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +7 -6
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +4 -8
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +13 -3
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +186 -139
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +19 -0
- package/dist/archiving-dashboards.module.d.ts.map +1 -0
- package/dist/archiving-dashboards.module.js +52 -0
- package/dist/archiving-dashboards.module.js.map +1 -0
- package/dist/core-dashboards.module.d.ts +3 -2
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +4 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +51 -48
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-dashboard.component.js","sourceRoot":"","sources":["../../src/MCP/mcp-dashboard.component.ts","../../src/MCP/mcp-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview MCP (Model Context Protocol) Management Dashboard\n *\n * Provides a comprehensive admin interface for managing MCP servers,\n * connections, tools, and viewing execution logs.\n *\n * Uses left sidebar navigation with query string deep linking via NavigationService.\n *\n * @module MCP Dashboard\n */\n\nimport { Component, OnDestroy, ChangeDetectorRef, AfterViewInit, OnInit } from '@angular/core';\nimport { Subject, BehaviorSubject, Subscription } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { RunView, Metadata, CompositeKey } from '@memberjunction/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport {\n ResourceData,\n MJMCPServerEntity,\n MJMCPServerConnectionEntity,\n MJMCPServerToolEntity,\n MJMCPToolExecutionLogEntity,\n MCPEngine,\n UserInfoEngine,\n MJOAuthAuthorizationStateEntity,\n MJOAuthClientRegistrationEntity,\n MJOAuthTokenEntity\n} from '@memberjunction/core-entities';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { MCPToolsService, MCPSyncState, MCPSyncResult } from './services/mcp-tools.service';\n\n/**\n * User preferences for the MCP Dashboard\n */\ninterface MCPDashboardUserPreferences {\n toolsViewMode: ToolsViewMode;\n toolsSortBy: ToolsSortBy;\n toolsSortAscending: boolean;\n logsSortColumn: 'status' | 'server' | 'tool' | 'connection' | 'started' | 'duration' | 'error';\n logsSortAscending: boolean;\n searchTerm: string;\n serverStatus: string;\n connectionStatus: string;\n toolStatus: string;\n logStatus: string;\n filterPanelVisible: boolean;\n}\n\n/**\n * Interface for MCP Server data\n */\nexport interface MCPServerData {\n ID: string;\n Name: string;\n Description: string | null;\n TransportType: string;\n ServerURL: string | null;\n Command: string | null;\n DefaultAuthType: string;\n Status: string;\n RateLimitPerMinute: number | null;\n RateLimitPerHour: number | null;\n LastSyncAt: Date | null;\n ConnectionCount?: number;\n ToolCount?: number;\n // OAuth configuration fields\n OAuthIssuerURL?: string | null;\n OAuthScopes?: string | null;\n OAuthMetadataCacheTTLMinutes?: number | null;\n OAuthClientID?: string | null;\n OAuthClientSecretEncrypted?: string | null;\n OAuthRequirePKCE?: boolean;\n}\n\n/**\n * Interface for MCP Connection data\n */\nexport interface MCPConnectionData {\n ID: string;\n MCPServerID: string;\n ServerName?: string;\n Name: string;\n Description: string | null;\n Status: string;\n CompanyID: string | null;\n AutoSyncTools: boolean;\n LogToolCalls: boolean;\n LastConnectedAt: Date | null;\n LastErrorMessage: string | null;\n}\n\n/**\n * Interface for MCP Tool data\n */\nexport interface MCPToolData {\n ID: string;\n MCPServerID: string;\n ServerName?: string;\n ToolName: string;\n ToolTitle: string | null;\n ToolDescription: string | null;\n InputSchema: string;\n Status: string;\n DiscoveredAt: Date;\n LastSeenAt: Date;\n}\n\n/**\n * Interface for server group (tools grouped by server)\n */\nexport interface MCPServerGroup {\n server: MCPServerData;\n tools: MCPToolData[];\n expanded: boolean;\n}\n\n/**\n * Tools view mode\n */\nexport type ToolsViewMode = 'card' | 'list';\n\n/**\n * Tools sort options\n */\nexport type ToolsSortBy = 'name' | 'server' | 'discovered' | 'lastSeen';\n\n/**\n * Interface for MCP Execution Log data\n */\nexport interface MCPExecutionLogData {\n ID: string;\n ConnectionID: string;\n ConnectionName?: string;\n ToolID: string | null;\n ToolName: string;\n Status: string;\n StartedAt: Date;\n CompletedAt: Date | null;\n DurationMs: number | null;\n UserID: string;\n UserName?: string;\n ErrorMessage: string | null;\n InputArgs?: string | null;\n Result?: string | null;\n ServerName?: string;\n}\n\n/**\n * Dashboard filter options\n */\nexport interface MCPDashboardFilters {\n searchTerm: string;\n serverStatus: string;\n connectionStatus: string;\n toolStatus: string;\n logStatus: string;\n}\n\n/**\n * Dashboard statistics\n */\nexport interface MCPDashboardStats {\n totalServers: number;\n activeServers: number;\n totalConnections: number;\n activeConnections: number;\n totalTools: number;\n activeTools: number;\n recentExecutions: number;\n failedExecutions: number;\n}\n\n/**\n * Active tab type\n */\nexport type MCPDashboardTab = 'servers' | 'connections' | 'tools' | 'logs';\n\n/**\n * MCP Management Dashboard Component\n *\n * Provides a tab-based interface for managing:\n * - MCP Servers\n * - MCP Connections\n * - MCP Tools\n * - Execution Logs\n */\n@RegisterClass(BaseDashboard, 'MCPDashboard')\n@Component({\n standalone: false,\n selector: 'mj-mcp-dashboard',\n templateUrl: './mcp-dashboard.component.html',\n styleUrls: ['./mcp-dashboard.component.css']\n})\nexport class MCPDashboardComponent extends BaseDashboard implements OnInit, AfterViewInit, OnDestroy {\n\n // ========================================\n // State\n // ========================================\n\n // Settings persistence\n private readonly USER_SETTINGS_KEY = 'MCP.Dashboard.UserPreferences';\n private settingsPersistSubject = new Subject<void>();\n private settingsLoaded = false;\n\n private metadata = new Metadata();\n\n public servers: MCPServerData[] = [];\n public connections: MCPConnectionData[] = [];\n public tools: MCPToolData[] = [];\n public executionLogs: MCPExecutionLogData[] = [];\n\n public filteredServers: MCPServerData[] = [];\n public filteredConnections: MCPConnectionData[] = [];\n public filteredTools: MCPToolData[] = [];\n public filteredLogs: MCPExecutionLogData[] = [];\n\n public stats: MCPDashboardStats = {\n totalServers: 0,\n activeServers: 0,\n totalConnections: 0,\n activeConnections: 0,\n totalTools: 0,\n activeTools: 0,\n recentExecutions: 0,\n failedExecutions: 0\n };\n\n public ActiveTab: MCPDashboardTab = 'servers';\n public IsLoading = false;\n public ErrorMessage: string | null = null;\n\n public filters$ = new BehaviorSubject<MCPDashboardFilters>({\n searchTerm: '',\n serverStatus: 'all',\n connectionStatus: 'all',\n toolStatus: 'all',\n logStatus: 'all'\n });\n\n // Dialog state\n public ShowServerDialog = false;\n public ShowConnectionDialog = false;\n public ShowTestToolDialog = false;\n public EditingServer: MCPServerData | null = null;\n public EditingConnection: MCPConnectionData | null = null;\n\n // Test tool dialog pre-selection\n public TestToolServerID: string | null = null;\n public TestToolConnectionID: string | null = null;\n public TestToolID: string | null = null;\n\n // Log detail panel state\n public ShowLogDetailPanel = false;\n public SelectedLog: MCPExecutionLogData | null = null;\n\n // Expandable server/connection cards\n public ExpandedServerID: string | null = null;\n public ExpandedConnectionID: string | null = null;\n\n // Logs sorting state\n public LogsSortColumn: 'status' | 'server' | 'tool' | 'connection' | 'started' | 'duration' | 'error' = 'started';\n public LogsSortAscending = false; // Default to descending (most recent first)\n\n // Tools tab state\n public ToolsViewMode: ToolsViewMode = 'card';\n public ToolsSortBy: ToolsSortBy = 'server';\n public ToolsSortAscending = true;\n public ServerGroups: MCPServerGroup[] = [];\n public ExpandedToolId: string | null = null;\n\n // Sync state\n public SyncStates = new Map<string, MCPSyncState>();\n private syncSubscriptions = new Map<string, Subscription>();\n\n // Filter panel state\n public FilterPanelVisible = true;\n\n // ========================================\n // Lifecycle\n // ========================================\n\n protected override destroy$ = new Subject<void>();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private mcpToolsService: MCPToolsService\n ) {\n super();\n\n // Set up debounced settings persistence\n this.settingsPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.persistUserPreferences();\n });\n }\n\n override async ngOnInit(): Promise<void> {\n await super.ngOnInit();\n\n // Check for OAuth completion redirect\n this.checkOAuthCompletion();\n\n // Load saved user preferences first\n this.loadUserPreferences();\n\n // Read initial tab from query params (deep link / direct URL)\n const initialParams = this.GetQueryParams();\n if (initialParams['tab'] && this.isValidTab(initialParams['tab'])) {\n this.ActiveTab = initialParams['tab'] as MCPDashboardTab;\n }\n\n // Apply configuration params if passed via NavigationService\n this.applyConfigurationParams();\n }\n\n /**\n * Called by the framework when the URL query params change due to\n * browser back/forward navigation or a deep link.\n */\n protected override OnQueryParamsChanged(params: Record<string, string>, source: 'popstate' | 'deeplink'): void {\n const tab = params['tab'] as MCPDashboardTab | undefined;\n if (tab && this.isValidTab(tab) && tab !== this.ActiveTab) {\n this.ActiveTab = tab;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Validates that a tab value is a valid MCPDashboardTab\n */\n private isValidTab(tab: string): tab is MCPDashboardTab {\n return ['servers', 'connections', 'tools', 'logs'].includes(tab);\n }\n\n /**\n * Applies configuration params passed via NavigationService\n */\n private applyConfigurationParams(): void {\n const config = this.Data?.Configuration;\n if (config?.tab && this.isValidTab(config.tab as string)) {\n this.ActiveTab = config.tab as MCPDashboardTab;\n }\n }\n\n // ========================================\n // User Settings Persistence\n // ========================================\n\n /**\n * Load saved user preferences from the UserInfoEngine\n */\n private loadUserPreferences(): void {\n try {\n const savedPrefs = UserInfoEngine.Instance.GetSetting(this.USER_SETTINGS_KEY);\n if (savedPrefs) {\n const prefs = JSON.parse(savedPrefs) as MCPDashboardUserPreferences;\n this.applyUserPreferencesFromStorage(prefs);\n }\n } catch (error) {\n console.warn('[MCPDashboard] Failed to load user preferences:', error);\n } finally {\n this.settingsLoaded = true;\n }\n }\n\n /**\n * Apply loaded preferences to component state\n */\n private applyUserPreferencesFromStorage(prefs: MCPDashboardUserPreferences): void {\n if (prefs.toolsViewMode) {\n this.ToolsViewMode = prefs.toolsViewMode;\n }\n if (prefs.toolsSortBy) {\n this.ToolsSortBy = prefs.toolsSortBy;\n }\n if (prefs.toolsSortAscending !== undefined) {\n this.ToolsSortAscending = prefs.toolsSortAscending;\n }\n if (prefs.logsSortColumn) {\n this.LogsSortColumn = prefs.logsSortColumn;\n }\n if (prefs.logsSortAscending !== undefined) {\n this.LogsSortAscending = prefs.logsSortAscending;\n }\n // Apply filter preferences\n const currentFilters = this.filters$.value;\n this.filters$.next({\n ...currentFilters,\n searchTerm: prefs.searchTerm || '',\n serverStatus: prefs.serverStatus || 'all',\n connectionStatus: prefs.connectionStatus || 'all',\n toolStatus: prefs.toolStatus || 'all',\n logStatus: prefs.logStatus || 'all'\n });\n // Apply filter panel visibility\n if (prefs.filterPanelVisible !== undefined) {\n this.FilterPanelVisible = prefs.filterPanelVisible;\n }\n }\n\n /**\n * Get current preferences as an object for saving\n */\n private getCurrentPreferences(): MCPDashboardUserPreferences {\n const currentFilters = this.filters$.value;\n return {\n toolsViewMode: this.ToolsViewMode,\n toolsSortBy: this.ToolsSortBy,\n toolsSortAscending: this.ToolsSortAscending,\n logsSortColumn: this.LogsSortColumn,\n logsSortAscending: this.LogsSortAscending,\n searchTerm: currentFilters.searchTerm,\n serverStatus: currentFilters.serverStatus,\n connectionStatus: currentFilters.connectionStatus,\n toolStatus: currentFilters.toolStatus,\n logStatus: currentFilters.logStatus,\n filterPanelVisible: this.FilterPanelVisible\n };\n }\n\n /**\n * Persist user preferences to storage (debounced)\n */\n private saveUserPreferencesDebounced(): void {\n if (!this.settingsLoaded) return; // Don't save during initial load\n this.settingsPersistSubject.next();\n }\n\n /**\n * Actually persist user preferences to the UserInfoEngine\n */\n private async persistUserPreferences(): Promise<void> {\n try {\n const prefs = this.getCurrentPreferences();\n await UserInfoEngine.Instance.SetSetting(this.USER_SETTINGS_KEY, JSON.stringify(prefs));\n } catch (error) {\n console.warn('[MCPDashboard] Failed to persist user preferences:', error);\n }\n }\n\n // Required by BaseResourceComponent\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'MCP Management';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-plug-circle-bolt';\n }\n\n protected initDashboard(): void {\n this.setupFilterSubscription();\n }\n\n protected loadData(): void {\n this.loadAllData();\n }\n\n ngAfterViewInit(): void {\n this.cdr.markForCheck();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n // Cleanup sync subscriptions\n this.syncSubscriptions.forEach(sub => sub.unsubscribe());\n this.syncSubscriptions.clear();\n }\n\n // ========================================\n // Data Loading\n // ========================================\n\n /**\n * Loads all dashboard data using MCPEngine for cached entities\n * and RunView for execution logs (historical data loaded on-demand)\n * @param forceRefresh - If true, forces MCPEngine to reload from database (use after sync operations)\n */\n public async loadAllData(forceRefresh: boolean = false): Promise<void> {\n this.IsLoading = true;\n this.ErrorMessage = null;\n this.cdr.markForCheck();\n\n try {\n // Initialize MCPEngine and load execution logs in parallel\n // forceRefresh=true is needed after sync operations since backend changes\n // won't trigger local BaseEntity events\n const rv = new RunView();\n const [, logsResult] = await Promise.all([\n MCPEngine.Instance.Config(forceRefresh),\n rv.RunView<MJMCPToolExecutionLogEntity>({\n EntityName: 'MJ: MCP Tool Execution Logs',\n ExtraFilter: `StartedAt >= DATEADD(day, -7, GETUTCDATE())`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 100,\n ResultType: 'simple'\n })\n ]);\n\n // Get cached data from MCPEngine and convert to interface types\n this.servers = MCPEngine.Instance.Servers.map(s => ({\n ID: s.ID,\n Name: s.Name,\n Description: s.Description,\n TransportType: s.TransportType,\n ServerURL: s.ServerURL,\n Command: s.Command,\n DefaultAuthType: s.DefaultAuthType,\n Status: s.Status,\n RateLimitPerMinute: s.RateLimitPerMinute,\n RateLimitPerHour: s.RateLimitPerHour,\n LastSyncAt: s.LastSyncAt,\n // OAuth configuration fields\n OAuthIssuerURL: s.OAuthIssuerURL,\n OAuthScopes: s.OAuthScopes,\n OAuthMetadataCacheTTLMinutes: s.OAuthMetadataCacheTTLMinutes,\n OAuthClientID: s.OAuthClientID,\n OAuthClientSecretEncrypted: s.OAuthClientSecretEncrypted,\n OAuthRequirePKCE: s.OAuthRequirePKCE\n }));\n\n this.connections = MCPEngine.Instance.Connections.map(c => ({\n ID: c.ID,\n MCPServerID: c.MCPServerID,\n Name: c.Name,\n Description: c.Description,\n Status: c.Status,\n CompanyID: c.CompanyID,\n AutoSyncTools: c.AutoSyncTools,\n LogToolCalls: c.LogToolCalls,\n LastConnectedAt: c.LastConnectedAt,\n LastErrorMessage: c.LastErrorMessage\n }));\n\n this.tools = MCPEngine.Instance.Tools.map(t => ({\n ID: t.ID,\n MCPServerID: t.MCPServerID,\n ToolName: t.ToolName,\n ToolTitle: t.ToolTitle,\n ToolDescription: t.ToolDescription,\n InputSchema: t.InputSchema,\n Status: t.Status,\n DiscoveredAt: t.DiscoveredAt,\n LastSeenAt: t.LastSeenAt\n }));\n\n if (logsResult.Success) {\n // Map database column names to UI interface property names\n this.executionLogs = (logsResult.Results || []).map(log => this.mapLogFromDatabase(log));\n }\n\n // Enrich data with counts and names\n this.enrichServerData();\n this.enrichConnectionData();\n this.enrichToolData();\n this.enrichLogData();\n\n // Calculate stats\n this.calculateStats();\n\n // Apply filters\n this.applyFilters();\n\n } catch (error) {\n this.ErrorMessage = `Failed to load data: ${error instanceof Error ? error.message : String(error)}`;\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private enrichServerData(): void {\n for (const server of this.servers) {\n server.ConnectionCount = this.connections.filter(c => UUIDsEqual(c.MCPServerID, server.ID)).length\n server.ToolCount = this.tools.filter(t => UUIDsEqual(t.MCPServerID, server.ID)).length\n }\n }\n\n private enrichConnectionData(): void {\n for (const conn of this.connections) {\n const server = this.servers.find(s => UUIDsEqual(s.ID, conn.MCPServerID));\n conn.ServerName = server?.Name ?? 'Unknown';\n }\n }\n\n private enrichToolData(): void {\n for (const tool of this.tools) {\n const server = this.servers.find(s => UUIDsEqual(s.ID, tool.MCPServerID));\n tool.ServerName = server?.Name ?? 'Unknown';\n }\n }\n\n private enrichLogData(): void {\n for (const log of this.executionLogs) {\n const conn = this.connections.find(c => UUIDsEqual(c.ID, log.ConnectionID));\n log.ConnectionName = conn?.Name ?? log.ConnectionName ?? 'Unknown';\n // Add server name via connection\n if (conn) {\n const server = this.servers.find(s => UUIDsEqual(s.ID, conn.MCPServerID));\n log.ServerName = server?.Name ?? 'Unknown';\n } else {\n log.ServerName = log.ServerName ?? 'Unknown';\n }\n }\n // Sort logs by StartedAt descending (most recent first)\n this.executionLogs.sort((a, b) => {\n const dateA = new Date(a.StartedAt).getTime();\n const dateB = new Date(b.StartedAt).getTime();\n return dateB - dateA;\n });\n }\n\n /**\n * Maps database log entity to UI interface format\n * Handles column name differences between DB schema and UI interface\n */\n private mapLogFromDatabase(dbLog: MJMCPToolExecutionLogEntity): MCPExecutionLogData {\n // Determine status from Success boolean\n let status: string;\n if (dbLog.Success === true) {\n status = 'Success';\n } else if (dbLog.Success === false) {\n status = 'Error';\n } else {\n // null means still running\n status = 'Running';\n }\n\n return {\n ID: dbLog.ID,\n ConnectionID: dbLog.MCPServerConnectionID,\n ToolID: dbLog.MCPServerToolID,\n ToolName: dbLog.ToolName || 'Unknown',\n Status: status,\n StartedAt: dbLog.StartedAt,\n CompletedAt: dbLog.EndedAt,\n DurationMs: dbLog.DurationMs,\n UserID: dbLog.UserID,\n UserName: dbLog.User,\n ErrorMessage: dbLog.ErrorMessage,\n InputArgs: dbLog.InputParameters,\n Result: dbLog.OutputContent,\n ConnectionName: dbLog.MCPServerConnection,\n ServerName: undefined // Will be enriched later\n };\n }\n\n private calculateStats(): void {\n this.stats = {\n totalServers: this.servers.length,\n activeServers: this.servers.filter(s => s.Status === 'Active').length,\n totalConnections: this.connections.length,\n activeConnections: this.connections.filter(c => c.Status === 'Active').length,\n totalTools: this.tools.length,\n activeTools: this.tools.filter(t => t.Status === 'Active').length,\n recentExecutions: this.executionLogs.length,\n failedExecutions: this.executionLogs.filter(l => l.Status === 'Error').length\n };\n }\n\n // ========================================\n // Filtering\n // ========================================\n\n private setupFilterSubscription(): void {\n this.filters$\n .pipe(\n debounceTime(300),\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n takeUntil(this.destroy$)\n )\n .subscribe(() => {\n this.applyFilters();\n this.cdr.detectChanges();\n });\n }\n\n public applyFilters(): void {\n const filters = this.filters$.value;\n const search = filters.searchTerm.toLowerCase();\n\n // Filter servers\n this.filteredServers = this.servers.filter(s => {\n const matchesSearch = !search ||\n s.Name.toLowerCase().includes(search) ||\n (s.Description?.toLowerCase().includes(search) ?? false);\n const matchesStatus = filters.serverStatus === 'all' || s.Status === filters.serverStatus;\n return matchesSearch && matchesStatus;\n });\n\n // Filter connections\n this.filteredConnections = this.connections.filter(c => {\n const matchesSearch = !search ||\n c.Name.toLowerCase().includes(search) ||\n (c.ServerName?.toLowerCase().includes(search) ?? false);\n const matchesStatus = filters.connectionStatus === 'all' || c.Status === filters.connectionStatus;\n return matchesSearch && matchesStatus;\n });\n\n // Filter tools\n this.filteredTools = this.tools.filter(t => {\n const matchesSearch = !search ||\n t.ToolName.toLowerCase().includes(search) ||\n (t.ToolTitle?.toLowerCase().includes(search) ?? false) ||\n (t.ToolDescription?.toLowerCase().includes(search) ?? false);\n const matchesStatus = filters.toolStatus === 'all' || t.Status === filters.toolStatus;\n return matchesSearch && matchesStatus;\n });\n\n // Build server groups for the tools tab\n this.buildServerGroups();\n\n // Filter logs\n this.filteredLogs = this.executionLogs.filter(l => {\n const matchesSearch = !search ||\n l.ToolName.toLowerCase().includes(search) ||\n (l.ConnectionName?.toLowerCase().includes(search) ?? false) ||\n (l.ServerName?.toLowerCase().includes(search) ?? false);\n const matchesStatus = filters.logStatus === 'all' || l.Status === filters.logStatus;\n return matchesSearch && matchesStatus;\n });\n\n // Apply current sort\n this.sortFilteredLogs();\n }\n\n public onSearchChange(term: string): void {\n const current = this.filters$.value;\n this.filters$.next({ ...current, searchTerm: term });\n this.saveUserPreferencesDebounced();\n }\n\n public onStatusFilterChange(filterType: string, value: string): void {\n const current = this.filters$.value;\n switch (filterType) {\n case 'server':\n this.filters$.next({ ...current, serverStatus: value });\n break;\n case 'connection':\n this.filters$.next({ ...current, connectionStatus: value });\n break;\n case 'tool':\n this.filters$.next({ ...current, toolStatus: value });\n break;\n case 'log':\n this.filters$.next({ ...current, logStatus: value });\n break;\n }\n this.saveUserPreferencesDebounced();\n }\n\n // ========================================\n // Filter Panel\n // ========================================\n\n /**\n * Toggle filter panel visibility\n */\n public toggleFilterPanel(): void {\n this.FilterPanelVisible = !this.FilterPanelVisible;\n this.saveUserPreferencesDebounced();\n this.cdr.detectChanges();\n }\n\n /**\n * Handle filter changes from the filter panel component\n */\n public onFiltersChange(filters: MCPDashboardFilters): void {\n this.filters$.next(filters);\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Get the current filtered count based on active tab\n */\n public get CurrentFilteredCount(): number {\n switch (this.ActiveTab) {\n case 'servers':\n return this.filteredServers.length;\n case 'connections':\n return this.filteredConnections.length;\n case 'tools':\n return this.filteredTools.length;\n case 'logs':\n return this.filteredLogs.length;\n default:\n return 0;\n }\n }\n\n /**\n * Get the total count based on active tab\n */\n public get CurrentTotalCount(): number {\n switch (this.ActiveTab) {\n case 'servers':\n return this.servers.length;\n case 'connections':\n return this.connections.length;\n case 'tools':\n return this.tools.length;\n case 'logs':\n return this.executionLogs.length;\n default:\n return 0;\n }\n }\n\n /**\n * Get current filters value (non-observable)\n */\n public get CurrentFilters(): MCPDashboardFilters {\n return this.filters$.value;\n }\n\n // ========================================\n // Tab Navigation\n // ========================================\n\n /**\n * Sets the active tab and updates URL for deep linking\n */\n public setActiveTab(tab: MCPDashboardTab): void {\n if (this.ActiveTab === tab) return;\n\n this.ActiveTab = tab;\n this.UpdateQueryParams({ tab: this.ActiveTab });\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Server Operations\n // ========================================\n\n public createServer(): void {\n this.EditingServer = null;\n this.ShowServerDialog = true;\n this.cdr.detectChanges();\n }\n\n public editServer(server: MCPServerData): void {\n this.EditingServer = server;\n this.ShowServerDialog = true;\n this.cdr.detectChanges();\n }\n\n public async deleteServer(server: MCPServerData): Promise<void> {\n // Check for related connections first\n const relatedConnections = this.connections.filter((c: MCPConnectionData) => UUIDsEqual(c.MCPServerID, server.ID));\n const relatedTools = this.tools.filter((t: MCPToolData) => UUIDsEqual(t.MCPServerID, server.ID));\n\n if (relatedConnections.length > 0 || relatedTools.length > 0) {\n const parts: string[] = [];\n if (relatedConnections.length > 0) {\n parts.push(`${relatedConnections.length} connection(s)`);\n }\n if (relatedTools.length > 0) {\n parts.push(`${relatedTools.length} tool(s)`);\n }\n\n if (!confirm(\n `Server \"${server.Name}\" has ${parts.join(' and ')}.\\n\\n` +\n `All related records will be deleted. Are you sure you want to proceed?`\n )) {\n return;\n }\n\n // Delete related connections first (which will cascade to connection tools/permissions)\n for (const conn of relatedConnections) {\n try {\n await this.deleteConnectionInternal(conn.ID);\n } catch (error) {\n this.ErrorMessage = `Failed to delete related connection \"${conn.Name}\": ${error instanceof Error ? error.message : String(error)}`;\n this.cdr.detectChanges();\n return;\n }\n }\n\n // Delete related tools\n for (const tool of relatedTools) {\n try {\n await this.deleteToolInternal(tool.ID);\n } catch (error) {\n this.ErrorMessage = `Failed to delete related tool \"${tool.ToolName}\": ${error instanceof Error ? error.message : String(error)}`;\n this.cdr.detectChanges();\n return;\n }\n }\n } else {\n if (!confirm(`Are you sure you want to delete server \"${server.Name}\"?`)) {\n return;\n }\n }\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJMCPServerEntity>('MJ: MCP Servers');\n const loaded = await entity.Load(server.ID);\n if (!loaded) {\n this.ErrorMessage = `Server not found: ${server.Name}`;\n this.cdr.detectChanges();\n return;\n }\n\n const deleted = await entity.Delete();\n if (!deleted) {\n const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Unknown error';\n this.ErrorMessage = `Failed to delete server: ${errorMsg}`;\n this.cdr.detectChanges();\n return;\n }\n\n await this.loadAllData();\n } catch (error) {\n this.ErrorMessage = `Failed to delete server: ${error instanceof Error ? error.message : String(error)}`;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Internal helper to delete a tool by ID without confirmation\n */\n private async deleteToolInternal(toolId: string): Promise<void> {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJMCPServerToolEntity>('MJ: MCP Server Tools');\n const loaded = await entity.Load(toolId);\n if (!loaded) {\n throw new Error(`Tool not found`);\n }\n const deleted = await entity.Delete();\n if (!deleted) {\n const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Delete failed';\n throw new Error(errorMsg);\n }\n }\n\n /**\n * Internal helper to delete a connection by ID without confirmation.\n * Handles deletion of all related records that don't have ON DELETE CASCADE:\n * - MCP Tool Execution Logs\n * - OAuth Authorization States\n * - OAuth Client Registrations\n * - OAuth Tokens\n */\n private async deleteConnectionInternal(connectionId: string): Promise<void> {\n console.log(`[MCPDashboard] deleteConnectionInternal called for connectionId: ${connectionId}`);\n const rv = new RunView();\n const md = new Metadata();\n\n // Delete execution logs for this connection\n console.log('[MCPDashboard] Deleting execution logs...');\n const logsResult = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: MCP Tool Execution Logs',\n ExtraFilter: `MCPServerConnectionID='${connectionId}'`,\n Fields: ['ID'],\n ResultType: 'simple'\n });\n if (logsResult.Success && logsResult.Results) {\n console.log(`[MCPDashboard] Found ${logsResult.Results.length} execution logs to delete`);\n for (const log of logsResult.Results) {\n console.log(`[MCPDashboard] Loading execution log ${log.ID}...`);\n const logEntity = await md.GetEntityObject<MJMCPToolExecutionLogEntity>('MJ: MCP Tool Execution Logs');\n const loaded = await logEntity.Load(log.ID);\n console.log(`[MCPDashboard] Load result for execution log ${log.ID}: ${loaded}`);\n if (loaded) {\n const deleted = await logEntity.Delete();\n if (!deleted) {\n console.error(`[MCPDashboard] Failed to delete execution log ${log.ID}:`, logEntity.LatestResult);\n throw new Error(`Failed to delete execution log: ${logEntity.LatestResult?.Message || 'Unknown error'}`);\n }\n console.log(`[MCPDashboard] Deleted execution log ${log.ID}`);\n } else {\n console.warn(`[MCPDashboard] Could not load execution log ${log.ID} - may have been already deleted`);\n }\n }\n }\n\n // Delete OAuth Authorization States for this connection\n console.log('[MCPDashboard] Deleting OAuth Authorization States...');\n const authStatesResult = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: O Auth Authorization States',\n ExtraFilter: `MCPServerConnectionID='${connectionId}'`,\n Fields: ['ID'],\n ResultType: 'simple'\n });\n if (authStatesResult.Success && authStatesResult.Results) {\n console.log(`[MCPDashboard] Found ${authStatesResult.Results.length} OAuth Authorization States to delete`);\n for (const state of authStatesResult.Results) {\n console.log(`[MCPDashboard] Loading OAuth Authorization State ${state.ID}...`);\n const stateEntity = await md.GetEntityObject<MJOAuthAuthorizationStateEntity>('MJ: O Auth Authorization States');\n const loaded = await stateEntity.Load(state.ID);\n console.log(`[MCPDashboard] Load result for OAuth Authorization State ${state.ID}: ${loaded}`);\n if (loaded) {\n const deleted = await stateEntity.Delete();\n if (!deleted) {\n console.error(`[MCPDashboard] Failed to delete OAuth Authorization State ${state.ID}:`, stateEntity.LatestResult);\n throw new Error(`Failed to delete OAuth Authorization State: ${stateEntity.LatestResult?.Message || 'Unknown error'}`);\n }\n console.log(`[MCPDashboard] Deleted OAuth Authorization State ${state.ID}`);\n } else {\n console.warn(`[MCPDashboard] Could not load OAuth Authorization State ${state.ID} - may have been already deleted`);\n }\n }\n }\n\n // Delete OAuth Client Registrations for this connection\n console.log('[MCPDashboard] Deleting OAuth Client Registrations...');\n const clientRegsResult = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: O Auth Client Registrations',\n ExtraFilter: `MCPServerConnectionID='${connectionId}'`,\n Fields: ['ID'],\n ResultType: 'simple'\n });\n if (clientRegsResult.Success && clientRegsResult.Results) {\n console.log(`[MCPDashboard] Found ${clientRegsResult.Results.length} OAuth Client Registrations to delete`);\n for (const reg of clientRegsResult.Results) {\n console.log(`[MCPDashboard] Loading OAuth Client Registration ${reg.ID}...`);\n const regEntity = await md.GetEntityObject<MJOAuthClientRegistrationEntity>('MJ: O Auth Client Registrations');\n const loaded = await regEntity.Load(reg.ID);\n console.log(`[MCPDashboard] Load result for OAuth Client Registration ${reg.ID}: ${loaded}`);\n if (loaded) {\n const deleted = await regEntity.Delete();\n if (!deleted) {\n console.error(`[MCPDashboard] Failed to delete OAuth Client Registration ${reg.ID}:`, regEntity.LatestResult);\n throw new Error(`Failed to delete OAuth Client Registration: ${regEntity.LatestResult?.Message || 'Unknown error'}`);\n }\n console.log(`[MCPDashboard] Deleted OAuth Client Registration ${reg.ID}`);\n } else {\n console.warn(`[MCPDashboard] Could not load OAuth Client Registration ${reg.ID} - may have been already deleted`);\n }\n }\n }\n\n // Delete OAuth Tokens for this connection\n console.log('[MCPDashboard] Deleting OAuth Tokens...');\n const tokensResult = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: O Auth Tokens',\n ExtraFilter: `MCPServerConnectionID='${connectionId}'`,\n Fields: ['ID'],\n ResultType: 'simple'\n });\n if (tokensResult.Success && tokensResult.Results) {\n console.log(`[MCPDashboard] Found ${tokensResult.Results.length} OAuth Tokens to delete`);\n for (const token of tokensResult.Results) {\n console.log(`[MCPDashboard] Loading OAuth Token ${token.ID}...`);\n const tokenEntity = await md.GetEntityObject<MJOAuthTokenEntity>('MJ: O Auth Tokens');\n const loaded = await tokenEntity.Load(token.ID);\n console.log(`[MCPDashboard] Load result for OAuth Token ${token.ID}: ${loaded}`);\n if (loaded) {\n const deleted = await tokenEntity.Delete();\n if (!deleted) {\n console.error(`[MCPDashboard] Failed to delete OAuth Token ${token.ID}:`, tokenEntity.LatestResult);\n throw new Error(`Failed to delete OAuth Token: ${tokenEntity.LatestResult?.Message || 'Unknown error'}`);\n }\n console.log(`[MCPDashboard] Deleted OAuth Token ${token.ID}`);\n } else {\n console.warn(`[MCPDashboard] Could not load OAuth Token ${token.ID} - may have been already deleted`);\n }\n }\n }\n\n // Now delete the connection itself\n console.log('[MCPDashboard] All related records deleted. Now deleting the connection itself...');\n const entity = await md.GetEntityObject<MJMCPServerConnectionEntity>('MJ: MCP Server Connections');\n const loaded = await entity.Load(connectionId);\n if (!loaded) {\n throw new Error(`Connection not found`);\n }\n const deleted = await entity.Delete();\n if (!deleted) {\n const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Delete failed';\n throw new Error(errorMsg);\n }\n }\n\n public async onServerDialogClose(result: { saved: boolean }): Promise<void> {\n this.ShowServerDialog = false;\n this.EditingServer = null;\n if (result.saved) {\n await this.loadAllData();\n }\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Connection Operations\n // ========================================\n\n public createConnection(): void {\n this.EditingConnection = null;\n this.ShowConnectionDialog = true;\n this.cdr.detectChanges();\n }\n\n public editConnection(connection: MCPConnectionData): void {\n this.EditingConnection = connection;\n this.ShowConnectionDialog = true;\n this.cdr.detectChanges();\n }\n\n public async deleteConnection(connection: MCPConnectionData): Promise<void> {\n // Check for related execution logs\n const relatedLogs = this.executionLogs.filter(l => UUIDsEqual(l.ConnectionID, connection.ID));\n\n if (relatedLogs.length > 0) {\n if (!confirm(\n `Connection \"${connection.Name}\" has ${relatedLogs.length} execution log(s).\\n\\n` +\n `All related logs will be deleted. Are you sure you want to proceed?`\n )) {\n return;\n }\n } else {\n if (!confirm(`Are you sure you want to delete connection \"${connection.Name}\"?`)) {\n return;\n }\n }\n\n try {\n // Use the internal method which handles deleting related records\n await this.deleteConnectionInternal(connection.ID);\n await this.loadAllData();\n } catch (error) {\n this.ErrorMessage = `Failed to delete connection: ${error instanceof Error ? error.message : String(error)}`;\n this.cdr.detectChanges();\n }\n }\n\n public async onConnectionDialogClose(result: { saved: boolean }): Promise<void> {\n this.ShowConnectionDialog = false;\n this.EditingConnection = null;\n if (result.saved) {\n await this.loadAllData();\n }\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Tool Operations\n // ========================================\n\n /**\n * Toggle tool card expansion for details view\n */\n public toggleToolExpand(tool: MCPToolData): void {\n if (UUIDsEqual(this.ExpandedToolId, tool.ID)) {\n this.ExpandedToolId = null;\n } else {\n this.ExpandedToolId = tool.ID;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Check if a tool card is expanded\n */\n public isToolExpanded(tool: MCPToolData): boolean {\n return UUIDsEqual(this.ExpandedToolId, tool.ID);\n }\n\n /**\n * Set tools view mode (card or list)\n */\n public setToolsViewMode(mode: ToolsViewMode): void {\n this.ToolsViewMode = mode;\n this.cdr.detectChanges();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Set tools sort option\n */\n public setToolsSort(sortBy: ToolsSortBy): void {\n if (this.ToolsSortBy === sortBy) {\n // Toggle ascending/descending\n this.ToolsSortAscending = !this.ToolsSortAscending;\n } else {\n this.ToolsSortBy = sortBy;\n this.ToolsSortAscending = true;\n }\n this.buildServerGroups();\n this.cdr.detectChanges();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Toggle server group expansion\n */\n public toggleServerGroup(group: MCPServerGroup): void {\n group.expanded = !group.expanded;\n this.cdr.detectChanges();\n }\n\n /**\n * Build server groups from tools data\n */\n private buildServerGroups(): void {\n // Group tools by server\n const serverMap = new Map<string, MCPToolData[]>();\n\n for (const tool of this.filteredTools) {\n const serverId = tool.MCPServerID;\n if (!serverMap.has(serverId)) {\n serverMap.set(serverId, []);\n }\n serverMap.get(serverId)!.push(tool);\n }\n\n // Build server groups\n this.ServerGroups = [];\n for (const server of this.servers) {\n const tools = serverMap.get(server.ID) || [];\n if (tools.length > 0) {\n // Sort tools within group\n this.sortTools(tools);\n\n this.ServerGroups.push({\n server,\n tools,\n expanded: true // Start expanded\n });\n }\n }\n\n // Sort server groups by tool count or name\n this.ServerGroups.sort((a, b) => {\n if (this.ToolsSortBy === 'server') {\n const nameCompare = a.server.Name.localeCompare(b.server.Name);\n return this.ToolsSortAscending ? nameCompare : -nameCompare;\n }\n // Sort by tool count (descending by default)\n const countCompare = b.tools.length - a.tools.length;\n return this.ToolsSortAscending ? -countCompare : countCompare;\n });\n }\n\n /**\n * Sort tools array in place\n */\n private sortTools(tools: MCPToolData[]): void {\n tools.sort((a, b) => {\n let compare = 0;\n switch (this.ToolsSortBy) {\n case 'name':\n compare = (a.ToolTitle || a.ToolName).localeCompare(b.ToolTitle || b.ToolName);\n break;\n case 'discovered':\n compare = new Date(a.DiscoveredAt).getTime() - new Date(b.DiscoveredAt).getTime();\n break;\n case 'lastSeen':\n compare = new Date(a.LastSeenAt).getTime() - new Date(b.LastSeenAt).getTime();\n break;\n default:\n compare = (a.ToolTitle || a.ToolName).localeCompare(b.ToolTitle || b.ToolName);\n }\n return this.ToolsSortAscending ? compare : -compare;\n });\n }\n\n /**\n * Get total tool count across all groups\n */\n public get TotalToolCount(): number {\n return this.ServerGroups.reduce((sum, group) => sum + group.tools.length, 0);\n }\n\n /**\n * Open Test Tool dialog\n */\n public openTestToolDialog(tool?: MCPToolData, connection?: MCPConnectionData): void {\n if (tool) {\n this.TestToolServerID = tool.MCPServerID;\n this.TestToolID = tool.ID;\n } else {\n this.TestToolServerID = null;\n this.TestToolID = null;\n }\n\n if (connection) {\n this.TestToolConnectionID = connection.ID;\n if (!this.TestToolServerID) {\n this.TestToolServerID = connection.MCPServerID;\n }\n } else {\n this.TestToolConnectionID = null;\n }\n\n this.ShowTestToolDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Close Test Tool dialog\n */\n public onTestToolDialogClose(): void {\n this.ShowTestToolDialog = false;\n this.TestToolServerID = null;\n this.TestToolConnectionID = null;\n this.TestToolID = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Parse and return input schema as formatted JSON\n */\n public getFormattedInputSchema(tool: MCPToolData): string {\n if (!tool.InputSchema) return 'No input schema';\n try {\n const schema = JSON.parse(tool.InputSchema);\n return JSON.stringify(schema, null, 2);\n } catch {\n return tool.InputSchema;\n }\n }\n\n /**\n * Get parameter count from input schema\n */\n public getParamCount(tool: MCPToolData): number {\n if (!tool.InputSchema) return 0;\n try {\n const schema = JSON.parse(tool.InputSchema);\n return Object.keys(schema.properties || {}).length;\n } catch {\n return 0;\n }\n }\n\n /**\n * Get required parameter count from input schema\n */\n public getRequiredParamCount(tool: MCPToolData): number {\n if (!tool.InputSchema) return 0;\n try {\n const schema = JSON.parse(tool.InputSchema);\n return (schema.required || []).length;\n } catch {\n return 0;\n }\n }\n\n // ========================================\n // Sync Operations\n // ========================================\n\n /**\n * Syncs tools for a specific connection\n */\n public async syncConnectionTools(connection: MCPConnectionData): Promise<void> {\n const connectionId = connection.ID;\n\n // Subscribe to sync state updates for this connection\n if (!this.syncSubscriptions.has(connectionId)) {\n const sub = this.mcpToolsService.getSyncState(connectionId)\n .pipe(takeUntil(this.destroy$))\n .subscribe(state => {\n this.SyncStates.set(connectionId, state);\n this.cdr.detectChanges();\n });\n this.syncSubscriptions.set(connectionId, sub);\n }\n\n try {\n const result: MCPSyncResult = await this.mcpToolsService.syncTools(connectionId);\n\n if (result.Success) {\n // Force refresh to show updated tools - backend changes don't trigger local events\n await this.loadAllData(true);\n } else if (result.RequiresOAuth || result.RequiresReauthorization) {\n // OAuth authorization is required - initiate fresh OAuth flow with frontend callback\n // Note: We ignore result.AuthorizationUrl because it was built with the server's callback URL\n // We need to initiate a fresh flow that uses the frontend callback URL\n console.log(`[MCPDashboard] OAuth ${result.RequiresReauthorization ? 're-' : ''}authorization required, initiating frontend OAuth flow...`);\n await this.initiateOAuthFlow(connectionId);\n } else {\n this.ErrorMessage = `Sync failed: ${result.ErrorMessage}`;\n }\n } catch (error) {\n this.ErrorMessage = `Sync error: ${error instanceof Error ? error.message : String(error)}`;\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Gets the sync state for a connection\n */\n public getSyncState(connectionId: string): MCPSyncState | undefined {\n return this.SyncStates.get(connectionId);\n }\n\n /**\n * Checks if a connection is currently syncing\n */\n public isSyncing(connectionId: string): boolean {\n return this.mcpToolsService.isSyncing(connectionId);\n }\n\n /**\n * Gets sync progress message for a connection\n */\n public getSyncProgressMessage(connectionId: string): string {\n const state = this.SyncStates.get(connectionId);\n if (!state?.progress) return '';\n return state.progress.message;\n }\n\n // ========================================\n // OAuth Operations\n // ========================================\n\n /**\n * Checks for OAuth completion by looking for query params set by the OAuth callback\n */\n private checkOAuthCompletion(): void {\n const params = this.GetQueryParams();\n\n if (params['oauth'] === 'success') {\n // OAuth completed successfully\n const connectionId = params['connectionId'];\n console.log(`[MCPDashboard] OAuth authorization completed for connection: ${connectionId}`);\n\n // Show success notification\n this.showSuccessNotification('OAuth authorization completed successfully');\n\n // Clear the OAuth query params, preserving the tab param\n this.UpdateQueryParams({ oauth: null, connectionId: null, error: null, error_description: null });\n\n // Refresh data to pick up new OAuth state\n this.loadAllData(true);\n } else if (params['oauth'] === 'error') {\n // OAuth failed\n const errorMessage = params['error_description'] || 'Authorization failed';\n console.error(`[MCPDashboard] OAuth authorization failed: ${params['error'] ?? 'unknown_error'} - ${errorMessage}`);\n\n // Show error message\n this.ErrorMessage = `OAuth authorization failed: ${errorMessage}`;\n\n // Clear the OAuth query params\n this.UpdateQueryParams({ oauth: null, connectionId: null, error: null, error_description: null });\n }\n }\n\n /**\n * Shows a success notification (temporary)\n */\n private showSuccessNotification(message: string): void {\n // For now, use a simple console log and clear any error message\n console.log(`[MCPDashboard] Success: ${message}`);\n this.ErrorMessage = null;\n // TODO: Implement proper toast/notification system\n }\n\n /**\n * Initiates OAuth authorization flow for a connection.\n * Stores the current URL and redirects directly to the OAuth provider.\n * Always uses the frontend callback URL so the OAuth redirect comes back to MJExplorer.\n *\n * @param connectionId - The MCP connection ID requiring OAuth\n */\n public async initiateOAuthFlow(connectionId: string): Promise<void> {\n // Store current URL for return after OAuth completion\n // Store both full URL and path-only version for cross-origin scenarios\n const currentUrl = window.location.href;\n const currentPath = window.location.pathname + window.location.search;\n\n // Store in both localStorage and sessionStorage for redundancy\n localStorage.setItem('oauth_return_url', currentUrl);\n localStorage.setItem('oauth_return_path', currentPath);\n sessionStorage.setItem('oauth_return_url', currentUrl);\n sessionStorage.setItem('oauth_return_path', currentPath);\n\n console.log('[MCPDashboard] Stored OAuth return URL:', currentUrl);\n console.log('[MCPDashboard] Stored OAuth return path:', currentPath);\n\n // Initiate OAuth via GraphQL to get the URL with frontend callback\n const result = await this.initiateMCPOAuth(connectionId);\n if (result.Success && result.AuthorizationUrl) {\n console.log('[MCPDashboard] Redirecting to OAuth provider:', result.AuthorizationUrl);\n window.location.href = result.AuthorizationUrl;\n } else {\n this.ErrorMessage = result.ErrorMessage || 'Failed to initiate OAuth authorization';\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Calls the InitiateMCPOAuth mutation with frontend callback URL\n */\n private async initiateMCPOAuth(connectionId: string): Promise<{\n Success: boolean;\n AuthorizationUrl?: string;\n ErrorMessage?: string;\n }> {\n try {\n const { GraphQLDataProvider, gql } = await import('@memberjunction/graphql-dataprovider');\n\n const mutation = gql`\n mutation InitiateMCPOAuth($input: InitiateMCPOAuthInput!) {\n InitiateMCPOAuth(input: $input) {\n Success\n ErrorMessage\n AuthorizationUrl\n StateParameter\n }\n }\n `;\n\n // Use the frontend callback URL so we handle the OAuth redirect\n const frontendCallbackUrl = `${window.location.origin}/oauth/callback`;\n\n const result = await GraphQLDataProvider.Instance.ExecuteGQL(mutation, {\n input: {\n ConnectionID: connectionId,\n FrontendCallbackUrl: frontendCallbackUrl\n }\n });\n\n return result?.InitiateMCPOAuth || { Success: false, ErrorMessage: 'No result returned' };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { Success: false, ErrorMessage: message };\n }\n }\n\n // ========================================\n // Utility Methods\n // ========================================\n\n public getStatusClass(status: string): string {\n switch (status) {\n case 'Active':\n return 'status-active';\n case 'Inactive':\n return 'status-inactive';\n case 'Error':\n return 'status-error';\n case 'Deprecated':\n return 'status-deprecated';\n default:\n return 'status-unknown';\n }\n }\n\n public getTransportIcon(transportType: string): string {\n switch (transportType) {\n case 'StreamableHTTP':\n case 'SSE':\n return 'fa-solid fa-globe';\n case 'Stdio':\n return 'fa-solid fa-terminal';\n case 'WebSocket':\n return 'fa-solid fa-plug';\n default:\n return 'fa-solid fa-question';\n }\n }\n\n public formatDate(date: Date | string | null): string {\n if (!date) return 'Never';\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toLocaleString();\n }\n\n public formatDuration(ms: number | null): string {\n if (ms === null) return '-';\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n }\n\n // ========================================\n // Logs Sorting\n // ========================================\n\n /**\n * Handles click on a sortable column header\n */\n public onLogSortColumn(column: typeof this.LogsSortColumn): void {\n if (this.LogsSortColumn === column) {\n // Toggle sort direction\n this.LogsSortAscending = !this.LogsSortAscending;\n } else {\n // New column, default to descending for dates/duration, ascending for text\n this.LogsSortColumn = column;\n this.LogsSortAscending = column !== 'started' && column !== 'duration';\n }\n this.sortFilteredLogs();\n this.cdr.detectChanges();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Sorts the filtered logs based on current sort settings\n */\n private sortFilteredLogs(): void {\n const direction = this.LogsSortAscending ? 1 : -1;\n\n this.filteredLogs.sort((a, b) => {\n let valA: string | number | Date | null;\n let valB: string | number | Date | null;\n\n switch (this.LogsSortColumn) {\n case 'status':\n valA = a.Status || '';\n valB = b.Status || '';\n break;\n case 'server':\n valA = a.ServerName || '';\n valB = b.ServerName || '';\n break;\n case 'tool':\n valA = a.ToolName || '';\n valB = b.ToolName || '';\n break;\n case 'connection':\n valA = a.ConnectionName || '';\n valB = b.ConnectionName || '';\n break;\n case 'started':\n valA = a.StartedAt ? new Date(a.StartedAt).getTime() : 0;\n valB = b.StartedAt ? new Date(b.StartedAt).getTime() : 0;\n break;\n case 'duration':\n valA = a.DurationMs ?? -1;\n valB = b.DurationMs ?? -1;\n break;\n case 'error':\n valA = a.ErrorMessage || '';\n valB = b.ErrorMessage || '';\n break;\n default:\n return 0;\n }\n\n if (typeof valA === 'string' && typeof valB === 'string') {\n return valA.localeCompare(valB) * direction;\n }\n if (valA < valB) return -1 * direction;\n if (valA > valB) return 1 * direction;\n return 0;\n });\n }\n\n /**\n * Gets the sort indicator class for a column header\n */\n public getLogSortClass(column: typeof this.LogsSortColumn): string {\n if (this.LogsSortColumn !== column) return '';\n return this.LogsSortAscending ? 'sorted-asc' : 'sorted-desc';\n }\n\n // ========================================\n // Log Detail Panel\n // ========================================\n\n /**\n * Handles click on a log row to show detail panel\n */\n public async onLogClick(log: MCPExecutionLogData): Promise<void> {\n // Load full log details if needed (InputArgs, Result)\n if (!log.InputArgs && !log.Result) {\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJMCPToolExecutionLogEntity>({\n EntityName: 'MJ: MCP Tool Execution Logs',\n ExtraFilter: `ID='${log.ID}'`,\n ResultType: 'simple'\n });\n if (result.Success && result.Results.length > 0) {\n const fullLog = this.mapLogFromDatabase(result.Results[0]);\n // Merge full log data (preserving already enriched fields)\n log.InputArgs = fullLog.InputArgs;\n log.Result = fullLog.Result;\n log.ErrorMessage = fullLog.ErrorMessage || log.ErrorMessage;\n }\n } catch (error) {\n console.warn('[MCPDashboard] Failed to load full log details:', error);\n }\n }\n\n // Enrich with server name\n const connection = this.connections.find(c => UUIDsEqual(c.ID, log.ConnectionID));\n if (connection) {\n log.ServerName = connection.ServerName;\n }\n\n this.SelectedLog = log;\n this.ShowLogDetailPanel = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Closes the log detail panel\n */\n public onLogDetailClose(): void {\n this.ShowLogDetailPanel = false;\n this.SelectedLog = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Handles run again from log detail panel\n */\n public onRunAgainFromLog(event: { toolId: string; connectionId: string }): void {\n this.ShowLogDetailPanel = false;\n this.SelectedLog = null;\n\n // Open test tool dialog with pre-selected tool and connection\n const tool = this.tools.find(t => UUIDsEqual(t.ID, event.toolId));\n const connection = this.connections.find(c => UUIDsEqual(c.ID, event.connectionId));\n\n if (tool) {\n this.TestToolServerID = tool.MCPServerID;\n this.TestToolID = tool.ID;\n }\n if (connection) {\n this.TestToolConnectionID = connection.ID;\n }\n\n this.ShowTestToolDialog = true;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Expandable Server/Connection Cards\n // ========================================\n\n /**\n * Toggles server card expansion\n */\n public toggleServerExpand(server: MCPServerData): void {\n if (UUIDsEqual(this.ExpandedServerID, server.ID)) {\n this.ExpandedServerID = null;\n } else {\n this.ExpandedServerID = server.ID;\n // Collapse any expanded connection\n this.ExpandedConnectionID = null;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Toggles connection card expansion\n */\n public toggleConnectionExpand(conn: MCPConnectionData): void {\n if (UUIDsEqual(this.ExpandedConnectionID, conn.ID)) {\n this.ExpandedConnectionID = null;\n } else {\n this.ExpandedConnectionID = conn.ID;\n // Collapse any expanded server\n this.ExpandedServerID = null;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Checks if a server card is expanded\n */\n public isServerExpanded(server: MCPServerData): boolean {\n return UUIDsEqual(this.ExpandedServerID, server.ID);\n }\n\n /**\n * Checks if a connection card is expanded\n */\n public isConnectionExpanded(conn: MCPConnectionData): boolean {\n return UUIDsEqual(this.ExpandedConnectionID, conn.ID);\n }\n\n /**\n * Gets tools for a specific server\n */\n public getToolsForServer(serverId: string): MCPToolData[] {\n return this.tools.filter(t => UUIDsEqual(t.MCPServerID, serverId));\n }\n\n /**\n * Gets tools for a specific connection (via its server)\n */\n public getToolsForConnection(connectionId: string): MCPToolData[] {\n const connection = this.connections.find(c => UUIDsEqual(c.ID, connectionId));\n if (!connection) return [];\n return this.tools.filter(t => UUIDsEqual(t.MCPServerID, connection.MCPServerID));\n }\n\n /**\n * Opens test tool dialog with a specific tool from expanded card\n */\n public runToolFromCard(tool: MCPToolData, connection?: MCPConnectionData): void {\n this.TestToolServerID = tool.MCPServerID;\n this.TestToolID = tool.ID;\n this.TestToolConnectionID = connection?.ID ?? null;\n this.ShowTestToolDialog = true;\n this.cdr.detectChanges();\n }\n}\n","<div class=\"mcp-dashboard\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <h2 class=\"dashboard-title\">\n <i class=\"fa-solid fa-plug-circle-bolt\"></i>\n MCP Dashboard\n </h2>\n <button\n type=\"button\"\n class=\"filter-toggle-btn\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (FilterPanelVisible) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ CurrentFilteredCount }} of {{ CurrentTotalCount }} items</span>\n </div>\n\n <div class=\"header-controls\">\n <!-- Tab Navigation -->\n <div class=\"tab-nav\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'servers'\"\n (click)=\"setActiveTab('servers')\">\n <i class=\"fa-solid fa-server\"></i>\n <span class=\"tab-label\">Servers</span>\n <span class=\"tab-badge\">{{ servers.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'connections'\"\n (click)=\"setActiveTab('connections')\">\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"tab-label\">Connections</span>\n <span class=\"tab-badge\">{{ connections.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'tools'\"\n (click)=\"setActiveTab('tools')\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"tab-label\">Tools</span>\n <span class=\"tab-badge\">{{ tools.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'logs'\"\n (click)=\"setActiveTab('logs')\">\n <i class=\"fa-solid fa-list-check\"></i>\n <span class=\"tab-label\">Logs</span>\n <span class=\"tab-badge\" [class.has-errors]=\"stats.failedExecutions > 0\">{{ executionLogs.length }}</span>\n </button>\n </div>\n\n <!-- Action Buttons based on tab -->\n @switch (ActiveTab) {\n @case ('servers') {\n <button mjButton variant=\"primary\" (click)=\"createServer()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Server\n </button>\n }\n @case ('connections') {\n <button mjButton variant=\"primary\" (click)=\"createConnection()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Connection\n </button>\n }\n @case ('tools') {\n <!-- View Mode Toggle -->\n <div class=\"view-toggle\">\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"ToolsViewMode === 'card'\"\n (click)=\"setToolsViewMode('card')\"\n title=\"Card View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"ToolsViewMode === 'list'\"\n (click)=\"setToolsViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n <button mjButton variant=\"primary\" (click)=\"openTestToolDialog()\">\n <i class=\"fa-solid fa-play\"></i>\n Test Tool\n </button>\n }\n @case ('logs') {\n <button mjButton variant=\"flat\" (click)=\"loadAllData()\" [disabled]=\"IsLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-sync\" [class.fa-spin]=\"IsLoading\"></i>\n Refresh\n </button>\n }\n }\n </div>\n </div>\n\n <!-- Main Content with Filter Panel -->\n <div class=\"main-content\">\n <!-- Filter Panel (Left) -->\n <div class=\"filter-panel-container\" [class.hidden]=\"!FilterPanelVisible\">\n <mj-mcp-filter-panel\n [filters]=\"CurrentFilters\"\n [activeTab]=\"ActiveTab\"\n [totalCount]=\"CurrentTotalCount\"\n [filteredCount]=\"CurrentFilteredCount\"\n (filtersChange)=\"onFiltersChange($event)\"\n (closePanel)=\"toggleFilterPanel()\">\n </mj-mcp-filter-panel>\n <!-- Resize Handle -->\n <div class=\"resize-handle\"></div>\n </div>\n\n <!-- Content Area -->\n <div class=\"content-area\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ ErrorMessage }}\n <button class=\"close-btn\" (click)=\"ErrorMessage = null\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n\n <!-- Content Body -->\n <div class=\"content-body\">\n @if (IsLoading) {\n <mj-loading text=\"Loading MCP data...\"></mj-loading>\n } @else {\n @switch (ActiveTab) {\n <!-- Servers Tab -->\n @case ('servers') {\n <div class=\"data-grid servers-grid\">\n @if (filteredServers.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-server\"></i>\n <p>No MCP servers configured</p>\n <button mjButton variant=\"primary\" (click)=\"createServer()\">\n Add Your First Server\n </button>\n </div>\n } @else {\n @for (server of filteredServers; track server.ID) {\n <div class=\"data-card\" [class.expanded]=\"isServerExpanded(server)\">\n <div class=\"card-header clickable\" (click)=\"toggleServerExpand(server)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isServerExpanded(server)\"></i>\n <i [class]=\"getTransportIcon(server.TransportType)\"></i>\n <span class=\"name\" [innerHTML]=\"server.Name | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(server.Status)\">\n {{ server.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton variant=\"flat\" (click)=\"editServer(server)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button mjButton variant=\"flat\" (click)=\"deleteServer(server)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n @if (server.Description) {\n <p class=\"description\" [innerHTML]=\"server.Description | highlightSearch:(filters$ | async)?.searchTerm\"></p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Transport</span>\n <span class=\"value\">{{ server.TransportType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auth</span>\n <span class=\"value\">{{ server.DefaultAuthType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Connections</span>\n <span class=\"value\">{{ server.ConnectionCount }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Tools</span>\n <span class=\"value\">{{ server.ToolCount }}</span>\n </div>\n @if (server.ServerURL) {\n <div class=\"detail full-width\">\n <span class=\"label\">URL</span>\n <span class=\"value url\">{{ server.ServerURL }}</span>\n </div>\n }\n @if (server.Command) {\n <div class=\"detail full-width\">\n <span class=\"label\">Command</span>\n <span class=\"value command\">{{ server.Command }}</span>\n </div>\n }\n <div class=\"detail\">\n <span class=\"label\">Last Sync</span>\n <span class=\"value\">{{ formatDate(server.LastSyncAt) }}</span>\n </div>\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isServerExpanded(server)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForServer(server.ID).length }})</span>\n </div>\n @if (getToolsForServer(server.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Sync a connection to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForServer(server.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"runToolFromCard(tool); $event.stopPropagation()\"\n title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Connections Tab -->\n @case ('connections') {\n <div class=\"data-grid connections-grid\">\n @if (filteredConnections.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-link\"></i>\n <p>No connections configured</p>\n <button mjButton variant=\"primary\" (click)=\"createConnection()\">\n Add Your First Connection\n </button>\n </div>\n } @else {\n @for (conn of filteredConnections; track conn.ID) {\n <div class=\"data-card\" [class.expanded]=\"isConnectionExpanded(conn)\">\n <div class=\"card-header clickable\" (click)=\"toggleConnectionExpand(conn)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isConnectionExpanded(conn)\"></i>\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"name\" [innerHTML]=\"conn.Name | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(conn.Status)\">\n {{ conn.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton\n variant=\"flat\"\n (click)=\"syncConnectionTools(conn)\"\n [disabled]=\"isSyncing(conn.ID)\"\n title=\"Sync Tools\">\n @if (isSyncing(conn.ID)) {\n <i class=\"fa-solid fa-sync fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-sync\"></i>\n }\n </button>\n <button mjButton variant=\"flat\" (click)=\"editConnection(conn)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button mjButton variant=\"flat\" (click)=\"deleteConnection(conn)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <!-- Sync Progress Banner -->\n @if (isSyncing(conn.ID)) {\n <div class=\"sync-progress-banner\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span class=\"sync-message\">{{ getSyncProgressMessage(conn.ID) || 'Syncing...' }}</span>\n </div>\n }\n <!-- Sync Result Banner -->\n @if (getSyncState(conn.ID)?.lastResult && !isSyncing(conn.ID)) {\n <div class=\"sync-result-banner\"\n [class.success]=\"getSyncState(conn.ID)?.lastResult?.Success\"\n [class.error]=\"!getSyncState(conn.ID)?.lastResult?.Success\">\n @if (getSyncState(conn.ID)?.lastResult?.Success) {\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Synced: {{ getSyncState(conn.ID)?.lastResult?.Added }} added,\n {{ getSyncState(conn.ID)?.lastResult?.Updated }} updated,\n {{ getSyncState(conn.ID)?.lastResult?.Deprecated }} deprecated\n </span>\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ getSyncState(conn.ID)?.lastResult?.ErrorMessage }}</span>\n }\n </div>\n }\n <div class=\"card-body\">\n @if (conn.Description) {\n <p class=\"description\" [innerHTML]=\"conn.Description | highlightSearch:(filters$ | async)?.searchTerm\"></p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Server</span>\n <span class=\"value\">{{ conn.ServerName }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auto Sync</span>\n <span class=\"value\">{{ conn.AutoSyncTools ? 'Yes' : 'No' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Logging</span>\n <span class=\"value\">{{ conn.LogToolCalls ? 'Enabled' : 'Disabled' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Last Connected</span>\n <span class=\"value\">{{ formatDate(conn.LastConnectedAt) }}</span>\n </div>\n @if (conn.LastErrorMessage) {\n <div class=\"detail full-width error\">\n <span class=\"label\">Last Error</span>\n <span class=\"value\">{{ conn.LastErrorMessage }}</span>\n </div>\n }\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isConnectionExpanded(conn)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForConnection(conn.ID).length }})</span>\n </div>\n @if (getToolsForConnection(conn.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Click the sync button to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForConnection(conn.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"runToolFromCard(tool, conn); $event.stopPropagation()\"\n title=\"Test this tool with this connection\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Tools Tab -->\n @case ('tools') {\n @if (ServerGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-wrench\"></i>\n <p>No tools discovered yet</p>\n <span class=\"hint\">Tools are discovered when connections sync with MCP servers</span>\n </div>\n } @else {\n <div class=\"tools-container\">\n <!-- Server Groups -->\n @for (group of ServerGroups; track group.server.ID) {\n <div class=\"server-group\" [class.collapsed]=\"!group.expanded\">\n <!-- Server Group Header -->\n <div class=\"server-group-header\" (click)=\"toggleServerGroup(group)\">\n <div class=\"server-info\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"group.expanded\"></i>\n <i [class]=\"getTransportIcon(group.server.TransportType)\"></i>\n <span class=\"server-name\">{{ group.server.Name }}</span>\n <span class=\"tool-count\">{{ group.tools.length }} tools</span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(group.server.Status)\">\n {{ group.server.Status }}\n </span>\n </div>\n <div class=\"server-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton variant=\"flat\" (click)=\"openTestToolDialog(undefined, undefined)\" title=\"Test a tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n </div>\n\n <!-- Tools Content -->\n @if (group.expanded) {\n <!-- Card View -->\n @if (ToolsViewMode === 'card') {\n <div class=\"tools-grid\">\n @for (tool of group.tools; track tool.ID) {\n <div class=\"tool-card\" [class.expanded]=\"isToolExpanded(tool)\">\n <div class=\"tool-card-header\" (click)=\"toggleToolExpand(tool)\">\n <div class=\"tool-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"name\" [innerHTML]=\"(tool.ToolTitle || tool.ToolName) | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n </div>\n <div class=\"tool-meta\">\n <span class=\"param-badge\" title=\"Parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }}\n </span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </div>\n </div>\n @if (tool.ToolDescription) {\n <p class=\"tool-description\" [innerHTML]=\"tool.ToolDescription | highlightSearch:(filters$ | async)?.searchTerm\"></p>\n }\n <div class=\"tool-card-actions\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openTestToolDialog(tool)\" title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n Test\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleToolExpand(tool)\" title=\"View details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n {{ isToolExpanded(tool) ? 'Less' : 'More' }}\n </button>\n </div>\n <!-- Expanded Details -->\n @if (isToolExpanded(tool)) {\n <div class=\"tool-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Parameters:</span>\n <span class=\"detail-value\">\n {{ getParamCount(tool) }} total, {{ getRequiredParamCount(tool) }} required\n </span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Last Seen:</span>\n <span class=\"detail-value\">{{ formatDate(tool.LastSeenAt) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-row full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <!-- List View -->\n <div class=\"tools-list\">\n <table>\n <thead>\n <tr>\n <th>Tool</th>\n <th>Description</th>\n <th>Params</th>\n <th>Status</th>\n <th>Last Seen</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (tool of group.tools; track tool.ID) {\n <tr [class.expanded]=\"isToolExpanded(tool)\">\n <td class=\"tool-name-cell\">\n <i class=\"fa-solid fa-wrench\"></i>\n <div class=\"tool-name-info\">\n <span class=\"tool-title\" [innerHTML]=\"(tool.ToolTitle || tool.ToolName) | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n @if (tool.ToolTitle) {\n <span class=\"tool-code\">{{ tool.ToolName }}</span>\n }\n </div>\n </td>\n <td class=\"description-cell\" [innerHTML]=\"(tool.ToolDescription || '-') | highlightSearch:(filters$ | async)?.searchTerm\">\n </td>\n <td>\n <span class=\"param-count\">{{ getParamCount(tool) }}</span>\n </td>\n <td>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </td>\n <td>{{ formatDate(tool.LastSeenAt) }}</td>\n <td class=\"actions-cell\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openTestToolDialog(tool)\" title=\"Test\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleToolExpand(tool)\" title=\"Details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n </button>\n </td>\n </tr>\n @if (isToolExpanded(tool)) {\n <tr class=\"detail-row-expanded\">\n <td colspan=\"6\">\n <div class=\"inline-details\">\n <div class=\"detail-section\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Required Params:</span>\n <span class=\"detail-value\">{{ getRequiredParamCount(tool) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-section full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n\n <!-- Logs Tab -->\n @case ('logs') {\n <div class=\"data-table\">\n @if (filteredLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-list-check\"></i>\n <p>No recent execution logs</p>\n <span class=\"hint\">Logs appear when tools are executed via MCP connections</span>\n </div>\n } @else {\n <table>\n <thead>\n <tr>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('status')\" (click)=\"onLogSortColumn('status')\">\n Status\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'status' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'status' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'status'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('server')\" (click)=\"onLogSortColumn('server')\">\n Server\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'server' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'server' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'server'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('tool')\" (click)=\"onLogSortColumn('tool')\">\n Tool\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'tool' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'tool' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'tool'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('connection')\" (click)=\"onLogSortColumn('connection')\">\n Connection\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'connection' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'connection' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'connection'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('started')\" (click)=\"onLogSortColumn('started')\">\n Started\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'started' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'started' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'started'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('duration')\" (click)=\"onLogSortColumn('duration')\">\n Duration\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'duration' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'duration' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'duration'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('error')\" (click)=\"onLogSortColumn('error')\">\n Error\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'error' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'error' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'error'\"></i>\n </th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (log of filteredLogs; track log.ID) {\n <tr [class.error-row]=\"log.Status === 'Error'\"\n class=\"clickable-row\"\n (click)=\"onLogClick(log)\"\n title=\"Click for details\">\n <td>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n @switch (log.Status) {\n @case ('Success') {\n <i class=\"fa-solid fa-check-circle\"></i>\n }\n @case ('Error') {\n <i class=\"fa-solid fa-times-circle\"></i>\n }\n @case ('Running') {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @default {\n <i class=\"fa-solid fa-question-circle\"></i>\n }\n }\n {{ log.Status || 'Unknown' }}\n </span>\n </td>\n <td class=\"server-name\">{{ log.ServerName }}</td>\n <td class=\"tool-name\">{{ log.ToolName }}</td>\n <td>{{ log.ConnectionName }}</td>\n <td>{{ formatDate(log.StartedAt) }}</td>\n <td>{{ formatDuration(log.DurationMs) }}</td>\n <td class=\"error-message\" [title]=\"log.ErrorMessage || ''\">\n {{ log.ErrorMessage || '-' }}\n </td>\n <td class=\"action-cell\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n }\n }\n </div>\n </div>\n </div>\n</div>\n\n<!-- Server Dialog -->\n@if (ShowServerDialog) {\n <mj-mcp-server-dialog\n [server]=\"EditingServer\"\n [visible]=\"ShowServerDialog\"\n (close)=\"onServerDialogClose($event)\">\n </mj-mcp-server-dialog>\n}\n\n<!-- Connection Dialog -->\n@if (ShowConnectionDialog) {\n <mj-mcp-connection-dialog\n [connection]=\"EditingConnection\"\n [servers]=\"servers\"\n [visible]=\"ShowConnectionDialog\"\n (close)=\"onConnectionDialogClose($event)\">\n </mj-mcp-connection-dialog>\n}\n\n<!-- Test Tool Dialog -->\n@if (ShowTestToolDialog) {\n <mj-mcp-test-tool-dialog\n [Visible]=\"ShowTestToolDialog\"\n [Servers]=\"servers\"\n [Connections]=\"connections\"\n [Tools]=\"tools\"\n [SelectedServerID]=\"TestToolServerID\"\n [SelectedConnectionID]=\"TestToolConnectionID\"\n [SelectedToolID]=\"TestToolID\"\n (Close)=\"onTestToolDialogClose()\">\n </mj-mcp-test-tool-dialog>\n}\n\n<!-- Log Detail Panel -->\n@if (ShowLogDetailPanel && SelectedLog) {\n <mj-mcp-log-detail-panel\n [Visible]=\"ShowLogDetailPanel\"\n [Log]=\"SelectedLog\"\n (Close)=\"onLogDetailClose()\"\n (RunAgain)=\"onRunAgainFromLog($event)\">\n </mj-mcp-log-detail-panel>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mcp-dashboard.component.js","sourceRoot":"","sources":["../../src/MCP/mcp-dashboard.component.ts","../../src/MCP/mcp-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview MCP (Model Context Protocol) Management Dashboard\n *\n * Provides a comprehensive admin interface for managing MCP servers,\n * connections, tools, and viewing execution logs.\n *\n * Uses left sidebar navigation with query string deep linking via NavigationService.\n *\n * @module MCP Dashboard\n */\n\nimport { Component, OnDestroy, ChangeDetectorRef, AfterViewInit, OnInit } from '@angular/core';\nimport { Subject, BehaviorSubject, Subscription } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { RunView, Metadata, CompositeKey } from '@memberjunction/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport {\n ResourceData,\n MJMCPServerEntity,\n MJMCPServerConnectionEntity,\n MJMCPServerToolEntity,\n MJMCPToolExecutionLogEntity,\n MJMCPToolFavoriteEntity,\n MCPEngine,\n UserInfoEngine,\n MJOAuthAuthorizationStateEntity,\n MJOAuthClientRegistrationEntity,\n MJOAuthTokenEntity,\n MJCredentialEntity\n} from '@memberjunction/core-entities';\nimport { CredentialEngine } from '@memberjunction/credentials';\nimport { RegisterClass , UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { GraphQLDataProvider, gql } from '@memberjunction/graphql-dataprovider';\nimport { MCPToolsService, MCPSyncState, MCPSyncResult } from './services/mcp-tools.service';\n\n/**\n * User preferences for the MCP Dashboard\n */\ninterface MCPDashboardUserPreferences {\n toolsViewMode: ToolsViewMode;\n toolsSortBy: ToolsSortBy;\n toolsSortAscending: boolean;\n logsSortColumn: 'status' | 'server' | 'tool' | 'connection' | 'started' | 'duration' | 'error';\n logsSortAscending: boolean;\n searchTerm: string;\n serverStatus: string;\n connectionStatus: string;\n toolStatus: string;\n logStatus: string;\n filterPanelVisible: boolean;\n}\n\n/**\n * Interface for MCP Server data\n */\nexport interface MCPServerData {\n ID: string;\n Name: string;\n Description: string | null;\n TransportType: string;\n ServerURL: string | null;\n Command: string | null;\n DefaultAuthType: string;\n Status: string;\n RateLimitPerMinute: number | null;\n RateLimitPerHour: number | null;\n LastSyncAt: Date | null;\n ConnectionCount?: number;\n ToolCount?: number;\n // OAuth configuration fields\n OAuthIssuerURL?: string | null;\n OAuthScopes?: string | null;\n OAuthMetadataCacheTTLMinutes?: number | null;\n OAuthClientID?: string | null;\n OAuthClientSecretEncrypted?: string | null;\n OAuthRequirePKCE?: boolean;\n}\n\n/**\n * Interface for MCP Connection data\n */\nexport interface MCPConnectionData {\n ID: string;\n MCPServerID: string;\n ServerName?: string;\n Name: string;\n Description: string | null;\n Status: string;\n CompanyID: string | null;\n CredentialID: string | null;\n AutoSyncTools: boolean;\n LogToolCalls: boolean;\n LastConnectedAt: Date | null;\n LastErrorMessage: string | null;\n}\n\n/**\n * Interface for MCP Tool data\n */\nexport interface MCPToolData {\n ID: string;\n MCPServerID: string;\n ServerName?: string;\n ToolName: string;\n ToolTitle: string | null;\n ToolDescription: string | null;\n InputSchema: string;\n Status: string;\n DiscoveredAt: Date;\n LastSeenAt: Date;\n}\n\n/**\n * Interface for server group (tools grouped by server)\n */\nexport interface MCPServerGroup {\n server: MCPServerData;\n tools: MCPToolData[];\n expanded: boolean;\n}\n\n/**\n * MCP tool summary returned by paginated GraphQL query (Part 3.2 scale path).\n * Omits heavy fields like InputSchema so thousands of rows stay light.\n */\nexport interface MCPToolSummary {\n ID: string;\n MCPServerID: string;\n ToolName: string;\n ToolTitle: string | null;\n ToolDescription: string | null;\n Status: string;\n ServerName: string | null;\n}\n\n/**\n * Tools view mode\n */\nexport type ToolsViewMode = 'card' | 'list';\n\n/**\n * Tools sort options\n */\nexport type ToolsSortBy = 'name' | 'server' | 'discovered' | 'lastSeen';\n\n/**\n * Interface for MCP Execution Log data\n */\nexport interface MCPExecutionLogData {\n ID: string;\n ConnectionID: string;\n ConnectionName?: string;\n ToolID: string | null;\n ToolName: string;\n Status: string;\n StartedAt: Date;\n CompletedAt: Date | null;\n DurationMs: number | null;\n UserID: string;\n UserName?: string;\n ErrorMessage: string | null;\n InputArgs?: string | null;\n Result?: string | null;\n ServerName?: string;\n}\n\n/**\n * Dashboard filter options\n */\nexport interface MCPDashboardFilters {\n searchTerm: string;\n serverStatus: string;\n connectionStatus: string;\n toolStatus: string;\n logStatus: string;\n /** Part 3.3 — tools tab server filter (ID of selected server, or 'all') */\n toolsServer?: string;\n /** Part 3.3 — tools tab category filter (derived from snake_case ToolName prefix, or 'all') */\n toolsCategory?: string;\n /** Part 3.6 — restrict Tools tab to favorited tools only */\n favoritesOnly?: boolean;\n /** Part 3.3 — restrict Tools tab to tools that appear in recent execution logs */\n recentOnly?: boolean;\n}\n\n/**\n * Dashboard statistics\n */\nexport interface MCPDashboardStats {\n totalServers: number;\n activeServers: number;\n totalConnections: number;\n activeConnections: number;\n totalTools: number;\n activeTools: number;\n recentExecutions: number;\n failedExecutions: number;\n}\n\n/**\n * Active tab type\n */\nexport type MCPDashboardTab = 'servers' | 'connections' | 'tools' | 'logs';\n\n/** Parameter config for the inline test tool form */\ninterface TestParamConfig {\n name: string;\n type: string;\n description: string;\n required: boolean;\n enumValues: unknown[];\n}\n\n/**\n * MCP Management Dashboard Component\n *\n * Provides a tab-based interface for managing:\n * - MCP Servers\n * - MCP Connections\n * - MCP Tools\n * - Execution Logs\n */\n@RegisterClass(BaseDashboard, 'MCPDashboard')\n@Component({\n standalone: false,\n selector: 'mj-mcp-dashboard',\n templateUrl: './mcp-dashboard.component.html',\n styleUrls: ['./mcp-dashboard.component.css']\n})\nexport class MCPDashboardComponent extends BaseDashboard implements OnInit, AfterViewInit, OnDestroy {\n\n // ========================================\n // State\n // ========================================\n\n // Settings persistence\n private readonly USER_SETTINGS_KEY = 'MCP.Dashboard.UserPreferences';\n private settingsPersistSubject = new Subject<void>();\n private settingsLoaded = false;\n\n private metadata = new Metadata();\n\n public servers: MCPServerData[] = [];\n public connections: MCPConnectionData[] = [];\n public tools: MCPToolData[] = [];\n public executionLogs: MCPExecutionLogData[] = [];\n\n public filteredServers: MCPServerData[] = [];\n public filteredConnections: MCPConnectionData[] = [];\n public filteredTools: MCPToolData[] = [];\n public filteredLogs: MCPExecutionLogData[] = [];\n\n /** Part 3.2 — paginated tools (scales to thousands). Appended as user scrolls. */\n public pagedTools: MCPToolSummary[] = [];\n public toolsTotalCount = 0;\n public toolsLoading = false;\n public toolsSkip = 0;\n public toolsPageSize = 50;\n public useScalablePagination = false;\n\n /** Part 3.6 — favorited tool IDs for the current user. */\n public favoritedToolIDs = new Set<string>();\n\n /** Part 3.5 — Test dialog search string for tool combobox-style filter */\n public TestToolSearch = '';\n\n /** Part 3.3 — derived data for the filter panel */\n public toolsAvailableServers: Array<{ ID: string; Name: string }> = [];\n public toolsAvailableCategories: Array<{ category: string; count: number }> = [];\n\n /** Part 3.4 — tool counts from GetMCPToolCounts (global, respects search) */\n public toolsGlobalCount: number = 0;\n /** Per-server tool count map used for \"(N tools)\" badge on group headers */\n public toolCountByServer: Record<string, number> = {};\n /** Part 3.4 — auto-collapse threshold for server groups */\n public readonly AUTO_COLLAPSE_THRESHOLD = 100;\n\n public stats: MCPDashboardStats = {\n totalServers: 0,\n activeServers: 0,\n totalConnections: 0,\n activeConnections: 0,\n totalTools: 0,\n activeTools: 0,\n recentExecutions: 0,\n failedExecutions: 0\n };\n\n public ActiveTab: MCPDashboardTab = 'servers';\n public IsLoading = false;\n public ErrorMessage: string | null = null;\n\n public filters$ = new BehaviorSubject<MCPDashboardFilters>({\n searchTerm: '',\n serverStatus: 'all',\n connectionStatus: 'all',\n toolStatus: 'all',\n logStatus: 'all'\n });\n\n // Dialog state\n public ShowServerDialog = false;\n public ShowConnectionDialog = false;\n public ShowTestToolDialog = false;\n public EditingServer: MCPServerData | null = null;\n public EditingConnection: MCPConnectionData | null = null;\n\n // Inline server form state (avoids sub-component DI issues)\n public ServerForm = {\n Name: '', Description: '', TransportType: 'StreamableHTTP',\n ServerURL: '', Command: '', DefaultAuthType: 'None', Status: 'Active',\n RateLimitPerMinute: null as number | null,\n RateLimitPerHour: null as number | null,\n RequestTimeoutMs: 60000\n };\n public ServerFormSaving = false;\n public ServerFormError: string | null = null;\n public readonly TransportTypes = [\n { value: 'StreamableHTTP', label: 'Streamable HTTP' },\n { value: 'SSE', label: 'Server-Sent Events' },\n { value: 'Stdio', label: 'Standard I/O' },\n { value: 'WebSocket', label: 'WebSocket' }\n ];\n public readonly AuthTypes = [\n { value: 'None', label: 'None' },\n { value: 'Bearer', label: 'Bearer Token' },\n { value: 'APIKey', label: 'API Key' },\n { value: 'OAuth2', label: 'OAuth 2.0' },\n { value: 'Basic', label: 'Basic Auth' }\n ];\n\n // Inline connection form state\n public ConnectionForm = {\n MCPServerID: '', Name: '', Description: '', BearerToken: '', Status: 'Active'\n };\n public ConnectionFormSaving = false;\n public ConnectionFormError: string | null = null;\n\n // Inline test tool form state\n public TestStep: 'select' | 'configure' | 'results' = 'select';\n public TestToolServerID: string | null = null;\n public TestToolConnectionID: string | null = null;\n public TestToolID: string | null = null;\n public TestFilteredConnections: MCPConnectionData[] = [];\n public TestFilteredTools: MCPToolData[] = [];\n public TestSelectedTool: MCPToolData | null = null;\n public TestParamConfigs: TestParamConfig[] = [];\n public TestParamValues: Record<string, string> = {};\n public TestIsExecuting = false;\n public TestExecutionResult: { Success: boolean; ErrorMessage?: string; Result?: string; DurationMs?: number } | null = null;\n\n // Log detail panel state\n public ShowLogDetailPanel = false;\n public SelectedLog: MCPExecutionLogData | null = null;\n\n // Expandable server/connection cards\n public ExpandedServerID: string | null = null;\n public ExpandedConnectionID: string | null = null;\n\n // Logs sorting state\n public LogsSortColumn: 'status' | 'server' | 'tool' | 'connection' | 'started' | 'duration' | 'error' = 'started';\n public LogsSortAscending = false; // Default to descending (most recent first)\n\n // Tools tab state\n public ToolsViewMode: ToolsViewMode = 'card';\n public ToolsSortBy: ToolsSortBy = 'server';\n public ToolsSortAscending = true;\n public ServerGroups: MCPServerGroup[] = [];\n public ExpandedToolId: string | null = null;\n\n // Sync state\n public SyncStates = new Map<string, MCPSyncState>();\n private syncSubscriptions = new Map<string, Subscription>();\n\n // Filter panel state\n public FilterPanelVisible = true;\n\n // ========================================\n // Lifecycle\n // ========================================\n\n protected override destroy$ = new Subject<void>();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private mcpToolsService: MCPToolsService\n ) {\n super();\n\n // Set up debounced settings persistence\n this.settingsPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.persistUserPreferences();\n });\n }\n\n override async ngOnInit(): Promise<void> {\n await super.ngOnInit();\n\n // Check for OAuth completion redirect\n this.checkOAuthCompletion();\n\n // Load saved user preferences first\n this.loadUserPreferences();\n\n // Read initial tab from query params (deep link / direct URL)\n const initialParams = this.GetQueryParams();\n if (initialParams['tab'] && this.isValidTab(initialParams['tab'])) {\n this.ActiveTab = initialParams['tab'] as MCPDashboardTab;\n }\n\n // Apply configuration params if passed via NavigationService\n this.applyConfigurationParams();\n }\n\n /**\n * Called by the framework when the URL query params change due to\n * browser back/forward navigation or a deep link.\n */\n protected override OnQueryParamsChanged(params: Record<string, string>, source: 'popstate' | 'deeplink'): void {\n const tab = params['tab'] as MCPDashboardTab | undefined;\n if (tab && this.isValidTab(tab) && tab !== this.ActiveTab) {\n this.ActiveTab = tab;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Validates that a tab value is a valid MCPDashboardTab\n */\n private isValidTab(tab: string): tab is MCPDashboardTab {\n return ['servers', 'connections', 'tools', 'logs'].includes(tab);\n }\n\n /**\n * Applies configuration params passed via NavigationService\n */\n private applyConfigurationParams(): void {\n const config = this.Data?.Configuration;\n if (config?.tab && this.isValidTab(config.tab as string)) {\n this.ActiveTab = config.tab as MCPDashboardTab;\n }\n }\n\n // ========================================\n // User Settings Persistence\n // ========================================\n\n /**\n * Load saved user preferences from the UserInfoEngine\n */\n private loadUserPreferences(): void {\n try {\n const savedPrefs = UserInfoEngine.Instance.GetSetting(this.USER_SETTINGS_KEY);\n if (savedPrefs) {\n const prefs = JSON.parse(savedPrefs) as MCPDashboardUserPreferences;\n this.applyUserPreferencesFromStorage(prefs);\n }\n } catch (error) {\n console.warn('[MCPDashboard] Failed to load user preferences:', error);\n } finally {\n this.settingsLoaded = true;\n }\n }\n\n /**\n * Apply loaded preferences to component state\n */\n private applyUserPreferencesFromStorage(prefs: MCPDashboardUserPreferences): void {\n if (prefs.toolsViewMode) {\n this.ToolsViewMode = prefs.toolsViewMode;\n }\n if (prefs.toolsSortBy) {\n this.ToolsSortBy = prefs.toolsSortBy;\n }\n if (prefs.toolsSortAscending !== undefined) {\n this.ToolsSortAscending = prefs.toolsSortAscending;\n }\n if (prefs.logsSortColumn) {\n this.LogsSortColumn = prefs.logsSortColumn;\n }\n if (prefs.logsSortAscending !== undefined) {\n this.LogsSortAscending = prefs.logsSortAscending;\n }\n // Apply filter preferences\n const currentFilters = this.filters$.value;\n this.filters$.next({\n ...currentFilters,\n searchTerm: prefs.searchTerm || '',\n serverStatus: prefs.serverStatus || 'all',\n connectionStatus: prefs.connectionStatus || 'all',\n toolStatus: prefs.toolStatus || 'all',\n logStatus: prefs.logStatus || 'all'\n });\n // Apply filter panel visibility\n if (prefs.filterPanelVisible !== undefined) {\n this.FilterPanelVisible = prefs.filterPanelVisible;\n }\n }\n\n /**\n * Get current preferences as an object for saving\n */\n private getCurrentPreferences(): MCPDashboardUserPreferences {\n const currentFilters = this.filters$.value;\n return {\n toolsViewMode: this.ToolsViewMode,\n toolsSortBy: this.ToolsSortBy,\n toolsSortAscending: this.ToolsSortAscending,\n logsSortColumn: this.LogsSortColumn,\n logsSortAscending: this.LogsSortAscending,\n searchTerm: currentFilters.searchTerm,\n serverStatus: currentFilters.serverStatus,\n connectionStatus: currentFilters.connectionStatus,\n toolStatus: currentFilters.toolStatus,\n logStatus: currentFilters.logStatus,\n filterPanelVisible: this.FilterPanelVisible\n };\n }\n\n /**\n * Persist user preferences to storage (debounced)\n */\n private saveUserPreferencesDebounced(): void {\n if (!this.settingsLoaded) return; // Don't save during initial load\n this.settingsPersistSubject.next();\n }\n\n /**\n * Actually persist user preferences to the UserInfoEngine\n */\n private async persistUserPreferences(): Promise<void> {\n try {\n const prefs = this.getCurrentPreferences();\n await UserInfoEngine.Instance.SetSetting(this.USER_SETTINGS_KEY, JSON.stringify(prefs));\n } catch (error) {\n console.warn('[MCPDashboard] Failed to persist user preferences:', error);\n }\n }\n\n // Required by BaseResourceComponent\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'MCP Management';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-plug-circle-bolt';\n }\n\n protected initDashboard(): void {\n this.setupFilterSubscription();\n }\n\n protected loadData(): void {\n this.loadAllData();\n }\n\n ngAfterViewInit(): void {\n this.cdr.markForCheck();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n // Cleanup sync subscriptions\n this.syncSubscriptions.forEach(sub => sub.unsubscribe());\n this.syncSubscriptions.clear();\n }\n\n // ========================================\n // Data Loading\n // ========================================\n\n /**\n * Loads all dashboard data using MCPEngine for cached entities\n * and RunView for execution logs (historical data loaded on-demand)\n * @param forceRefresh - If true, forces MCPEngine to reload from database (use after sync operations)\n */\n public async loadAllData(forceRefresh: boolean = false): Promise<void> {\n this.IsLoading = true;\n this.ErrorMessage = null;\n this.cdr.markForCheck();\n\n try {\n // Initialize MCPEngine and load execution logs in parallel\n // forceRefresh=true is needed after sync operations since backend changes\n // won't trigger local BaseEntity events\n const rv = new RunView();\n const [, logsResult] = await Promise.all([\n MCPEngine.Instance.Config(forceRefresh),\n rv.RunView<MJMCPToolExecutionLogEntity>({\n EntityName: 'MJ: MCP Tool Execution Logs',\n ExtraFilter: `StartedAt >= DATEADD(day, -7, GETUTCDATE())`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 100,\n ResultType: 'simple'\n })\n ]);\n\n // Get cached data from MCPEngine and convert to interface types\n this.servers = MCPEngine.Instance.Servers.map(s => ({\n ID: s.ID,\n Name: s.Name,\n Description: s.Description,\n TransportType: s.TransportType,\n ServerURL: s.ServerURL,\n Command: s.Command,\n DefaultAuthType: s.DefaultAuthType,\n Status: s.Status,\n RateLimitPerMinute: s.RateLimitPerMinute,\n RateLimitPerHour: s.RateLimitPerHour,\n LastSyncAt: s.LastSyncAt,\n // OAuth configuration fields\n OAuthIssuerURL: s.OAuthIssuerURL,\n OAuthScopes: s.OAuthScopes,\n OAuthMetadataCacheTTLMinutes: s.OAuthMetadataCacheTTLMinutes,\n OAuthClientID: s.OAuthClientID,\n OAuthClientSecretEncrypted: s.OAuthClientSecretEncrypted,\n OAuthRequirePKCE: s.OAuthRequirePKCE\n }));\n\n this.connections = MCPEngine.Instance.Connections.map(c => ({\n ID: c.ID,\n MCPServerID: c.MCPServerID,\n Name: c.Name,\n Description: c.Description,\n Status: c.Status,\n CompanyID: c.CompanyID,\n CredentialID: c.CredentialID ?? null,\n AutoSyncTools: c.AutoSyncTools,\n LogToolCalls: c.LogToolCalls,\n LastConnectedAt: c.LastConnectedAt,\n LastErrorMessage: c.LastErrorMessage\n }));\n\n this.tools = MCPEngine.Instance.Tools.map(t => ({\n ID: t.ID,\n MCPServerID: t.MCPServerID,\n ToolName: t.ToolName,\n ToolTitle: t.ToolTitle,\n ToolDescription: t.ToolDescription,\n InputSchema: t.InputSchema,\n Status: t.Status,\n DiscoveredAt: t.DiscoveredAt,\n LastSeenAt: t.LastSeenAt\n }));\n\n if (logsResult.Success) {\n // Map database column names to UI interface property names\n this.executionLogs = (logsResult.Results || []).map(log => this.mapLogFromDatabase(log));\n }\n\n // Enrich data with counts and names\n this.enrichServerData();\n this.enrichConnectionData();\n this.enrichToolData();\n this.enrichLogData();\n\n // Calculate stats\n this.calculateStats();\n\n // Populate filter dropdowns from loaded data (needed even outside Scale mode)\n this.toolsAvailableServers = this.servers.map(s => ({ ID: s.ID, Name: s.Name }));\n this.toolsAvailableCategories = this.computeCategoriesFromTools();\n\n // Apply filters\n this.applyFilters();\n\n // Load user's favorites (Part 3.6) — fire and forget\n this.loadFavorites();\n\n } catch (error) {\n this.ErrorMessage = `Failed to load data: ${error instanceof Error ? error.message : String(error)}`;\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private enrichServerData(): void {\n for (const server of this.servers) {\n server.ConnectionCount = this.connections.filter(c => UUIDsEqual(c.MCPServerID, server.ID)).length\n server.ToolCount = this.tools.filter(t => UUIDsEqual(t.MCPServerID, server.ID)).length\n }\n }\n\n private enrichConnectionData(): void {\n for (const conn of this.connections) {\n const server = this.servers.find(s => UUIDsEqual(s.ID, conn.MCPServerID));\n conn.ServerName = server?.Name ?? 'Unknown';\n }\n }\n\n private enrichToolData(): void {\n for (const tool of this.tools) {\n const server = this.servers.find(s => UUIDsEqual(s.ID, tool.MCPServerID));\n tool.ServerName = server?.Name ?? 'Unknown';\n }\n }\n\n private enrichLogData(): void {\n for (const log of this.executionLogs) {\n const conn = this.connections.find(c => UUIDsEqual(c.ID, log.ConnectionID));\n log.ConnectionName = conn?.Name ?? log.ConnectionName ?? 'Unknown';\n // Add server name via connection\n if (conn) {\n const server = this.servers.find(s => UUIDsEqual(s.ID, conn.MCPServerID));\n log.ServerName = server?.Name ?? 'Unknown';\n } else {\n log.ServerName = log.ServerName ?? 'Unknown';\n }\n }\n // Sort logs by StartedAt descending (most recent first)\n this.executionLogs.sort((a, b) => {\n const dateA = new Date(a.StartedAt).getTime();\n const dateB = new Date(b.StartedAt).getTime();\n return dateB - dateA;\n });\n }\n\n /**\n * Maps database log entity to UI interface format\n * Handles column name differences between DB schema and UI interface\n */\n private mapLogFromDatabase(dbLog: MJMCPToolExecutionLogEntity): MCPExecutionLogData {\n // Determine status from Success boolean\n let status: string;\n if (dbLog.Success === true) {\n status = 'Success';\n } else if (dbLog.Success === false) {\n status = 'Error';\n } else {\n // null means still running\n status = 'Running';\n }\n\n return {\n ID: dbLog.ID,\n ConnectionID: dbLog.MCPServerConnectionID,\n ToolID: dbLog.MCPServerToolID,\n ToolName: dbLog.ToolName || 'Unknown',\n Status: status,\n StartedAt: dbLog.StartedAt,\n CompletedAt: dbLog.EndedAt,\n DurationMs: dbLog.DurationMs,\n UserID: dbLog.UserID,\n UserName: dbLog.User,\n ErrorMessage: dbLog.ErrorMessage,\n InputArgs: dbLog.InputParameters,\n Result: dbLog.OutputContent,\n ConnectionName: dbLog.MCPServerConnection,\n ServerName: undefined // Will be enriched later\n };\n }\n\n private calculateStats(): void {\n this.stats = {\n totalServers: this.servers.length,\n activeServers: this.servers.filter(s => s.Status === 'Active').length,\n totalConnections: this.connections.length,\n activeConnections: this.connections.filter(c => c.Status === 'Active').length,\n totalTools: this.tools.length,\n activeTools: this.tools.filter(t => t.Status === 'Active').length,\n recentExecutions: this.executionLogs.length,\n failedExecutions: this.executionLogs.filter(l => l.Status === 'Error').length\n };\n }\n\n // ========================================\n // Filtering\n // ========================================\n\n private setupFilterSubscription(): void {\n this.filters$\n .pipe(\n debounceTime(300),\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n takeUntil(this.destroy$)\n )\n .subscribe(() => {\n this.applyFilters();\n this.cdr.detectChanges();\n });\n }\n\n public applyFilters(): void {\n const filters = this.filters$.value;\n const search = filters.searchTerm.toLowerCase();\n\n // Filter servers\n this.filteredServers = this.servers.filter(s => {\n const matchesSearch = !search ||\n s.Name.toLowerCase().includes(search) ||\n (s.Description?.toLowerCase().includes(search) ?? false);\n const matchesStatus = filters.serverStatus === 'all' || s.Status === filters.serverStatus;\n return matchesSearch && matchesStatus;\n });\n\n // Filter connections\n this.filteredConnections = this.connections.filter(c => {\n const matchesSearch = !search ||\n c.Name.toLowerCase().includes(search) ||\n (c.ServerName?.toLowerCase().includes(search) ?? false);\n const matchesStatus = filters.connectionStatus === 'all' || c.Status === filters.connectionStatus;\n return matchesSearch && matchesStatus;\n });\n\n // Filter tools (legacy grouped view — now also honors Server / Category / Favorites-only filters)\n this.filteredTools = this.tools.filter(t => {\n const matchesSearch = !search ||\n t.ToolName.toLowerCase().includes(search) ||\n (t.ToolTitle?.toLowerCase().includes(search) ?? false) ||\n (t.ToolDescription?.toLowerCase().includes(search) ?? false);\n const matchesStatus = filters.toolStatus === 'all' || t.Status === filters.toolStatus;\n const matchesServer = !filters.toolsServer || filters.toolsServer === 'all' ||\n UUIDsEqual(t.MCPServerID, filters.toolsServer);\n const cat = t.ToolName.indexOf('_') > 0 ? t.ToolName.substring(0, t.ToolName.indexOf('_')) : t.ToolName;\n const matchesCategory = !filters.toolsCategory || filters.toolsCategory === 'all' || cat === filters.toolsCategory;\n const matchesFavorite = !filters.favoritesOnly || this.isFavorited(t.ID);\n const matchesRecent = !filters.recentOnly || this.recentToolIDSet().has(NormalizeUUID(t.ID));\n return matchesSearch && matchesStatus && matchesServer && matchesCategory && matchesFavorite && matchesRecent;\n });\n\n // Build server groups for the tools tab\n this.buildServerGroups();\n\n // Filter logs\n this.filteredLogs = this.executionLogs.filter(l => {\n const matchesSearch = !search ||\n l.ToolName.toLowerCase().includes(search) ||\n (l.ConnectionName?.toLowerCase().includes(search) ?? false) ||\n (l.ServerName?.toLowerCase().includes(search) ?? false);\n const matchesStatus = filters.logStatus === 'all' || l.Status === filters.logStatus;\n return matchesSearch && matchesStatus;\n });\n\n // Apply current sort\n this.sortFilteredLogs();\n }\n\n public onSearchChange(term: string): void {\n const current = this.filters$.value;\n this.filters$.next({ ...current, searchTerm: term });\n this.saveUserPreferencesDebounced();\n }\n\n public onStatusFilterChange(filterType: string, value: string): void {\n const current = this.filters$.value;\n switch (filterType) {\n case 'server':\n this.filters$.next({ ...current, serverStatus: value });\n break;\n case 'connection':\n this.filters$.next({ ...current, connectionStatus: value });\n break;\n case 'tool':\n this.filters$.next({ ...current, toolStatus: value });\n break;\n case 'log':\n this.filters$.next({ ...current, logStatus: value });\n break;\n }\n this.saveUserPreferencesDebounced();\n }\n\n // ========================================\n // Filter Panel\n // ========================================\n\n /**\n * Toggle filter panel visibility\n */\n public toggleFilterPanel(): void {\n this.FilterPanelVisible = !this.FilterPanelVisible;\n this.saveUserPreferencesDebounced();\n this.cdr.detectChanges();\n }\n\n /**\n * Handle filter changes from the filter panel component\n */\n public onFiltersChange(filters: MCPDashboardFilters): void {\n this.filters$.next(filters);\n this.saveUserPreferencesDebounced();\n // Part 3.3/3.4 — when Tools tab is active in scale mode, reload the paginated list + counts\n if (this.ActiveTab === 'tools' && this.useScalablePagination) {\n this.loadToolsPage(true);\n this.loadToolCounts();\n }\n }\n\n /** Inlined filter panel — single-field update helper */\n public onFilterFieldChange(field: keyof MCPDashboardFilters, value: unknown): void {\n const updated = { ...this.filters$.value, [field]: value };\n this.onFiltersChange(updated as MCPDashboardFilters);\n }\n\n /** Count of non-default filter dimensions, used for \"Filters (N)\" badge */\n public activeFilterCount(): number {\n const f = this.filters$.value;\n let n = 0;\n if (f.searchTerm) n++;\n if (f.serverStatus && f.serverStatus !== 'all') n++;\n if (f.connectionStatus && f.connectionStatus !== 'all') n++;\n if (f.toolStatus && f.toolStatus !== 'all') n++;\n if (f.logStatus && f.logStatus !== 'all') n++;\n if (f.toolsServer && f.toolsServer !== 'all') n++;\n if (f.toolsCategory && f.toolsCategory !== 'all') n++;\n if (f.favoritesOnly) n++;\n if (f.recentOnly) n++;\n return n;\n }\n\n /** Derive category list (snake_case prefix) + counts from the currently loaded tools. */\n public computeCategoriesFromTools(): Array<{ category: string; count: number }> {\n const counts = new Map<string, number>();\n for (const t of this.tools) {\n const idx = t.ToolName.indexOf('_');\n const cat = idx > 0 ? t.ToolName.substring(0, idx) : t.ToolName;\n counts.set(cat, (counts.get(cat) ?? 0) + 1);\n }\n return Array.from(counts.entries())\n .map(([category, count]) => ({ category, count }))\n .sort((a, b) => a.category.localeCompare(b.category));\n }\n\n public resetAllFilters(): void {\n this.onFiltersChange({\n searchTerm: '',\n serverStatus: 'all',\n connectionStatus: 'all',\n toolStatus: 'all',\n logStatus: 'all',\n toolsServer: 'all',\n toolsCategory: 'all',\n favoritesOnly: false,\n recentOnly: false\n });\n }\n\n /**\n * Get the current filtered count based on active tab\n */\n public get CurrentFilteredCount(): number {\n switch (this.ActiveTab) {\n case 'servers':\n return this.filteredServers.length;\n case 'connections':\n return this.filteredConnections.length;\n case 'tools':\n return this.filteredTools.length;\n case 'logs':\n return this.filteredLogs.length;\n default:\n return 0;\n }\n }\n\n /**\n * Get the total count based on active tab\n */\n public get CurrentTotalCount(): number {\n switch (this.ActiveTab) {\n case 'servers':\n return this.servers.length;\n case 'connections':\n return this.connections.length;\n case 'tools':\n return this.tools.length;\n case 'logs':\n return this.executionLogs.length;\n default:\n return 0;\n }\n }\n\n /**\n * Get current filters value (non-observable)\n */\n public get CurrentFilters(): MCPDashboardFilters {\n return this.filters$.value;\n }\n\n // ========================================\n // Tab Navigation\n // ========================================\n\n /**\n * Sets the active tab and updates URL for deep linking\n */\n public setActiveTab(tab: MCPDashboardTab): void {\n if (this.ActiveTab === tab) return;\n\n this.ActiveTab = tab;\n this.UpdateQueryParams({ tab: this.ActiveTab });\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Server Operations\n // ========================================\n\n public createServer(): void {\n this.EditingServer = null;\n this.ServerForm = { Name: '', Description: '', TransportType: 'StreamableHTTP', ServerURL: '', Command: '', DefaultAuthType: 'None', Status: 'Active', RateLimitPerMinute: null, RateLimitPerHour: null, RequestTimeoutMs: 60000 };\n this.ServerFormError = null;\n this.ShowServerDialog = true;\n this.cdr.detectChanges();\n }\n\n public editServer(server: MCPServerData): void {\n this.EditingServer = server;\n this.ServerForm = {\n Name: server.Name,\n Description: server.Description ?? '',\n TransportType: server.TransportType,\n ServerURL: server.ServerURL ?? '',\n Command: server.Command ?? '',\n DefaultAuthType: server.DefaultAuthType,\n Status: server.Status,\n RateLimitPerMinute: server.RateLimitPerMinute,\n RateLimitPerHour: server.RateLimitPerHour,\n RequestTimeoutMs: 60000\n };\n this.ServerFormError = null;\n this.ShowServerDialog = true;\n this.cdr.detectChanges();\n }\n\n public async deleteServer(server: MCPServerData): Promise<void> {\n // Check for related connections first\n const relatedConnections = this.connections.filter((c: MCPConnectionData) => UUIDsEqual(c.MCPServerID, server.ID));\n const relatedTools = this.tools.filter((t: MCPToolData) => UUIDsEqual(t.MCPServerID, server.ID));\n\n if (relatedConnections.length > 0 || relatedTools.length > 0) {\n const parts: string[] = [];\n if (relatedConnections.length > 0) {\n parts.push(`${relatedConnections.length} connection(s)`);\n }\n if (relatedTools.length > 0) {\n parts.push(`${relatedTools.length} tool(s)`);\n }\n\n if (!confirm(\n `Server \"${server.Name}\" has ${parts.join(' and ')}.\\n\\n` +\n `All related records will be deleted. Are you sure you want to proceed?`\n )) {\n return;\n }\n\n // Delete related connections first (which will cascade to connection tools/permissions)\n for (const conn of relatedConnections) {\n try {\n await this.deleteConnectionInternal(conn.ID);\n } catch (error) {\n this.ErrorMessage = `Failed to delete related connection \"${conn.Name}\": ${error instanceof Error ? error.message : String(error)}`;\n this.cdr.detectChanges();\n return;\n }\n }\n\n // Delete related tools\n for (const tool of relatedTools) {\n try {\n await this.deleteToolInternal(tool.ID);\n } catch (error) {\n this.ErrorMessage = `Failed to delete related tool \"${tool.ToolName}\": ${error instanceof Error ? error.message : String(error)}`;\n this.cdr.detectChanges();\n return;\n }\n }\n } else {\n if (!confirm(`Are you sure you want to delete server \"${server.Name}\"?`)) {\n return;\n }\n }\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJMCPServerEntity>('MJ: MCP Servers');\n const loaded = await entity.Load(server.ID);\n if (!loaded) {\n this.ErrorMessage = `Server not found: ${server.Name}`;\n this.cdr.detectChanges();\n return;\n }\n\n const deleted = await entity.Delete();\n if (!deleted) {\n const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Unknown error';\n this.ErrorMessage = `Failed to delete server: ${errorMsg}`;\n this.cdr.detectChanges();\n return;\n }\n\n await this.loadAllData();\n } catch (error) {\n this.ErrorMessage = `Failed to delete server: ${error instanceof Error ? error.message : String(error)}`;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Internal helper to delete a tool by ID without confirmation\n */\n private async deleteToolInternal(toolId: string): Promise<void> {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJMCPServerToolEntity>('MJ: MCP Server Tools');\n const loaded = await entity.Load(toolId);\n if (!loaded) {\n throw new Error(`Tool not found`);\n }\n const deleted = await entity.Delete();\n if (!deleted) {\n const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Delete failed';\n throw new Error(errorMsg);\n }\n }\n\n /**\n * Internal helper to delete a connection by ID without confirmation.\n * Handles deletion of all related records that don't have ON DELETE CASCADE:\n * - MCP Tool Execution Logs\n * - OAuth Authorization States\n * - OAuth Client Registrations\n * - OAuth Tokens\n */\n private async deleteConnectionInternal(connectionId: string): Promise<void> {\n console.log(`[MCPDashboard] deleteConnectionInternal called for connectionId: ${connectionId}`);\n const rv = new RunView();\n const md = new Metadata();\n\n // Delete execution logs for this connection\n console.log('[MCPDashboard] Deleting execution logs...');\n const logsResult = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: MCP Tool Execution Logs',\n ExtraFilter: `MCPServerConnectionID='${connectionId}'`,\n Fields: ['ID'],\n ResultType: 'simple'\n });\n if (logsResult.Success && logsResult.Results) {\n console.log(`[MCPDashboard] Found ${logsResult.Results.length} execution logs to delete`);\n for (const log of logsResult.Results) {\n console.log(`[MCPDashboard] Loading execution log ${log.ID}...`);\n const logEntity = await md.GetEntityObject<MJMCPToolExecutionLogEntity>('MJ: MCP Tool Execution Logs');\n const loaded = await logEntity.Load(log.ID);\n console.log(`[MCPDashboard] Load result for execution log ${log.ID}: ${loaded}`);\n if (loaded) {\n const deleted = await logEntity.Delete();\n if (!deleted) {\n console.error(`[MCPDashboard] Failed to delete execution log ${log.ID}:`, logEntity.LatestResult);\n throw new Error(`Failed to delete execution log: ${logEntity.LatestResult?.Message || 'Unknown error'}`);\n }\n console.log(`[MCPDashboard] Deleted execution log ${log.ID}`);\n } else {\n console.warn(`[MCPDashboard] Could not load execution log ${log.ID} - may have been already deleted`);\n }\n }\n }\n\n // Delete OAuth Authorization States for this connection\n console.log('[MCPDashboard] Deleting OAuth Authorization States...');\n const authStatesResult = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: O Auth Authorization States',\n ExtraFilter: `MCPServerConnectionID='${connectionId}'`,\n Fields: ['ID'],\n ResultType: 'simple'\n });\n if (authStatesResult.Success && authStatesResult.Results) {\n console.log(`[MCPDashboard] Found ${authStatesResult.Results.length} OAuth Authorization States to delete`);\n for (const state of authStatesResult.Results) {\n console.log(`[MCPDashboard] Loading OAuth Authorization State ${state.ID}...`);\n const stateEntity = await md.GetEntityObject<MJOAuthAuthorizationStateEntity>('MJ: O Auth Authorization States');\n const loaded = await stateEntity.Load(state.ID);\n console.log(`[MCPDashboard] Load result for OAuth Authorization State ${state.ID}: ${loaded}`);\n if (loaded) {\n const deleted = await stateEntity.Delete();\n if (!deleted) {\n console.error(`[MCPDashboard] Failed to delete OAuth Authorization State ${state.ID}:`, stateEntity.LatestResult);\n throw new Error(`Failed to delete OAuth Authorization State: ${stateEntity.LatestResult?.Message || 'Unknown error'}`);\n }\n console.log(`[MCPDashboard] Deleted OAuth Authorization State ${state.ID}`);\n } else {\n console.warn(`[MCPDashboard] Could not load OAuth Authorization State ${state.ID} - may have been already deleted`);\n }\n }\n }\n\n // Delete OAuth Client Registrations for this connection\n console.log('[MCPDashboard] Deleting OAuth Client Registrations...');\n const clientRegsResult = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: O Auth Client Registrations',\n ExtraFilter: `MCPServerConnectionID='${connectionId}'`,\n Fields: ['ID'],\n ResultType: 'simple'\n });\n if (clientRegsResult.Success && clientRegsResult.Results) {\n console.log(`[MCPDashboard] Found ${clientRegsResult.Results.length} OAuth Client Registrations to delete`);\n for (const reg of clientRegsResult.Results) {\n console.log(`[MCPDashboard] Loading OAuth Client Registration ${reg.ID}...`);\n const regEntity = await md.GetEntityObject<MJOAuthClientRegistrationEntity>('MJ: O Auth Client Registrations');\n const loaded = await regEntity.Load(reg.ID);\n console.log(`[MCPDashboard] Load result for OAuth Client Registration ${reg.ID}: ${loaded}`);\n if (loaded) {\n const deleted = await regEntity.Delete();\n if (!deleted) {\n console.error(`[MCPDashboard] Failed to delete OAuth Client Registration ${reg.ID}:`, regEntity.LatestResult);\n throw new Error(`Failed to delete OAuth Client Registration: ${regEntity.LatestResult?.Message || 'Unknown error'}`);\n }\n console.log(`[MCPDashboard] Deleted OAuth Client Registration ${reg.ID}`);\n } else {\n console.warn(`[MCPDashboard] Could not load OAuth Client Registration ${reg.ID} - may have been already deleted`);\n }\n }\n }\n\n // Delete OAuth Tokens for this connection\n console.log('[MCPDashboard] Deleting OAuth Tokens...');\n const tokensResult = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: O Auth Tokens',\n ExtraFilter: `MCPServerConnectionID='${connectionId}'`,\n Fields: ['ID'],\n ResultType: 'simple'\n });\n if (tokensResult.Success && tokensResult.Results) {\n console.log(`[MCPDashboard] Found ${tokensResult.Results.length} OAuth Tokens to delete`);\n for (const token of tokensResult.Results) {\n console.log(`[MCPDashboard] Loading OAuth Token ${token.ID}...`);\n const tokenEntity = await md.GetEntityObject<MJOAuthTokenEntity>('MJ: O Auth Tokens');\n const loaded = await tokenEntity.Load(token.ID);\n console.log(`[MCPDashboard] Load result for OAuth Token ${token.ID}: ${loaded}`);\n if (loaded) {\n const deleted = await tokenEntity.Delete();\n if (!deleted) {\n console.error(`[MCPDashboard] Failed to delete OAuth Token ${token.ID}:`, tokenEntity.LatestResult);\n throw new Error(`Failed to delete OAuth Token: ${tokenEntity.LatestResult?.Message || 'Unknown error'}`);\n }\n console.log(`[MCPDashboard] Deleted OAuth Token ${token.ID}`);\n } else {\n console.warn(`[MCPDashboard] Could not load OAuth Token ${token.ID} - may have been already deleted`);\n }\n }\n }\n\n // Now delete the connection itself\n console.log('[MCPDashboard] All related records deleted. Now deleting the connection itself...');\n const entity = await md.GetEntityObject<MJMCPServerConnectionEntity>('MJ: MCP Server Connections');\n const loaded = await entity.Load(connectionId);\n if (!loaded) {\n throw new Error(`Connection not found`);\n }\n const deleted = await entity.Delete();\n if (!deleted) {\n const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Delete failed';\n throw new Error(errorMsg);\n }\n }\n\n public async onServerDialogClose(result: { saved: boolean }): Promise<void> {\n this.ShowServerDialog = false;\n this.EditingServer = null;\n if (result.saved) {\n await this.loadAllData();\n }\n this.cdr.detectChanges();\n }\n\n public cancelServerForm(): void {\n this.ShowServerDialog = false;\n this.ServerFormError = null;\n this.cdr.detectChanges();\n }\n\n public async saveServerForm(): Promise<void> {\n if (!this.ServerForm.Name?.trim()) {\n this.ServerFormError = 'Name is required';\n this.cdr.detectChanges();\n return;\n }\n if ((this.ServerForm.TransportType === 'StreamableHTTP' || this.ServerForm.TransportType === 'SSE' || this.ServerForm.TransportType === 'WebSocket') && !this.ServerForm.ServerURL?.trim()) {\n this.ServerFormError = 'Server URL is required for this transport type';\n this.cdr.detectChanges();\n return;\n }\n this.ServerFormSaving = true;\n this.ServerFormError = null;\n this.cdr.detectChanges();\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJMCPServerEntity>('MJ: MCP Servers');\n if (this.EditingServer?.ID) {\n await entity.Load(this.EditingServer.ID);\n } else {\n entity.NewRecord();\n }\n entity.Name = this.ServerForm.Name.trim();\n entity.Description = this.ServerForm.Description?.trim() || null;\n entity.TransportType = this.ServerForm.TransportType as MJMCPServerEntity['TransportType'];\n entity.ServerURL = this.ServerForm.ServerURL?.trim() || null;\n entity.Command = this.ServerForm.Command?.trim() || null;\n entity.DefaultAuthType = this.ServerForm.DefaultAuthType as MJMCPServerEntity['DefaultAuthType'];\n entity.Status = this.ServerForm.Status as MJMCPServerEntity['Status'];\n entity.RateLimitPerMinute = this.ServerForm.RateLimitPerMinute ?? null;\n entity.RateLimitPerHour = this.ServerForm.RateLimitPerHour ?? null;\n entity.RequestTimeoutMs = this.ServerForm.RequestTimeoutMs ?? 60000;\n const saved = await entity.Save();\n if (!saved) {\n throw new Error(entity.LatestResult?.CompleteMessage ?? 'Save failed');\n }\n this.ShowServerDialog = false;\n await this.loadAllData();\n } catch (err) {\n this.ServerFormError = err instanceof Error ? err.message : String(err);\n } finally {\n this.ServerFormSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n // ========================================\n // Connection Operations\n // ========================================\n\n public createConnection(): void {\n this.EditingConnection = null;\n this.ConnectionForm = { MCPServerID: this.servers[0]?.ID ?? '', Name: '', Description: '', BearerToken: '', Status: 'Active' };\n this.ConnectionFormError = null;\n this.ShowConnectionDialog = true;\n this.cdr.detectChanges();\n }\n\n public cancelConnectionForm(): void {\n this.ShowConnectionDialog = false;\n this.ConnectionFormError = null;\n this.cdr.detectChanges();\n }\n\n public async saveConnectionForm(): Promise<void> {\n if (!this.ConnectionForm.MCPServerID) {\n this.ConnectionFormError = 'Please select a server';\n this.cdr.detectChanges();\n return;\n }\n if (!this.ConnectionForm.Name?.trim()) {\n this.ConnectionFormError = 'Name is required';\n this.cdr.detectChanges();\n return;\n }\n this.ConnectionFormSaving = true;\n this.ConnectionFormError = null;\n this.cdr.detectChanges();\n try {\n const md = new Metadata();\n let credentialID: string | null = null;\n\n // If a bearer token was provided, create a Credential record for it\n if (this.ConnectionForm.BearerToken?.trim()) {\n await CredentialEngine.Instance.Config();\n const credType = CredentialEngine.Instance.CredentialTypes\n .find(t => /bearer|api/i.test(t.Name));\n const credTypeID = credType?.ID ?? null;\n if (credTypeID) {\n const cred = await md.GetEntityObject<MJCredentialEntity>('MJ: Credentials');\n cred.NewRecord();\n cred.CredentialTypeID = credTypeID;\n cred.Name = `${this.ConnectionForm.Name.trim()} Token`;\n cred.Values = JSON.stringify({ apiKey: this.ConnectionForm.BearerToken.trim() });\n const credSaved = await cred.Save();\n if (!credSaved) throw new Error(cred.LatestResult?.CompleteMessage ?? 'Failed to save credential');\n credentialID = cred.ID;\n }\n }\n\n const entity = await md.GetEntityObject<MJMCPServerConnectionEntity>('MJ: MCP Server Connections');\n entity.NewRecord();\n entity.MCPServerID = this.ConnectionForm.MCPServerID;\n entity.Name = this.ConnectionForm.Name.trim();\n entity.Description = this.ConnectionForm.Description?.trim() || null;\n entity.Status = this.ConnectionForm.Status as MJMCPServerConnectionEntity['Status'];\n entity.CredentialID = credentialID;\n entity.AutoSyncTools = true;\n entity.LogToolCalls = true;\n entity.LogInputParameters = true;\n entity.LogOutputContent = true;\n const saved = await entity.Save();\n if (!saved) throw new Error(entity.LatestResult?.CompleteMessage ?? 'Save failed');\n this.ShowConnectionDialog = false;\n await this.loadAllData();\n } catch (err) {\n this.ConnectionFormError = err instanceof Error ? err.message : String(err);\n } finally {\n this.ConnectionFormSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n public editConnection(connection: MCPConnectionData): void {\n this.EditingConnection = connection;\n this.ShowConnectionDialog = true;\n this.cdr.detectChanges();\n }\n\n public async deleteConnection(connection: MCPConnectionData): Promise<void> {\n // Check for related execution logs\n const relatedLogs = this.executionLogs.filter(l => UUIDsEqual(l.ConnectionID, connection.ID));\n\n if (relatedLogs.length > 0) {\n if (!confirm(\n `Connection \"${connection.Name}\" has ${relatedLogs.length} execution log(s).\\n\\n` +\n `All related logs will be deleted. Are you sure you want to proceed?`\n )) {\n return;\n }\n } else {\n if (!confirm(`Are you sure you want to delete connection \"${connection.Name}\"?`)) {\n return;\n }\n }\n\n try {\n // Use the internal method which handles deleting related records\n await this.deleteConnectionInternal(connection.ID);\n await this.loadAllData();\n } catch (error) {\n this.ErrorMessage = `Failed to delete connection: ${error instanceof Error ? error.message : String(error)}`;\n this.cdr.detectChanges();\n }\n }\n\n public async onConnectionDialogClose(result: { saved: boolean }): Promise<void> {\n this.ShowConnectionDialog = false;\n this.EditingConnection = null;\n if (result.saved) {\n await this.loadAllData();\n }\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Tool Operations\n // ========================================\n\n /**\n * Toggle tool card expansion for details view\n */\n public toggleToolExpand(tool: MCPToolData): void {\n if (UUIDsEqual(this.ExpandedToolId, tool.ID)) {\n this.ExpandedToolId = null;\n } else {\n this.ExpandedToolId = tool.ID;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Check if a tool card is expanded\n */\n public isToolExpanded(tool: MCPToolData): boolean {\n return UUIDsEqual(this.ExpandedToolId, tool.ID);\n }\n\n /**\n * Set tools view mode (card or list)\n */\n public setToolsViewMode(mode: ToolsViewMode): void {\n this.ToolsViewMode = mode;\n this.cdr.detectChanges();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Set tools sort option\n */\n public setToolsSort(sortBy: ToolsSortBy): void {\n if (this.ToolsSortBy === sortBy) {\n // Toggle ascending/descending\n this.ToolsSortAscending = !this.ToolsSortAscending;\n } else {\n this.ToolsSortBy = sortBy;\n this.ToolsSortAscending = true;\n }\n this.buildServerGroups();\n this.cdr.detectChanges();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Toggle server group expansion\n */\n public toggleServerGroup(group: MCPServerGroup): void {\n group.expanded = !group.expanded;\n this.cdr.detectChanges();\n }\n\n /**\n * Build server groups from tools data\n */\n private buildServerGroups(): void {\n // Group tools by server\n const serverMap = new Map<string, MCPToolData[]>();\n\n for (const tool of this.filteredTools) {\n const serverId = tool.MCPServerID;\n if (!serverMap.has(serverId)) {\n serverMap.set(serverId, []);\n }\n serverMap.get(serverId)!.push(tool);\n }\n\n // Build server groups\n this.ServerGroups = [];\n for (const server of this.servers) {\n const tools = serverMap.get(server.ID) || [];\n if (tools.length > 0) {\n // Sort tools within group\n this.sortTools(tools);\n\n // Part 3.4 — auto-collapse groups exceeding the threshold\n const startExpanded = tools.length <= this.AUTO_COLLAPSE_THRESHOLD;\n this.ServerGroups.push({\n server,\n tools,\n expanded: startExpanded\n });\n }\n }\n\n // Sort server groups by tool count or name\n this.ServerGroups.sort((a, b) => {\n if (this.ToolsSortBy === 'server') {\n const nameCompare = a.server.Name.localeCompare(b.server.Name);\n return this.ToolsSortAscending ? nameCompare : -nameCompare;\n }\n // Sort by tool count (descending by default)\n const countCompare = b.tools.length - a.tools.length;\n return this.ToolsSortAscending ? -countCompare : countCompare;\n });\n }\n\n /**\n * Sort tools array in place\n */\n private sortTools(tools: MCPToolData[]): void {\n tools.sort((a, b) => {\n let compare = 0;\n switch (this.ToolsSortBy) {\n case 'name':\n compare = (a.ToolTitle || a.ToolName).localeCompare(b.ToolTitle || b.ToolName);\n break;\n case 'discovered':\n compare = new Date(a.DiscoveredAt).getTime() - new Date(b.DiscoveredAt).getTime();\n break;\n case 'lastSeen':\n compare = new Date(a.LastSeenAt).getTime() - new Date(b.LastSeenAt).getTime();\n break;\n default:\n compare = (a.ToolTitle || a.ToolName).localeCompare(b.ToolTitle || b.ToolName);\n }\n return this.ToolsSortAscending ? compare : -compare;\n });\n }\n\n /**\n * Get total tool count across all groups\n */\n public get TotalToolCount(): number {\n return this.ServerGroups.reduce((sum, group) => sum + group.tools.length, 0);\n }\n\n /**\n * Open Test Tool dialog\n */\n public openTestToolDialog(tool?: MCPToolData, connection?: MCPConnectionData): void {\n if (tool) {\n this.TestToolServerID = tool.MCPServerID;\n this.TestToolID = tool.ID;\n } else {\n this.TestToolServerID = null;\n this.TestToolID = null;\n }\n\n if (connection) {\n this.TestToolConnectionID = connection.ID;\n if (!this.TestToolServerID) {\n this.TestToolServerID = connection.MCPServerID;\n }\n } else {\n this.TestToolConnectionID = null;\n }\n\n this.TestStep = 'select';\n this.TestExecutionResult = null;\n this.testUpdateFilteredLists();\n this.ShowTestToolDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Close Test Tool dialog\n */\n public onTestToolDialogClose(): void {\n this.testCloseDialog();\n }\n\n // ========================================\n // Inline Test Tool Methods\n // ========================================\n\n private testUpdateFilteredLists(): void {\n if (this.TestToolServerID) {\n this.TestFilteredConnections = this.connections.filter(\n c => UUIDsEqual(c.MCPServerID, this.TestToolServerID!) && c.Status === 'Active'\n );\n this.TestFilteredTools = this.tools.filter(\n t => UUIDsEqual(t.MCPServerID, this.TestToolServerID!) && t.Status === 'Active'\n );\n if (this.TestFilteredConnections.length > 0 && !this.TestToolConnectionID) {\n this.TestToolConnectionID = this.TestFilteredConnections[0].ID;\n }\n } else {\n this.TestFilteredConnections = [];\n this.TestFilteredTools = [];\n }\n }\n\n public onTestServerChange(value: string): void {\n this.TestToolServerID = value || null;\n this.TestToolConnectionID = null;\n this.TestToolID = null;\n this.testUpdateFilteredLists();\n this.cdr.detectChanges();\n }\n\n public onTestConnectionChange(value: string): void {\n this.TestToolConnectionID = value || null;\n }\n\n public onTestToolSelectChange(value: string): void {\n this.TestToolID = value || null;\n }\n\n public get TestCanProceed(): boolean {\n return !!this.TestToolServerID && !!this.TestToolConnectionID && !!this.TestToolID;\n }\n\n public testProceedToConfig(): void {\n if (!this.TestCanProceed) return;\n this.TestSelectedTool = this.tools.find(t => UUIDsEqual(t.ID, this.TestToolID!)) ?? null;\n if (!this.TestSelectedTool) return;\n this.testParseSchema();\n this.TestStep = 'configure';\n this.cdr.detectChanges();\n }\n\n private testParseSchema(): void {\n this.TestParamConfigs = [];\n this.TestParamValues = {};\n if (!this.TestSelectedTool?.InputSchema) return;\n try {\n const schema = JSON.parse(this.TestSelectedTool.InputSchema) as {\n properties?: Record<string, { type?: string | string[]; description?: string; enum?: unknown[] }>;\n required?: string[];\n };\n const required = schema.required ?? [];\n for (const [name, prop] of Object.entries(schema.properties ?? {})) {\n const rawType = prop.type;\n const type = Array.isArray(rawType)\n ? (rawType.filter(t => t !== 'null')[0] ?? 'string')\n : (rawType ?? 'string');\n this.TestParamConfigs.push({\n name, type, description: prop.description ?? '',\n required: required.includes(name), enumValues: prop.enum ?? []\n });\n this.TestParamValues[name] = '';\n }\n this.TestParamConfigs.sort((a, b) => (a.required === b.required ? 0 : a.required ? -1 : 1));\n } catch (e) {\n console.error('Failed to parse tool schema', e);\n }\n }\n\n public testSetParam(name: string, value: string): void {\n this.TestParamValues[name] = value;\n }\n\n public get TestIsValid(): boolean {\n return this.TestParamConfigs.filter(p => p.required).every(p => !!this.TestParamValues[p.name]);\n }\n\n public async testExecuteTool(): Promise<void> {\n if (!this.TestIsValid || !this.TestToolConnectionID || !this.TestToolID) return;\n this.TestIsExecuting = true;\n this.cdr.detectChanges();\n\n const inputArgs: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(this.TestParamValues)) {\n if (v !== '') inputArgs[k] = v;\n }\n\n const mutation = gql`\n mutation ExecuteMCPTool($input: ExecuteMCPToolInput!) {\n ExecuteMCPTool(input: $input) { Success ErrorMessage Result DurationMs }\n }\n `;\n\n try {\n const result = await GraphQLDataProvider.Instance.ExecuteGQL(mutation, {\n input: {\n ConnectionID: this.TestToolConnectionID,\n ToolID: this.TestToolID,\n ToolName: this.TestSelectedTool?.ToolName,\n InputArgs: JSON.stringify(inputArgs)\n }\n });\n this.TestExecutionResult = result?.ExecuteMCPTool ?? { Success: false, ErrorMessage: 'No result returned' };\n } catch (e) {\n this.TestExecutionResult = { Success: false, ErrorMessage: e instanceof Error ? e.message : String(e) };\n } finally {\n this.TestIsExecuting = false;\n this.TestStep = 'results';\n this.cdr.detectChanges();\n }\n }\n\n public testGoBack(): void {\n this.TestStep = this.TestStep === 'results' ? 'configure' : 'select';\n this.cdr.detectChanges();\n }\n\n public testRunAgain(): void {\n this.TestExecutionResult = null;\n this.TestStep = 'configure';\n this.cdr.detectChanges();\n }\n\n public testCloseDialog(): void {\n this.ShowTestToolDialog = false;\n this.TestStep = 'select';\n this.TestSelectedTool = null;\n this.TestParamConfigs = [];\n this.TestParamValues = {};\n this.TestExecutionResult = null;\n this.cdr.detectChanges();\n }\n\n public formatTestResult(result: unknown): string {\n if (result == null) return '';\n if (typeof result === 'string') return result;\n try {\n return JSON.stringify(result, null, 2);\n } catch {\n return String(result);\n }\n }\n\n /**\n * Part 3.2 — loads a page of tools via the paginated resolver.\n * Uses the same GraphQLDataProvider + gql pattern as testExecuteTool above.\n */\n public async loadToolsPage(reset: boolean = true): Promise<void> {\n if (this.toolsLoading) return;\n this.toolsLoading = true;\n if (reset) {\n this.toolsSkip = 0;\n this.pagedTools = [];\n }\n try {\n const filters = this.filters$.value;\n const query = gql`\n query GetMCPToolsPage($skip: Int!, $take: Int!, $searchText: String, $serverID: String, $category: String) {\n GetMCPToolsPage(skip: $skip, take: $take, searchText: $searchText, serverID: $serverID, category: $category) {\n items { ID MCPServerID ToolName ToolTitle ToolDescription Status ServerName }\n totalCount\n hasMore\n }\n }\n `;\n const result = await GraphQLDataProvider.Instance.ExecuteGQL(query, {\n skip: this.toolsSkip,\n take: this.toolsPageSize,\n searchText: filters.searchTerm || null,\n serverID: (filters.toolsServer && filters.toolsServer !== 'all') ? filters.toolsServer : null,\n category: (filters.toolsCategory && filters.toolsCategory !== 'all') ? filters.toolsCategory : null\n });\n const page = result?.GetMCPToolsPage;\n if (page) {\n this.pagedTools = reset ? page.items : [...this.pagedTools, ...page.items];\n this.toolsTotalCount = page.totalCount;\n this.toolsSkip = this.pagedTools.length;\n }\n } catch (e) {\n console.error('[MCPDashboard] loadToolsPage failed:', e);\n } finally {\n this.toolsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public onToolsScrolledIndexChange(index: number): void {\n if (!this.useScalablePagination || this.toolsLoading) return;\n if (this.pagedTools.length >= this.toolsTotalCount) return;\n if (index + 20 >= this.pagedTools.length) {\n this.loadToolsPage(false);\n }\n }\n\n /** Native-scroll infinite-load: triggers next page when user nears the bottom */\n public onToolsScrollNative(event: Event): void {\n if (!this.useScalablePagination || this.toolsLoading) return;\n if (this.pagedTools.length >= this.toolsTotalCount) return;\n const el = event.target as HTMLElement;\n if (el.scrollTop + el.clientHeight >= el.scrollHeight - 200) {\n this.loadToolsPage(false);\n }\n }\n\n public toggleScalableMode(enabled: boolean): void {\n this.useScalablePagination = enabled;\n if (enabled && this.pagedTools.length === 0) {\n this.loadToolsPage(true);\n this.loadToolCounts();\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Part 3.4 — fetch global + per-server + per-category counts (used for badges\n * and to populate the category filter dropdown). Respects current search filter.\n */\n public async loadToolCounts(): Promise<void> {\n try {\n const filters = this.filters$.value;\n const query = gql`\n query GetMCPToolCounts($serverID: String, $searchText: String) {\n GetMCPToolCounts(serverID: $serverID, searchText: $searchText) {\n totalCount\n countByServer { serverID serverName count }\n countByCategory { category count }\n }\n }\n `;\n const result = await GraphQLDataProvider.Instance.ExecuteGQL(query, {\n serverID: (filters.toolsServer && filters.toolsServer !== 'all') ? filters.toolsServer : null,\n searchText: filters.searchTerm || null\n });\n const counts = result?.GetMCPToolCounts;\n if (counts) {\n this.toolsGlobalCount = counts.totalCount;\n this.toolCountByServer = {};\n (counts.countByServer || []).forEach((r: { serverID: string; count: number }) => {\n this.toolCountByServer[r.serverID] = r.count;\n });\n this.toolsAvailableCategories = (counts.countByCategory || [])\n .filter((c: { category: string }) => c.category && c.category.length > 0)\n .sort((a: { category: string }, b: { category: string }) => a.category.localeCompare(b.category));\n // Available servers derived from the servers list (already loaded)\n this.toolsAvailableServers = this.servers.map(s => ({ ID: s.ID, Name: s.Name }));\n this.cdr.detectChanges();\n }\n } catch (e) {\n console.warn('[MCPDashboard] loadToolCounts failed:', e);\n }\n }\n\n /** Part 3.4 — returns tool count for a server (falls back to ServerGroups length for legacy view) */\n public getServerToolCount(serverID: string): number {\n return this.toolCountByServer[serverID] ?? this.tools.filter(t => UUIDsEqual(t.MCPServerID, serverID)).length;\n }\n\n public trackPagedTool(_index: number, tool: MCPToolSummary): string {\n return tool.ID;\n }\n\n /** Part 3.6 — Scale mode display. When a client-side filter (Favorites/Recently-used) is active,\n * bypass server pagination and filter the fully-loaded local `this.tools` list so the filter\n * considers ALL tools, not just the current 50-row page. */\n public get visiblePagedTools(): MCPToolSummary[] {\n const f = this.filters$.value;\n if (f.favoritesOnly || f.recentOnly) {\n const search = (f.searchTerm || '').toLowerCase();\n const recent = f.recentOnly ? this.recentToolIDSet() : null;\n return this.tools\n .filter(t => {\n if (f.favoritesOnly && !this.isFavorited(t.ID)) return false;\n if (recent && !recent.has(NormalizeUUID(t.ID))) return false;\n if (f.toolsServer && f.toolsServer !== 'all' && !UUIDsEqual(t.MCPServerID, f.toolsServer)) return false;\n if (f.toolsCategory && f.toolsCategory !== 'all') {\n const idx = t.ToolName.indexOf('_');\n const cat = idx > 0 ? t.ToolName.substring(0, idx) : t.ToolName;\n if (cat !== f.toolsCategory) return false;\n }\n if (search && !(\n t.ToolName.toLowerCase().includes(search) ||\n (t.ToolTitle?.toLowerCase().includes(search) ?? false) ||\n (t.ToolDescription?.toLowerCase().includes(search) ?? false)\n )) return false;\n return true;\n })\n .map(t => ({\n ID: t.ID,\n MCPServerID: t.MCPServerID,\n ToolName: t.ToolName,\n ToolTitle: t.ToolTitle ?? null,\n ToolDescription: t.ToolDescription ?? null,\n Status: t.Status,\n ServerName: t.ServerName ?? null\n }));\n }\n return this.pagedTools;\n }\n\n /** Scale-mode denominator. In bypass-pagination mode (favorites/recent filters), the user\n * sees the fully filtered local list, so the \"of N\" reflects that filtered total.\n * Otherwise we show the server-side total for the current query. */\n public scaleDenominator(): number {\n const f = this.filters$.value;\n if (f.favoritesOnly || f.recentOnly) {\n return this.visiblePagedTools.length;\n }\n return this.toolsTotalCount;\n }\n\n /** Part 3.5 — recently used tool IDs derived from execution logs (dedup, max 5) */\n public get TestRecentToolIDs(): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const log of this.executionLogs) {\n if (!log.ToolID) continue;\n if (seen.has(log.ToolID)) continue;\n seen.add(log.ToolID);\n out.push(log.ToolID);\n if (out.length >= 5) break;\n }\n return out;\n }\n\n /** Part 3.5 — Test dialog combobox: filtered tools with recent-first ordering */\n public get TestComboboxTools(): MCPToolData[] {\n const term = this.TestToolSearch.trim().toLowerCase();\n const base = this.TestFilteredTools.filter(t =>\n !term ||\n t.ToolName.toLowerCase().includes(term) ||\n (t.ToolTitle && t.ToolTitle.toLowerCase().includes(term)) ||\n (t.ToolDescription && t.ToolDescription.toLowerCase().includes(term))\n );\n const recentSet = new Set(this.TestRecentToolIDs);\n const recent = base.filter(t => recentSet.has(t.ID));\n const rest = base.filter(t => !recentSet.has(t.ID));\n return [...recent, ...rest];\n }\n\n public isRecentTestTool(toolID: string): boolean {\n return this.TestRecentToolIDs.includes(toolID);\n }\n\n public onTestToolSearchChange(value: string): void {\n this.TestToolSearch = value;\n this.cdr.detectChanges();\n }\n\n public pickTestTool(toolID: string): void {\n this.TestToolID = toolID;\n this.cdr.detectChanges();\n }\n\n /**\n * Part 3.6 — load the current user's favorited tool IDs.\n */\n public async loadFavorites(): Promise<void> {\n try {\n const md = new Metadata();\n const currentUserID = md.CurrentUser?.ID;\n if (!currentUserID) return;\n // MCPEngine caches MCP: Tool Favorites via BaseEngine CacheLocal — Config() is\n // idempotent, and the cache auto-invalidates on Save/Delete via BaseEntity events,\n // so repeat loads hit the Global Object Store with no DB round-trip.\n await MCPEngine.Instance.Config();\n const userFavorites = MCPEngine.Instance.GetFavoritesByUser(currentUserID);\n this.favoritedToolIDs = new Set(userFavorites.map(f => NormalizeUUID(f.MCPServerToolID)));\n this.cdr.detectChanges();\n } catch (e) {\n console.warn('[MCPDashboard] loadFavorites failed:', e);\n }\n }\n\n public isFavorited(toolID: string): boolean {\n return this.favoritedToolIDs.has(NormalizeUUID(toolID));\n }\n\n /** Part 3.3 — set of tool IDs seen in recent execution logs (last N unique). */\n public recentToolIDSet(): Set<string> {\n const out = new Set<string>();\n for (const log of this.executionLogs) {\n if (log.ToolID) out.add(NormalizeUUID(log.ToolID));\n }\n return out;\n }\n\n public async toggleFavorite(toolID: string, event?: Event): Promise<void> {\n if (event) event.stopPropagation();\n const md = new Metadata();\n const currentUserID = md.CurrentUser?.ID;\n if (!currentUserID) {\n console.warn('[MCPDashboard] toggleFavorite: no current user');\n return;\n }\n const normalizedID = NormalizeUUID(toolID);\n const isFav = this.favoritedToolIDs.has(normalizedID);\n try {\n if (isFav) {\n // Find the existing favorite in MCPEngine's cache and Delete via the entity —\n // BaseEngine's event-driven cache sync will drop it from _Favorites automatically.\n await MCPEngine.Instance.Config();\n const entity = MCPEngine.Instance.GetFavoriteByUserAndTool(currentUserID, toolID);\n if (!entity) {\n // Cache says it's missing but UI thought it was favorited — drop from the\n // local Set so the UI reconciles.\n this.favoritedToolIDs.delete(normalizedID);\n } else {\n const deleted = await entity.Delete();\n if (!deleted) {\n console.warn('[MCPDashboard] Delete favorite failed:', entity.LatestResult?.CompleteMessage);\n return;\n }\n this.favoritedToolIDs.delete(normalizedID);\n }\n } else {\n const entity = await md.GetEntityObject<MJMCPToolFavoriteEntity>('MJ: MCP Tool Favorites');\n entity.NewRecord();\n entity.UserID = currentUserID;\n entity.MCPServerToolID = toolID;\n const saved = await entity.Save();\n if (!saved) {\n console.warn('[MCPDashboard] Save favorite failed:', entity.LatestResult?.CompleteMessage);\n return;\n }\n this.favoritedToolIDs.add(normalizedID);\n }\n // Force a new Set instance so Angular change detection picks it up\n this.favoritedToolIDs = new Set(this.favoritedToolIDs);\n this.cdr.detectChanges();\n } catch (e) {\n console.error('[MCPDashboard] toggleFavorite failed:', e);\n }\n }\n\n public formatLogJson(value: string | null | undefined): string {\n if (!value) return '';\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n\n /**\n * Parse and return input schema as formatted JSON\n */\n public getFormattedInputSchema(tool: MCPToolData): string {\n if (!tool.InputSchema) return 'No input schema';\n try {\n const schema = JSON.parse(tool.InputSchema);\n return JSON.stringify(schema, null, 2);\n } catch {\n return tool.InputSchema;\n }\n }\n\n /**\n * Get parameter count from input schema\n */\n public getParamCount(tool: MCPToolData): number {\n if (!tool.InputSchema) return 0;\n try {\n const schema = JSON.parse(tool.InputSchema);\n return Object.keys(schema.properties || {}).length;\n } catch {\n return 0;\n }\n }\n\n /**\n * Get required parameter count from input schema\n */\n public getRequiredParamCount(tool: MCPToolData): number {\n if (!tool.InputSchema) return 0;\n try {\n const schema = JSON.parse(tool.InputSchema);\n return (schema.required || []).length;\n } catch {\n return 0;\n }\n }\n\n // ========================================\n // Sync Operations\n // ========================================\n\n /**\n * Syncs tools for a specific connection\n */\n public async syncConnectionTools(connection: MCPConnectionData): Promise<void> {\n const connectionId = connection.ID;\n\n // Subscribe to sync state updates for this connection\n if (!this.syncSubscriptions.has(connectionId)) {\n const sub = this.mcpToolsService.getSyncState(connectionId)\n .pipe(takeUntil(this.destroy$))\n .subscribe(state => {\n this.SyncStates.set(connectionId, state);\n this.cdr.detectChanges();\n });\n this.syncSubscriptions.set(connectionId, sub);\n }\n\n try {\n const result: MCPSyncResult = await this.mcpToolsService.syncTools(connectionId);\n\n if (result.Success) {\n // Force refresh to show updated tools - backend changes don't trigger local events\n await this.loadAllData(true);\n } else if (result.RequiresOAuth || result.RequiresReauthorization) {\n // OAuth authorization is required - initiate fresh OAuth flow with frontend callback\n // Note: We ignore result.AuthorizationUrl because it was built with the server's callback URL\n // We need to initiate a fresh flow that uses the frontend callback URL\n console.log(`[MCPDashboard] OAuth ${result.RequiresReauthorization ? 're-' : ''}authorization required, initiating frontend OAuth flow...`);\n await this.initiateOAuthFlow(connectionId);\n } else {\n this.ErrorMessage = `Sync failed: ${result.ErrorMessage}`;\n }\n } catch (error) {\n this.ErrorMessage = `Sync error: ${error instanceof Error ? error.message : String(error)}`;\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Gets the sync state for a connection\n */\n public getSyncState(connectionId: string): MCPSyncState | undefined {\n return this.SyncStates.get(connectionId);\n }\n\n /**\n * Checks if a connection is currently syncing\n */\n public isSyncing(connectionId: string): boolean {\n return this.mcpToolsService.isSyncing(connectionId);\n }\n\n /**\n * Gets sync progress message for a connection\n */\n public getSyncProgressMessage(connectionId: string): string {\n const state = this.SyncStates.get(connectionId);\n if (!state?.progress) return '';\n return state.progress.message;\n }\n\n // ========================================\n // OAuth Operations\n // ========================================\n\n /**\n * Checks for OAuth completion by looking for query params set by the OAuth callback\n */\n private checkOAuthCompletion(): void {\n const params = this.GetQueryParams();\n\n if (params['oauth'] === 'success') {\n // OAuth completed successfully\n const connectionId = params['connectionId'];\n console.log(`[MCPDashboard] OAuth authorization completed for connection: ${connectionId}`);\n\n // Show success notification\n this.showSuccessNotification('OAuth authorization completed successfully');\n\n // Clear the OAuth query params, preserving the tab param\n this.UpdateQueryParams({ oauth: null, connectionId: null, error: null, error_description: null });\n\n // Refresh data to pick up new OAuth state\n this.loadAllData(true);\n } else if (params['oauth'] === 'error') {\n // OAuth failed\n const errorMessage = params['error_description'] || 'Authorization failed';\n console.error(`[MCPDashboard] OAuth authorization failed: ${params['error'] ?? 'unknown_error'} - ${errorMessage}`);\n\n // Show error message\n this.ErrorMessage = `OAuth authorization failed: ${errorMessage}`;\n\n // Clear the OAuth query params\n this.UpdateQueryParams({ oauth: null, connectionId: null, error: null, error_description: null });\n }\n }\n\n /**\n * Shows a success notification (temporary)\n */\n private showSuccessNotification(message: string): void {\n // For now, use a simple console log and clear any error message\n console.log(`[MCPDashboard] Success: ${message}`);\n this.ErrorMessage = null;\n // TODO: Implement proper toast/notification system\n }\n\n /**\n * Initiates OAuth authorization flow for a connection.\n * Stores the current URL and redirects directly to the OAuth provider.\n * Always uses the frontend callback URL so the OAuth redirect comes back to MJExplorer.\n *\n * @param connectionId - The MCP connection ID requiring OAuth\n */\n public async initiateOAuthFlow(connectionId: string): Promise<void> {\n // Store current URL for return after OAuth completion\n // Store both full URL and path-only version for cross-origin scenarios\n const currentUrl = window.location.href;\n const currentPath = window.location.pathname + window.location.search;\n\n // Store in both localStorage and sessionStorage for redundancy\n localStorage.setItem('oauth_return_url', currentUrl);\n localStorage.setItem('oauth_return_path', currentPath);\n sessionStorage.setItem('oauth_return_url', currentUrl);\n sessionStorage.setItem('oauth_return_path', currentPath);\n\n console.log('[MCPDashboard] Stored OAuth return URL:', currentUrl);\n console.log('[MCPDashboard] Stored OAuth return path:', currentPath);\n\n // Initiate OAuth via GraphQL to get the URL with frontend callback\n const result = await this.initiateMCPOAuth(connectionId);\n if (result.Success && result.AuthorizationUrl) {\n console.log('[MCPDashboard] Redirecting to OAuth provider:', result.AuthorizationUrl);\n window.location.href = result.AuthorizationUrl;\n } else {\n this.ErrorMessage = result.ErrorMessage || 'Failed to initiate OAuth authorization';\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Calls the InitiateMCPOAuth mutation with frontend callback URL\n */\n private async initiateMCPOAuth(connectionId: string): Promise<{\n Success: boolean;\n AuthorizationUrl?: string;\n ErrorMessage?: string;\n }> {\n try {\n const { GraphQLDataProvider, gql } = await import('@memberjunction/graphql-dataprovider');\n\n const mutation = gql`\n mutation InitiateMCPOAuth($input: InitiateMCPOAuthInput!) {\n InitiateMCPOAuth(input: $input) {\n Success\n ErrorMessage\n AuthorizationUrl\n StateParameter\n }\n }\n `;\n\n // Use the frontend callback URL so we handle the OAuth redirect\n const frontendCallbackUrl = `${window.location.origin}/oauth/callback`;\n\n const result = await GraphQLDataProvider.Instance.ExecuteGQL(mutation, {\n input: {\n ConnectionID: connectionId,\n FrontendCallbackUrl: frontendCallbackUrl\n }\n });\n\n return result?.InitiateMCPOAuth || { Success: false, ErrorMessage: 'No result returned' };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { Success: false, ErrorMessage: message };\n }\n }\n\n // ========================================\n // Utility Methods\n // ========================================\n\n public getStatusClass(status: string): string {\n switch (status) {\n case 'Active':\n return 'status-active';\n case 'Inactive':\n return 'status-inactive';\n case 'Error':\n return 'status-error';\n case 'Deprecated':\n return 'status-deprecated';\n default:\n return 'status-unknown';\n }\n }\n\n public getTransportIcon(transportType: string): string {\n switch (transportType) {\n case 'StreamableHTTP':\n case 'SSE':\n return 'fa-solid fa-globe';\n case 'Stdio':\n return 'fa-solid fa-terminal';\n case 'WebSocket':\n return 'fa-solid fa-plug';\n default:\n return 'fa-solid fa-question';\n }\n }\n\n public formatDate(date: Date | string | null): string {\n if (!date) return 'Never';\n const d = typeof date === 'string' ? new Date(date) : date;\n return d.toLocaleString();\n }\n\n public formatDuration(ms: number | null): string {\n if (ms === null) return '-';\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n }\n\n // ========================================\n // Logs Sorting\n // ========================================\n\n /**\n * Handles click on a sortable column header\n */\n public onLogSortColumn(column: typeof this.LogsSortColumn): void {\n if (this.LogsSortColumn === column) {\n // Toggle sort direction\n this.LogsSortAscending = !this.LogsSortAscending;\n } else {\n // New column, default to descending for dates/duration, ascending for text\n this.LogsSortColumn = column;\n this.LogsSortAscending = column !== 'started' && column !== 'duration';\n }\n this.sortFilteredLogs();\n this.cdr.detectChanges();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Sorts the filtered logs based on current sort settings\n */\n private sortFilteredLogs(): void {\n const direction = this.LogsSortAscending ? 1 : -1;\n\n this.filteredLogs.sort((a, b) => {\n let valA: string | number | Date | null;\n let valB: string | number | Date | null;\n\n switch (this.LogsSortColumn) {\n case 'status':\n valA = a.Status || '';\n valB = b.Status || '';\n break;\n case 'server':\n valA = a.ServerName || '';\n valB = b.ServerName || '';\n break;\n case 'tool':\n valA = a.ToolName || '';\n valB = b.ToolName || '';\n break;\n case 'connection':\n valA = a.ConnectionName || '';\n valB = b.ConnectionName || '';\n break;\n case 'started':\n valA = a.StartedAt ? new Date(a.StartedAt).getTime() : 0;\n valB = b.StartedAt ? new Date(b.StartedAt).getTime() : 0;\n break;\n case 'duration':\n valA = a.DurationMs ?? -1;\n valB = b.DurationMs ?? -1;\n break;\n case 'error':\n valA = a.ErrorMessage || '';\n valB = b.ErrorMessage || '';\n break;\n default:\n return 0;\n }\n\n if (typeof valA === 'string' && typeof valB === 'string') {\n return valA.localeCompare(valB) * direction;\n }\n if (valA < valB) return -1 * direction;\n if (valA > valB) return 1 * direction;\n return 0;\n });\n }\n\n /**\n * Gets the sort indicator class for a column header\n */\n public getLogSortClass(column: typeof this.LogsSortColumn): string {\n if (this.LogsSortColumn !== column) return '';\n return this.LogsSortAscending ? 'sorted-asc' : 'sorted-desc';\n }\n\n // ========================================\n // Log Detail Panel\n // ========================================\n\n /**\n * Handles click on a log row to show detail panel\n */\n public async onLogClick(log: MCPExecutionLogData): Promise<void> {\n // Load full log details if needed (InputArgs, Result)\n if (!log.InputArgs && !log.Result) {\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJMCPToolExecutionLogEntity>({\n EntityName: 'MJ: MCP Tool Execution Logs',\n ExtraFilter: `ID='${log.ID}'`,\n ResultType: 'simple'\n });\n if (result.Success && result.Results.length > 0) {\n const fullLog = this.mapLogFromDatabase(result.Results[0]);\n // Merge full log data (preserving already enriched fields)\n log.InputArgs = fullLog.InputArgs;\n log.Result = fullLog.Result;\n log.ErrorMessage = fullLog.ErrorMessage || log.ErrorMessage;\n }\n } catch (error) {\n console.warn('[MCPDashboard] Failed to load full log details:', error);\n }\n }\n\n // Enrich with server name\n const connection = this.connections.find(c => UUIDsEqual(c.ID, log.ConnectionID));\n if (connection) {\n log.ServerName = connection.ServerName;\n }\n\n this.SelectedLog = log;\n this.ShowLogDetailPanel = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Closes the log detail panel\n */\n public onLogDetailClose(): void {\n this.ShowLogDetailPanel = false;\n this.SelectedLog = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Handles run again from log detail panel\n */\n public onRunAgainFromLog(event: { toolId: string; connectionId: string }): void {\n this.ShowLogDetailPanel = false;\n this.SelectedLog = null;\n\n // Open test tool dialog with pre-selected tool and connection\n const tool = this.tools.find(t => UUIDsEqual(t.ID, event.toolId));\n const connection = this.connections.find(c => UUIDsEqual(c.ID, event.connectionId));\n\n if (tool) {\n this.TestToolServerID = tool.MCPServerID;\n this.TestToolID = tool.ID;\n }\n if (connection) {\n this.TestToolConnectionID = connection.ID;\n }\n\n this.ShowTestToolDialog = true;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Expandable Server/Connection Cards\n // ========================================\n\n /**\n * Toggles server card expansion\n */\n public toggleServerExpand(server: MCPServerData): void {\n if (UUIDsEqual(this.ExpandedServerID, server.ID)) {\n this.ExpandedServerID = null;\n } else {\n this.ExpandedServerID = server.ID;\n // Collapse any expanded connection\n this.ExpandedConnectionID = null;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Toggles connection card expansion\n */\n public toggleConnectionExpand(conn: MCPConnectionData): void {\n if (UUIDsEqual(this.ExpandedConnectionID, conn.ID)) {\n this.ExpandedConnectionID = null;\n } else {\n this.ExpandedConnectionID = conn.ID;\n // Collapse any expanded server\n this.ExpandedServerID = null;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Checks if a server card is expanded\n */\n public isServerExpanded(server: MCPServerData): boolean {\n return UUIDsEqual(this.ExpandedServerID, server.ID);\n }\n\n /**\n * Checks if a connection card is expanded\n */\n public isConnectionExpanded(conn: MCPConnectionData): boolean {\n return UUIDsEqual(this.ExpandedConnectionID, conn.ID);\n }\n\n /**\n * Gets tools for a specific server\n */\n public getToolsForServer(serverId: string): MCPToolData[] {\n return this.tools.filter(t => UUIDsEqual(t.MCPServerID, serverId));\n }\n\n /**\n * Gets tools for a specific connection (via its server)\n */\n public getToolsForConnection(connectionId: string): MCPToolData[] {\n const connection = this.connections.find(c => UUIDsEqual(c.ID, connectionId));\n if (!connection) return [];\n return this.tools.filter(t => UUIDsEqual(t.MCPServerID, connection.MCPServerID));\n }\n\n /**\n * Opens test tool dialog with a specific tool from expanded card\n */\n public runToolFromCard(tool: MCPToolData, connection?: MCPConnectionData): void {\n this.TestToolServerID = tool.MCPServerID;\n this.TestToolID = tool.ID;\n this.TestToolConnectionID = connection?.ID ?? null;\n this.ShowTestToolDialog = true;\n this.cdr.detectChanges();\n }\n}\n","<div class=\"mcp-dashboard\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <h2 class=\"dashboard-title\">\n <i class=\"fa-solid fa-plug-circle-bolt\"></i>\n MCP Dashboard\n </h2>\n <button\n type=\"button\"\n class=\"filter-toggle-btn\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (FilterPanelVisible) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ CurrentFilteredCount }} of {{ CurrentTotalCount }} items</span>\n </div>\n\n <div class=\"header-controls\">\n <!-- Tab Navigation -->\n <div class=\"tab-nav\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'servers'\"\n (click)=\"setActiveTab('servers')\">\n <i class=\"fa-solid fa-server\"></i>\n <span class=\"tab-label\">Servers</span>\n <span class=\"tab-badge\">{{ servers.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'connections'\"\n (click)=\"setActiveTab('connections')\">\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"tab-label\">Connections</span>\n <span class=\"tab-badge\">{{ connections.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'tools'\"\n (click)=\"setActiveTab('tools')\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"tab-label\">Tools</span>\n <span class=\"tab-badge\">{{ tools.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'logs'\"\n (click)=\"setActiveTab('logs')\">\n <i class=\"fa-solid fa-list-check\"></i>\n <span class=\"tab-label\">Logs</span>\n <span class=\"tab-badge\" [class.has-errors]=\"stats.failedExecutions > 0\">{{ executionLogs.length }}</span>\n </button>\n </div>\n\n <!-- Action Buttons based on tab -->\n @switch (ActiveTab) {\n @case ('servers') {\n <button mjButton variant=\"primary\" (click)=\"createServer()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Server\n </button>\n }\n @case ('connections') {\n <button mjButton variant=\"primary\" (click)=\"createConnection()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Connection\n </button>\n }\n @case ('tools') {\n <!-- View Mode Toggle -->\n <div class=\"view-toggle\">\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"ToolsViewMode === 'card'\"\n (click)=\"setToolsViewMode('card')\"\n title=\"Card View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"ToolsViewMode === 'list'\"\n (click)=\"setToolsViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n <button mjButton variant=\"primary\" (click)=\"openTestToolDialog()\">\n <i class=\"fa-solid fa-play\"></i>\n Test Tool\n </button>\n }\n @case ('logs') {\n <button mjButton variant=\"flat\" (click)=\"loadAllData()\" [disabled]=\"IsLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-sync\" [class.fa-spin]=\"IsLoading\"></i>\n Refresh\n </button>\n }\n }\n </div>\n </div>\n\n <!-- Main Content with Filter Panel -->\n <div class=\"main-content\">\n <!-- Filter Panel (Left) — INLINED to avoid module-resolution failures in dynamic component -->\n <div class=\"filter-panel-container\" [class.hidden]=\"!FilterPanelVisible\">\n <div style=\"padding:12px;border-right:1px solid var(--mj-border-default,#e0e0e0);height:100%;box-sizing:border-box;overflow-y:auto;background:var(--mj-bg-surface,#fff);min-width:240px\">\n <!-- Header -->\n <div style=\"display:flex;align-items:center;justify-content:space-between;margin-bottom:12px\">\n <div style=\"display:flex;align-items:center;gap:6px\">\n <h3 style=\"margin:0;font-size:0.95rem;font-weight:600\">MCP Filters</h3>\n @if (activeFilterCount() > 0) {\n <span style=\"padding:2px 8px;background:var(--mj-brand-primary,#264FAF);color:#fff;border-radius:10px;font-size:0.7rem;font-weight:600\">{{ activeFilterCount() }}</span>\n }\n </div>\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888)\">{{ CurrentFilteredCount }} / {{ CurrentTotalCount }}</div>\n </div>\n\n <!-- Search -->\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-search\"></i> Search</label>\n <input #fSearch type=\"text\" class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.searchTerm\" (input)=\"onFilterFieldChange('searchTerm', fSearch.value)\" placeholder=\"Search…\" />\n </div>\n\n <!-- Tool tab filters -->\n @if (ActiveTab === 'tools') {\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-server\"></i> Server</label>\n <select #fServer class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.toolsServer ?? 'all'\" (change)=\"onFilterFieldChange('toolsServer', fServer.value)\">\n <option value=\"all\">All Servers</option>\n @for (s of toolsAvailableServers; track s.ID) {\n <option [value]=\"s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-tags\"></i> Category</label>\n <select #fCat class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.toolsCategory ?? 'all'\" (change)=\"onFilterFieldChange('toolsCategory', fCat.value)\">\n <option value=\"all\">All Categories</option>\n @for (c of toolsAvailableCategories; track c.category) {\n <option [value]=\"c.category\">{{ c.category }} ({{ c.count }})</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:12px\">\n <label style=\"display:flex;align-items:center;gap:6px;cursor:pointer;font-size:0.85rem\">\n <input #fFav type=\"checkbox\" [checked]=\"CurrentFilters.favoritesOnly === true\" (change)=\"onFilterFieldChange('favoritesOnly', fFav.checked)\" />\n <i class=\"fa-solid fa-star\" style=\"color:var(--mj-status-warning,#f59e0b)\"></i>\n Favorites only\n </label>\n </div>\n <div style=\"margin-bottom:12px\">\n <label style=\"display:flex;align-items:center;gap:6px;cursor:pointer;font-size:0.85rem\">\n <input #fRec type=\"checkbox\" [checked]=\"CurrentFilters.recentOnly === true\" (change)=\"onFilterFieldChange('recentOnly', fRec.checked)\" />\n <i class=\"fa-solid fa-clock-rotate-left\" style=\"color:var(--mj-brand-primary,#264FAF)\"></i>\n Recently used only\n </label>\n </div>\n }\n\n <!-- Tab-specific status filter -->\n @if (ActiveTab === 'servers') {\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-toggle-on\"></i> Server Status</label>\n <select #fSStatus class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.serverStatus\" (change)=\"onFilterFieldChange('serverStatus', fSStatus.value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n }\n @if (ActiveTab === 'connections') {\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-toggle-on\"></i> Connection Status</label>\n <select #fCStatus class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.connectionStatus\" (change)=\"onFilterFieldChange('connectionStatus', fCStatus.value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n <option value=\"Error\">Error</option>\n </select>\n </div>\n }\n @if (ActiveTab === 'tools') {\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-toggle-on\"></i> Tool Status</label>\n <select #fTStatus class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.toolStatus\" (change)=\"onFilterFieldChange('toolStatus', fTStatus.value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"Active\">Active</option>\n <option value=\"Deprecated\">Deprecated</option>\n </select>\n </div>\n }\n @if (ActiveTab === 'logs') {\n <div style=\"margin-bottom:12px\">\n <label style=\"display:block;font-size:0.75rem;color:var(--mj-text-secondary,#475569);margin-bottom:4px\"><i class=\"fa-solid fa-circle-check\"></i> Log Status</label>\n <select #fLStatus class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [value]=\"CurrentFilters.logStatus\" (change)=\"onFilterFieldChange('logStatus', fLStatus.value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"Success\">Success</option>\n <option value=\"Error\">Error</option>\n <option value=\"Running\">Running</option>\n </select>\n </div>\n }\n\n <!-- Reset -->\n <div style=\"margin-top:16px\">\n <button mjButton variant=\"flat\" style=\"width:100%\" (click)=\"resetAllFilters()\">\n <i class=\"fa-solid fa-undo\"></i> Reset Filters\n </button>\n </div>\n </div>\n <div class=\"resize-handle\"></div>\n </div>\n\n <!-- Content Area -->\n <div class=\"content-area\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ ErrorMessage }}\n <button class=\"close-btn\" (click)=\"ErrorMessage = null\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n\n <!-- Content Body -->\n <div class=\"content-body\">\n @if (IsLoading) {\n <mj-loading text=\"Loading MCP data...\"></mj-loading>\n } @else {\n @switch (ActiveTab) {\n <!-- Servers Tab -->\n @case ('servers') {\n <div class=\"data-grid servers-grid\">\n @if (filteredServers.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-server\"></i>\n <p>No MCP servers configured</p>\n <button mjButton variant=\"primary\" (click)=\"createServer()\">\n Add Your First Server\n </button>\n </div>\n } @else {\n @for (server of filteredServers; track server.ID) {\n <div class=\"data-card\" [class.expanded]=\"isServerExpanded(server)\">\n <div class=\"card-header clickable\" (click)=\"toggleServerExpand(server)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isServerExpanded(server)\"></i>\n <i [class]=\"getTransportIcon(server.TransportType)\"></i>\n <span class=\"name\">{{ server.Name }}</span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(server.Status)\">\n {{ server.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton variant=\"flat\" (click)=\"editServer(server)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button mjButton variant=\"flat\" (click)=\"deleteServer(server)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n @if (server.Description) {\n <p class=\"description\">{{ server.Description }}</p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Transport</span>\n <span class=\"value\">{{ server.TransportType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auth</span>\n <span class=\"value\">{{ server.DefaultAuthType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Connections</span>\n <span class=\"value\">{{ server.ConnectionCount }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Tools</span>\n <span class=\"value\">{{ server.ToolCount }}</span>\n </div>\n @if (server.ServerURL) {\n <div class=\"detail full-width\">\n <span class=\"label\">URL</span>\n <span class=\"value url\">{{ server.ServerURL }}</span>\n </div>\n }\n @if (server.Command) {\n <div class=\"detail full-width\">\n <span class=\"label\">Command</span>\n <span class=\"value command\">{{ server.Command }}</span>\n </div>\n }\n <div class=\"detail\">\n <span class=\"label\">Last Sync</span>\n <span class=\"value\">{{ formatDate(server.LastSyncAt) }}</span>\n </div>\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isServerExpanded(server)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForServer(server.ID).length }})</span>\n </div>\n @if (getToolsForServer(server.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Sync a connection to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForServer(server.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"runToolFromCard(tool); $event.stopPropagation()\"\n title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Connections Tab -->\n @case ('connections') {\n <div class=\"data-grid connections-grid\">\n @if (filteredConnections.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-link\"></i>\n <p>No connections configured</p>\n <button mjButton variant=\"primary\" (click)=\"createConnection()\">\n Add Your First Connection\n </button>\n </div>\n } @else {\n @for (conn of filteredConnections; track conn.ID) {\n <div class=\"data-card\" [class.expanded]=\"isConnectionExpanded(conn)\">\n <div class=\"card-header clickable\" (click)=\"toggleConnectionExpand(conn)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isConnectionExpanded(conn)\"></i>\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"name\">{{ conn.Name }}</span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(conn.Status)\">\n {{ conn.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton\n variant=\"flat\"\n (click)=\"syncConnectionTools(conn)\"\n [disabled]=\"isSyncing(conn.ID)\"\n title=\"Sync Tools\">\n @if (isSyncing(conn.ID)) {\n <i class=\"fa-solid fa-sync fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-sync\"></i>\n }\n </button>\n <button mjButton variant=\"flat\" (click)=\"editConnection(conn)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button mjButton variant=\"flat\" (click)=\"deleteConnection(conn)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <!-- Sync Progress Banner -->\n @if (isSyncing(conn.ID)) {\n <div class=\"sync-progress-banner\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span class=\"sync-message\">{{ getSyncProgressMessage(conn.ID) || 'Syncing...' }}</span>\n </div>\n }\n <!-- Sync Result Banner -->\n @if (getSyncState(conn.ID)?.lastResult && !isSyncing(conn.ID)) {\n <div class=\"sync-result-banner\"\n [class.success]=\"getSyncState(conn.ID)?.lastResult?.Success\"\n [class.error]=\"!getSyncState(conn.ID)?.lastResult?.Success\">\n @if (getSyncState(conn.ID)?.lastResult?.Success) {\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Synced: {{ getSyncState(conn.ID)?.lastResult?.Added }} added,\n {{ getSyncState(conn.ID)?.lastResult?.Updated }} updated,\n {{ getSyncState(conn.ID)?.lastResult?.Deprecated }} deprecated\n </span>\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ getSyncState(conn.ID)?.lastResult?.ErrorMessage }}</span>\n }\n </div>\n }\n <div class=\"card-body\">\n @if (conn.Description) {\n <p class=\"description\">{{ conn.Description }}</p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Server</span>\n <span class=\"value\">{{ conn.ServerName }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auto Sync</span>\n <span class=\"value\">{{ conn.AutoSyncTools ? 'Yes' : 'No' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Logging</span>\n <span class=\"value\">{{ conn.LogToolCalls ? 'Enabled' : 'Disabled' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Last Connected</span>\n <span class=\"value\">{{ formatDate(conn.LastConnectedAt) }}</span>\n </div>\n @if (conn.LastErrorMessage) {\n <div class=\"detail full-width error\">\n <span class=\"label\">Last Error</span>\n <span class=\"value\">{{ conn.LastErrorMessage }}</span>\n </div>\n }\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isConnectionExpanded(conn)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForConnection(conn.ID).length }})</span>\n </div>\n @if (getToolsForConnection(conn.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Click the sync button to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForConnection(conn.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"runToolFromCard(tool, conn); $event.stopPropagation()\"\n title=\"Test this tool with this connection\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Tools Tab -->\n @case ('tools') {\n <!-- Scale-mode toggle (Part 3.2): flip to virtual-scrolled paginated list for 1000s of tools -->\n <div style=\"display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:4px 0;font-size:0.8rem;color:var(--mj-text-muted,#888)\">\n <label style=\"display:flex;align-items:center;gap:6px;cursor:pointer\">\n <input type=\"checkbox\" [checked]=\"useScalablePagination\" (change)=\"toggleScalableMode($any($event.target).checked)\" />\n Scale mode (virtual scroll, paginated)\n </label>\n @if (useScalablePagination) {\n <span>· Showing {{ pagedTools.length }} of {{ toolsTotalCount }}</span>\n }\n </div>\n @if (useScalablePagination) {\n <div style=\"padding:8px 12px;font-size:0.8rem;color:var(--mj-text-secondary,#475569);background:var(--mj-bg-surface-card,#f8f9fa);border-radius:4px;margin-bottom:6px\">\n Showing <strong>{{ visiblePagedTools.length }}</strong> of <strong>{{ scaleDenominator() }}</strong> tools\n </div>\n <div style=\"height:calc(100vh - 260px);width:100%;overflow-y:auto;border:1px solid var(--mj-border-subtle,#eee);border-radius:4px\" (scroll)=\"onToolsScrollNative($event)\">\n @for (tool of visiblePagedTools; track tool.ID) {\n <div style=\"display:flex;align-items:center;gap:12px;padding:12px 14px;border-bottom:1px solid var(--mj-border-subtle,#eee);height:72px;box-sizing:border-box\">\n <i class=\"fa-solid fa-wrench\" style=\"color:var(--mj-brand-primary,#264FAF)\"></i>\n <div style=\"flex:1;min-width:0\">\n <div style=\"font-weight:500;font-size:0.875rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ tool.ToolTitle || tool.ToolName }}</div>\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ tool.ServerName }} · {{ tool.ToolName }}</div>\n </div>\n <button type=\"button\" (click)=\"toggleFavorite(tool.ID, $event)\" [title]=\"isFavorited(tool.ID) ? 'Unfavorite' : 'Favorite'\" style=\"background:transparent;border:none;cursor:pointer;padding:4px;font-size:1rem\" [style.color]=\"isFavorited(tool.ID) ? 'var(--mj-status-warning, #f59e0b)' : 'var(--mj-text-muted, #bbb)'\">\n <i [class]=\"isFavorited(tool.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">{{ tool.Status }}</span>\n </div>\n }\n @if (toolsLoading) {\n <div style=\"padding:12px;text-align:center;font-size:0.8rem;color:var(--mj-text-muted,#888)\">Loading more…</div>\n }\n </div>\n } @else if (ServerGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-wrench\"></i>\n <p>No tools discovered yet</p>\n <span class=\"hint\">Tools are discovered when connections sync with MCP servers</span>\n </div>\n } @else {\n <div class=\"tools-container\">\n <!-- Server Groups -->\n @for (group of ServerGroups; track group.server.ID) {\n <div class=\"server-group\" [class.collapsed]=\"!group.expanded\">\n <!-- Server Group Header -->\n <div class=\"server-group-header\" (click)=\"toggleServerGroup(group)\">\n <div class=\"server-info\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"group.expanded\"></i>\n <i [class]=\"getTransportIcon(group.server.TransportType)\"></i>\n <span class=\"server-name\">{{ group.server.Name }}</span>\n <span class=\"tool-count\">{{ getServerToolCount(group.server.ID) }} tools</span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(group.server.Status)\">\n {{ group.server.Status }}\n </span>\n </div>\n <div class=\"server-actions\" (click)=\"$event.stopPropagation()\">\n <button mjButton variant=\"flat\" (click)=\"openTestToolDialog(undefined, undefined)\" title=\"Test a tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n </div>\n\n <!-- Tools Content -->\n @if (group.expanded) {\n <!-- Card View -->\n @if (ToolsViewMode === 'card') {\n <div class=\"tools-grid\">\n @for (tool of group.tools; track tool.ID) {\n <div class=\"tool-card\" [class.expanded]=\"isToolExpanded(tool)\">\n <div class=\"tool-card-header\" (click)=\"toggleToolExpand(tool)\">\n <div class=\"tool-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n </div>\n <div class=\"tool-meta\">\n <span class=\"param-badge\" title=\"Parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }}\n </span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </div>\n </div>\n @if (tool.ToolDescription) {\n <p class=\"tool-description\">{{ tool.ToolDescription }}</p>\n }\n <div class=\"tool-card-actions\">\n <button type=\"button\" (click)=\"toggleFavorite(tool.ID, $event)\" [title]=\"isFavorited(tool.ID) ? 'Unfavorite' : 'Favorite'\" style=\"background:transparent;border:none;cursor:pointer;padding:4px;font-size:1rem\" [style.color]=\"isFavorited(tool.ID) ? 'var(--mj-status-warning, #f59e0b)' : 'var(--mj-text-muted, #bbb)'\">\n <i [class]=\"isFavorited(tool.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openTestToolDialog(tool)\" title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n Test\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleToolExpand(tool)\" title=\"View details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n {{ isToolExpanded(tool) ? 'Less' : 'More' }}\n </button>\n </div>\n <!-- Expanded Details -->\n @if (isToolExpanded(tool)) {\n <div class=\"tool-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Parameters:</span>\n <span class=\"detail-value\">\n {{ getParamCount(tool) }} total, {{ getRequiredParamCount(tool) }} required\n </span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Last Seen:</span>\n <span class=\"detail-value\">{{ formatDate(tool.LastSeenAt) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-row full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <!-- List View -->\n <div class=\"tools-list\">\n <table>\n <thead>\n <tr>\n <th>Tool</th>\n <th>Description</th>\n <th>Params</th>\n <th>Status</th>\n <th>Last Seen</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (tool of group.tools; track tool.ID) {\n <tr [class.expanded]=\"isToolExpanded(tool)\">\n <td class=\"tool-name-cell\">\n <i class=\"fa-solid fa-wrench\"></i>\n <div class=\"tool-name-info\">\n <span class=\"tool-title\">{{ tool.ToolTitle || tool.ToolName }}</span>\n @if (tool.ToolTitle) {\n <span class=\"tool-code\">{{ tool.ToolName }}</span>\n }\n </div>\n </td>\n <td class=\"description-cell\">{{ tool.ToolDescription || '-' }}</td>\n <td>\n <span class=\"param-count\">{{ getParamCount(tool) }}</span>\n </td>\n <td>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </td>\n <td>{{ formatDate(tool.LastSeenAt) }}</td>\n <td class=\"actions-cell\">\n <button type=\"button\" (click)=\"toggleFavorite(tool.ID, $event)\" [title]=\"isFavorited(tool.ID) ? 'Unfavorite' : 'Favorite'\" style=\"background:transparent;border:none;cursor:pointer;padding:4px;font-size:0.95rem;margin-right:4px\" [style.color]=\"isFavorited(tool.ID) ? 'var(--mj-status-warning, #f59e0b)' : 'var(--mj-text-muted, #bbb)'\">\n <i [class]=\"isFavorited(tool.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openTestToolDialog(tool)\" title=\"Test\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleToolExpand(tool)\" title=\"Details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n </button>\n </td>\n </tr>\n @if (isToolExpanded(tool)) {\n <tr class=\"detail-row-expanded\">\n <td colspan=\"6\">\n <div class=\"inline-details\">\n <div class=\"detail-section\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Required Params:</span>\n <span class=\"detail-value\">{{ getRequiredParamCount(tool) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-section full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n\n <!-- Logs Tab -->\n @case ('logs') {\n <div class=\"data-table\">\n @if (filteredLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-list-check\"></i>\n <p>No recent execution logs</p>\n <span class=\"hint\">Logs appear when tools are executed via MCP connections</span>\n </div>\n } @else {\n <table>\n <thead>\n <tr>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('status')\" (click)=\"onLogSortColumn('status')\">\n Status\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'status' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'status' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'status'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('server')\" (click)=\"onLogSortColumn('server')\">\n Server\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'server' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'server' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'server'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('tool')\" (click)=\"onLogSortColumn('tool')\">\n Tool\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'tool' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'tool' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'tool'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('connection')\" (click)=\"onLogSortColumn('connection')\">\n Connection\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'connection' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'connection' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'connection'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('started')\" (click)=\"onLogSortColumn('started')\">\n Started\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'started' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'started' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'started'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('duration')\" (click)=\"onLogSortColumn('duration')\">\n Duration\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'duration' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'duration' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'duration'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('error')\" (click)=\"onLogSortColumn('error')\">\n Error\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'error' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'error' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'error'\"></i>\n </th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (log of filteredLogs; track log.ID) {\n <tr [class.error-row]=\"log.Status === 'Error'\"\n class=\"clickable-row\"\n (click)=\"onLogClick(log)\"\n title=\"Click for details\">\n <td>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n @switch (log.Status) {\n @case ('Success') {\n <i class=\"fa-solid fa-check-circle\"></i>\n }\n @case ('Error') {\n <i class=\"fa-solid fa-times-circle\"></i>\n }\n @case ('Running') {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @default {\n <i class=\"fa-solid fa-question-circle\"></i>\n }\n }\n {{ log.Status || 'Unknown' }}\n </span>\n </td>\n <td class=\"server-name\">{{ log.ServerName }}</td>\n <td class=\"tool-name\">{{ log.ToolName }}</td>\n <td>{{ log.ConnectionName }}</td>\n <td>{{ formatDate(log.StartedAt) }}</td>\n <td>{{ formatDuration(log.DurationMs) }}</td>\n <td class=\"error-message\" [title]=\"log.ErrorMessage || ''\">\n {{ log.ErrorMessage || '-' }}\n </td>\n <td class=\"action-cell\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n }\n }\n </div>\n </div>\n </div>\n</div>\n\n<!-- Server Dialog (inline — avoids sub-component DI issues) -->\n@if (ShowServerDialog) {\n <div style=\"position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\" (click)=\"cancelServerForm()\">\n <div style=\"display:flex;flex-direction:column;background:var(--mj-bg-surface,#fff);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,0.3);overflow:hidden;width:600px;max-width:90vw;max-height:90vh\" (click)=\"$event.stopPropagation()\">\n <!-- Title bar -->\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <h2 style=\"margin:0;font-size:1.125rem;font-weight:600;color:var(--mj-text-primary,#333)\">{{ EditingServer ? 'Edit MCP Server' : 'Add MCP Server' }}</h2>\n <button style=\"display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;cursor:pointer;color:var(--mj-text-muted,#888);border-radius:4px\" (click)=\"cancelServerForm()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Body -->\n <div style=\"flex:1;overflow-y:auto;padding:20px;color:var(--mj-text-primary,#333)\">\n @if (ServerFormError) {\n <div style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:6px;padding:10px 14px;margin-bottom:16px;color:var(--mj-status-error-text,#c53030);font-size:0.875rem\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i> {{ ServerFormError }}\n </div>\n }\n <!-- Name -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Name <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #sfName class=\"mj-input\" placeholder=\"e.g., GitHub MCP Server\" [value]=\"ServerForm.Name\" (input)=\"ServerForm.Name = sfName.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n <!-- Description -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Description</label>\n <textarea #sfDesc class=\"mj-textarea\" placeholder=\"Optional description\" [value]=\"ServerForm.Description\" (input)=\"ServerForm.Description = sfDesc.value\" rows=\"3\" style=\"width:100%;box-sizing:border-box\"></textarea>\n </div>\n <!-- Transport Type -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Transport Type <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #sfTransport class=\"mj-input\" [value]=\"ServerForm.TransportType\" (change)=\"ServerForm.TransportType = sfTransport.value\" style=\"width:100%;box-sizing:border-box\">\n @for (t of TransportTypes; track t.value) {\n <option [value]=\"t.value\">{{ t.label }}</option>\n }\n </select>\n </div>\n <!-- Server URL (for HTTP-based transports) -->\n @if (ServerForm.TransportType === 'StreamableHTTP' || ServerForm.TransportType === 'SSE' || ServerForm.TransportType === 'WebSocket') {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Server URL <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #sfUrl class=\"mj-input\" placeholder=\"https://api.example.com/mcp\" [value]=\"ServerForm.ServerURL\" (input)=\"ServerForm.ServerURL = sfUrl.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n }\n <!-- Command (for Stdio) -->\n @if (ServerForm.TransportType === 'Stdio') {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Command <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #sfCmd class=\"mj-input\" placeholder=\"e.g., npx\" [value]=\"ServerForm.Command\" (input)=\"ServerForm.Command = sfCmd.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n }\n <!-- Auth Type -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Default Auth Type</label>\n <select #sfAuth class=\"mj-input\" [value]=\"ServerForm.DefaultAuthType\" (change)=\"ServerForm.DefaultAuthType = sfAuth.value\" style=\"width:100%;box-sizing:border-box\">\n @for (a of AuthTypes; track a.value) {\n <option [value]=\"a.value\">{{ a.label }}</option>\n }\n </select>\n </div>\n <!-- Status -->\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Status</label>\n <select #sfStatus class=\"mj-input\" [value]=\"ServerForm.Status\" (change)=\"ServerForm.Status = sfStatus.value\" style=\"width:100%;box-sizing:border-box\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n </div>\n <!-- Actions -->\n <div style=\"display:flex;align-items:center;gap:8px;padding:16px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <button mjButton variant=\"primary\" (click)=\"saveServerForm()\" [disabled]=\"ServerFormSaving\">\n @if (ServerFormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> }\n {{ EditingServer ? 'Update' : 'Create' }}\n </button>\n <button mjButton (click)=\"cancelServerForm()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- Connection Dialog (inline) -->\n@if (ShowConnectionDialog) {\n <div style=\"position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\" (click)=\"cancelConnectionForm()\">\n <div style=\"display:flex;flex-direction:column;background:var(--mj-bg-surface,#fff);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,0.3);overflow:hidden;width:560px;max-width:90vw;max-height:90vh\" (click)=\"$event.stopPropagation()\">\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <h2 style=\"margin:0;font-size:1.125rem;font-weight:600;color:var(--mj-text-primary,#333)\">Add Connection</h2>\n <button style=\"display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;cursor:pointer;color:var(--mj-text-muted,#888);border-radius:4px\" (click)=\"cancelConnectionForm()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div style=\"flex:1;overflow-y:auto;padding:20px;color:var(--mj-text-primary,#333)\">\n @if (ConnectionFormError) {\n <div style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:6px;padding:10px 14px;margin-bottom:16px;color:var(--mj-status-error-text,#c53030);font-size:0.875rem\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i> {{ ConnectionFormError }}\n </div>\n }\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Server <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #cfServer class=\"mj-input\" [value]=\"ConnectionForm.MCPServerID\" (change)=\"ConnectionForm.MCPServerID = cfServer.value\" style=\"width:100%;box-sizing:border-box\">\n <option value=\"\">— select server —</option>\n @for (s of servers; track s.ID) {\n <option [value]=\"s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Name <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #cfName class=\"mj-input\" placeholder=\"e.g., Zapier Connection\" [value]=\"ConnectionForm.Name\" (input)=\"ConnectionForm.Name = cfName.value\" style=\"width:100%;box-sizing:border-box\" />\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Bearer Token</label>\n <input #cfToken class=\"mj-input\" placeholder=\"Paste bearer token here\" [value]=\"ConnectionForm.BearerToken\" (input)=\"ConnectionForm.BearerToken = cfToken.value\" style=\"width:100%;box-sizing:border-box;font-family:monospace;font-size:0.8rem\" />\n <span style=\"font-size:0.75rem;color:var(--mj-text-muted,#888)\">Will be stored as a Credential and linked to this connection</span>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Status</label>\n <select #cfStatus class=\"mj-input\" [value]=\"ConnectionForm.Status\" (change)=\"ConnectionForm.Status = cfStatus.value\" style=\"width:100%;box-sizing:border-box\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n </div>\n <div style=\"display:flex;align-items:center;gap:8px;padding:16px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <button mjButton variant=\"primary\" (click)=\"saveConnectionForm()\" [disabled]=\"ConnectionFormSaving\">\n @if (ConnectionFormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> }\n Create\n </button>\n <button mjButton (click)=\"cancelConnectionForm()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- Test Tool Dialog (inline) -->\n@if (ShowTestToolDialog) {\n <div style=\"position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\" (click)=\"testCloseDialog()\">\n <div style=\"display:flex;flex-direction:column;background:var(--mj-bg-surface,#fff);border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,0.3);overflow:hidden;width:640px;max-width:90vw;max-height:90vh\" (click)=\"$event.stopPropagation()\">\n <!-- Title bar -->\n <div style=\"display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <h2 style=\"margin:0;font-size:1.125rem;font-weight:600;color:var(--mj-text-primary,#333)\">\n Test MCP Tool\n @if (TestStep !== 'select') {\n <span style=\"font-size:0.875rem;font-weight:400;color:var(--mj-text-muted,#888);margin-left:8px\">— {{ TestSelectedTool?.ToolTitle || TestSelectedTool?.ToolName }}</span>\n }\n </h2>\n <button style=\"display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;cursor:pointer;color:var(--mj-text-muted,#888);border-radius:4px\" (click)=\"testCloseDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Step indicator -->\n <div style=\"display:flex;gap:0;padding:10px 20px;background:var(--mj-bg-surface-card,#f9f9f9);border-bottom:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n <span style=\"font-size:0.8rem;font-weight:500;\" [style.color]=\"TestStep==='select' ? 'var(--mj-brand-primary,#264FAF)' : 'var(--mj-text-muted,#888)'\">1. Select</span>\n <span style=\"margin:0 8px;color:var(--mj-text-muted,#888)\">›</span>\n <span style=\"font-size:0.8rem;font-weight:500;\" [style.color]=\"TestStep==='configure' ? 'var(--mj-brand-primary,#264FAF)' : 'var(--mj-text-muted,#888)'\">2. Configure</span>\n <span style=\"margin:0 8px;color:var(--mj-text-muted,#888)\">›</span>\n <span style=\"font-size:0.8rem;font-weight:500;\" [style.color]=\"TestStep==='results' ? 'var(--mj-brand-primary,#264FAF)' : 'var(--mj-text-muted,#888)'\">3. Results</span>\n </div>\n <!-- Body -->\n <div style=\"flex:1;overflow-y:auto;padding:20px;color:var(--mj-text-primary,#333)\">\n @if (TestStep === 'select') {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Server <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #tSrv class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (change)=\"onTestServerChange(tSrv.value)\">\n <option value=\"\">— select server —</option>\n @for (s of servers; track s.ID) {\n <option [value]=\"s.ID\" [selected]=\"TestToolServerID === s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Connection <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <select #tConn class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" [attr.disabled]=\"!TestToolServerID ? true : null\" (change)=\"onTestConnectionChange(tConn.value)\">\n <option value=\"\">— select connection —</option>\n @for (c of TestFilteredConnections; track c.ID) {\n <option [value]=\"c.ID\" [selected]=\"TestToolConnectionID === c.ID\">{{ c.Name }}</option>\n }\n </select>\n </div>\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">Tool <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span></label>\n <input #tSearch type=\"text\" class=\"mj-input\" style=\"width:100%;box-sizing:border-box;margin-bottom:6px\" placeholder=\"Search tools… (Recently used appear first)\" [value]=\"TestToolSearch\" (input)=\"onTestToolSearchChange(tSearch.value)\" [attr.disabled]=\"!TestToolServerID ? true : null\" />\n <div style=\"max-height:220px;overflow-y:auto;border:1px solid var(--mj-border-default,#e0e0e0);border-radius:4px;background:var(--mj-bg-surface,#fff)\">\n @if (TestComboboxTools.length === 0) {\n <div style=\"padding:12px;text-align:center;font-size:0.8rem;color:var(--mj-text-muted,#888)\">No tools match.</div>\n }\n @for (t of TestComboboxTools; track t.ID) {\n <div (click)=\"pickTestTool(t.ID)\" style=\"padding:8px 12px;cursor:pointer;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--mj-border-subtle,#eee)\" [style.background]=\"TestToolID === t.ID ? 'color-mix(in srgb, var(--mj-brand-primary,#264FAF) 12%, var(--mj-bg-surface,#fff))' : null\">\n @if (isRecentTestTool(t.ID)) {\n <span style=\"font-size:0.65rem;background:var(--mj-brand-primary,#264FAF);color:#fff;padding:1px 6px;border-radius:8px;font-weight:600\">Recent</span>\n }\n <div style=\"flex:1;min-width:0\">\n <div style=\"font-size:0.85rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ t.ToolTitle || t.ToolName }}</div>\n @if (t.ToolTitle && t.ToolName !== t.ToolTitle) {\n <div style=\"font-size:0.7rem;color:var(--mj-text-muted,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap\">{{ t.ToolName }}</div>\n }\n </div>\n @if (TestToolID === t.ID) {\n <i class=\"fa-solid fa-check\" style=\"color:var(--mj-brand-primary,#264FAF)\"></i>\n }\n </div>\n }\n </div>\n </div>\n } @else if (TestStep === 'configure') {\n @if (TestParamConfigs.length === 0) {\n <div style=\"text-align:center;padding:24px;color:var(--mj-text-muted,#888)\">\n <i class=\"fa-solid fa-check-circle\" style=\"font-size:2rem;margin-bottom:8px;display:block\"></i>\n <p>This tool requires no parameters.</p>\n </div>\n } @else {\n @for (p of TestParamConfigs; track p.name) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;color:var(--mj-text-primary,#333);margin-bottom:4px\">\n {{ p.name }} @if (p.required) { <span style=\"color:var(--mj-status-error,#e53e3e)\">*</span> }\n </label>\n @if (p.description) {\n <p style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin:0 0 4px 0\">{{ p.description }}</p>\n }\n @if (p.enumValues.length > 0) {\n <select #enumEl class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (change)=\"testSetParam(p.name, enumEl.value)\">\n <option value=\"\">— select —</option>\n @for (v of p.enumValues; track $index) { <option [value]=\"$any(v)\">{{ $any(v) }}</option> }\n </select>\n } @else if (p.type === 'boolean') {\n <select #boolEl class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (change)=\"testSetParam(p.name, boolEl.value)\">\n <option value=\"false\">false</option>\n <option value=\"true\">true</option>\n </select>\n } @else if (p.type === 'array' || p.type === 'object') {\n <textarea #jsonEl class=\"mj-textarea\" rows=\"3\" style=\"width:100%;box-sizing:border-box;font-family:monospace;font-size:0.8rem\" (input)=\"testSetParam(p.name, jsonEl.value)\" [placeholder]=\"'Enter JSON ' + p.type + '...'\"></textarea>\n } @else {\n <input #strEl class=\"mj-input\" style=\"width:100%;box-sizing:border-box\" (input)=\"testSetParam(p.name, strEl.value)\" [placeholder]=\"p.description || 'Enter value...'\" />\n }\n </div>\n }\n }\n } @else {\n @if (TestExecutionResult?.Success) {\n <div style=\"background:var(--mj-status-success-bg,#f0fff4);border:1px solid var(--mj-status-success-border,#9ae6b4);border-radius:6px;padding:12px 16px;margin-bottom:16px;color:var(--mj-status-success-text,#276749)\">\n <i class=\"fa-solid fa-check-circle\"></i> Execution Successful\n @if (TestExecutionResult?.DurationMs) { <span style=\"float:right;font-size:0.75rem\">{{ TestExecutionResult?.DurationMs }}ms</span> }\n </div>\n } @else {\n <div style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:6px;padding:12px 16px;margin-bottom:16px;color:var(--mj-status-error-text,#c53030)\">\n <i class=\"fa-solid fa-times-circle\"></i> Execution Failed\n </div>\n }\n @if (TestExecutionResult?.ErrorMessage) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:4px\">Error</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.8rem;white-space:pre-wrap;word-break:break-all;margin:0\">{{ TestExecutionResult?.ErrorMessage }}</pre>\n </div>\n }\n @if (TestExecutionResult?.Result) {\n <div>\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:4px\">Result</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.8rem;white-space:pre-wrap;word-break:break-all;overflow-y:auto;max-height:300px;margin:0\">{{ formatTestResult(TestExecutionResult?.Result) }}</pre>\n </div>\n }\n }\n </div>\n <!-- Actions -->\n <div style=\"display:flex;align-items:center;gap:8px;padding:16px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);flex-shrink:0\">\n @if (TestStep === 'select') {\n <button mjButton variant=\"primary\" (click)=\"testProceedToConfig()\" [disabled]=\"!TestCanProceed\">Next <i class=\"fa-solid fa-arrow-right\"></i></button>\n <button mjButton (click)=\"testCloseDialog()\">Cancel</button>\n } @else if (TestStep === 'configure') {\n <button mjButton variant=\"primary\" (click)=\"testExecuteTool()\" [disabled]=\"!TestIsValid || TestIsExecuting\">\n @if (TestIsExecuting) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Executing... } @else { <i class=\"fa-solid fa-play\"></i> Execute }\n </button>\n <button mjButton (click)=\"testGoBack()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n } @else {\n <button mjButton variant=\"primary\" (click)=\"testRunAgain()\"><i class=\"fa-solid fa-redo\"></i> Run Again</button>\n <button mjButton (click)=\"testGoBack()\">Edit Params</button>\n <button mjButton (click)=\"testCloseDialog()\">Close</button>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Log Detail Panel (inlined) -->\n@if (ShowLogDetailPanel && SelectedLog) {\n <div style=\"position:fixed;inset:0;z-index:10000;pointer-events:none\">\n <div style=\"position:absolute;inset:0;background:rgba(0,0,0,0.35);pointer-events:auto\" (click)=\"onLogDetailClose()\"></div>\n <div style=\"position:absolute;top:0;right:0;height:100%;width:560px;max-width:95vw;background:var(--mj-bg-surface,#fff);box-shadow:-4px 0 20px rgba(0,0,0,0.15);display:flex;flex-direction:column;pointer-events:auto\">\n <div style=\"padding:16px 20px;border-bottom:1px solid var(--mj-border-default,#e0e0e0);display:flex;align-items:center;justify-content:space-between\">\n <div>\n <h3 style=\"margin:0;font-size:1rem;font-weight:600\">{{ SelectedLog.ToolName }}</h3>\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin-top:4px\">\n <span [class]=\"SelectedLog.Status === 'Success' ? 'status-success' : SelectedLog.Status === 'Error' ? 'status-error' : 'status-running'\" style=\"font-weight:600\">{{ SelectedLog.Status }}</span>\n <span style=\"margin:0 8px\">·</span>\n <span>{{ formatDate(SelectedLog.StartedAt) }}</span>\n @if (SelectedLog.DurationMs != null) {\n <span style=\"margin:0 8px\">·</span>\n <span>{{ formatDuration(SelectedLog.DurationMs) }}</span>\n }\n </div>\n </div>\n <button mjButton (click)=\"onLogDetailClose()\" aria-label=\"Close\"><i class=\"fa-solid fa-xmark\"></i></button>\n </div>\n <div style=\"flex:1;overflow-y:auto;padding:16px 20px\">\n <div style=\"margin-bottom:16px\">\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin-bottom:4px\">Connection</div>\n <div style=\"font-size:0.875rem\">{{ SelectedLog.ConnectionName || SelectedLog.ConnectionID }}</div>\n @if (SelectedLog.ServerName) {\n <div style=\"font-size:0.75rem;color:var(--mj-text-muted,#888);margin-top:2px\">{{ SelectedLog.ServerName }}</div>\n }\n </div>\n @if (SelectedLog.InputArgs) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:6px\">Input Arguments</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.75rem;white-space:pre-wrap;word-break:break-all;overflow-y:auto;max-height:240px;margin:0\">{{ formatLogJson(SelectedLog.InputArgs) }}</pre>\n </div>\n }\n @if (SelectedLog.Result) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:6px\">Result</label>\n <pre style=\"background:var(--mj-bg-surface-sunken,#f0f0f0);border-radius:4px;padding:12px;font-size:0.75rem;white-space:pre-wrap;word-break:break-all;overflow-y:auto;max-height:360px;margin:0\">{{ formatLogJson(SelectedLog.Result) }}</pre>\n </div>\n }\n @if (SelectedLog.ErrorMessage) {\n <div style=\"margin-bottom:16px\">\n <label style=\"display:block;font-size:0.875rem;font-weight:500;margin-bottom:6px;color:var(--mj-status-error-text,#c53030)\">Error</label>\n <pre style=\"background:var(--mj-status-error-bg,#fff5f5);border:1px solid var(--mj-status-error-border,#feb2b2);border-radius:4px;padding:12px;font-size:0.75rem;white-space:pre-wrap;word-break:break-all;margin:0;color:var(--mj-status-error-text,#c53030)\">{{ SelectedLog.ErrorMessage }}</pre>\n </div>\n }\n </div>\n <div style=\"padding:12px 20px;border-top:1px solid var(--mj-border-default,#e0e0e0);display:flex;gap:8px;justify-content:flex-start\">\n @if (SelectedLog.ToolID) {\n <button mjButton variant=\"primary\" (click)=\"onRunAgainFromLog({ toolId: SelectedLog.ToolID!, connectionId: SelectedLog.ConnectionID })\"><i class=\"fa-solid fa-redo\"></i> Run Again</button>\n }\n <button mjButton (click)=\"onLogDetailClose()\">Close</button>\n </div>\n </div>\n </div>\n}\n"]}
|