@memberjunction/ng-dashboards 6.2.0-edge.5 → 6.2.0-edge.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.md +28 -0
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +1 -1
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +15 -7
  5. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  6. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +7 -1
  7. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  8. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +209 -57
  9. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +12 -11
  11. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -1
  12. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +15 -15
  13. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -1
  14. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +28 -16
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
  18. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  19. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +30 -6
  20. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  21. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -1
  22. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  23. package/dist/AI/components/tags/tags-resource.component.js +15 -7
  24. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  25. package/dist/AI/components/vectors/sensitive-fields.d.ts +9 -4
  26. package/dist/AI/components/vectors/sensitive-fields.d.ts.map +1 -1
  27. package/dist/AI/components/vectors/sensitive-fields.js +39 -14
  28. package/dist/AI/components/vectors/sensitive-fields.js.map +1 -1
  29. package/dist/AI/components/vectors/vector-document-rules.d.ts +13 -0
  30. package/dist/AI/components/vectors/vector-document-rules.d.ts.map +1 -1
  31. package/dist/AI/components/vectors/vector-document-rules.js +14 -0
  32. package/dist/AI/components/vectors/vector-document-rules.js.map +1 -1
  33. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +34 -14
  34. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  35. package/dist/AI/components/vectors/vector-management-resource.component.js +127 -50
  36. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  37. package/dist/AI/components/vectors/vector-store-selection.d.ts +32 -0
  38. package/dist/AI/components/vectors/vector-store-selection.d.ts.map +1 -0
  39. package/dist/AI/components/vectors/vector-store-selection.js +57 -0
  40. package/dist/AI/components/vectors/vector-store-selection.js.map +1 -0
  41. package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts +236 -0
  42. package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts.map +1 -0
  43. package/dist/ChiefOfStaff/chief-of-staff-agent-context.js +374 -0
  44. package/dist/ChiefOfStaff/chief-of-staff-agent-context.js.map +1 -0
  45. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts +195 -0
  46. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts.map +1 -0
  47. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js +2910 -0
  48. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js.map +1 -0
  49. package/dist/ChiefOfStaff/index.d.ts +3 -0
  50. package/dist/ChiefOfStaff/index.d.ts.map +1 -0
  51. package/dist/ChiefOfStaff/index.js +3 -0
  52. package/dist/ChiefOfStaff/index.js.map +1 -0
  53. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  54. package/dist/Communication/communication-logs-resource.component.js +2 -1
  55. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  56. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  57. package/dist/Communication/communication-monitor-resource.component.js +23 -18
  58. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  59. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  60. package/dist/Communication/communication-runs-resource.component.js +11 -10
  61. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  62. package/dist/DashboardEditor/dashboard-editor.component.d.ts +17 -2
  63. package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -1
  64. package/dist/DashboardEditor/dashboard-editor.component.js +94 -43
  65. package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -1
  66. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +24 -0
  67. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  68. package/dist/DataExplorer/data-explorer-dashboard.component.js +146 -50
  69. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  70. package/dist/DataExplorer/models/explorer-state.interface.d.ts +2 -0
  71. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
  72. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
  73. package/dist/LoginStudio/login-studio-resource.component.d.ts +10 -2
  74. package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -1
  75. package/dist/LoginStudio/login-studio-resource.component.js +110 -77
  76. package/dist/LoginStudio/login-studio-resource.component.js.map +1 -1
  77. package/dist/MCP/mcp-dashboard.component.d.ts +24 -4
  78. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  79. package/dist/MCP/mcp-dashboard.component.js +118 -65
  80. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  81. package/dist/PredictiveStudio/business-predictions.view-models.d.ts +1 -1
  82. package/dist/PredictiveStudio/business-predictions.view-models.d.ts.map +1 -1
  83. package/dist/PredictiveStudio/business-predictions.view-models.js +3 -3
  84. package/dist/PredictiveStudio/business-predictions.view-models.js.map +1 -1
  85. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts +6 -63
  86. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
  87. package/dist/PredictiveStudio/components/ps-experiments.component.js +256 -521
  88. package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
  89. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts +0 -18
  90. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts.map +1 -1
  91. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +122 -249
  92. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js.map +1 -1
  93. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +5 -9
  94. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
  95. package/dist/PredictiveStudio/components/ps-pipelines.component.js +98 -130
  96. package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
  97. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts +53 -4
  98. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -1
  99. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +335 -326
  100. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -1
  101. package/dist/PredictiveStudio/components/ps-row-drivers.component.d.ts +19 -0
  102. package/dist/PredictiveStudio/components/ps-row-drivers.component.d.ts.map +1 -0
  103. package/dist/PredictiveStudio/components/ps-row-drivers.component.js +85 -0
  104. package/dist/PredictiveStudio/components/ps-row-drivers.component.js.map +1 -0
  105. package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts +19 -1
  106. package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts.map +1 -1
  107. package/dist/PredictiveStudio/engine/predictive-studio.engine.js +51 -2
  108. package/dist/PredictiveStudio/engine/predictive-studio.engine.js.map +1 -1
  109. package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts +3 -1
  110. package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts.map +1 -1
  111. package/dist/PredictiveStudio/predictive-studio-agent-context.js +3 -0
  112. package/dist/PredictiveStudio/predictive-studio-agent-context.js.map +1 -1
  113. package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts +27 -4
  114. package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts.map +1 -1
  115. package/dist/PredictiveStudio/predictive-studio-score-history.service.js +94 -61
  116. package/dist/PredictiveStudio/predictive-studio-score-history.service.js.map +1 -1
  117. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts +29 -5
  118. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
  119. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +185 -103
  120. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
  121. package/dist/PredictiveStudio/resources/ps-studio-resource.component.js +1 -1
  122. package/dist/PredictiveStudio/resources/ps-studio-resource.component.js.map +1 -1
  123. package/dist/ai-dashboards.module.d.ts +22 -21
  124. package/dist/ai-dashboards.module.d.ts.map +1 -1
  125. package/dist/ai-dashboards.module.js +8 -2
  126. package/dist/ai-dashboards.module.js.map +1 -1
  127. package/dist/public-api.d.ts +2 -0
  128. package/dist/public-api.d.ts.map +1 -1
  129. package/dist/public-api.js +3 -0
  130. package/dist/public-api.js.map +1 -1
  131. package/package.json +71 -71
  132. package/dist/PredictiveStudio/at-risk.view-models.d.ts +0 -120
  133. package/dist/PredictiveStudio/at-risk.view-models.d.ts.map +0 -1
  134. package/dist/PredictiveStudio/at-risk.view-models.js +0 -261
  135. package/dist/PredictiveStudio/at-risk.view-models.js.map +0 -1
  136. package/dist/PredictiveStudio/components/ps-confirm-modal.component.d.ts +0 -109
  137. package/dist/PredictiveStudio/components/ps-confirm-modal.component.d.ts.map +0 -1
  138. package/dist/PredictiveStudio/components/ps-confirm-modal.component.js +0 -323
  139. package/dist/PredictiveStudio/components/ps-confirm-modal.component.js.map +0 -1
  140. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts +0 -137
  141. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts.map +0 -1
  142. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js +0 -826
  143. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js.map +0 -1
@@ -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 { MJConfirmService } from '@memberjunction/ng-ui-components';\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';\nimport {\n BuildMCPAgentContextFull,\n IsValidMCPTab,\n IsValidToolsViewMode,\n ResolveMCPItem,\n BuildMCPNotFoundError,\n MCP_TABS,\n MCP_TOOLS_VIEW_MODES,\n MCP_LOG_SORT_COLUMNS,\n type MCPAgentContextInput,\n type MCPTabContextInput,\n type MCPNamedItem,\n} from './mcp-agent-context';\nimport { ValidateEnumParam, ValidateStringParam } from '../shared/agent-tool-validation';\nimport type { AgentToolResult } from '../shared/agent-tool-validation';\n\n/**\n * Local alias for the client-tool shape `NavigationService.SetAgentClientTools`\n * accepts. Declared here (not imported) so we don't add a re-export across the\n * shared validation file (mirrors the Testing dashboard's local alias).\n */\ntype MCPAgentTool = {\n Name: string;\n Description: string;\n ParameterSchema: Record<string, unknown>;\n Handler: (params: Record<string, unknown>) => Promise<unknown>;\n};\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; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n tools: MCPToolData[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n expanded: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\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 = this.ProviderToUse;\n\n public Servers: MCPServerData[] = [];\n\n /** @deprecated Use {@link Servers}. */\n public get servers(): MCPServerData[] {\n return this.Servers;\n }\n /** @deprecated Use {@link Servers}. */\n public set servers(value: MCPServerData[]) {\n this.Servers = value;\n }\n public Connections: MCPConnectionData[] = [];\n\n /** @deprecated Use {@link Connections}. */\n public get connections(): MCPConnectionData[] {\n return this.Connections;\n }\n /** @deprecated Use {@link Connections}. */\n public set connections(value: MCPConnectionData[]) {\n this.Connections = value;\n }\n public tools: MCPToolData[] = [];\n public ExecutionLogs: MCPExecutionLogData[] = [];\n\n /** @deprecated Use {@link ExecutionLogs}. */\n public get executionLogs(): MCPExecutionLogData[] {\n return this.ExecutionLogs;\n }\n /** @deprecated Use {@link ExecutionLogs}. */\n public set executionLogs(value: MCPExecutionLogData[]) {\n this.ExecutionLogs = value;\n }\n\n /**\n * Precomputed tools-by-server index (key = NormalizeUUID(MCPServerID)).\n * Rebuilt once whenever tools/connections load (see buildToolsByServerMap),\n * so the server/connection card @for blocks read tools via an O(1) Map lookup\n * instead of re-filtering the whole tools array on every change-detection pass.\n */\n private toolsByServerID = new Map<string, MCPToolData[]>();\n\n public FilteredServers: MCPServerData[] = [];\n\n /** @deprecated Use {@link FilteredServers}. */\n public get filteredServers(): MCPServerData[] {\n return this.FilteredServers;\n }\n /** @deprecated Use {@link FilteredServers}. */\n public set filteredServers(value: MCPServerData[]) {\n this.FilteredServers = value;\n }\n public FilteredConnections: MCPConnectionData[] = [];\n\n /** @deprecated Use {@link FilteredConnections}. */\n public get filteredConnections(): MCPConnectionData[] {\n return this.FilteredConnections;\n }\n /** @deprecated Use {@link FilteredConnections}. */\n public set filteredConnections(value: MCPConnectionData[]) {\n this.FilteredConnections = value;\n }\n public FilteredTools: MCPToolData[] = [];\n\n /** @deprecated Use {@link FilteredTools}. */\n public get filteredTools(): MCPToolData[] {\n return this.FilteredTools;\n }\n /** @deprecated Use {@link FilteredTools}. */\n public set filteredTools(value: MCPToolData[]) {\n this.FilteredTools = value;\n }\n public FilteredLogs: MCPExecutionLogData[] = [];\n\n /** @deprecated Use {@link FilteredLogs}. */\n public get filteredLogs(): MCPExecutionLogData[] {\n return this.FilteredLogs;\n }\n /** @deprecated Use {@link FilteredLogs}. */\n public set filteredLogs(value: MCPExecutionLogData[]) {\n this.FilteredLogs = value;\n }\n\n /** Part 3.2 — paginated tools (scales to thousands). Appended as user scrolls. */\n public PagedTools: MCPToolSummary[] = [];\n\n /** @deprecated Use {@link PagedTools}. */\n public get pagedTools(): MCPToolSummary[] {\n return this.PagedTools;\n }\n /** @deprecated Use {@link PagedTools}. */\n public set pagedTools(value: MCPToolSummary[]) {\n this.PagedTools = value;\n }\n public ToolsTotalCount = 0;\n\n /** @deprecated Use {@link ToolsTotalCount}. */\n public get toolsTotalCount() {\n return this.ToolsTotalCount;\n }\n /** @deprecated Use {@link ToolsTotalCount}. */\n public set toolsTotalCount(value) {\n this.ToolsTotalCount = value;\n }\n public ToolsLoading = false;\n\n /** @deprecated Use {@link ToolsLoading}. */\n public get toolsLoading() {\n return this.ToolsLoading;\n }\n /** @deprecated Use {@link ToolsLoading}. */\n public set toolsLoading(value) {\n this.ToolsLoading = value;\n }\n public ToolsSkip = 0;\n\n /** @deprecated Use {@link ToolsSkip}. */\n public get toolsSkip() {\n return this.ToolsSkip;\n }\n /** @deprecated Use {@link ToolsSkip}. */\n public set toolsSkip(value) {\n this.ToolsSkip = value;\n }\n public ToolsPageSize = 50;\n\n /** @deprecated Use {@link ToolsPageSize}. */\n public get toolsPageSize() {\n return this.ToolsPageSize;\n }\n /** @deprecated Use {@link ToolsPageSize}. */\n public set toolsPageSize(value) {\n this.ToolsPageSize = value;\n }\n public UseScalablePagination = false;\n\n /** @deprecated Use {@link UseScalablePagination}. */\n public get useScalablePagination() {\n return this.UseScalablePagination;\n }\n /** @deprecated Use {@link UseScalablePagination}. */\n public set useScalablePagination(value) {\n this.UseScalablePagination = value;\n }\n\n /** Part 3.6 — favorited tool IDs for the current user. */\n public FavoritedToolIDs = new Set<string>();\n\n /** @deprecated Use {@link FavoritedToolIDs}. */\n public get favoritedToolIDs() {\n return this.FavoritedToolIDs;\n }\n /** @deprecated Use {@link FavoritedToolIDs}. */\n public set favoritedToolIDs(value) {\n this.FavoritedToolIDs = value;\n }\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\n /** @deprecated Use {@link ToolsAvailableServers}. */\n public get toolsAvailableServers(): Array<{ ID: string; Name: string }> {\n return this.ToolsAvailableServers;\n }\n /** @deprecated Use {@link ToolsAvailableServers}. */\n public set toolsAvailableServers(value: Array<{ ID: string; Name: string }>) {\n this.ToolsAvailableServers = value;\n }\n public ToolsAvailableCategories: Array<{ category: string; count: number }> = [];\n\n /** @deprecated Use {@link ToolsAvailableCategories}. */\n public get toolsAvailableCategories(): Array<{ category: string; count: number }> {\n return this.ToolsAvailableCategories;\n }\n /** @deprecated Use {@link ToolsAvailableCategories}. */\n public set toolsAvailableCategories(value: Array<{ category: string; count: number }>) {\n this.ToolsAvailableCategories = value;\n }\n\n /** Part 3.4 — tool counts from GetMCPToolCounts (global, respects search) */\n public ToolsGlobalCount: number = 0;\n\n /** @deprecated Use {@link ToolsGlobalCount}. */\n public get toolsGlobalCount(): number {\n return this.ToolsGlobalCount;\n }\n /** @deprecated Use {@link ToolsGlobalCount}. */\n public set toolsGlobalCount(value: number) {\n this.ToolsGlobalCount = value;\n }\n /** Per-server tool count map used for \"(N tools)\" badge on group headers */\n public ToolCountByServer: Record<string, number> = {};\n\n /** @deprecated Use {@link ToolCountByServer}. */\n public get toolCountByServer(): Record<string, number> {\n return this.ToolCountByServer;\n }\n /** @deprecated Use {@link ToolCountByServer}. */\n public set toolCountByServer(value: Record<string, number>) {\n this.ToolCountByServer = value;\n }\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 /** @deprecated Use {@link Stats}. */\n public get stats(): MCPDashboardStats {\n return this.Stats;\n }\n /** @deprecated Use {@link Stats}. */\n public set stats(value: MCPDashboardStats) {\n this.Stats = value;\n }\n\n public ActiveTab: MCPDashboardTab = 'servers';\n\n /**\n * The tab the agent tool-set was last registered for. Mode-scoping guard:\n * the safe tool surface differs per tab (servers/connections/tools/logs), so\n * `syncAgentToolsForMode()` only re-registers on a tab transition. Mirrors the\n * Data Explorer's `lastRegisteredToolMode`.\n */\n private lastRegisteredToolMode: MCPDashboardTab | null = null;\n\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 /** @deprecated Use {@link Filters$}. */\n public get filters$() {\n return this.Filters$;\n }\n /** @deprecated Use {@link Filters$}. */\n public set filters$(value) {\n this.Filters$ = value;\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 // Collapsible state for the log detail sections (Input Args / Result / Error)\n public LogInputArgsExpanded = true;\n public LogResultExpanded = true;\n public LogErrorExpanded = true;\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 private confirm: MJConfirmService\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 // Keep the mode-scoped agent tools + deep context aligned with the tab\n // when it changes via back/forward or a deep link.\n this.syncAgentToolsForMode();\n this.publishAgentContext();\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.publishAgentContext();\n this.syncAgentToolsForMode();\n this.cdr.markForCheck();\n }\n\n // ================================================================\n // AI Agent Context & Client Tools — DEEP enrichment (Data-Explorer depth)\n //\n // 🚨 SAFETY BOUNDARY — READ-ONLY / NAVIGATIONAL ONLY 🚨\n // MCP is a credential-bearing surface. Servers carry OAuth client secrets,\n // connections carry bearer tokens, and OAuth token / client-registration /\n // credential entities are in scope here. The agent context and client tools\n // registered below are strictly READ / FILTER / SORT / SELECT / NAVIGATE +\n // a read-only favorite-toggle preference:\n // - tab switches, free-text search, per-tab status filters, server/category\n // filter, favorites/recent toggles, tools view-mode, logs sort\n // - SELECT a server / connection / tool / log (by id OR name) — highlights /\n // expands / opens the detail panel\n // - OPEN the selected record in a tab for VIEWING (OpenEntityRecord — never edits)\n // - data refresh (read-only reload)\n //\n // 🔒 DELIBERATELY NOT exposed to the agent (must stay human-initiated):\n // - create / edit / delete of servers and connections\n // - MCP tool EXECUTION / test-with-params (untrusted LLM-supplied args\n // against real, side-effecting external tools) — NO execute path\n // - ANY secret/credential value: server URL/command, bearer token, OAuth\n // client secret, encrypted credential, or tool input/output payload\n //\n // Context exposes ONLY aggregate + per-tab counts, navigation/filter state,\n // the user's own search terms, and user-facing DISPLAY names (server / tool /\n // connection names; log labels are tool-name + status only) — never secrets,\n // never tool args, never tool results.\n //\n // MODE-SCOPING (mirrors the Data Explorer / Testing dashboards): the safe tool\n // surface differs per active tab, so `SetAgentClientTools` re-registers ONLY on\n // a tab transition (guarded by {@link lastRegisteredToolMode}). COMMON tools\n // (tab switch, search, refresh, clear filters) are always present; per-tab\n // tools (server/connection/tool/log select+open+filter+sort) appear only while\n // their tab is active.\n // ================================================================\n\n /**\n * Publish the current MCP dashboard state to the AI agent. Re-invoked on every\n * meaningful state change (data load, filter/search change, tab switch,\n * view-mode/sort change, selection change). The shaping lives in the pure\n * {@link buildMCPAgentContextFull} helper so it stays unit-testable and the\n * secret-free guarantee is auditable in one place.\n */\n private publishAgentContext(): void {\n const top: MCPAgentContextInput = {\n ActiveTab: this.ActiveTab,\n ServerCount: this.Stats.totalServers,\n ActiveServerCount: this.Stats.activeServers,\n ConnectionCount: this.Stats.totalConnections,\n ToolCount: this.Stats.totalTools,\n RecentExecutionCount: this.Stats.recentExecutions,\n FailedExecutionCount: this.Stats.failedExecutions,\n CurrentSearchTerm: this.Filters$.value.searchTerm,\n ToolsViewMode: this.ToolsViewMode,\n };\n this.navigationService.SetAgentContext(this, BuildMCPAgentContextFull(top, this.buildActiveTabContext()));\n }\n\n /** Build the deep per-tab context slice for whichever tab is active. */\n private buildActiveTabContext(): MCPTabContextInput {\n const f = this.Filters$.value;\n switch (this.ActiveTab) {\n case 'connections': {\n const selected = this.Connections.find(c => this.ExpandedConnectionID && UUIDsEqual(c.ID, this.ExpandedConnectionID)) ?? null;\n return {\n Tab: 'connections',\n Data: {\n ConnectionCount: this.Connections.length,\n FilteredConnectionCount: this.FilteredConnections.length,\n ConnectionStatusFilter: f.connectionStatus ?? 'all',\n VisibleConnectionNames: this.FilteredConnections.map(c => c.Name),\n SelectedConnectionId: selected?.ID ?? null,\n SelectedConnectionName: selected?.Name ?? null,\n },\n };\n }\n case 'tools': {\n const selected = this.tools.find(t => this.ExpandedToolId && UUIDsEqual(t.ID, this.ExpandedToolId)) ?? null;\n const serverFilter = f.toolsServer ?? 'all';\n const serverFilterName = serverFilter && serverFilter !== 'all'\n ? (this.ToolsAvailableServers.find(s => UUIDsEqual(s.ID, serverFilter))?.Name ?? null)\n : null;\n return {\n Tab: 'tools',\n Data: {\n ToolCount: this.tools.length,\n FilteredToolCount: this.FilteredTools.length,\n ToolsViewMode: this.ToolsViewMode,\n ToolStatusFilter: f.toolStatus ?? 'all',\n ServerFilter: serverFilter,\n ServerFilterName: serverFilterName,\n CategoryFilter: f.toolsCategory ?? 'all',\n FavoritesOnly: f.favoritesOnly ?? false,\n RecentOnly: f.recentOnly ?? false,\n FavoriteToolCount: this.FavoritedToolIDs.size,\n VisibleToolNames: this.FilteredTools.map(t => t.ToolTitle || t.ToolName),\n AvailableServerNames: this.ToolsAvailableServers.map(s => s.Name),\n AvailableCategoryNames: this.ToolsAvailableCategories.map(c => c.category),\n SelectedToolId: selected?.ID ?? null,\n SelectedToolName: selected ? (selected.ToolTitle || selected.ToolName) : null,\n },\n };\n }\n case 'logs': {\n return {\n Tab: 'logs',\n Data: {\n ExecutionCount: this.ExecutionLogs.length,\n FilteredExecutionCount: this.FilteredLogs.length,\n FailedExecutionCount: this.ExecutionLogs.filter(l => l.Status === 'Error').length,\n LogStatusFilter: f.logStatus ?? 'all',\n SortColumn: this.LogsSortColumn,\n SortDirection: this.LogsSortAscending ? 'asc' : 'desc',\n VisibleLogLabels: this.FilteredLogs.map(l => this.logLabel(l)),\n SelectedLogId: this.SelectedLog?.ID ?? null,\n SelectedLogName: this.SelectedLog?.ToolName ?? null,\n DetailPanelOpen: this.ShowLogDetailPanel,\n },\n };\n }\n case 'servers':\n default: {\n const selected = this.Servers.find(s => this.ExpandedServerID && UUIDsEqual(s.ID, this.ExpandedServerID)) ?? null;\n return {\n Tab: 'servers',\n Data: {\n ServerCount: this.Servers.length,\n FilteredServerCount: this.FilteredServers.length,\n ActiveServerCount: this.Stats.activeServers,\n ServerStatusFilter: f.serverStatus ?? 'all',\n VisibleServerNames: this.FilteredServers.map(s => s.Name),\n SelectedServerId: selected?.ID ?? null,\n SelectedServerName: selected?.Name ?? null,\n },\n };\n }\n }\n }\n\n /**\n * Build a non-secret display label for a log row: the tool name plus its\n * status (e.g. \"github_search · Error\"). NEVER includes InputArgs or Result.\n */\n private logLabel(log: MCPExecutionLogData): string {\n const tool = log.ToolName || '(unknown tool)';\n return log.Status ? `${tool} · ${log.Status}` : tool;\n }\n\n // ----------------------------------------------------------------\n // Mode-scoped client-tool registration\n // ----------------------------------------------------------------\n\n /**\n * Register the safe client-tool set for the ACTIVE tab. `SetAgentClientTools`\n * replaces the registered set wholesale, so we only re-register on a tab\n * transition (guarded by {@link lastRegisteredToolMode}). Common tools are\n * always present; per-tab tools swap so e.g. a logs-only SelectLog is never\n * visible while Servers is open.\n *\n * 🔒 SAFETY: every tool below is read / filter / sort / select / navigate /\n * favorite-toggle / refresh. No tool creates, edits, deletes, executes an MCP\n * tool, or returns a secret. See the SAFETY BOUNDARY comment above.\n */\n private syncAgentToolsForMode(): void {\n const tab = this.ActiveTab;\n if (this.lastRegisteredToolMode === tab) {\n return;\n }\n this.lastRegisteredToolMode = tab;\n this.navigationService.SetAgentClientTools(this, this.buildToolsForMode(tab));\n }\n\n /** Compose the safe tool list for a given tab: common tools + per-tab tools. */\n private buildToolsForMode(tab: MCPDashboardTab): MCPAgentTool[] {\n const tools: MCPAgentTool[] = [...this.buildCommonMCPTools()];\n switch (tab) {\n case 'servers':\n tools.push(...this.buildServersTools());\n break;\n case 'connections':\n tools.push(...this.buildConnectionsTools());\n break;\n case 'tools':\n tools.push(...this.buildToolsTabTools());\n break;\n case 'logs':\n tools.push(...this.buildLogsTools());\n break;\n }\n return tools;\n }\n\n /** Tools available on EVERY tab: tab switch, search, refresh, clear filters. */\n private buildCommonMCPTools(): MCPAgentTool[] {\n return [\n {\n Name: 'SwitchMCPTab',\n Description: 'Switch the active MCP dashboard tab. Valid tabs: servers, connections, tools, logs.',\n ParameterSchema: { type: 'object', properties: { tab: { type: 'string', enum: ['servers', 'connections', 'tools', 'logs'] } }, required: ['tab'] },\n Handler: async (params: Record<string, unknown>) => this.toolSwitchTab(params),\n },\n {\n Name: 'SearchMCPTools',\n Description: 'Set the free-text search term applied to the current MCP tab (filters servers/connections/tools/logs by name/description).',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.toolSearch(params),\n },\n {\n Name: 'RefreshMCPData',\n Description: 'Reload all MCP dashboard data. Read-only — does not create, modify, or execute anything.',\n ParameterSchema: { type: 'object', properties: { forceRefresh: { type: 'boolean' } } },\n Handler: async (params: Record<string, unknown>) => this.toolRefresh(params),\n },\n {\n Name: 'ClearMCPFilters',\n Description: 'Reset all MCP dashboard filters (search, status, server, category, favorites, recent) to their defaults.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.ResetAllFilters();\n this.publishAgentContext();\n return { Success: true };\n },\n },\n ];\n }\n\n /** Servers-tab tools: filter by status, select/open a server. */\n private buildServersTools(): MCPAgentTool[] {\n return [\n {\n Name: 'FilterServersByStatus',\n Description: 'Restrict the Servers tab to a status, or \"all\" to clear.',\n ParameterSchema: { type: 'object', properties: { status: { type: 'string' } }, required: ['status'] },\n Handler: async (params: Record<string, unknown>) => this.toolFilterByStatus('server', params),\n },\n {\n Name: 'SelectServer',\n Description: 'Select (expand) an MCP server by its ID or name, revealing its details panel. Read-only navigation — does not edit or execute.',\n ParameterSchema: { type: 'object', properties: { server: { type: 'string' } }, required: ['server'] },\n Handler: async (params: Record<string, unknown>) => this.toolSelectServer(params),\n },\n {\n Name: 'OpenServerRecord',\n Description: 'Open the selected MCP server\\'s record in a new tab for VIEWING (read-only). Pass a server ID or name, or omit to open the currently selected server.',\n ParameterSchema: { type: 'object', properties: { server: { type: 'string' } } },\n Handler: async (params: Record<string, unknown>) => this.toolOpenServerRecord(params),\n },\n ];\n }\n\n /** Connections-tab tools: filter by status, select/open a connection, navigate to its server. */\n private buildConnectionsTools(): MCPAgentTool[] {\n return [\n {\n Name: 'FilterConnectionsByStatus',\n Description: 'Restrict the Connections tab to a status, or \"all\" to clear.',\n ParameterSchema: { type: 'object', properties: { status: { type: 'string' } }, required: ['status'] },\n Handler: async (params: Record<string, unknown>) => this.toolFilterByStatus('connection', params),\n },\n {\n Name: 'SelectConnection',\n Description: 'Select (expand) an MCP connection by its ID or name, revealing its details panel. Read-only navigation.',\n ParameterSchema: { type: 'object', properties: { connection: { type: 'string' } }, required: ['connection'] },\n Handler: async (params: Record<string, unknown>) => this.toolSelectConnection(params),\n },\n {\n Name: 'OpenConnectionRecord',\n Description: 'Open an MCP connection\\'s record in a new tab for VIEWING (read-only). Pass a connection ID or name, or omit to open the currently selected connection.',\n ParameterSchema: { type: 'object', properties: { connection: { type: 'string' } } },\n Handler: async (params: Record<string, unknown>) => this.toolOpenConnectionRecord(params),\n },\n {\n Name: 'NavigateToConnectionServer',\n Description: 'Open the parent MCP server record for a connection (by connection ID or name, or the selected one) in a new tab for VIEWING. Related-record navigation, read-only.',\n ParameterSchema: { type: 'object', properties: { connection: { type: 'string' } } },\n Handler: async (params: Record<string, unknown>) => this.toolNavigateToConnectionServer(params),\n },\n ];\n }\n\n /** Tools-tab tools: filter (status/server/category/favorites/recent), view-mode, favorite toggle, select/open. */\n private buildToolsTabTools(): MCPAgentTool[] {\n return [\n {\n Name: 'FilterToolsByStatus',\n Description: 'Restrict the Tools tab to a tool status, or \"all\" to clear.',\n ParameterSchema: { type: 'object', properties: { status: { type: 'string' } }, required: ['status'] },\n Handler: async (params: Record<string, unknown>) => this.toolFilterByStatus('tool', params),\n },\n {\n Name: 'FilterMCPToolsByServer',\n Description: 'Restrict the Tools tab to a single MCP server by its ID or name, or \"all\" to clear the server filter.',\n ParameterSchema: { type: 'object', properties: { server: { type: 'string' } }, required: ['server'] },\n Handler: async (params: Record<string, unknown>) => this.toolFilterByServer(params),\n },\n {\n Name: 'FilterToolsByCategory',\n Description: 'Restrict the Tools tab to a category (the snake_case prefix of tool names), or \"all\" to clear.',\n ParameterSchema: { type: 'object', properties: { category: { type: 'string' } }, required: ['category'] },\n Handler: async (params: Record<string, unknown>) => this.toolFilterByCategory(params),\n },\n {\n Name: 'ToggleToolsFavoritesOnly',\n Description: 'Toggle (or set) restricting the Tools tab to favorited tools only.',\n ParameterSchema: { type: 'object', properties: { enabled: { type: 'boolean' } } },\n Handler: async (params: Record<string, unknown>) => this.toolToggleFavoritesOnly(params),\n },\n {\n Name: 'SetToolsViewMode',\n Description: 'Set the Tools tab view mode. Valid modes: card, list.',\n ParameterSchema: { type: 'object', properties: { mode: { type: 'string', enum: ['card', 'list'] } }, required: ['mode'] },\n Handler: async (params: Record<string, unknown>) => this.toolSetToolsViewMode(params),\n },\n {\n Name: 'ToggleMCPToolFavorite',\n Description: 'Toggle the favorite flag for an MCP tool (by ID or name) for the current user. Read/navigational preference only — does NOT execute or modify the tool.',\n ParameterSchema: { type: 'object', properties: { tool: { type: 'string' } }, required: ['tool'] },\n Handler: async (params: Record<string, unknown>) => this.toolToggleFavorite(params),\n },\n {\n Name: 'SelectTool',\n Description: 'Select (expand) an MCP tool by its ID or name, revealing its details. Read-only navigation — does NOT execute the tool.',\n ParameterSchema: { type: 'object', properties: { tool: { type: 'string' } }, required: ['tool'] },\n Handler: async (params: Record<string, unknown>) => this.toolSelectTool(params),\n },\n {\n Name: 'OpenToolRecord',\n Description: 'Open an MCP tool\\'s record in a new tab for VIEWING (read-only). Pass a tool ID or name, or omit to open the currently selected tool. Does NOT execute the tool.',\n ParameterSchema: { type: 'object', properties: { tool: { type: 'string' } } },\n Handler: async (params: Record<string, unknown>) => this.toolOpenToolRecord(params),\n },\n ];\n }\n\n /** Logs-tab tools: filter by status, sort, select/open a log. */\n private buildLogsTools(): MCPAgentTool[] {\n return [\n {\n Name: 'FilterLogsByStatus',\n Description: 'Restrict the Logs tab to an execution status, or \"all\" to clear.',\n ParameterSchema: { type: 'object', properties: { status: { type: 'string' } }, required: ['status'] },\n Handler: async (params: Record<string, unknown>) => this.toolFilterByStatus('log', params),\n },\n {\n Name: 'SortLogs',\n Description: 'Sort the execution-logs table by a column. Columns: status, server, tool, connection, started, duration, error. Clicking the same column again toggles direction.',\n ParameterSchema: { type: 'object', properties: { column: { type: 'string', enum: ['status', 'server', 'tool', 'connection', 'started', 'duration', 'error'] } }, required: ['column'] },\n Handler: async (params: Record<string, unknown>) => this.toolSortLogs(params),\n },\n {\n Name: 'SelectLog',\n Description: 'Select an execution log by its ID (or a tool-name match) to open its detail panel for VIEWING. Read-only navigation. Note: the panel never exposes credentials.',\n ParameterSchema: { type: 'object', properties: { log: { type: 'string' } }, required: ['log'] },\n Handler: async (params: Record<string, unknown>) => this.toolSelectLog(params),\n },\n {\n Name: 'OpenLogRecord',\n Description: 'Open an execution-log record in a new tab for VIEWING (read-only). Pass a log ID, or omit to open the currently selected log.',\n ParameterSchema: { type: 'object', properties: { log: { type: 'string' } } },\n Handler: async (params: Record<string, unknown>) => this.toolOpenLogRecord(params),\n },\n ];\n }\n\n // ----------------------------------------------------------------\n // Tolerant tool handlers (validate input, never throw)\n // ----------------------------------------------------------------\n\n /** Switch the active tab after validating it. */\n private toolSwitchTab(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateEnumParam(params?.['tab'], MCP_TABS, 'tab');\n if (!v.ok) return v.result;\n this.SetActiveTab(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Set the dashboard search term. */\n private toolSearch(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['query'], 'query');\n if (!v.ok) return v.result;\n this.OnSearchChange(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Set a per-tab status filter ('all' or a status string). Tolerant of any string. */\n private toolFilterByStatus(kind: 'server' | 'connection' | 'tool' | 'log', params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['status'], 'status');\n if (!v.ok) return v.result;\n this.OnStatusFilterChange(kind, v.value || 'all');\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Restrict the Tools tab to a single server (by ID or name; 'all' to clear). */\n private toolFilterByServer(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['server'], 'server');\n if (!v.ok) return v.result;\n const raw = v.value;\n // Ensure the Tools tab is active so the filter is meaningful.\n this.SetActiveTab('tools');\n if (!raw || raw === 'all') {\n this.OnFilterFieldChange('toolsServer', 'all');\n this.publishAgentContext();\n return { Success: true };\n }\n const candidates: MCPNamedItem[] = this.ToolsAvailableServers.map(s => ({ ID: s.ID, Name: s.Name }));\n const match = ResolveMCPItem(raw, candidates);\n if (!match) {\n return { Success: false, ErrorMessage: BuildMCPNotFoundError(raw, candidates, 'server') };\n }\n this.OnFilterFieldChange('toolsServer', match.ID);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Restrict the Tools tab to a category prefix ('all' to clear). Tolerant. */\n private toolFilterByCategory(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['category'], 'category');\n if (!v.ok) return v.result;\n const cat = v.value || 'all';\n this.SetActiveTab('tools');\n if (cat !== 'all' && !this.ToolsAvailableCategories.some(c => c.category === cat)) {\n const sample = this.ToolsAvailableCategories.slice(0, 6).map(c => c.category).join(', ');\n return { Success: false, ErrorMessage: `Category \"${cat}\" is not available. Available categories include: ${sample || '(none)'}.` };\n }\n this.OnFilterFieldChange('toolsCategory', cat);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Toggle (or explicitly set) the favorites-only filter on the Tools tab. */\n private toolToggleFavoritesOnly(params: Record<string, unknown>): AgentToolResult {\n this.SetActiveTab('tools');\n const raw = params?.['enabled'];\n const enabled = typeof raw === 'boolean' ? raw : !(this.Filters$.value.favoritesOnly ?? false);\n this.OnFilterFieldChange('favoritesOnly', enabled);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Toggle a tool's favorite flag for the current user (by ID or name). */\n private async toolToggleFavorite(params: Record<string, unknown>): Promise<AgentToolResult> {\n const v = ValidateStringParam(params?.['tool'], 'tool');\n if (!v.ok) return v.result;\n const match = ResolveMCPItem(v.value, this.toolCandidates());\n if (!match) {\n return { Success: false, ErrorMessage: BuildMCPNotFoundError(v.value, this.toolCandidates(), 'tool') };\n }\n try {\n await this.ToggleFavorite(match.ID);\n this.publishAgentContext();\n return { Success: true };\n } catch (e) {\n return { Success: false, ErrorMessage: e instanceof Error ? e.message : 'Toggle favorite failed.' };\n }\n }\n\n /** Reload all dashboard data (read-only). */\n private async toolRefresh(params: Record<string, unknown>): Promise<AgentToolResult> {\n const forceRefresh = params?.['forceRefresh'] === true;\n try {\n await this.LoadAllData(forceRefresh);\n this.publishAgentContext();\n return { Success: true };\n } catch (e) {\n return { Success: false, ErrorMessage: e instanceof Error ? e.message : 'Refresh failed.' };\n }\n }\n\n /** Switch the Tools tab view mode after validating it. */\n private toolSetToolsViewMode(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateEnumParam(params?.['mode'], MCP_TOOLS_VIEW_MODES, 'mode');\n if (!v.ok) return v.result;\n this.SetToolsViewMode(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Sort the logs table by a validated column. */\n private toolSortLogs(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateEnumParam(params?.['column'], MCP_LOG_SORT_COLUMNS, 'column');\n if (!v.ok) return v.result;\n this.SetActiveTab('logs');\n this.OnLogSortColumn(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n // --- selection / open helpers ---\n\n /** Name-and-ID candidates for the tool resolver (tool display name = title || name). */\n private toolCandidates(): MCPNamedItem[] {\n return this.tools.map(t => ({ ID: t.ID, Name: t.ToolTitle || t.ToolName }));\n }\n\n /** Resolve a server reference (ID or name); returns the row or a tolerant error. */\n private resolveServerRef(raw: string): { ok: true; server: MCPServerData } | { ok: false; result: AgentToolResult } {\n const candidates: MCPNamedItem[] = this.Servers.map(s => ({ ID: s.ID, Name: s.Name }));\n const match = ResolveMCPItem(raw, candidates);\n if (!match) {\n return { ok: false, result: { Success: false, ErrorMessage: BuildMCPNotFoundError(raw, candidates, 'server') } };\n }\n const server = this.Servers.find(s => UUIDsEqual(s.ID, match.ID))!;\n return { ok: true, server };\n }\n\n /** Resolve a connection reference (ID or name); returns the row or a tolerant error. */\n private resolveConnectionRef(raw: string): { ok: true; connection: MCPConnectionData } | { ok: false; result: AgentToolResult } {\n const candidates: MCPNamedItem[] = this.Connections.map(c => ({ ID: c.ID, Name: c.Name }));\n const match = ResolveMCPItem(raw, candidates);\n if (!match) {\n return { ok: false, result: { Success: false, ErrorMessage: BuildMCPNotFoundError(raw, candidates, 'connection') } };\n }\n const connection = this.Connections.find(c => UUIDsEqual(c.ID, match.ID))!;\n return { ok: true, connection };\n }\n\n /** Select (expand) a server by ID or name. */\n private toolSelectServer(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['server'], 'server');\n if (!v.ok) return v.result;\n const r = this.resolveServerRef(v.value);\n if (!r.ok) return r.result;\n this.SetActiveTab('servers');\n if (!this.IsServerExpanded(r.server)) {\n this.ToggleServerExpand(r.server);\n }\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Open a server record in a tab (view-only). Defaults to the selected server. */\n private toolOpenServerRecord(params: Record<string, unknown>): AgentToolResult {\n const raw = typeof params?.['server'] === 'string' ? (params['server'] as string) : '';\n let server: MCPServerData | null = null;\n if (raw) {\n const r = this.resolveServerRef(raw);\n if (!r.ok) return r.result;\n server = r.server;\n } else {\n server = this.Servers.find(s => this.ExpandedServerID && UUIDsEqual(s.ID, this.ExpandedServerID)) ?? null;\n if (!server) return { Success: false, ErrorMessage: 'No server is selected. Pass a server ID or name, or select one first.' };\n }\n this.navigationService.OpenEntityRecord('MJ: MCP Servers', CompositeKey.FromID(server.ID));\n return { Success: true };\n }\n\n /** Select (expand) a connection by ID or name. */\n private toolSelectConnection(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['connection'], 'connection');\n if (!v.ok) return v.result;\n const r = this.resolveConnectionRef(v.value);\n if (!r.ok) return r.result;\n this.SetActiveTab('connections');\n if (!this.IsConnectionExpanded(r.connection)) {\n this.ToggleConnectionExpand(r.connection);\n }\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Open a connection record in a tab (view-only). Defaults to the selected connection. */\n private toolOpenConnectionRecord(params: Record<string, unknown>): AgentToolResult {\n const raw = typeof params?.['connection'] === 'string' ? (params['connection'] as string) : '';\n let connection: MCPConnectionData | null = null;\n if (raw) {\n const r = this.resolveConnectionRef(raw);\n if (!r.ok) return r.result;\n connection = r.connection;\n } else {\n connection = this.Connections.find(c => this.ExpandedConnectionID && UUIDsEqual(c.ID, this.ExpandedConnectionID)) ?? null;\n if (!connection) return { Success: false, ErrorMessage: 'No connection is selected. Pass a connection ID or name, or select one first.' };\n }\n this.navigationService.OpenEntityRecord('MJ: MCP Server Connections', CompositeKey.FromID(connection.ID));\n return { Success: true };\n }\n\n /** Navigate to the parent server of a connection (related-record, view-only). */\n private toolNavigateToConnectionServer(params: Record<string, unknown>): AgentToolResult {\n const raw = typeof params?.['connection'] === 'string' ? (params['connection'] as string) : '';\n let connection: MCPConnectionData | null = null;\n if (raw) {\n const r = this.resolveConnectionRef(raw);\n if (!r.ok) return r.result;\n connection = r.connection;\n } else {\n connection = this.Connections.find(c => this.ExpandedConnectionID && UUIDsEqual(c.ID, this.ExpandedConnectionID)) ?? null;\n if (!connection) return { Success: false, ErrorMessage: 'No connection is selected. Pass a connection ID or name, or select one first.' };\n }\n const server = this.Servers.find(s => UUIDsEqual(s.ID, connection!.MCPServerID));\n if (!server) return { Success: false, ErrorMessage: `The parent server for connection \"${connection.Name}\" is not loaded.` };\n this.navigationService.OpenEntityRecord('MJ: MCP Servers', CompositeKey.FromID(server.ID));\n return { Success: true };\n }\n\n /** Select (expand) a tool by ID or name. Does NOT execute the tool. */\n private toolSelectTool(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['tool'], 'tool');\n if (!v.ok) return v.result;\n const match = ResolveMCPItem(v.value, this.toolCandidates());\n if (!match) return { Success: false, ErrorMessage: BuildMCPNotFoundError(v.value, this.toolCandidates(), 'tool') };\n const tool = this.tools.find(t => UUIDsEqual(t.ID, match.ID))!;\n this.SetActiveTab('tools');\n if (!this.IsToolExpanded(tool)) {\n this.ToggleToolExpand(tool);\n }\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Open a tool record in a tab (view-only). Defaults to the selected tool. Does NOT execute. */\n private toolOpenToolRecord(params: Record<string, unknown>): AgentToolResult {\n const raw = typeof params?.['tool'] === 'string' ? (params['tool'] as string) : '';\n let tool: MCPToolData | null = null;\n if (raw) {\n const match = ResolveMCPItem(raw, this.toolCandidates());\n if (!match) return { Success: false, ErrorMessage: BuildMCPNotFoundError(raw, this.toolCandidates(), 'tool') };\n tool = this.tools.find(t => UUIDsEqual(t.ID, match.ID)) ?? null;\n } else {\n tool = this.tools.find(t => this.ExpandedToolId && UUIDsEqual(t.ID, this.ExpandedToolId)) ?? null;\n if (!tool) return { Success: false, ErrorMessage: 'No tool is selected. Pass a tool ID or name, or select one first.' };\n }\n this.navigationService.OpenEntityRecord('MJ: MCP Server Tools', CompositeKey.FromID(tool!.ID));\n return { Success: true };\n }\n\n /** Select a log (open its detail panel) by ID or tool-name match. */\n private async toolSelectLog(params: Record<string, unknown>): Promise<AgentToolResult> {\n const v = ValidateStringParam(params?.['log'], 'log');\n if (!v.ok) return v.result;\n const candidates: MCPNamedItem[] = this.FilteredLogs.map(l => ({ ID: l.ID, Name: l.ToolName }));\n const match = ResolveMCPItem(v.value, candidates);\n if (!match) return { Success: false, ErrorMessage: BuildMCPNotFoundError(v.value, candidates, 'log') };\n const log = this.ExecutionLogs.find(l => UUIDsEqual(l.ID, match.ID));\n if (!log) return { Success: false, ErrorMessage: `Log \"${v.value}\" is no longer loaded.` };\n this.SetActiveTab('logs');\n await this.OnLogClick(log);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Open a log record in a tab (view-only). Defaults to the selected log. */\n private toolOpenLogRecord(params: Record<string, unknown>): AgentToolResult {\n const raw = typeof params?.['log'] === 'string' ? (params['log'] as string) : '';\n let log: MCPExecutionLogData | null = null;\n if (raw) {\n const candidates: MCPNamedItem[] = this.ExecutionLogs.map(l => ({ ID: l.ID, Name: l.ToolName }));\n const match = ResolveMCPItem(raw, candidates);\n if (!match) return { Success: false, ErrorMessage: BuildMCPNotFoundError(raw, candidates, 'log') };\n log = this.ExecutionLogs.find(l => UUIDsEqual(l.ID, match.ID)) ?? null;\n } else {\n log = this.SelectedLog;\n if (!log) return { Success: false, ErrorMessage: 'No log is selected. Pass a log ID, or select one first.' };\n }\n this.navigationService.OpenEntityRecord('MJ: MCP Tool Execution Logs', CompositeKey.FromID(log!.ID));\n return { Success: true };\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 = RunView.FromMetadataProvider(this.ProviderToUse);\n // Dialect-neutral 7-day cutoff: compute in JS and inject an ISO-8601\n // literal rather than DATEADD/GETUTCDATE, which don't exist on PostgreSQL.\n const sevenDaysAgoIso = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();\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 >= '${sevenDaysAgoIso}'`,\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 // Index tools by server ID once, now that tools/connections are loaded.\n this.buildToolsByServerMap();\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 // Refresh the agent context now that counts/stats are recomputed.\n this.publishAgentContext();\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 /** @deprecated Use {@link LoadAllData}. */\n public async loadAllData(forceRefresh: boolean = false): Promise<void> {\n return this.LoadAllData(forceRefresh);\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 // Re-emit agent context so search / filter / tab-clear changes are\n // reflected in the AI agent's view of this surface.\n this.publishAgentContext();\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 /** @deprecated Use {@link ApplyFilters}. */\n public applyFilters(): void {\n return this.ApplyFilters();\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 /** @deprecated Use {@link OnSearchChange}. */\n public onSearchChange(term: string): void {\n return this.OnSearchChange(term);\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 /** @deprecated Use {@link OnStatusFilterChange}. */\n public onStatusFilterChange(filterType: string, value: string): void {\n return this.OnStatusFilterChange(filterType, value);\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 /** @deprecated Use {@link ToggleFilterPanel}. */\n public toggleFilterPanel(): void {\n return this.ToggleFilterPanel();\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 /** @deprecated Use {@link OnFiltersChange}. */\n public onFiltersChange(filters: MCPDashboardFilters): void {\n return this.OnFiltersChange(filters);\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 /** @deprecated Use {@link OnFilterFieldChange}. */\n public onFilterFieldChange(field: keyof MCPDashboardFilters, value: unknown): void {\n return this.OnFilterFieldChange(field, value);\n }\n\n /** Count of non-default filter dimensions, used for \"Filters (N)\" badge */\n public activeFilterCount(): number { // case-violation-ok-legacy-back-compat: the PascalCase name is already taken in this scope\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 /** @deprecated Use {@link ComputeCategoriesFromTools}. */\n public computeCategoriesFromTools(): Array<{ category: string; count: number }> {\n return this.ComputeCategoriesFromTools();\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 /** @deprecated Use {@link ResetAllFilters}. */\n public resetAllFilters(): void {\n return this.ResetAllFilters();\n }\n\n /** Reset only the popover filters — leave searchTerm (toolbar) untouched. */\n public ResetPopoverFilters(): void {\n const current = this.Filters$.value;\n this.OnFiltersChange({\n ...current,\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 /** @deprecated Use {@link ResetPopoverFilters}. */\n public resetPopoverFilters(): void {\n return this.ResetPopoverFilters();\n }\n\n /** Tools-tab view-mode options for the shared <mj-view-toggle>. */\n public readonly ToolsViewOptions = [\n { key: 'card', icon: 'fa-solid fa-grip', title: 'Card View' },\n { key: 'list', icon: 'fa-solid fa-list', title: 'List View' },\n ];\n\n /** @deprecated Use {@link ToolsViewOptions}. */\n public get toolsViewOptions() {\n return this.ToolsViewOptions;\n }\n\n /** Tab config consumed by the centralized <mj-tab-nav>. */\n public get McpTabs(): import('@memberjunction/ng-ui-components').TabConfig[] {\n return [\n { key: 'servers', label: 'Servers', icon: 'fa-solid fa-server', badge: this.Servers.length },\n { key: 'connections', label: 'Connections', icon: 'fa-solid fa-link', badge: this.Connections.length },\n { key: 'tools', label: 'Tools', icon: 'fa-solid fa-wrench', badge: this.tools.length },\n { key: 'logs', label: 'Logs', icon: 'fa-solid fa-list-check', badge: this.ExecutionLogs.length, badgeVariant: this.Stats.failedExecutions > 0 ? 'error' : 'default' },\n ];\n }\n\n /** @deprecated Use {@link McpTabs}. */\n public get mcpTabs(): import('@memberjunction/ng-ui-components').TabConfig[] {\n return this.McpTabs;\n }\n\n /** Active filter count excluding searchTerm (surfaced separately via toolbar mj-page-search). */\n public get ActiveFilterCount(): number {\n const f = this.Filters$.value;\n let n = 0;\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 /** Values record consumed by the centralized <mj-filter-panel>, scoped to the current tab. */\n public get McpFilterValues(): Record<string, unknown> {\n const f = this.Filters$.value;\n return {\n serverStatus: f.serverStatus,\n connectionStatus: f.connectionStatus,\n toolStatus: f.toolStatus,\n logStatus: f.logStatus,\n toolsServer: f.toolsServer,\n toolsCategory: f.toolsCategory,\n favoritesOnly: f.favoritesOnly,\n recentOnly: f.recentOnly,\n };\n }\n\n /** @deprecated Use {@link McpFilterValues}. */\n public get mcpFilterValues(): Record<string, unknown> {\n return this.McpFilterValues;\n }\n\n /** Field config built dynamically based on the active tab. */\n public get McpFilterFields(): import('@memberjunction/ng-ui-components').FilterFieldConfig[] {\n const fields: import('@memberjunction/ng-ui-components').FilterFieldConfig[] = [];\n\n if (this.ActiveTab === 'tools') {\n fields.push({\n key: 'toolsServer',\n type: 'dropdown',\n label: 'Server',\n icon: 'fa-solid fa-server',\n filterable: this.ToolsAvailableServers.length > 10,\n options: [\n { text: 'All Servers', value: 'all' },\n ...this.ToolsAvailableServers.map(s => ({ text: s.Name, value: s.ID })),\n ],\n });\n fields.push({\n key: 'toolsCategory',\n type: 'dropdown',\n label: 'Category',\n icon: 'fa-solid fa-tags',\n filterable: this.ToolsAvailableCategories.length > 10,\n options: [\n { text: 'All Categories', value: 'all' },\n ...this.ToolsAvailableCategories.map(c => ({ text: `${c.category} (${c.count})`, value: c.category })),\n ],\n });\n }\n\n // Per-tab status filter\n if (this.ActiveTab === 'servers') {\n fields.push({\n key: 'serverStatus',\n type: 'dropdown',\n label: 'Server Status',\n icon: 'fa-solid fa-toggle-on',\n options: [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Inactive', value: 'Inactive' },\n ],\n });\n } else if (this.ActiveTab === 'connections') {\n fields.push({\n key: 'connectionStatus',\n type: 'dropdown',\n label: 'Connection Status',\n icon: 'fa-solid fa-toggle-on',\n options: [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Inactive', value: 'Inactive' },\n { text: 'Error', value: 'Error' },\n ],\n });\n } else if (this.ActiveTab === 'tools') {\n fields.push({\n key: 'toolStatus',\n type: 'dropdown',\n label: 'Tool Status',\n icon: 'fa-solid fa-toggle-on',\n options: [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Deprecated', value: 'Deprecated' },\n ],\n });\n // Boolean toggles as chips (active = true, all = false)\n fields.push({\n key: 'favoritesOnly',\n type: 'chips',\n label: 'Favorites',\n icon: 'fa-solid fa-star',\n chipOptions: [\n { text: 'All', value: false },\n { text: 'Favorites only', value: true, icon: 'fa-solid fa-star' },\n ],\n });\n fields.push({\n key: 'recentOnly',\n type: 'chips',\n label: 'Recency',\n icon: 'fa-solid fa-clock-rotate-left',\n chipOptions: [\n { text: 'All', value: false },\n { text: 'Recently used only', value: true, icon: 'fa-solid fa-clock-rotate-left' },\n ],\n });\n } else if (this.ActiveTab === 'logs') {\n fields.push({\n key: 'logStatus',\n type: 'dropdown',\n label: 'Log Status',\n icon: 'fa-solid fa-circle-check',\n options: [\n { text: 'All Statuses', value: 'all' },\n { text: 'Success', value: 'Success' },\n { text: 'Error', value: 'Error' },\n { text: 'Running', value: 'Running' },\n ],\n });\n }\n\n return fields;\n }\n\n /** @deprecated Use {@link McpFilterFields}. */\n public get mcpFilterFields(): import('@memberjunction/ng-ui-components').FilterFieldConfig[] {\n return this.McpFilterFields;\n }\n\n /** Receive updated values from <mj-filter-panel> and propagate to filters$. */\n public OnFilterValuesChange(values: Record<string, unknown>): void {\n const current = this.Filters$.value;\n this.OnFiltersChange({\n ...current,\n serverStatus: (values['serverStatus'] as string) ?? current.serverStatus,\n connectionStatus: (values['connectionStatus'] as string) ?? current.connectionStatus,\n toolStatus: (values['toolStatus'] as string) ?? current.toolStatus,\n logStatus: (values['logStatus'] as string) ?? current.logStatus,\n toolsServer: (values['toolsServer'] as string) ?? current.toolsServer,\n toolsCategory: (values['toolsCategory'] as string) ?? current.toolsCategory,\n favoritesOnly: (values['favoritesOnly'] as boolean) ?? false,\n recentOnly: (values['recentOnly'] as boolean) ?? false,\n });\n }\n\n /** @deprecated Use {@link OnFilterValuesChange}. */\n public onFilterValuesChange(values: Record<string, unknown>): void {\n return this.OnFilterValuesChange(values);\n }\n\n /** Update searchTerm from the toolbar mj-page-search. */\n public OnSearchTermChange(value: string): void {\n const current = this.Filters$.value;\n this.OnFiltersChange({ ...current, searchTerm: value ?? '' });\n }\n\n /** @deprecated Use {@link OnSearchTermChange}. */\n public onSearchTermChange(value: string): void {\n return this.OnSearchTermChange(value);\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\n // Clear filters that belong to OTHER tabs — they're not applicable here\n // and would otherwise stay stuck in state (counted in the badge, hidden from\n // the popover form). searchTerm is universal and preserved.\n const current = this.Filters$.value;\n this.OnFiltersChange({\n ...current,\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 this.UpdateQueryParams({ tab: this.ActiveTab });\n // Mode-scoping: swap the agent's per-tab tool set on the tab transition,\n // then re-publish the now-tab-scoped deep context.\n this.syncAgentToolsForMode();\n this.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link SetActiveTab}. */\n public setActiveTab(tab: MCPDashboardTab): void {\n return this.SetActiveTab(tab);\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 /** @deprecated Use {@link CreateServer}. */\n public createServer(): void {\n return this.CreateServer();\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 /** @deprecated Use {@link EditServer}. */\n public editServer(server: MCPServerData): void {\n return this.EditServer(server);\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 const confirmed = await this.confirm.ConfirmDelete({\n title: 'Delete server',\n message: `Delete server \"${server.Name}\"? It has ${parts.join(' and ')}.`,\n detail: 'All related records will be deleted. This cannot be undone.',\n });\n if (!confirmed) {\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 const confirmed = await this.confirm.ConfirmDelete({\n title: 'Delete server',\n message: `Delete server \"${server.Name}\"?`,\n });\n if (!confirmed) {\n return;\n }\n }\n\n try {\n const md = this.ProviderToUse;\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 /** @deprecated Use {@link DeleteServer}. */\n public async deleteServer(server: MCPServerData): Promise<void> {\n return this.DeleteServer(server);\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 = this.ProviderToUse;\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 = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n\n // Queue deletes for 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] Queueing ${logsResult.Results.length} execution logs for delete`);\n for (const log of logsResult.Results) {\n const logEntity = await md.GetEntityObject<MJMCPToolExecutionLogEntity>('MJ: MCP Tool Execution Logs');\n if (await logEntity.Load(log.ID)) {\n logEntity.TransactionGroup = tg;\n await logEntity.Delete();\n } else {\n console.warn(`[MCPDashboard] Could not load execution log ${log.ID} - may have been already deleted`);\n }\n }\n }\n\n // Queue deletes for 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] Queueing ${authStatesResult.Results.length} OAuth Authorization States for delete`);\n for (const state of authStatesResult.Results) {\n const stateEntity = await md.GetEntityObject<MJOAuthAuthorizationStateEntity>('MJ: O Auth Authorization States');\n if (await stateEntity.Load(state.ID)) {\n stateEntity.TransactionGroup = tg;\n await stateEntity.Delete();\n } else {\n console.warn(`[MCPDashboard] Could not load OAuth Authorization State ${state.ID} - may have been already deleted`);\n }\n }\n }\n\n // Queue deletes for 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] Queueing ${clientRegsResult.Results.length} OAuth Client Registrations for delete`);\n for (const reg of clientRegsResult.Results) {\n const regEntity = await md.GetEntityObject<MJOAuthClientRegistrationEntity>('MJ: O Auth Client Registrations');\n if (await regEntity.Load(reg.ID)) {\n regEntity.TransactionGroup = tg;\n await regEntity.Delete();\n } else {\n console.warn(`[MCPDashboard] Could not load OAuth Client Registration ${reg.ID} - may have been already deleted`);\n }\n }\n }\n\n // Queue deletes for 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] Queueing ${tokensResult.Results.length} OAuth Tokens for delete`);\n for (const token of tokensResult.Results) {\n const tokenEntity = await md.GetEntityObject<MJOAuthTokenEntity>('MJ: O Auth Tokens');\n if (await tokenEntity.Load(token.ID)) {\n tokenEntity.TransactionGroup = tg;\n await tokenEntity.Delete();\n } else {\n console.warn(`[MCPDashboard] Could not load OAuth Token ${token.ID} - may have been already deleted`);\n }\n }\n }\n\n // Queue the connection delete last\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 entity.TransactionGroup = tg;\n await entity.Delete();\n\n // Submit everything atomically — if anything fails, the whole cascade rolls back\n if (!await tg.Submit()) {\n const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Delete failed';\n throw new Error(`Failed to delete connection and related records: ${errorMsg}`);\n }\n console.log('[MCPDashboard] Connection and all related records deleted atomically');\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 /** @deprecated Use {@link OnServerDialogClose}. */\n public async onServerDialogClose(result: { saved: boolean }): Promise<void> {\n return this.OnServerDialogClose(result);\n }\n\n public CancelServerForm(): void {\n this.ShowServerDialog = false;\n this.ServerFormError = null;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link CancelServerForm}. */\n public cancelServerForm(): void {\n return this.CancelServerForm();\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 = this.ProviderToUse;\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 /** @deprecated Use {@link SaveServerForm}. */\n public async saveServerForm(): Promise<void> {\n return this.SaveServerForm();\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 /** @deprecated Use {@link CancelConnectionForm}. */\n public cancelConnectionForm(): void {\n return this.CancelConnectionForm();\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 = this.ProviderToUse;\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 /** @deprecated Use {@link SaveConnectionForm}. */\n public async saveConnectionForm(): Promise<void> {\n return this.SaveConnectionForm();\n }\n\n public EditConnection(connection: MCPConnectionData): void {\n this.EditingConnection = connection;\n this.ShowConnectionDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link EditConnection}. */\n public editConnection(connection: MCPConnectionData): void {\n return this.EditConnection(connection);\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 const confirmed = await this.confirm.ConfirmDelete({\n title: 'Delete connection',\n message: `Delete connection \"${connection.Name}\"? It has ${relatedLogs.length} execution log(s).`,\n detail: 'All related logs will be deleted. This cannot be undone.',\n });\n if (!confirmed) {\n return;\n }\n } else {\n const confirmed = await this.confirm.ConfirmDelete({\n title: 'Delete connection',\n message: `Delete connection \"${connection.Name}\"?`,\n });\n if (!confirmed) {\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 /** @deprecated Use {@link DeleteConnection}. */\n public async deleteConnection(connection: MCPConnectionData): Promise<void> {\n return this.DeleteConnection(connection);\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 /** @deprecated Use {@link OnConnectionDialogClose}. */\n public async onConnectionDialogClose(result: { saved: boolean }): Promise<void> {\n return this.OnConnectionDialogClose(result);\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.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link ToggleToolExpand}. */\n public toggleToolExpand(tool: MCPToolData): void {\n return this.ToggleToolExpand(tool);\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 /** @deprecated Use {@link IsToolExpanded}. */\n public isToolExpanded(tool: MCPToolData): boolean {\n return this.IsToolExpanded(tool);\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 /** @deprecated Use {@link SetToolsViewMode}. */\n public setToolsViewMode(mode: ToolsViewMode): void {\n return this.SetToolsViewMode(mode);\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 /** @deprecated Use {@link SetToolsSort}. */\n public setToolsSort(sortBy: ToolsSortBy): void {\n return this.SetToolsSort(sortBy);\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 /** @deprecated Use {@link ToggleServerGroup}. */\n public toggleServerGroup(group: MCPServerGroup): void {\n return this.ToggleServerGroup(group);\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 /** @deprecated Use {@link OpenTestToolDialog}. */\n public openTestToolDialog(tool?: MCPToolData, connection?: MCPConnectionData): void {\n return this.OpenTestToolDialog(tool, connection);\n }\n\n /**\n * Close Test Tool dialog\n */\n public OnTestToolDialogClose(): void {\n this.TestCloseDialog();\n }\n\n /** @deprecated Use {@link OnTestToolDialogClose}. */\n public onTestToolDialogClose(): void {\n return this.OnTestToolDialogClose();\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 /** @deprecated Use {@link OnTestServerChange}. */\n public onTestServerChange(value: string): void {\n return this.OnTestServerChange(value);\n }\n\n public OnTestConnectionChange(value: string): void {\n this.TestToolConnectionID = value || null;\n }\n\n /** @deprecated Use {@link OnTestConnectionChange}. */\n public onTestConnectionChange(value: string): void {\n return this.OnTestConnectionChange(value);\n }\n\n public OnTestToolSelectChange(value: string): void {\n this.TestToolID = value || null;\n }\n\n /** @deprecated Use {@link OnTestToolSelectChange}. */\n public onTestToolSelectChange(value: string): void {\n return this.OnTestToolSelectChange(value);\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 /** @deprecated Use {@link TestProceedToConfig}. */\n public testProceedToConfig(): void {\n return this.TestProceedToConfig();\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 /** @deprecated Use {@link TestSetParam}. */\n public testSetParam(name: string, value: string): void {\n return this.TestSetParam(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 /** @deprecated Use {@link TestExecuteTool}. */\n public async testExecuteTool(): Promise<void> {\n return this.TestExecuteTool();\n }\n\n public TestGoBack(): void {\n this.TestStep = this.TestStep === 'results' ? 'configure' : 'select';\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link TestGoBack}. */\n public testGoBack(): void {\n return this.TestGoBack();\n }\n\n public TestRunAgain(): void {\n this.TestExecutionResult = null;\n this.TestStep = 'configure';\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link TestRunAgain}. */\n public testRunAgain(): void {\n return this.TestRunAgain();\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 /** @deprecated Use {@link TestCloseDialog}. */\n public testCloseDialog(): void {\n return this.TestCloseDialog();\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 /** @deprecated Use {@link FormatTestResult}. */\n public formatTestResult(result: unknown): string {\n return this.FormatTestResult(result);\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 /** @deprecated Use {@link LoadToolsPage}. */\n public async loadToolsPage(reset: boolean = true): Promise<void> {\n return this.LoadToolsPage(reset);\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 /** @deprecated Use {@link OnToolsScrolledIndexChange}. */\n public onToolsScrolledIndexChange(index: number): void {\n return this.OnToolsScrolledIndexChange(index);\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 /** @deprecated Use {@link OnToolsScrollNative}. */\n public onToolsScrollNative(event: Event): void {\n return this.OnToolsScrollNative(event);\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 /** @deprecated Use {@link ToggleScalableMode}. */\n public toggleScalableMode(enabled: boolean): void {\n return this.ToggleScalableMode(enabled);\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 /** @deprecated Use {@link LoadToolCounts}. */\n public async loadToolCounts(): Promise<void> {\n return this.LoadToolCounts();\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 /** @deprecated Use {@link GetServerToolCount}. */\n public getServerToolCount(serverID: string): number {\n return this.GetServerToolCount(serverID);\n }\n\n public TrackPagedTool(_index: number, tool: MCPToolSummary): string {\n return tool.ID;\n }\n\n /** @deprecated Use {@link TrackPagedTool}. */\n public trackPagedTool(_index: number, tool: MCPToolSummary): string {\n return this.TrackPagedTool(_index, tool);\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 /** @deprecated Use {@link VisiblePagedTools}. */\n public get visiblePagedTools(): MCPToolSummary[] {\n return this.VisiblePagedTools;\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 /** @deprecated Use {@link ScaleDenominator}. */\n public scaleDenominator(): number {\n return this.ScaleDenominator();\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 /** @deprecated Use {@link IsRecentTestTool}. */\n public isRecentTestTool(toolID: string): boolean {\n return this.IsRecentTestTool(toolID);\n }\n\n public OnTestToolSearchChange(value: string): void {\n this.TestToolSearch = value;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnTestToolSearchChange}. */\n public onTestToolSearchChange(value: string): void {\n return this.OnTestToolSearchChange(value);\n }\n\n public PickTestTool(toolID: string): void {\n this.TestToolID = toolID;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link PickTestTool}. */\n public pickTestTool(toolID: string): void {\n return this.PickTestTool(toolID);\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 = this.ProviderToUse;\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 /** @deprecated Use {@link LoadFavorites}. */\n public async loadFavorites(): Promise<void> {\n return this.LoadFavorites();\n }\n\n public IsFavorited(toolID: string): boolean {\n return this.FavoritedToolIDs.has(NormalizeUUID(toolID));\n }\n\n /** @deprecated Use {@link IsFavorited}. */\n public isFavorited(toolID: string): boolean {\n return this.IsFavorited(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 /** @deprecated Use {@link RecentToolIDSet}. */\n public recentToolIDSet(): Set<string> {\n return this.RecentToolIDSet();\n }\n\n public async ToggleFavorite(toolID: string, event?: Event): Promise<void> {\n if (event) event.stopPropagation();\n const md = this.ProviderToUse;\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 /** @deprecated Use {@link ToggleFavorite}. */\n public async toggleFavorite(toolID: string, event?: Event): Promise<void> {\n return this.ToggleFavorite(toolID, event);\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 /** @deprecated Use {@link FormatLogJson}. */\n public formatLogJson(value: string | null | undefined): string {\n return this.FormatLogJson(value);\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 /** @deprecated Use {@link GetFormattedInputSchema}. */\n public getFormattedInputSchema(tool: MCPToolData): string {\n return this.GetFormattedInputSchema(tool);\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 /** @deprecated Use {@link GetParamCount}. */\n public getParamCount(tool: MCPToolData): number {\n return this.GetParamCount(tool);\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 /** @deprecated Use {@link GetRequiredParamCount}. */\n public getRequiredParamCount(tool: MCPToolData): number {\n return this.GetRequiredParamCount(tool);\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 /** @deprecated Use {@link SyncConnectionTools}. */\n public async syncConnectionTools(connection: MCPConnectionData): Promise<void> {\n return this.SyncConnectionTools(connection);\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 /** @deprecated Use {@link GetSyncState}. */\n public getSyncState(connectionId: string): MCPSyncState | undefined {\n return this.GetSyncState(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 /** @deprecated Use {@link IsSyncing}. */\n public isSyncing(connectionId: string): boolean {\n return this.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 /** @deprecated Use {@link GetSyncProgressMessage}. */\n public getSyncProgressMessage(connectionId: string): string {\n return this.GetSyncProgressMessage(connectionId);\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 /** @deprecated Use {@link InitiateOAuthFlow}. */\n public async initiateOAuthFlow(connectionId: string): Promise<void> {\n return this.InitiateOAuthFlow(connectionId);\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 /** @deprecated Use {@link GetStatusClass}. */\n public getStatusClass(status: string): string {\n return this.GetStatusClass(status);\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 /** @deprecated Use {@link GetTransportIcon}. */\n public getTransportIcon(transportType: string): string {\n return this.GetTransportIcon(transportType);\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 /** @deprecated Use {@link OnLogSortColumn}. */\n public onLogSortColumn(column: typeof this.LogsSortColumn): void {\n return this.OnLogSortColumn(column);\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 /** @deprecated Use {@link GetLogSortClass}. */\n public getLogSortClass(column: typeof this.LogsSortColumn): string {\n return this.GetLogSortClass(column);\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnLogClick}. */\n public async onLogClick(log: MCPExecutionLogData): Promise<void> {\n return this.OnLogClick(log);\n }\n\n /**\n * Closes the log detail panel\n */\n public OnLogDetailClose(): void {\n this.ShowLogDetailPanel = false;\n this.SelectedLog = null;\n this.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnLogDetailClose}. */\n public onLogDetailClose(): void {\n return this.OnLogDetailClose();\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 /** @deprecated Use {@link OnRunAgainFromLog}. */\n public onRunAgainFromLog(event: { toolId: string; connectionId: string }): void {\n return this.OnRunAgainFromLog(event);\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.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link ToggleServerExpand}. */\n public toggleServerExpand(server: MCPServerData): void {\n return this.ToggleServerExpand(server);\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.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link ToggleConnectionExpand}. */\n public toggleConnectionExpand(conn: MCPConnectionData): void {\n return this.ToggleConnectionExpand(conn);\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 /** @deprecated Use {@link IsServerExpanded}. */\n public isServerExpanded(server: MCPServerData): boolean {\n return this.IsServerExpanded(server);\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 /** @deprecated Use {@link IsConnectionExpanded}. */\n public isConnectionExpanded(conn: MCPConnectionData): boolean {\n return this.IsConnectionExpanded(conn);\n }\n\n /**\n * Partition `this.tools` into the {@link toolsByServerID} index, keyed by the\n * normalized MCPServerID. Called once whenever tools/connections load so the\n * server/connection card `@for` blocks read tools via an O(1) Map lookup instead\n * of re-filtering the whole tools array on every change-detection pass.\n */\n private buildToolsByServerMap(): void {\n const map = new Map<string, MCPToolData[]>();\n for (const tool of this.tools) {\n const key = NormalizeUUID(tool.MCPServerID);\n const bucket = map.get(key);\n if (bucket) {\n bucket.push(tool);\n } else {\n map.set(key, [tool]);\n }\n }\n this.toolsByServerID = map;\n }\n\n /**\n * Gets tools for a specific server (O(1) lookup against the precomputed index).\n */\n public GetToolsForServer(serverId: string): MCPToolData[] {\n return this.toolsByServerID.get(NormalizeUUID(serverId)) ?? [];\n }\n\n /** @deprecated Use {@link GetToolsForServer}. */\n public getToolsForServer(serverId: string): MCPToolData[] {\n return this.GetToolsForServer(serverId);\n }\n\n /**\n * Gets tools for a specific connection (via its server, O(1) lookup).\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.toolsByServerID.get(NormalizeUUID(connection.MCPServerID)) ?? [];\n }\n\n /** @deprecated Use {@link GetToolsForConnection}. */\n public getToolsForConnection(connectionId: string): MCPToolData[] {\n return this.GetToolsForConnection(connectionId);\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 /** @deprecated Use {@link RunToolFromCard}. */\n public runToolFromCard(tool: MCPToolData, connection?: MCPConnectionData): void {\n return this.RunToolFromCard(tool, connection);\n }\n}\n","<mj-page-layout>\n <!-- Header -->\n <mj-page-header\n Title=\"MCP Dashboard\"\n Icon=\"fa-solid fa-plug-circle-bolt\">\n <div meta>\n <mj-stat-badge [Count]=\"CurrentFilteredCount\" [Total]=\"CurrentTotalCount\" Label=\"items\"></mj-stat-badge>\n </div>\n <div actions>\n <!-- Action Buttons based on tab -->\n @switch (ActiveTab) {\n @case ('servers') {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createServer()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span class=\"action-btn-label\">Add Server</span>\n </button>\n }\n @case ('connections') {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createConnection()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span class=\"action-btn-label\">Add Connection</span>\n </button>\n }\n @case ('tools') {\n <mj-view-toggle\n [Options]=\"toolsViewOptions\"\n [ActiveKey]=\"ToolsViewMode\"\n (KeyChange)=\"setToolsViewMode($any($event))\">\n </mj-view-toggle>\n <button mjButton variant=\"secondary\" size=\"sm\"\n (click)=\"toggleScalableMode(!useScalablePagination)\"\n [title]=\"useScalablePagination ? 'Scale mode on: virtual scroll, paginated' : 'Enable scale mode for large tool sets'\">\n <i class=\"fa-solid\" [class.fa-bolt]=\"useScalablePagination\" [class.fa-bolt-lightning]=\"!useScalablePagination\"></i>\n <span class=\"action-btn-label\">Scale: {{ useScalablePagination ? 'ON' : 'OFF' }}</span>\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"openTestToolDialog()\">\n <i class=\"fa-solid fa-play\"></i>\n <span class=\"action-btn-label\">Test Tool</span>\n </button>\n }\n @case ('logs') {\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"loadAllData()\"></mj-refresh-button>\n }\n }\n </div>\n <div toolbar>\n <!-- Tab Navigation -->\n <mj-tab-nav\n [Tabs]=\"mcpTabs\"\n [ActiveKey]=\"ActiveTab\"\n (TabChange)=\"setActiveTab($any($event))\">\n </mj-tab-nav>\n <mj-page-search\n Placeholder=\"Search…\"\n [Value]=\"CurrentFilters.searchTerm\"\n (ValueChange)=\"onSearchTermChange($event)\">\n </mj-page-search>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetPopoverFilters()\">\n <mj-filter-panel\n [Fields]=\"mcpFilterFields\"\n [Values]=\"mcpFilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetPopoverFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n </div>\n </mj-page-header>\n\n <!-- Main Content -->\n <mj-page-body [Flex]=\"true\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <mj-alert Variant=\"error\" Dismissible (Dismissed)=\"ErrorMessage = null\">{{ ErrorMessage }}</mj-alert>\n }\n\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 <mj-empty-state Icon=\"fa-solid fa-server\"\n Title=\"No MCP servers configured\"\n ActionText=\"Add Your First Server\"\n (Action)=\"createServer()\" />\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 <mj-empty-state Icon=\"fa-solid fa-link\"\n Title=\"No connections configured\"\n ActionText=\"Add Your First Connection\"\n (Action)=\"createConnection()\" />\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 <mj-alert Size=\"sm\"\n [Variant]=\"getSyncState(conn.ID)?.lastResult?.Success ? 'success' : 'error'\">\n @if (getSyncState(conn.ID)?.lastResult?.Success) {\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 <span>{{ getSyncState(conn.ID)?.lastResult?.ErrorMessage }}</span>\n }\n </mj-alert>\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 @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 <mj-empty-state Icon=\"fa-solid fa-wrench\"\n Title=\"No tools discovered yet\"\n Message=\"Tools are discovered when connections sync with MCP servers\" />\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 <mj-empty-state Icon=\"fa-solid fa-list-check\"\n Title=\"No recent execution logs\"\n Message=\"Logs appear when tools are executed via MCP connections\" />\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 </mj-page-body>\n</mj-page-layout>\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 <mj-alert Variant=\"error\">{{ ServerFormError }}</mj-alert>\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 <mj-alert Variant=\"error\">{{ ConnectionFormError }}</mj-alert>\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 <mj-alert Variant=\"success\">Execution Successful @if (TestExecutionResult?.DurationMs) { <span style=\"float:right;font-size:0.75rem\">{{ TestExecutionResult?.DurationMs }}ms</span> }</mj-alert>\n } @else {\n <mj-alert Variant=\"error\">Execution Failed</mj-alert>\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 <mj-accordion-panel class=\"mcp-log-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"LogInputArgsExpanded\" (ExpandedChange)=\"LogInputArgsExpanded = $event\">\n <ng-template mjAccordionTitle><span>Input Arguments</span></ng-template>\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 </mj-accordion-panel>\n }\n @if (SelectedLog.Result) {\n <mj-accordion-panel class=\"mcp-log-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"LogResultExpanded\" (ExpandedChange)=\"LogResultExpanded = $event\">\n <ng-template mjAccordionTitle><span>Result</span></ng-template>\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 </mj-accordion-panel>\n }\n @if (SelectedLog.ErrorMessage) {\n <mj-accordion-panel class=\"mcp-log-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"LogErrorExpanded\" (ExpandedChange)=\"LogErrorExpanded = $event\">\n <ng-template mjAccordionTitle><span style=\"color:var(--mj-status-error-text,#c53030)\">Error</span></ng-template>\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 </mj-accordion-panel>\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"]}
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 { MJConfirmService } from '@memberjunction/ng-ui-components';\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';\nimport {\n BuildMCPAgentContextFull,\n IsValidMCPTab,\n IsValidToolsViewMode,\n ResolveMCPItem,\n BuildMCPNotFoundError,\n MCP_TABS,\n MCP_TOOLS_VIEW_MODES,\n MCP_LOG_SORT_COLUMNS,\n type MCPAgentContextInput,\n type MCPTabContextInput,\n type MCPNamedItem,\n} from './mcp-agent-context';\nimport { ValidateEnumParam, ValidateStringParam } from '../shared/agent-tool-validation';\nimport type { AgentToolResult } from '../shared/agent-tool-validation';\n\n/**\n * Local alias for the client-tool shape `NavigationService.SetAgentClientTools`\n * accepts. Declared here (not imported) so we don't add a re-export across the\n * shared validation file (mirrors the Testing dashboard's local alias).\n */\ntype MCPAgentTool = {\n Name: string;\n Description: string;\n ParameterSchema: Record<string, unknown>;\n Handler: (params: Record<string, unknown>) => Promise<unknown>;\n};\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; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n tools: MCPToolData[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n expanded: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\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 = this.ProviderToUse;\n\n public Servers: MCPServerData[] = [];\n\n /** @deprecated Use {@link Servers}. */\n public get servers(): MCPServerData[] {\n return this.Servers;\n }\n /** @deprecated Use {@link Servers}. */\n public set servers(value: MCPServerData[]) {\n this.Servers = value;\n }\n public Connections: MCPConnectionData[] = [];\n\n /** @deprecated Use {@link Connections}. */\n public get connections(): MCPConnectionData[] {\n return this.Connections;\n }\n /** @deprecated Use {@link Connections}. */\n public set connections(value: MCPConnectionData[]) {\n this.Connections = value;\n }\n public tools: MCPToolData[] = [];\n public ExecutionLogs: MCPExecutionLogData[] = [];\n\n /** @deprecated Use {@link ExecutionLogs}. */\n public get executionLogs(): MCPExecutionLogData[] {\n return this.ExecutionLogs;\n }\n /** @deprecated Use {@link ExecutionLogs}. */\n public set executionLogs(value: MCPExecutionLogData[]) {\n this.ExecutionLogs = value;\n }\n\n /**\n * Precomputed tools-by-server index (key = NormalizeUUID(MCPServerID)).\n * Rebuilt once whenever tools/connections load (see buildToolsByServerMap),\n * so the server/connection card @for blocks read tools via an O(1) Map lookup\n * instead of re-filtering the whole tools array on every change-detection pass.\n */\n private toolsByServerID = new Map<string, MCPToolData[]>();\n\n public FilteredServers: MCPServerData[] = [];\n\n /** @deprecated Use {@link FilteredServers}. */\n public get filteredServers(): MCPServerData[] {\n return this.FilteredServers;\n }\n /** @deprecated Use {@link FilteredServers}. */\n public set filteredServers(value: MCPServerData[]) {\n this.FilteredServers = value;\n }\n public FilteredConnections: MCPConnectionData[] = [];\n\n /** @deprecated Use {@link FilteredConnections}. */\n public get filteredConnections(): MCPConnectionData[] {\n return this.FilteredConnections;\n }\n /** @deprecated Use {@link FilteredConnections}. */\n public set filteredConnections(value: MCPConnectionData[]) {\n this.FilteredConnections = value;\n }\n public FilteredTools: MCPToolData[] = [];\n\n /** @deprecated Use {@link FilteredTools}. */\n public get filteredTools(): MCPToolData[] {\n return this.FilteredTools;\n }\n /** @deprecated Use {@link FilteredTools}. */\n public set filteredTools(value: MCPToolData[]) {\n this.FilteredTools = value;\n }\n public FilteredLogs: MCPExecutionLogData[] = [];\n\n /** @deprecated Use {@link FilteredLogs}. */\n public get filteredLogs(): MCPExecutionLogData[] {\n return this.FilteredLogs;\n }\n /** @deprecated Use {@link FilteredLogs}. */\n public set filteredLogs(value: MCPExecutionLogData[]) {\n this.FilteredLogs = value;\n }\n\n /** Part 3.2 — paginated tools (scales to thousands). Appended as user scrolls. */\n public PagedTools: MCPToolSummary[] = [];\n\n /** @deprecated Use {@link PagedTools}. */\n public get pagedTools(): MCPToolSummary[] {\n return this.PagedTools;\n }\n /** @deprecated Use {@link PagedTools}. */\n public set pagedTools(value: MCPToolSummary[]) {\n this.PagedTools = value;\n }\n public ToolsTotalCount = 0;\n\n /** @deprecated Use {@link ToolsTotalCount}. */\n public get toolsTotalCount() {\n return this.ToolsTotalCount;\n }\n /** @deprecated Use {@link ToolsTotalCount}. */\n public set toolsTotalCount(value) {\n this.ToolsTotalCount = value;\n }\n public ToolsLoading = false;\n\n /** @deprecated Use {@link ToolsLoading}. */\n public get toolsLoading() {\n return this.ToolsLoading;\n }\n /** @deprecated Use {@link ToolsLoading}. */\n public set toolsLoading(value) {\n this.ToolsLoading = value;\n }\n public ToolsSkip = 0;\n\n /** @deprecated Use {@link ToolsSkip}. */\n public get toolsSkip() {\n return this.ToolsSkip;\n }\n /** @deprecated Use {@link ToolsSkip}. */\n public set toolsSkip(value) {\n this.ToolsSkip = value;\n }\n public ToolsPageSize = 50;\n\n /** @deprecated Use {@link ToolsPageSize}. */\n public get toolsPageSize() {\n return this.ToolsPageSize;\n }\n /** @deprecated Use {@link ToolsPageSize}. */\n public set toolsPageSize(value) {\n this.ToolsPageSize = value;\n }\n public UseScalablePagination = false;\n\n /** @deprecated Use {@link UseScalablePagination}. */\n public get useScalablePagination() {\n return this.UseScalablePagination;\n }\n /** @deprecated Use {@link UseScalablePagination}. */\n public set useScalablePagination(value) {\n this.UseScalablePagination = value;\n }\n\n /** Part 3.6 — favorited tool IDs for the current user. */\n public FavoritedToolIDs = new Set<string>();\n\n /** @deprecated Use {@link FavoritedToolIDs}. */\n public get favoritedToolIDs() {\n return this.FavoritedToolIDs;\n }\n /** @deprecated Use {@link FavoritedToolIDs}. */\n public set favoritedToolIDs(value) {\n this.FavoritedToolIDs = value;\n }\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\n /** @deprecated Use {@link ToolsAvailableServers}. */\n public get toolsAvailableServers(): Array<{ ID: string; Name: string }> {\n return this.ToolsAvailableServers;\n }\n /** @deprecated Use {@link ToolsAvailableServers}. */\n public set toolsAvailableServers(value: Array<{ ID: string; Name: string }>) {\n this.ToolsAvailableServers = value;\n }\n public ToolsAvailableCategories: Array<{ category: string; count: number }> = [];\n\n /** @deprecated Use {@link ToolsAvailableCategories}. */\n public get toolsAvailableCategories(): Array<{ category: string; count: number }> {\n return this.ToolsAvailableCategories;\n }\n /** @deprecated Use {@link ToolsAvailableCategories}. */\n public set toolsAvailableCategories(value: Array<{ category: string; count: number }>) {\n this.ToolsAvailableCategories = value;\n }\n\n /** Part 3.4 — tool counts from GetMCPToolCounts (global, respects search) */\n public ToolsGlobalCount: number = 0;\n\n /** @deprecated Use {@link ToolsGlobalCount}. */\n public get toolsGlobalCount(): number {\n return this.ToolsGlobalCount;\n }\n /** @deprecated Use {@link ToolsGlobalCount}. */\n public set toolsGlobalCount(value: number) {\n this.ToolsGlobalCount = value;\n }\n /** Per-server tool count map used for \"(N tools)\" badge on group headers */\n public ToolCountByServer: Record<string, number> = {};\n\n /** @deprecated Use {@link ToolCountByServer}. */\n public get toolCountByServer(): Record<string, number> {\n return this.ToolCountByServer;\n }\n /** @deprecated Use {@link ToolCountByServer}. */\n public set toolCountByServer(value: Record<string, number>) {\n this.ToolCountByServer = value;\n }\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 /** @deprecated Use {@link Stats}. */\n public get stats(): MCPDashboardStats {\n return this.Stats;\n }\n /** @deprecated Use {@link Stats}. */\n public set stats(value: MCPDashboardStats) {\n this.Stats = value;\n }\n\n public ActiveTab: MCPDashboardTab = 'servers';\n\n /**\n * The tab the agent tool-set was last registered for. Mode-scoping guard:\n * the safe tool surface differs per tab (servers/connections/tools/logs), so\n * `syncAgentToolsForMode()` only re-registers on a tab transition. Mirrors the\n * Data Explorer's `lastRegisteredToolMode`.\n */\n private lastRegisteredToolMode: MCPDashboardTab | null = null;\n\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 /** @deprecated Use {@link Filters$}. */\n public get filters$() {\n return this.Filters$;\n }\n /** @deprecated Use {@link Filters$}. */\n public set filters$(value) {\n this.Filters$ = value;\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 // Collapsible state for the log detail sections (Input Args / Result / Error)\n public LogInputArgsExpanded = true;\n public LogResultExpanded = true;\n public LogErrorExpanded = true;\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 private confirm: MJConfirmService\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 // Keep the mode-scoped agent tools + deep context aligned with the tab\n // when it changes via back/forward or a deep link.\n this.syncAgentToolsForMode();\n this.publishAgentContext();\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.publishAgentContext();\n this.syncAgentToolsForMode();\n this.cdr.markForCheck();\n }\n\n // ================================================================\n // AI Agent Context & Client Tools — DEEP enrichment (Data-Explorer depth)\n //\n // 🚨 SAFETY BOUNDARY — READ-ONLY / NAVIGATIONAL ONLY 🚨\n // MCP is a credential-bearing surface. Servers carry OAuth client secrets,\n // connections carry bearer tokens, and OAuth token / client-registration /\n // credential entities are in scope here. The agent context and client tools\n // registered below are strictly READ / FILTER / SORT / SELECT / NAVIGATE +\n // a read-only favorite-toggle preference:\n // - tab switches, free-text search, per-tab status filters, server/category\n // filter, favorites/recent toggles, tools view-mode, logs sort\n // - SELECT a server / connection / tool / log (by id OR name) — highlights /\n // expands / opens the detail panel\n // - OPEN the selected record in a tab for VIEWING (OpenEntityRecord — never edits)\n // - data refresh (read-only reload)\n //\n // 🔒 DELIBERATELY NOT exposed to the agent (must stay human-initiated):\n // - create / edit / delete of servers and connections\n // - MCP tool EXECUTION / test-with-params (untrusted LLM-supplied args\n // against real, side-effecting external tools) — NO execute path\n // - ANY secret/credential value: server URL/command, bearer token, OAuth\n // client secret, encrypted credential, or tool input/output payload\n //\n // Context exposes ONLY aggregate + per-tab counts, navigation/filter state,\n // the user's own search terms, and user-facing DISPLAY names (server / tool /\n // connection names; log labels are tool-name + status only) — never secrets,\n // never tool args, never tool results.\n //\n // MODE-SCOPING (mirrors the Data Explorer / Testing dashboards): the safe tool\n // surface differs per active tab, so `SetAgentClientTools` re-registers ONLY on\n // a tab transition (guarded by {@link lastRegisteredToolMode}). COMMON tools\n // (tab switch, search, refresh, clear filters) are always present; per-tab\n // tools (server/connection/tool/log select+open+filter+sort) appear only while\n // their tab is active.\n // ================================================================\n\n /**\n * Publish the current MCP dashboard state to the AI agent. Re-invoked on every\n * meaningful state change (data load, filter/search change, tab switch,\n * view-mode/sort change, selection change). The shaping lives in the pure\n * {@link buildMCPAgentContextFull} helper so it stays unit-testable and the\n * secret-free guarantee is auditable in one place.\n */\n private publishAgentContext(): void {\n const top: MCPAgentContextInput = {\n ActiveTab: this.ActiveTab,\n ServerCount: this.Stats.totalServers,\n ActiveServerCount: this.Stats.activeServers,\n ConnectionCount: this.Stats.totalConnections,\n ToolCount: this.Stats.totalTools,\n RecentExecutionCount: this.Stats.recentExecutions,\n FailedExecutionCount: this.Stats.failedExecutions,\n CurrentSearchTerm: this.Filters$.value.searchTerm,\n ToolsViewMode: this.ToolsViewMode,\n };\n this.navigationService.SetAgentContext(this, BuildMCPAgentContextFull(top, this.buildActiveTabContext()));\n }\n\n /** Build the deep per-tab context slice for whichever tab is active. */\n private buildActiveTabContext(): MCPTabContextInput {\n const f = this.Filters$.value;\n switch (this.ActiveTab) {\n case 'connections': {\n const selected = this.Connections.find(c => this.ExpandedConnectionID && UUIDsEqual(c.ID, this.ExpandedConnectionID)) ?? null;\n return {\n Tab: 'connections',\n Data: {\n ConnectionCount: this.Connections.length,\n FilteredConnectionCount: this.FilteredConnections.length,\n ConnectionStatusFilter: f.connectionStatus ?? 'all',\n VisibleConnectionNames: this.FilteredConnections.map(c => c.Name),\n SelectedConnectionId: selected?.ID ?? null,\n SelectedConnectionName: selected?.Name ?? null,\n },\n };\n }\n case 'tools': {\n const selected = this.tools.find(t => this.ExpandedToolId && UUIDsEqual(t.ID, this.ExpandedToolId)) ?? null;\n const serverFilter = f.toolsServer ?? 'all';\n const serverFilterName = serverFilter && serverFilter !== 'all'\n ? (this.ToolsAvailableServers.find(s => UUIDsEqual(s.ID, serverFilter))?.Name ?? null)\n : null;\n return {\n Tab: 'tools',\n Data: {\n ToolCount: this.tools.length,\n FilteredToolCount: this.FilteredTools.length,\n ToolsViewMode: this.ToolsViewMode,\n ToolStatusFilter: f.toolStatus ?? 'all',\n ServerFilter: serverFilter,\n ServerFilterName: serverFilterName,\n CategoryFilter: f.toolsCategory ?? 'all',\n FavoritesOnly: f.favoritesOnly ?? false,\n RecentOnly: f.recentOnly ?? false,\n FavoriteToolCount: this.FavoritedToolIDs.size,\n VisibleToolNames: this.FilteredTools.map(t => t.ToolTitle || t.ToolName),\n AvailableServerNames: this.ToolsAvailableServers.map(s => s.Name),\n AvailableCategoryNames: this.ToolsAvailableCategories.map(c => c.category),\n SelectedToolId: selected?.ID ?? null,\n SelectedToolName: selected ? (selected.ToolTitle || selected.ToolName) : null,\n },\n };\n }\n case 'logs': {\n return {\n Tab: 'logs',\n Data: {\n ExecutionCount: this.ExecutionLogs.length,\n FilteredExecutionCount: this.FilteredLogs.length,\n FailedExecutionCount: this.ExecutionLogs.filter(l => l.Status === 'Error').length,\n LogStatusFilter: f.logStatus ?? 'all',\n SortColumn: this.LogsSortColumn,\n SortDirection: this.LogsSortAscending ? 'asc' : 'desc',\n VisibleLogLabels: this.FilteredLogs.map(l => this.logLabel(l)),\n SelectedLogId: this.SelectedLog?.ID ?? null,\n SelectedLogName: this.SelectedLog?.ToolName ?? null,\n DetailPanelOpen: this.ShowLogDetailPanel,\n },\n };\n }\n case 'servers':\n default: {\n const selected = this.Servers.find(s => this.ExpandedServerID && UUIDsEqual(s.ID, this.ExpandedServerID)) ?? null;\n return {\n Tab: 'servers',\n Data: {\n ServerCount: this.Servers.length,\n FilteredServerCount: this.FilteredServers.length,\n ActiveServerCount: this.Stats.activeServers,\n ServerStatusFilter: f.serverStatus ?? 'all',\n VisibleServerNames: this.FilteredServers.map(s => s.Name),\n SelectedServerId: selected?.ID ?? null,\n SelectedServerName: selected?.Name ?? null,\n },\n };\n }\n }\n }\n\n /**\n * Build a non-secret display label for a log row: the tool name plus its\n * status (e.g. \"github_search · Error\"). NEVER includes InputArgs or Result.\n */\n private logLabel(log: MCPExecutionLogData): string {\n const tool = log.ToolName || '(unknown tool)';\n return log.Status ? `${tool} · ${log.Status}` : tool;\n }\n\n // ----------------------------------------------------------------\n // Mode-scoped client-tool registration\n // ----------------------------------------------------------------\n\n /**\n * Register the safe client-tool set for the ACTIVE tab. `SetAgentClientTools`\n * replaces the registered set wholesale, so we only re-register on a tab\n * transition (guarded by {@link lastRegisteredToolMode}). Common tools are\n * always present; per-tab tools swap so e.g. a logs-only SelectLog is never\n * visible while Servers is open.\n *\n * 🔒 SAFETY: every tool below is read / filter / sort / select / navigate /\n * favorite-toggle / refresh. No tool creates, edits, deletes, executes an MCP\n * tool, or returns a secret. See the SAFETY BOUNDARY comment above.\n */\n private syncAgentToolsForMode(): void {\n const tab = this.ActiveTab;\n if (this.lastRegisteredToolMode === tab) {\n return;\n }\n this.lastRegisteredToolMode = tab;\n this.navigationService.SetAgentClientTools(this, this.buildToolsForMode(tab));\n }\n\n /** Compose the safe tool list for a given tab: common tools + per-tab tools. */\n private buildToolsForMode(tab: MCPDashboardTab): MCPAgentTool[] {\n const tools: MCPAgentTool[] = [...this.buildCommonMCPTools()];\n switch (tab) {\n case 'servers':\n tools.push(...this.buildServersTools());\n break;\n case 'connections':\n tools.push(...this.buildConnectionsTools());\n break;\n case 'tools':\n tools.push(...this.buildToolsTabTools());\n break;\n case 'logs':\n tools.push(...this.buildLogsTools());\n break;\n }\n return tools;\n }\n\n /** Tools available on EVERY tab: tab switch, search, refresh, clear filters. */\n private buildCommonMCPTools(): MCPAgentTool[] {\n return [\n {\n Name: 'SwitchMCPTab',\n Description: 'Switch the active MCP dashboard tab. Valid tabs: servers, connections, tools, logs.',\n ParameterSchema: { type: 'object', properties: { tab: { type: 'string', enum: ['servers', 'connections', 'tools', 'logs'] } }, required: ['tab'] },\n Handler: async (params: Record<string, unknown>) => this.toolSwitchTab(params),\n },\n {\n Name: 'SearchMCPTools',\n Description: 'Set the free-text search term applied to the current MCP tab (filters servers/connections/tools/logs by name/description).',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.toolSearch(params),\n },\n {\n Name: 'RefreshMCPData',\n Description: 'Reload all MCP dashboard data. Read-only — does not create, modify, or execute anything.',\n ParameterSchema: { type: 'object', properties: { forceRefresh: { type: 'boolean' } } },\n Handler: async (params: Record<string, unknown>) => this.toolRefresh(params),\n },\n {\n Name: 'ClearMCPFilters',\n Description: 'Reset all MCP dashboard filters (search, status, server, category, favorites, recent) to their defaults.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.ResetAllFilters();\n this.publishAgentContext();\n return { Success: true };\n },\n },\n ];\n }\n\n /** Servers-tab tools: filter by status, select/open a server. */\n private buildServersTools(): MCPAgentTool[] {\n return [\n {\n Name: 'FilterServersByStatus',\n Description: 'Restrict the Servers tab to a status, or \"all\" to clear.',\n ParameterSchema: { type: 'object', properties: { status: { type: 'string' } }, required: ['status'] },\n Handler: async (params: Record<string, unknown>) => this.toolFilterByStatus('server', params),\n },\n {\n Name: 'SelectServer',\n Description: 'Select (expand) an MCP server by its ID or name, revealing its details panel. Read-only navigation — does not edit or execute.',\n ParameterSchema: { type: 'object', properties: { server: { type: 'string' } }, required: ['server'] },\n Handler: async (params: Record<string, unknown>) => this.toolSelectServer(params),\n },\n {\n Name: 'OpenServerRecord',\n Description: 'Open the selected MCP server\\'s record in a new tab for VIEWING (read-only). Pass a server ID or name, or omit to open the currently selected server.',\n ParameterSchema: { type: 'object', properties: { server: { type: 'string' } } },\n Handler: async (params: Record<string, unknown>) => this.toolOpenServerRecord(params),\n },\n ];\n }\n\n /** Connections-tab tools: filter by status, select/open a connection, navigate to its server. */\n private buildConnectionsTools(): MCPAgentTool[] {\n return [\n {\n Name: 'FilterConnectionsByStatus',\n Description: 'Restrict the Connections tab to a status, or \"all\" to clear.',\n ParameterSchema: { type: 'object', properties: { status: { type: 'string' } }, required: ['status'] },\n Handler: async (params: Record<string, unknown>) => this.toolFilterByStatus('connection', params),\n },\n {\n Name: 'SelectConnection',\n Description: 'Select (expand) an MCP connection by its ID or name, revealing its details panel. Read-only navigation.',\n ParameterSchema: { type: 'object', properties: { connection: { type: 'string' } }, required: ['connection'] },\n Handler: async (params: Record<string, unknown>) => this.toolSelectConnection(params),\n },\n {\n Name: 'OpenConnectionRecord',\n Description: 'Open an MCP connection\\'s record in a new tab for VIEWING (read-only). Pass a connection ID or name, or omit to open the currently selected connection.',\n ParameterSchema: { type: 'object', properties: { connection: { type: 'string' } } },\n Handler: async (params: Record<string, unknown>) => this.toolOpenConnectionRecord(params),\n },\n {\n Name: 'NavigateToConnectionServer',\n Description: 'Open the parent MCP server record for a connection (by connection ID or name, or the selected one) in a new tab for VIEWING. Related-record navigation, read-only.',\n ParameterSchema: { type: 'object', properties: { connection: { type: 'string' } } },\n Handler: async (params: Record<string, unknown>) => this.toolNavigateToConnectionServer(params),\n },\n ];\n }\n\n /** Tools-tab tools: filter (status/server/category/favorites/recent), view-mode, favorite toggle, select/open. */\n private buildToolsTabTools(): MCPAgentTool[] {\n return [\n {\n Name: 'FilterToolsByStatus',\n Description: 'Restrict the Tools tab to a tool status, or \"all\" to clear.',\n ParameterSchema: { type: 'object', properties: { status: { type: 'string' } }, required: ['status'] },\n Handler: async (params: Record<string, unknown>) => this.toolFilterByStatus('tool', params),\n },\n {\n Name: 'FilterMCPToolsByServer',\n Description: 'Restrict the Tools tab to a single MCP server by its ID or name, or \"all\" to clear the server filter.',\n ParameterSchema: { type: 'object', properties: { server: { type: 'string' } }, required: ['server'] },\n Handler: async (params: Record<string, unknown>) => this.toolFilterByServer(params),\n },\n {\n Name: 'FilterToolsByCategory',\n Description: 'Restrict the Tools tab to a category (the snake_case prefix of tool names), or \"all\" to clear.',\n ParameterSchema: { type: 'object', properties: { category: { type: 'string' } }, required: ['category'] },\n Handler: async (params: Record<string, unknown>) => this.toolFilterByCategory(params),\n },\n {\n Name: 'ToggleToolsFavoritesOnly',\n Description: 'Toggle (or set) restricting the Tools tab to favorited tools only.',\n ParameterSchema: { type: 'object', properties: { enabled: { type: 'boolean' } } },\n Handler: async (params: Record<string, unknown>) => this.toolToggleFavoritesOnly(params),\n },\n {\n Name: 'SetToolsViewMode',\n Description: 'Set the Tools tab view mode. Valid modes: card, list.',\n ParameterSchema: { type: 'object', properties: { mode: { type: 'string', enum: ['card', 'list'] } }, required: ['mode'] },\n Handler: async (params: Record<string, unknown>) => this.toolSetToolsViewMode(params),\n },\n {\n Name: 'ToggleMCPToolFavorite',\n Description: 'Toggle the favorite flag for an MCP tool (by ID or name) for the current user. Read/navigational preference only — does NOT execute or modify the tool.',\n ParameterSchema: { type: 'object', properties: { tool: { type: 'string' } }, required: ['tool'] },\n Handler: async (params: Record<string, unknown>) => this.toolToggleFavorite(params),\n },\n {\n Name: 'SelectTool',\n Description: 'Select (expand) an MCP tool by its ID or name, revealing its details. Read-only navigation — does NOT execute the tool.',\n ParameterSchema: { type: 'object', properties: { tool: { type: 'string' } }, required: ['tool'] },\n Handler: async (params: Record<string, unknown>) => this.toolSelectTool(params),\n },\n {\n Name: 'OpenToolRecord',\n Description: 'Open an MCP tool\\'s record in a new tab for VIEWING (read-only). Pass a tool ID or name, or omit to open the currently selected tool. Does NOT execute the tool.',\n ParameterSchema: { type: 'object', properties: { tool: { type: 'string' } } },\n Handler: async (params: Record<string, unknown>) => this.toolOpenToolRecord(params),\n },\n ];\n }\n\n /** Logs-tab tools: filter by status, sort, select/open a log. */\n private buildLogsTools(): MCPAgentTool[] {\n return [\n {\n Name: 'FilterLogsByStatus',\n Description: 'Restrict the Logs tab to an execution status, or \"all\" to clear.',\n ParameterSchema: { type: 'object', properties: { status: { type: 'string' } }, required: ['status'] },\n Handler: async (params: Record<string, unknown>) => this.toolFilterByStatus('log', params),\n },\n {\n Name: 'SortLogs',\n Description: 'Sort the execution-logs table by a column. Columns: status, server, tool, connection, started, duration, error. Clicking the same column again toggles direction.',\n ParameterSchema: { type: 'object', properties: { column: { type: 'string', enum: ['status', 'server', 'tool', 'connection', 'started', 'duration', 'error'] } }, required: ['column'] },\n Handler: async (params: Record<string, unknown>) => this.toolSortLogs(params),\n },\n {\n Name: 'SelectLog',\n Description: 'Select an execution log by its ID (or a tool-name match) to open its detail panel for VIEWING. Read-only navigation. Note: the panel never exposes credentials.',\n ParameterSchema: { type: 'object', properties: { log: { type: 'string' } }, required: ['log'] },\n Handler: async (params: Record<string, unknown>) => this.toolSelectLog(params),\n },\n {\n Name: 'OpenLogRecord',\n Description: 'Open an execution-log record in a new tab for VIEWING (read-only). Pass a log ID, or omit to open the currently selected log.',\n ParameterSchema: { type: 'object', properties: { log: { type: 'string' } } },\n Handler: async (params: Record<string, unknown>) => this.toolOpenLogRecord(params),\n },\n ];\n }\n\n // ----------------------------------------------------------------\n // Tolerant tool handlers (validate input, never throw)\n // ----------------------------------------------------------------\n\n /** Switch the active tab after validating it. */\n private toolSwitchTab(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateEnumParam(params?.['tab'], MCP_TABS, 'tab');\n if (!v.ok) return v.result;\n this.SetActiveTab(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Set the dashboard search term. */\n private toolSearch(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['query'], 'query');\n if (!v.ok) return v.result;\n this.OnSearchChange(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Set a per-tab status filter ('all' or a status string). Tolerant of any string. */\n private toolFilterByStatus(kind: 'server' | 'connection' | 'tool' | 'log', params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['status'], 'status');\n if (!v.ok) return v.result;\n this.OnStatusFilterChange(kind, v.value || 'all');\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Restrict the Tools tab to a single server (by ID or name; 'all' to clear). */\n private toolFilterByServer(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['server'], 'server');\n if (!v.ok) return v.result;\n const raw = v.value;\n // Ensure the Tools tab is active so the filter is meaningful.\n this.SetActiveTab('tools');\n if (!raw || raw === 'all') {\n this.OnFilterFieldChange('toolsServer', 'all');\n this.publishAgentContext();\n return { Success: true };\n }\n const candidates: MCPNamedItem[] = this.ToolsAvailableServers.map(s => ({ ID: s.ID, Name: s.Name }));\n const match = ResolveMCPItem(raw, candidates);\n if (!match) {\n return { Success: false, ErrorMessage: BuildMCPNotFoundError(raw, candidates, 'server') };\n }\n this.OnFilterFieldChange('toolsServer', match.ID);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Restrict the Tools tab to a category prefix ('all' to clear). Tolerant. */\n private toolFilterByCategory(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['category'], 'category');\n if (!v.ok) return v.result;\n const cat = v.value || 'all';\n this.SetActiveTab('tools');\n if (cat !== 'all' && !this.ToolsAvailableCategories.some(c => c.category === cat)) {\n const sample = this.ToolsAvailableCategories.slice(0, 6).map(c => c.category).join(', ');\n return { Success: false, ErrorMessage: `Category \"${cat}\" is not available. Available categories include: ${sample || '(none)'}.` };\n }\n this.OnFilterFieldChange('toolsCategory', cat);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Toggle (or explicitly set) the favorites-only filter on the Tools tab. */\n private toolToggleFavoritesOnly(params: Record<string, unknown>): AgentToolResult {\n this.SetActiveTab('tools');\n const raw = params?.['enabled'];\n const enabled = typeof raw === 'boolean' ? raw : !(this.Filters$.value.favoritesOnly ?? false);\n this.OnFilterFieldChange('favoritesOnly', enabled);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Toggle a tool's favorite flag for the current user (by ID or name). */\n private async toolToggleFavorite(params: Record<string, unknown>): Promise<AgentToolResult> {\n const v = ValidateStringParam(params?.['tool'], 'tool');\n if (!v.ok) return v.result;\n const match = ResolveMCPItem(v.value, this.toolCandidates());\n if (!match) {\n return { Success: false, ErrorMessage: BuildMCPNotFoundError(v.value, this.toolCandidates(), 'tool') };\n }\n try {\n await this.ToggleFavorite(match.ID);\n this.publishAgentContext();\n return { Success: true };\n } catch (e) {\n return { Success: false, ErrorMessage: e instanceof Error ? e.message : 'Toggle favorite failed.' };\n }\n }\n\n /** Reload all dashboard data (read-only). */\n private async toolRefresh(params: Record<string, unknown>): Promise<AgentToolResult> {\n const forceRefresh = params?.['forceRefresh'] === true;\n try {\n await this.LoadAllData(forceRefresh);\n this.publishAgentContext();\n return { Success: true };\n } catch (e) {\n return { Success: false, ErrorMessage: e instanceof Error ? e.message : 'Refresh failed.' };\n }\n }\n\n /** Switch the Tools tab view mode after validating it. */\n private toolSetToolsViewMode(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateEnumParam(params?.['mode'], MCP_TOOLS_VIEW_MODES, 'mode');\n if (!v.ok) return v.result;\n this.SetToolsViewMode(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Sort the logs table by a validated column. */\n private toolSortLogs(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateEnumParam(params?.['column'], MCP_LOG_SORT_COLUMNS, 'column');\n if (!v.ok) return v.result;\n this.SetActiveTab('logs');\n this.OnLogSortColumn(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n // --- selection / open helpers ---\n\n /** Name-and-ID candidates for the tool resolver (tool display name = title || name). */\n private toolCandidates(): MCPNamedItem[] {\n return this.tools.map(t => ({ ID: t.ID, Name: t.ToolTitle || t.ToolName }));\n }\n\n /** Resolve a server reference (ID or name); returns the row or a tolerant error. */\n private resolveServerRef(raw: string): { ok: true; server: MCPServerData } | { ok: false; result: AgentToolResult } {\n const candidates: MCPNamedItem[] = this.Servers.map(s => ({ ID: s.ID, Name: s.Name }));\n const match = ResolveMCPItem(raw, candidates);\n if (!match) {\n return { ok: false, result: { Success: false, ErrorMessage: BuildMCPNotFoundError(raw, candidates, 'server') } };\n }\n const server = this.Servers.find(s => UUIDsEqual(s.ID, match.ID))!;\n return { ok: true, server };\n }\n\n /** Resolve a connection reference (ID or name); returns the row or a tolerant error. */\n private resolveConnectionRef(raw: string): { ok: true; connection: MCPConnectionData } | { ok: false; result: AgentToolResult } {\n const candidates: MCPNamedItem[] = this.Connections.map(c => ({ ID: c.ID, Name: c.Name }));\n const match = ResolveMCPItem(raw, candidates);\n if (!match) {\n return { ok: false, result: { Success: false, ErrorMessage: BuildMCPNotFoundError(raw, candidates, 'connection') } };\n }\n const connection = this.Connections.find(c => UUIDsEqual(c.ID, match.ID))!;\n return { ok: true, connection };\n }\n\n /** Select (expand) a server by ID or name. */\n private toolSelectServer(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['server'], 'server');\n if (!v.ok) return v.result;\n const r = this.resolveServerRef(v.value);\n if (!r.ok) return r.result;\n this.SetActiveTab('servers');\n if (!this.IsServerExpanded(r.server)) {\n this.ToggleServerExpand(r.server);\n }\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Open a server record in a tab (view-only). Defaults to the selected server. */\n private toolOpenServerRecord(params: Record<string, unknown>): AgentToolResult {\n const raw = typeof params?.['server'] === 'string' ? (params['server'] as string) : '';\n let server: MCPServerData | null = null;\n if (raw) {\n const r = this.resolveServerRef(raw);\n if (!r.ok) return r.result;\n server = r.server;\n } else {\n server = this.Servers.find(s => this.ExpandedServerID && UUIDsEqual(s.ID, this.ExpandedServerID)) ?? null;\n if (!server) return { Success: false, ErrorMessage: 'No server is selected. Pass a server ID or name, or select one first.' };\n }\n this.navigationService.OpenEntityRecord('MJ: MCP Servers', CompositeKey.FromID(server.ID));\n return { Success: true };\n }\n\n /** Select (expand) a connection by ID or name. */\n private toolSelectConnection(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['connection'], 'connection');\n if (!v.ok) return v.result;\n const r = this.resolveConnectionRef(v.value);\n if (!r.ok) return r.result;\n this.SetActiveTab('connections');\n if (!this.IsConnectionExpanded(r.connection)) {\n this.ToggleConnectionExpand(r.connection);\n }\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Open a connection record in a tab (view-only). Defaults to the selected connection. */\n private toolOpenConnectionRecord(params: Record<string, unknown>): AgentToolResult {\n const raw = typeof params?.['connection'] === 'string' ? (params['connection'] as string) : '';\n let connection: MCPConnectionData | null = null;\n if (raw) {\n const r = this.resolveConnectionRef(raw);\n if (!r.ok) return r.result;\n connection = r.connection;\n } else {\n connection = this.Connections.find(c => this.ExpandedConnectionID && UUIDsEqual(c.ID, this.ExpandedConnectionID)) ?? null;\n if (!connection) return { Success: false, ErrorMessage: 'No connection is selected. Pass a connection ID or name, or select one first.' };\n }\n this.navigationService.OpenEntityRecord('MJ: MCP Server Connections', CompositeKey.FromID(connection.ID));\n return { Success: true };\n }\n\n /** Navigate to the parent server of a connection (related-record, view-only). */\n private toolNavigateToConnectionServer(params: Record<string, unknown>): AgentToolResult {\n const raw = typeof params?.['connection'] === 'string' ? (params['connection'] as string) : '';\n let connection: MCPConnectionData | null = null;\n if (raw) {\n const r = this.resolveConnectionRef(raw);\n if (!r.ok) return r.result;\n connection = r.connection;\n } else {\n connection = this.Connections.find(c => this.ExpandedConnectionID && UUIDsEqual(c.ID, this.ExpandedConnectionID)) ?? null;\n if (!connection) return { Success: false, ErrorMessage: 'No connection is selected. Pass a connection ID or name, or select one first.' };\n }\n const server = this.Servers.find(s => UUIDsEqual(s.ID, connection!.MCPServerID));\n if (!server) return { Success: false, ErrorMessage: `The parent server for connection \"${connection.Name}\" is not loaded.` };\n this.navigationService.OpenEntityRecord('MJ: MCP Servers', CompositeKey.FromID(server.ID));\n return { Success: true };\n }\n\n /** Select (expand) a tool by ID or name. Does NOT execute the tool. */\n private toolSelectTool(params: Record<string, unknown>): AgentToolResult {\n const v = ValidateStringParam(params?.['tool'], 'tool');\n if (!v.ok) return v.result;\n const match = ResolveMCPItem(v.value, this.toolCandidates());\n if (!match) return { Success: false, ErrorMessage: BuildMCPNotFoundError(v.value, this.toolCandidates(), 'tool') };\n const tool = this.tools.find(t => UUIDsEqual(t.ID, match.ID))!;\n this.SetActiveTab('tools');\n if (!this.IsToolExpanded(tool)) {\n this.ToggleToolExpand(tool);\n }\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Open a tool record in a tab (view-only). Defaults to the selected tool. Does NOT execute. */\n private toolOpenToolRecord(params: Record<string, unknown>): AgentToolResult {\n const raw = typeof params?.['tool'] === 'string' ? (params['tool'] as string) : '';\n let tool: MCPToolData | null = null;\n if (raw) {\n const match = ResolveMCPItem(raw, this.toolCandidates());\n if (!match) return { Success: false, ErrorMessage: BuildMCPNotFoundError(raw, this.toolCandidates(), 'tool') };\n tool = this.tools.find(t => UUIDsEqual(t.ID, match.ID)) ?? null;\n } else {\n tool = this.tools.find(t => this.ExpandedToolId && UUIDsEqual(t.ID, this.ExpandedToolId)) ?? null;\n if (!tool) return { Success: false, ErrorMessage: 'No tool is selected. Pass a tool ID or name, or select one first.' };\n }\n this.navigationService.OpenEntityRecord('MJ: MCP Server Tools', CompositeKey.FromID(tool!.ID));\n return { Success: true };\n }\n\n /** Select a log (open its detail panel) by ID or tool-name match. */\n private async toolSelectLog(params: Record<string, unknown>): Promise<AgentToolResult> {\n const v = ValidateStringParam(params?.['log'], 'log');\n if (!v.ok) return v.result;\n const candidates: MCPNamedItem[] = this.FilteredLogs.map(l => ({ ID: l.ID, Name: l.ToolName }));\n const match = ResolveMCPItem(v.value, candidates);\n if (!match) return { Success: false, ErrorMessage: BuildMCPNotFoundError(v.value, candidates, 'log') };\n const log = this.ExecutionLogs.find(l => UUIDsEqual(l.ID, match.ID));\n if (!log) return { Success: false, ErrorMessage: `Log \"${v.value}\" is no longer loaded.` };\n this.SetActiveTab('logs');\n await this.OnLogClick(log);\n this.publishAgentContext();\n return { Success: true };\n }\n\n /** Open a log record in a tab (view-only). Defaults to the selected log. */\n private toolOpenLogRecord(params: Record<string, unknown>): AgentToolResult {\n const raw = typeof params?.['log'] === 'string' ? (params['log'] as string) : '';\n let log: MCPExecutionLogData | null = null;\n if (raw) {\n const candidates: MCPNamedItem[] = this.ExecutionLogs.map(l => ({ ID: l.ID, Name: l.ToolName }));\n const match = ResolveMCPItem(raw, candidates);\n if (!match) return { Success: false, ErrorMessage: BuildMCPNotFoundError(raw, candidates, 'log') };\n log = this.ExecutionLogs.find(l => UUIDsEqual(l.ID, match.ID)) ?? null;\n } else {\n log = this.SelectedLog;\n if (!log) return { Success: false, ErrorMessage: 'No log is selected. Pass a log ID, or select one first.' };\n }\n this.navigationService.OpenEntityRecord('MJ: MCP Tool Execution Logs', CompositeKey.FromID(log!.ID));\n return { Success: true };\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 = RunView.FromMetadataProvider(this.ProviderToUse);\n // Dialect-neutral 7-day cutoff: compute in JS and inject an ISO-8601\n // literal rather than DATEADD/GETUTCDATE, which don't exist on PostgreSQL.\n const sevenDaysAgoIso = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();\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 >= '${sevenDaysAgoIso}'`,\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 // Index tools by server ID once, now that tools/connections are loaded.\n this.buildToolsByServerMap();\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 // Refresh the agent context now that counts/stats are recomputed.\n this.publishAgentContext();\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 /** @deprecated Use {@link LoadAllData}. */\n public async loadAllData(forceRefresh: boolean = false): Promise<void> {\n return this.LoadAllData(forceRefresh);\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 // Re-emit agent context so search / filter / tab-clear changes are\n // reflected in the AI agent's view of this surface.\n this.publishAgentContext();\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 /** @deprecated Use {@link ApplyFilters}. */\n public applyFilters(): void {\n return this.ApplyFilters();\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 /** @deprecated Use {@link OnSearchChange}. */\n public onSearchChange(term: string): void {\n return this.OnSearchChange(term);\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 /** @deprecated Use {@link OnStatusFilterChange}. */\n public onStatusFilterChange(filterType: string, value: string): void {\n return this.OnStatusFilterChange(filterType, value);\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 /** @deprecated Use {@link ToggleFilterPanel}. */\n public toggleFilterPanel(): void {\n return this.ToggleFilterPanel();\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 /** @deprecated Use {@link OnFiltersChange}. */\n public onFiltersChange(filters: MCPDashboardFilters): void {\n return this.OnFiltersChange(filters);\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 /** @deprecated Use {@link OnFilterFieldChange}. */\n public onFilterFieldChange(field: keyof MCPDashboardFilters, value: unknown): void {\n return this.OnFilterFieldChange(field, value);\n }\n\n /** Count of non-default filter dimensions, used for \"Filters (N)\" badge */\n public activeFilterCount(): number { // case-violation-ok-legacy-back-compat: the PascalCase name is already taken in this scope\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 /** @deprecated Use {@link ComputeCategoriesFromTools}. */\n public computeCategoriesFromTools(): Array<{ category: string; count: number }> {\n return this.ComputeCategoriesFromTools();\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 /** @deprecated Use {@link ResetAllFilters}. */\n public resetAllFilters(): void {\n return this.ResetAllFilters();\n }\n\n /** Reset only the popover filters — leave searchTerm (toolbar) untouched. */\n public ResetPopoverFilters(): void {\n const current = this.Filters$.value;\n this.OnFiltersChange({\n ...current,\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 /** @deprecated Use {@link ResetPopoverFilters}. */\n public resetPopoverFilters(): void {\n return this.ResetPopoverFilters();\n }\n\n /** Tools-tab view-mode options for the shared <mj-view-toggle>. */\n public readonly ToolsViewOptions = [\n { key: 'card', icon: 'fa-solid fa-grip', title: 'Card View' },\n { key: 'list', icon: 'fa-solid fa-list', title: 'List View' },\n ];\n\n /** @deprecated Use {@link ToolsViewOptions}. */\n public get toolsViewOptions() {\n return this.ToolsViewOptions;\n }\n\n /** Tab config consumed by the centralized <mj-tab-nav>. */\n public get McpTabs(): import('@memberjunction/ng-ui-components').TabConfig[] {\n return [\n { key: 'servers', label: 'Servers', icon: 'fa-solid fa-server', badge: this.Servers.length },\n { key: 'connections', label: 'Connections', icon: 'fa-solid fa-link', badge: this.Connections.length },\n { key: 'tools', label: 'Tools', icon: 'fa-solid fa-wrench', badge: this.tools.length },\n { key: 'logs', label: 'Logs', icon: 'fa-solid fa-list-check', badge: this.ExecutionLogs.length, badgeVariant: this.Stats.failedExecutions > 0 ? 'error' : 'default' },\n ];\n }\n\n /** @deprecated Use {@link McpTabs}. */\n public get mcpTabs(): import('@memberjunction/ng-ui-components').TabConfig[] {\n return this.McpTabs;\n }\n\n /** Active filter count excluding searchTerm (surfaced separately via toolbar mj-page-search). */\n public get ActiveFilterCount(): number {\n const f = this.Filters$.value;\n let n = 0;\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 /** Values record consumed by the centralized <mj-filter-panel>, scoped to the current tab. */\n private _mcpFilterValuesCache: Record<string, unknown> = {};\n private _mcpFilterValuesKey = '';\n\n /**\n * Filter values object passed to `<mj-filter-panel>`.\n * Memoized on filter field signature so template bindings do not allocate a fresh object on every CD pass.\n */\n public get McpFilterValues(): Record<string, unknown> {\n const f = this.Filters$.value;\n const key = `${f.serverStatus}|${f.connectionStatus}|${f.toolStatus}|${f.logStatus}|${f.toolsServer ?? ''}|${f.toolsCategory ?? ''}|${f.favoritesOnly ? 1 : 0}|${f.recentOnly ? 1 : 0}`;\n if (key !== this._mcpFilterValuesKey) {\n this._mcpFilterValuesKey = key;\n this._mcpFilterValuesCache = {\n serverStatus: f.serverStatus,\n connectionStatus: f.connectionStatus,\n toolStatus: f.toolStatus,\n logStatus: f.logStatus,\n toolsServer: f.toolsServer,\n toolsCategory: f.toolsCategory,\n favoritesOnly: f.favoritesOnly,\n recentOnly: f.recentOnly,\n };\n }\n return this._mcpFilterValuesCache;\n }\n\n /** @deprecated Use {@link McpFilterValues}. */\n public get mcpFilterValues(): Record<string, unknown> {\n return this.McpFilterValues;\n }\n\n private _mcpFilterFieldsCache: import('@memberjunction/ng-ui-components').FilterFieldConfig[] = [];\n private _mcpFilterFieldsKey = '';\n\n /**\n * Field config built dynamically based on the active tab.\n * Memoized on active tab and available servers/categories so `<mj-filter-panel>` receives a stable reference across CD ticks.\n */\n public get McpFilterFields(): import('@memberjunction/ng-ui-components').FilterFieldConfig[] {\n const srvSig = this.ActiveTab === 'tools' ? this.ToolsAvailableServers.map(s => s.ID).join(',') : '';\n const catSig = this.ActiveTab === 'tools' ? this.ToolsAvailableCategories.map(c => `${c.category}:${c.count}`).join(',') : '';\n const key = `${this.ActiveTab}|${srvSig}|${catSig}`;\n if (key === this._mcpFilterFieldsKey) {\n return this._mcpFilterFieldsCache;\n }\n this._mcpFilterFieldsKey = key;\n\n const fields: import('@memberjunction/ng-ui-components').FilterFieldConfig[] = [];\n\n if (this.ActiveTab === 'tools') {\n fields.push({\n key: 'toolsServer',\n type: 'dropdown',\n label: 'Server',\n icon: 'fa-solid fa-server',\n filterable: this.ToolsAvailableServers.length > 10,\n options: [\n { text: 'All Servers', value: 'all' },\n ...this.ToolsAvailableServers.map(s => ({ text: s.Name, value: s.ID })),\n ],\n });\n fields.push({\n key: 'toolsCategory',\n type: 'dropdown',\n label: 'Category',\n icon: 'fa-solid fa-tags',\n filterable: this.ToolsAvailableCategories.length > 10,\n options: [\n { text: 'All Categories', value: 'all' },\n ...this.ToolsAvailableCategories.map(c => ({ text: `${c.category} (${c.count})`, value: c.category })),\n ],\n });\n }\n\n // Per-tab status filter\n if (this.ActiveTab === 'servers') {\n fields.push({\n key: 'serverStatus',\n type: 'dropdown',\n label: 'Server Status',\n icon: 'fa-solid fa-toggle-on',\n options: [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Inactive', value: 'Inactive' },\n ],\n });\n } else if (this.ActiveTab === 'connections') {\n fields.push({\n key: 'connectionStatus',\n type: 'dropdown',\n label: 'Connection Status',\n icon: 'fa-solid fa-toggle-on',\n options: [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Inactive', value: 'Inactive' },\n { text: 'Error', value: 'Error' },\n ],\n });\n } else if (this.ActiveTab === 'tools') {\n fields.push({\n key: 'toolStatus',\n type: 'dropdown',\n label: 'Tool Status',\n icon: 'fa-solid fa-toggle-on',\n options: [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Deprecated', value: 'Deprecated' },\n ],\n });\n // Boolean toggles as chips (active = true, all = false)\n fields.push({\n key: 'favoritesOnly',\n type: 'chips',\n label: 'Favorites',\n icon: 'fa-solid fa-star',\n chipOptions: [\n { text: 'All', value: false },\n { text: 'Favorites only', value: true, icon: 'fa-solid fa-star' },\n ],\n });\n fields.push({\n key: 'recentOnly',\n type: 'chips',\n label: 'Recency',\n icon: 'fa-solid fa-clock-rotate-left',\n chipOptions: [\n { text: 'All', value: false },\n { text: 'Recently used only', value: true, icon: 'fa-solid fa-clock-rotate-left' },\n ],\n });\n } else if (this.ActiveTab === 'logs') {\n fields.push({\n key: 'logStatus',\n type: 'dropdown',\n label: 'Log Status',\n icon: 'fa-solid fa-circle-check',\n options: [\n { text: 'All Statuses', value: 'all' },\n { text: 'Success', value: 'Success' },\n { text: 'Error', value: 'Error' },\n { text: 'Running', value: 'Running' },\n ],\n });\n }\n\n this._mcpFilterFieldsCache = fields;\n return fields;\n }\n\n /** @deprecated Use {@link McpFilterFields}. */\n public get mcpFilterFields(): import('@memberjunction/ng-ui-components').FilterFieldConfig[] {\n return this.McpFilterFields;\n }\n\n /** Receive updated values from <mj-filter-panel> and propagate to filters$. */\n public OnFilterValuesChange(values: Record<string, unknown>): void {\n const current = this.Filters$.value;\n this.OnFiltersChange({\n ...current,\n serverStatus: (values['serverStatus'] as string) ?? current.serverStatus,\n connectionStatus: (values['connectionStatus'] as string) ?? current.connectionStatus,\n toolStatus: (values['toolStatus'] as string) ?? current.toolStatus,\n logStatus: (values['logStatus'] as string) ?? current.logStatus,\n toolsServer: (values['toolsServer'] as string) ?? current.toolsServer,\n toolsCategory: (values['toolsCategory'] as string) ?? current.toolsCategory,\n favoritesOnly: (values['favoritesOnly'] as boolean) ?? false,\n recentOnly: (values['recentOnly'] as boolean) ?? false,\n });\n }\n\n /** @deprecated Use {@link OnFilterValuesChange}. */\n public onFilterValuesChange(values: Record<string, unknown>): void {\n return this.OnFilterValuesChange(values);\n }\n\n /** Update searchTerm from the toolbar mj-page-search. */\n public OnSearchTermChange(value: string): void {\n const current = this.Filters$.value;\n this.OnFiltersChange({ ...current, searchTerm: value ?? '' });\n }\n\n /** @deprecated Use {@link OnSearchTermChange}. */\n public onSearchTermChange(value: string): void {\n return this.OnSearchTermChange(value);\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\n // Clear filters that belong to OTHER tabs — they're not applicable here\n // and would otherwise stay stuck in state (counted in the badge, hidden from\n // the popover form). searchTerm is universal and preserved.\n const current = this.Filters$.value;\n this.OnFiltersChange({\n ...current,\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 this.UpdateQueryParams({ tab: this.ActiveTab });\n // Mode-scoping: swap the agent's per-tab tool set on the tab transition,\n // then re-publish the now-tab-scoped deep context.\n this.syncAgentToolsForMode();\n this.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link SetActiveTab}. */\n public setActiveTab(tab: MCPDashboardTab): void {\n return this.SetActiveTab(tab);\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 /** @deprecated Use {@link CreateServer}. */\n public createServer(): void {\n return this.CreateServer();\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 /** @deprecated Use {@link EditServer}. */\n public editServer(server: MCPServerData): void {\n return this.EditServer(server);\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 const confirmed = await this.confirm.ConfirmDelete({\n title: 'Delete server',\n message: `Delete server \"${server.Name}\"? It has ${parts.join(' and ')}.`,\n detail: 'All related records will be deleted. This cannot be undone.',\n });\n if (!confirmed) {\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 const confirmed = await this.confirm.ConfirmDelete({\n title: 'Delete server',\n message: `Delete server \"${server.Name}\"?`,\n });\n if (!confirmed) {\n return;\n }\n }\n\n try {\n const md = this.ProviderToUse;\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 /** @deprecated Use {@link DeleteServer}. */\n public async deleteServer(server: MCPServerData): Promise<void> {\n return this.DeleteServer(server);\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 = this.ProviderToUse;\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 = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n\n // Queue deletes for 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] Queueing ${logsResult.Results.length} execution logs for delete`);\n for (const log of logsResult.Results) {\n const logEntity = await md.GetEntityObject<MJMCPToolExecutionLogEntity>('MJ: MCP Tool Execution Logs');\n if (await logEntity.Load(log.ID)) {\n logEntity.TransactionGroup = tg;\n await logEntity.Delete();\n } else {\n console.warn(`[MCPDashboard] Could not load execution log ${log.ID} - may have been already deleted`);\n }\n }\n }\n\n // Queue deletes for 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] Queueing ${authStatesResult.Results.length} OAuth Authorization States for delete`);\n for (const state of authStatesResult.Results) {\n const stateEntity = await md.GetEntityObject<MJOAuthAuthorizationStateEntity>('MJ: O Auth Authorization States');\n if (await stateEntity.Load(state.ID)) {\n stateEntity.TransactionGroup = tg;\n await stateEntity.Delete();\n } else {\n console.warn(`[MCPDashboard] Could not load OAuth Authorization State ${state.ID} - may have been already deleted`);\n }\n }\n }\n\n // Queue deletes for 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] Queueing ${clientRegsResult.Results.length} OAuth Client Registrations for delete`);\n for (const reg of clientRegsResult.Results) {\n const regEntity = await md.GetEntityObject<MJOAuthClientRegistrationEntity>('MJ: O Auth Client Registrations');\n if (await regEntity.Load(reg.ID)) {\n regEntity.TransactionGroup = tg;\n await regEntity.Delete();\n } else {\n console.warn(`[MCPDashboard] Could not load OAuth Client Registration ${reg.ID} - may have been already deleted`);\n }\n }\n }\n\n // Queue deletes for 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] Queueing ${tokensResult.Results.length} OAuth Tokens for delete`);\n for (const token of tokensResult.Results) {\n const tokenEntity = await md.GetEntityObject<MJOAuthTokenEntity>('MJ: O Auth Tokens');\n if (await tokenEntity.Load(token.ID)) {\n tokenEntity.TransactionGroup = tg;\n await tokenEntity.Delete();\n } else {\n console.warn(`[MCPDashboard] Could not load OAuth Token ${token.ID} - may have been already deleted`);\n }\n }\n }\n\n // Queue the connection delete last\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 entity.TransactionGroup = tg;\n await entity.Delete();\n\n // Submit everything atomically — if anything fails, the whole cascade rolls back\n if (!await tg.Submit()) {\n const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Delete failed';\n throw new Error(`Failed to delete connection and related records: ${errorMsg}`);\n }\n console.log('[MCPDashboard] Connection and all related records deleted atomically');\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 /** @deprecated Use {@link OnServerDialogClose}. */\n public async onServerDialogClose(result: { saved: boolean }): Promise<void> {\n return this.OnServerDialogClose(result);\n }\n\n public CancelServerForm(): void {\n this.ShowServerDialog = false;\n this.ServerFormError = null;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link CancelServerForm}. */\n public cancelServerForm(): void {\n return this.CancelServerForm();\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 = this.ProviderToUse;\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 /** @deprecated Use {@link SaveServerForm}. */\n public async saveServerForm(): Promise<void> {\n return this.SaveServerForm();\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 /** @deprecated Use {@link CancelConnectionForm}. */\n public cancelConnectionForm(): void {\n return this.CancelConnectionForm();\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 = this.ProviderToUse;\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 /** @deprecated Use {@link SaveConnectionForm}. */\n public async saveConnectionForm(): Promise<void> {\n return this.SaveConnectionForm();\n }\n\n public EditConnection(connection: MCPConnectionData): void {\n this.EditingConnection = connection;\n this.ShowConnectionDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link EditConnection}. */\n public editConnection(connection: MCPConnectionData): void {\n return this.EditConnection(connection);\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 const confirmed = await this.confirm.ConfirmDelete({\n title: 'Delete connection',\n message: `Delete connection \"${connection.Name}\"? It has ${relatedLogs.length} execution log(s).`,\n detail: 'All related logs will be deleted. This cannot be undone.',\n });\n if (!confirmed) {\n return;\n }\n } else {\n const confirmed = await this.confirm.ConfirmDelete({\n title: 'Delete connection',\n message: `Delete connection \"${connection.Name}\"?`,\n });\n if (!confirmed) {\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 /** @deprecated Use {@link DeleteConnection}. */\n public async deleteConnection(connection: MCPConnectionData): Promise<void> {\n return this.DeleteConnection(connection);\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 /** @deprecated Use {@link OnConnectionDialogClose}. */\n public async onConnectionDialogClose(result: { saved: boolean }): Promise<void> {\n return this.OnConnectionDialogClose(result);\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.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link ToggleToolExpand}. */\n public toggleToolExpand(tool: MCPToolData): void {\n return this.ToggleToolExpand(tool);\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 /** @deprecated Use {@link IsToolExpanded}. */\n public isToolExpanded(tool: MCPToolData): boolean {\n return this.IsToolExpanded(tool);\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 /** @deprecated Use {@link SetToolsViewMode}. */\n public setToolsViewMode(mode: ToolsViewMode): void {\n return this.SetToolsViewMode(mode);\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 /** @deprecated Use {@link SetToolsSort}. */\n public setToolsSort(sortBy: ToolsSortBy): void {\n return this.SetToolsSort(sortBy);\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 /** @deprecated Use {@link ToggleServerGroup}. */\n public toggleServerGroup(group: MCPServerGroup): void {\n return this.ToggleServerGroup(group);\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 /** @deprecated Use {@link OpenTestToolDialog}. */\n public openTestToolDialog(tool?: MCPToolData, connection?: MCPConnectionData): void {\n return this.OpenTestToolDialog(tool, connection);\n }\n\n /**\n * Close Test Tool dialog\n */\n public OnTestToolDialogClose(): void {\n this.TestCloseDialog();\n }\n\n /** @deprecated Use {@link OnTestToolDialogClose}. */\n public onTestToolDialogClose(): void {\n return this.OnTestToolDialogClose();\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 /** @deprecated Use {@link OnTestServerChange}. */\n public onTestServerChange(value: string): void {\n return this.OnTestServerChange(value);\n }\n\n public OnTestConnectionChange(value: string): void {\n this.TestToolConnectionID = value || null;\n }\n\n /** @deprecated Use {@link OnTestConnectionChange}. */\n public onTestConnectionChange(value: string): void {\n return this.OnTestConnectionChange(value);\n }\n\n public OnTestToolSelectChange(value: string): void {\n this.TestToolID = value || null;\n }\n\n /** @deprecated Use {@link OnTestToolSelectChange}. */\n public onTestToolSelectChange(value: string): void {\n return this.OnTestToolSelectChange(value);\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 /** @deprecated Use {@link TestProceedToConfig}. */\n public testProceedToConfig(): void {\n return this.TestProceedToConfig();\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 /** @deprecated Use {@link TestSetParam}. */\n public testSetParam(name: string, value: string): void {\n return this.TestSetParam(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 /** @deprecated Use {@link TestExecuteTool}. */\n public async testExecuteTool(): Promise<void> {\n return this.TestExecuteTool();\n }\n\n public TestGoBack(): void {\n this.TestStep = this.TestStep === 'results' ? 'configure' : 'select';\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link TestGoBack}. */\n public testGoBack(): void {\n return this.TestGoBack();\n }\n\n public TestRunAgain(): void {\n this.TestExecutionResult = null;\n this.TestStep = 'configure';\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link TestRunAgain}. */\n public testRunAgain(): void {\n return this.TestRunAgain();\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 /** @deprecated Use {@link TestCloseDialog}. */\n public testCloseDialog(): void {\n return this.TestCloseDialog();\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 /** @deprecated Use {@link FormatTestResult}. */\n public formatTestResult(result: unknown): string {\n return this.FormatTestResult(result);\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 /** @deprecated Use {@link LoadToolsPage}. */\n public async loadToolsPage(reset: boolean = true): Promise<void> {\n return this.LoadToolsPage(reset);\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 /** @deprecated Use {@link OnToolsScrolledIndexChange}. */\n public onToolsScrolledIndexChange(index: number): void {\n return this.OnToolsScrolledIndexChange(index);\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 /** @deprecated Use {@link OnToolsScrollNative}. */\n public onToolsScrollNative(event: Event): void {\n return this.OnToolsScrollNative(event);\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 /** @deprecated Use {@link ToggleScalableMode}. */\n public toggleScalableMode(enabled: boolean): void {\n return this.ToggleScalableMode(enabled);\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 /** @deprecated Use {@link LoadToolCounts}. */\n public async loadToolCounts(): Promise<void> {\n return this.LoadToolCounts();\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 /** @deprecated Use {@link GetServerToolCount}. */\n public getServerToolCount(serverID: string): number {\n return this.GetServerToolCount(serverID);\n }\n\n public TrackPagedTool(_index: number, tool: MCPToolSummary): string {\n return tool.ID;\n }\n\n /** @deprecated Use {@link TrackPagedTool}. */\n public trackPagedTool(_index: number, tool: MCPToolSummary): string {\n return this.TrackPagedTool(_index, tool);\n }\n\n private _visiblePagedToolsCache: MCPToolSummary[] = [];\n private _visiblePagedToolsKey = '';\n private _testRecentToolIDsCache: string[] = [];\n private _testRecentToolIDSetCache = new Set<string>();\n private _testRecentToolIDsSource: MCPExecutionLogData[] | null = null;\n private _testRecentToolIDsLen = -1;\n private _testComboboxToolsCache: MCPToolData[] = [];\n private _testComboboxToolsKey = '';\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 * Memoized on filter state, tool count, favorite count, and log count to avoid repeated array allocation per CD pass. */\n public get VisiblePagedTools(): MCPToolSummary[] {\n const f = this.Filters$.value;\n if (f.favoritesOnly || f.recentOnly) {\n const key = `${f.favoritesOnly ? 1 : 0}|${f.recentOnly ? 1 : 0}|${f.toolsServer ?? ''}|${f.toolsCategory ?? ''}|${f.searchTerm ?? ''}|${this.tools.length}|${this.FavoritedToolIDs.size}|${this.ExecutionLogs.length}`;\n if (key !== this._visiblePagedToolsKey) {\n this._visiblePagedToolsKey = key;\n const search = (f.searchTerm || '').toLowerCase();\n const recent = f.recentOnly ? this.RecentToolIDSet() : null;\n this._visiblePagedToolsCache = 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._visiblePagedToolsCache;\n }\n return this.PagedTools;\n }\n\n /** @deprecated Use {@link VisiblePagedTools}. */\n public get visiblePagedTools(): MCPToolSummary[] {\n return this.VisiblePagedTools;\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 /** @deprecated Use {@link ScaleDenominator}. */\n public scaleDenominator(): number {\n return this.ScaleDenominator();\n }\n\n /** Part 3.5 — recently used tool IDs derived from execution logs (dedup, max 5), memoized on `ExecutionLogs`. */\n public get TestRecentToolIDs(): string[] {\n if (\n this._testRecentToolIDsSource !== this.ExecutionLogs ||\n this._testRecentToolIDsLen !== this.ExecutionLogs.length\n ) {\n this._testRecentToolIDsSource = this.ExecutionLogs;\n this._testRecentToolIDsLen = this.ExecutionLogs.length;\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 this._testRecentToolIDsCache = out;\n this._testRecentToolIDSetCache = seen;\n }\n return this._testRecentToolIDsCache;\n }\n\n /** Part 3.5 — Test dialog combobox: filtered tools with recent-first ordering, memoized on inputs. */\n public get TestComboboxTools(): MCPToolData[] {\n const term = this.TestToolSearch.trim().toLowerCase();\n const base = this.TestFilteredTools;\n const recentIds = this.TestRecentToolIDs;\n const key = `${term}|${base.length}|${base[0]?.ID ?? ''}|${recentIds.join(',')}`;\n if (key !== this._testComboboxToolsKey) {\n this._testComboboxToolsKey = key;\n const filtered = base.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 = this._testRecentToolIDSetCache;\n const recent = filtered.filter(t => recentSet.has(t.ID));\n const rest = filtered.filter(t => !recentSet.has(t.ID));\n this._testComboboxToolsCache = [...recent, ...rest];\n }\n return this._testComboboxToolsCache;\n }\n\n public IsRecentTestTool(toolID: string): boolean {\n void this.TestRecentToolIDs;\n return this._testRecentToolIDSetCache.has(toolID);\n }\n\n /** @deprecated Use {@link IsRecentTestTool}. */\n public isRecentTestTool(toolID: string): boolean {\n return this.IsRecentTestTool(toolID);\n }\n\n public OnTestToolSearchChange(value: string): void {\n this.TestToolSearch = value;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnTestToolSearchChange}. */\n public onTestToolSearchChange(value: string): void {\n return this.OnTestToolSearchChange(value);\n }\n\n public PickTestTool(toolID: string): void {\n this.TestToolID = toolID;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link PickTestTool}. */\n public pickTestTool(toolID: string): void {\n return this.PickTestTool(toolID);\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 = this.ProviderToUse;\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 /** @deprecated Use {@link LoadFavorites}. */\n public async loadFavorites(): Promise<void> {\n return this.LoadFavorites();\n }\n\n public IsFavorited(toolID: string): boolean {\n return this.FavoritedToolIDs.has(NormalizeUUID(toolID));\n }\n\n /** @deprecated Use {@link IsFavorited}. */\n public isFavorited(toolID: string): boolean {\n return this.IsFavorited(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 /** @deprecated Use {@link RecentToolIDSet}. */\n public recentToolIDSet(): Set<string> {\n return this.RecentToolIDSet();\n }\n\n public async ToggleFavorite(toolID: string, event?: Event): Promise<void> {\n if (event) event.stopPropagation();\n const md = this.ProviderToUse;\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 /** @deprecated Use {@link ToggleFavorite}. */\n public async toggleFavorite(toolID: string, event?: Event): Promise<void> {\n return this.ToggleFavorite(toolID, event);\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 /** @deprecated Use {@link FormatLogJson}. */\n public formatLogJson(value: string | null | undefined): string {\n return this.FormatLogJson(value);\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 /** @deprecated Use {@link GetFormattedInputSchema}. */\n public getFormattedInputSchema(tool: MCPToolData): string {\n return this.GetFormattedInputSchema(tool);\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 /** @deprecated Use {@link GetParamCount}. */\n public getParamCount(tool: MCPToolData): number {\n return this.GetParamCount(tool);\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 /** @deprecated Use {@link GetRequiredParamCount}. */\n public getRequiredParamCount(tool: MCPToolData): number {\n return this.GetRequiredParamCount(tool);\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 /** @deprecated Use {@link SyncConnectionTools}. */\n public async syncConnectionTools(connection: MCPConnectionData): Promise<void> {\n return this.SyncConnectionTools(connection);\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 /** @deprecated Use {@link GetSyncState}. */\n public getSyncState(connectionId: string): MCPSyncState | undefined {\n return this.GetSyncState(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 /** @deprecated Use {@link IsSyncing}. */\n public isSyncing(connectionId: string): boolean {\n return this.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 /** @deprecated Use {@link GetSyncProgressMessage}. */\n public getSyncProgressMessage(connectionId: string): string {\n return this.GetSyncProgressMessage(connectionId);\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 /** @deprecated Use {@link InitiateOAuthFlow}. */\n public async initiateOAuthFlow(connectionId: string): Promise<void> {\n return this.InitiateOAuthFlow(connectionId);\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 /** @deprecated Use {@link GetStatusClass}. */\n public getStatusClass(status: string): string {\n return this.GetStatusClass(status);\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 /** @deprecated Use {@link GetTransportIcon}. */\n public getTransportIcon(transportType: string): string {\n return this.GetTransportIcon(transportType);\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 /** @deprecated Use {@link OnLogSortColumn}. */\n public onLogSortColumn(column: typeof this.LogsSortColumn): void {\n return this.OnLogSortColumn(column);\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 /** @deprecated Use {@link GetLogSortClass}. */\n public getLogSortClass(column: typeof this.LogsSortColumn): string {\n return this.GetLogSortClass(column);\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnLogClick}. */\n public async onLogClick(log: MCPExecutionLogData): Promise<void> {\n return this.OnLogClick(log);\n }\n\n /**\n * Closes the log detail panel\n */\n public OnLogDetailClose(): void {\n this.ShowLogDetailPanel = false;\n this.SelectedLog = null;\n this.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnLogDetailClose}. */\n public onLogDetailClose(): void {\n return this.OnLogDetailClose();\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 /** @deprecated Use {@link OnRunAgainFromLog}. */\n public onRunAgainFromLog(event: { toolId: string; connectionId: string }): void {\n return this.OnRunAgainFromLog(event);\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.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link ToggleServerExpand}. */\n public toggleServerExpand(server: MCPServerData): void {\n return this.ToggleServerExpand(server);\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.publishAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link ToggleConnectionExpand}. */\n public toggleConnectionExpand(conn: MCPConnectionData): void {\n return this.ToggleConnectionExpand(conn);\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 /** @deprecated Use {@link IsServerExpanded}. */\n public isServerExpanded(server: MCPServerData): boolean {\n return this.IsServerExpanded(server);\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 /** @deprecated Use {@link IsConnectionExpanded}. */\n public isConnectionExpanded(conn: MCPConnectionData): boolean {\n return this.IsConnectionExpanded(conn);\n }\n\n /**\n * Partition `this.tools` into the {@link toolsByServerID} index, keyed by the\n * normalized MCPServerID. Called once whenever tools/connections load so the\n * server/connection card `@for` blocks read tools via an O(1) Map lookup instead\n * of re-filtering the whole tools array on every change-detection pass.\n */\n private buildToolsByServerMap(): void {\n const map = new Map<string, MCPToolData[]>();\n for (const tool of this.tools) {\n const key = NormalizeUUID(tool.MCPServerID);\n const bucket = map.get(key);\n if (bucket) {\n bucket.push(tool);\n } else {\n map.set(key, [tool]);\n }\n }\n this.toolsByServerID = map;\n }\n\n /**\n * Gets tools for a specific server (O(1) lookup against the precomputed index).\n */\n public GetToolsForServer(serverId: string): MCPToolData[] {\n return this.toolsByServerID.get(NormalizeUUID(serverId)) ?? [];\n }\n\n /** @deprecated Use {@link GetToolsForServer}. */\n public getToolsForServer(serverId: string): MCPToolData[] {\n return this.GetToolsForServer(serverId);\n }\n\n /**\n * Gets tools for a specific connection (via its server, O(1) lookup).\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.toolsByServerID.get(NormalizeUUID(connection.MCPServerID)) ?? [];\n }\n\n /** @deprecated Use {@link GetToolsForConnection}. */\n public getToolsForConnection(connectionId: string): MCPToolData[] {\n return this.GetToolsForConnection(connectionId);\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 /** @deprecated Use {@link RunToolFromCard}. */\n public runToolFromCard(tool: MCPToolData, connection?: MCPConnectionData): void {\n return this.RunToolFromCard(tool, connection);\n }\n}\n","<mj-page-layout>\n <!-- Header -->\n <mj-page-header\n Title=\"MCP Dashboard\"\n Icon=\"fa-solid fa-plug-circle-bolt\">\n <div meta>\n <mj-stat-badge [Count]=\"CurrentFilteredCount\" [Total]=\"CurrentTotalCount\" Label=\"items\"></mj-stat-badge>\n </div>\n <div actions>\n <!-- Action Buttons based on tab -->\n @switch (ActiveTab) {\n @case ('servers') {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createServer()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span class=\"action-btn-label\">Add Server</span>\n </button>\n }\n @case ('connections') {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createConnection()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span class=\"action-btn-label\">Add Connection</span>\n </button>\n }\n @case ('tools') {\n <mj-view-toggle\n [Options]=\"toolsViewOptions\"\n [ActiveKey]=\"ToolsViewMode\"\n (KeyChange)=\"setToolsViewMode($any($event))\">\n </mj-view-toggle>\n <button mjButton variant=\"secondary\" size=\"sm\"\n (click)=\"toggleScalableMode(!useScalablePagination)\"\n [title]=\"useScalablePagination ? 'Scale mode on: virtual scroll, paginated' : 'Enable scale mode for large tool sets'\">\n <i class=\"fa-solid\" [class.fa-bolt]=\"useScalablePagination\" [class.fa-bolt-lightning]=\"!useScalablePagination\"></i>\n <span class=\"action-btn-label\">Scale: {{ useScalablePagination ? 'ON' : 'OFF' }}</span>\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"openTestToolDialog()\">\n <i class=\"fa-solid fa-play\"></i>\n <span class=\"action-btn-label\">Test Tool</span>\n </button>\n }\n @case ('logs') {\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"loadAllData()\"></mj-refresh-button>\n }\n }\n </div>\n <div toolbar>\n <!-- Tab Navigation -->\n <mj-tab-nav\n [Tabs]=\"mcpTabs\"\n [ActiveKey]=\"ActiveTab\"\n (TabChange)=\"setActiveTab($any($event))\">\n </mj-tab-nav>\n <mj-page-search\n Placeholder=\"Search…\"\n [Value]=\"CurrentFilters.searchTerm\"\n (ValueChange)=\"onSearchTermChange($event)\">\n </mj-page-search>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetPopoverFilters()\">\n <mj-filter-panel\n [Fields]=\"mcpFilterFields\"\n [Values]=\"mcpFilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetPopoverFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n </div>\n </mj-page-header>\n\n <!-- Main Content -->\n <mj-page-body [Flex]=\"true\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <mj-alert Variant=\"error\" Dismissible (Dismissed)=\"ErrorMessage = null\">{{ ErrorMessage }}</mj-alert>\n }\n\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 <mj-empty-state Icon=\"fa-solid fa-server\"\n Title=\"No MCP servers configured\"\n ActionText=\"Add Your First Server\"\n (Action)=\"createServer()\" />\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 <mj-empty-state Icon=\"fa-solid fa-link\"\n Title=\"No connections configured\"\n ActionText=\"Add Your First Connection\"\n (Action)=\"createConnection()\" />\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 <mj-alert Size=\"sm\"\n [Variant]=\"getSyncState(conn.ID)?.lastResult?.Success ? 'success' : 'error'\">\n @if (getSyncState(conn.ID)?.lastResult?.Success) {\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 <span>{{ getSyncState(conn.ID)?.lastResult?.ErrorMessage }}</span>\n }\n </mj-alert>\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 @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 <mj-empty-state Icon=\"fa-solid fa-wrench\"\n Title=\"No tools discovered yet\"\n Message=\"Tools are discovered when connections sync with MCP servers\" />\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 <mj-empty-state Icon=\"fa-solid fa-list-check\"\n Title=\"No recent execution logs\"\n Message=\"Logs appear when tools are executed via MCP connections\" />\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 </mj-page-body>\n</mj-page-layout>\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 <mj-alert Variant=\"error\">{{ ServerFormError }}</mj-alert>\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 <mj-alert Variant=\"error\">{{ ConnectionFormError }}</mj-alert>\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 <mj-alert Variant=\"success\">Execution Successful @if (TestExecutionResult?.DurationMs) { <span style=\"float:right;font-size:0.75rem\">{{ TestExecutionResult?.DurationMs }}ms</span> }</mj-alert>\n } @else {\n <mj-alert Variant=\"error\">Execution Failed</mj-alert>\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 <mj-accordion-panel class=\"mcp-log-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"LogInputArgsExpanded\" (ExpandedChange)=\"LogInputArgsExpanded = $event\">\n <ng-template mjAccordionTitle><span>Input Arguments</span></ng-template>\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 </mj-accordion-panel>\n }\n @if (SelectedLog.Result) {\n <mj-accordion-panel class=\"mcp-log-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"LogResultExpanded\" (ExpandedChange)=\"LogResultExpanded = $event\">\n <ng-template mjAccordionTitle><span>Result</span></ng-template>\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 </mj-accordion-panel>\n }\n @if (SelectedLog.ErrorMessage) {\n <mj-accordion-panel class=\"mcp-log-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"LogErrorExpanded\" (ExpandedChange)=\"LogErrorExpanded = $event\">\n <ng-template mjAccordionTitle><span style=\"color:var(--mj-status-error-text,#c53030)\">Error</span></ng-template>\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 </mj-accordion-panel>\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"]}