@memberjunction/ng-dashboards 5.23.0 → 5.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +15 -33
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +233 -493
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +2 -2
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +7 -7
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +717 -8
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +7166 -1889
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +50 -4
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +759 -491
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts +4 -5
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +14 -15
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +4 -4
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +5 -5
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +4 -4
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +5 -5
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +2 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +1 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +2 -3
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +9 -11
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +62 -7
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +825 -359
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +2 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +2 -0
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +4 -5
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +11 -12
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.d.ts +2 -3
- package/dist/Actions/components/code-management.component.d.ts.map +1 -1
- package/dist/Actions/components/code-management.component.js +4 -6
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.d.ts +2 -3
- package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +4 -6
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +4 -5
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +10 -11
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +13 -12
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +39 -66
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.d.ts +2 -3
- package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +4 -6
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.d.ts +2 -3
- package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +4 -6
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.d.ts +112 -0
- package/dist/ApplicationRoles/application-roles-resource.component.d.ts.map +1 -0
- package/dist/ApplicationRoles/application-roles-resource.component.js +532 -0
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -0
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +1 -0
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +4 -1
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +4 -1
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +4 -1
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +4 -1
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +4 -1
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +2 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +2 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -3
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +10 -11
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +2 -0
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts +4 -4
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +8 -9
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -3
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +11 -12
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +1 -0
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +2 -3
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +9 -10
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +23 -15
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +167 -213
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +68 -32
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +470 -437
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts +10 -3
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +35 -11
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.d.ts +12 -3
- package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.js +5 -1
- package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +4 -4
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +4 -5
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +2 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +3 -0
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +3 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +3 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +3 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +412 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4267 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +39 -4
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +187 -13
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +13 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +329 -224
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +76 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +602 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/index.d.ts +2 -1
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +2 -1
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +2 -0
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +2 -0
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +2 -0
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +2 -0
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +7 -28
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +25 -107
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +1 -0
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +10 -23
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +41 -103
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +9 -10
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +2 -0
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +2 -0
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +2 -0
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +2 -0
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +2 -0
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +1 -0
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts +4 -4
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +9 -10
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts +2 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +2 -0
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +4 -4
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +10 -11
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +2 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +2 -0
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/__tests__/analytics-resource.test.d.ts +2 -0
- package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
- package/dist/__tests__/analytics-resource.test.js +181 -0
- package/dist/__tests__/analytics-resource.test.js.map +1 -0
- package/dist/__tests__/scheduling.test.d.ts +2 -0
- package/dist/__tests__/scheduling.test.d.ts.map +1 -0
- package/dist/__tests__/scheduling.test.js +205 -0
- package/dist/__tests__/scheduling.test.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +22 -18
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +29 -10
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +19 -18
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +8 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +2 -1
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +7 -3
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -1
- package/dist/public-api.js.map +1 -1
- package/dist/shared/entity-field-display.d.ts +44 -0
- package/dist/shared/entity-field-display.d.ts.map +1 -0
- package/dist/shared/entity-field-display.js +118 -0
- package/dist/shared/entity-field-display.js.map +1 -0
- package/package.json +47 -46
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +0 -85
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +0 -1
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +0 -461
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-diagnostics.component.js","sourceRoot":"","sources":["../../src/SystemDiagnostics/system-diagnostics.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ElementRef, ViewChild, AfterViewInit, NgZone } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Subject, interval } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { CompositeKey, TelemetryManager, TelemetryEvent, TelemetryPattern, TelemetryInsight, TelemetryCategory, TelemetryParamsUnion, isSingleRunViewParams, isSingleRunQueryParams, isBatchRunViewParams } from '@memberjunction/core';\nimport { ResourceData, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseEngineRegistry, EngineMemoryStats, LocalCacheManager, CacheEntryInfo, CacheStats, CacheEntryType, Metadata } from '@memberjunction/core';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport * as d3 from 'd3';\n\n/**\n * Interface representing a single engine's diagnostic info for display\n */\nexport interface EngineDiagnosticInfo {\n className: string;\n isLoaded: boolean;\n registeredAt: Date;\n lastLoadedAt: Date | null;\n estimatedMemoryBytes: number;\n itemCount: number;\n memoryDisplay: string;\n}\n\n/**\n * Interface for engine config items for drill-down detail\n */\nexport interface EngineConfigItemDisplay {\n propertyName: string;\n type: 'entity' | 'dataset';\n entityName?: string;\n datasetName?: string;\n filter?: string;\n orderBy?: string;\n itemCount: number;\n estimatedMemoryBytes: number;\n memoryDisplay: string;\n sampleData: unknown[];\n expanded: boolean;\n // Paging support\n displayedData: unknown[];\n allDataLoaded: boolean;\n isLoadingMore: boolean;\n currentPage: number;\n pageSize: number;\n}\n\n/**\n * Engine detail panel state\n */\nexport interface EngineDetailPanelState {\n isOpen: boolean;\n engine: EngineDiagnosticInfo | null;\n configItems: EngineConfigItemDisplay[];\n isRefreshing: boolean;\n}\n\n/**\n * Interface for redundant entity loading info\n */\nexport interface RedundantLoadInfo {\n entityName: string;\n engines: string[];\n}\n\n/**\n * Display-friendly telemetry pattern info\n */\nexport interface TelemetryPatternDisplay {\n fingerprint: string;\n category: TelemetryCategory;\n operation: string;\n entityName: string | null;\n filter: string | null;\n orderBy: string | null;\n count: number;\n avgElapsedMs: number;\n totalElapsedMs: number;\n minElapsedMs: number;\n maxElapsedMs: number;\n lastSeen: Date;\n sampleParams: TelemetryParamsUnion;\n}\n\n/**\n * Display-friendly telemetry event for timeline\n */\nexport interface TelemetryEventDisplay {\n id: string;\n category: TelemetryCategory;\n operation: string;\n entityName: string | null;\n filter: string | null;\n startTime: number;\n endTime: number | undefined;\n elapsedMs: number | undefined;\n timestamp: Date;\n params: TelemetryParamsUnion;\n}\n\n/**\n * Extended insight with expansion state\n */\nexport interface TelemetryInsightDisplay extends TelemetryInsight {\n expanded: boolean;\n relatedEvents: TelemetryEventDisplay[];\n}\n\n/**\n * Sort configuration for patterns table\n */\nexport interface PatternSortConfig {\n column: 'category' | 'operation' | 'entity' | 'count' | 'avgMs' | 'totalMs';\n direction: 'asc' | 'desc';\n}\n\n/**\n * Event detail panel state\n */\nexport interface EventDetailPanelState {\n isOpen: boolean;\n event: TelemetryEventDisplay | null;\n relatedPattern: TelemetryPatternDisplay | null;\n}\n\n/**\n * Summary stats for telemetry\n */\nexport interface TelemetrySummary {\n totalEvents: number;\n totalPatterns: number;\n totalInsights: number;\n activeEvents: number;\n byCategory: Record<TelemetryCategory, { events: number; avgMs: number }>;\n}\n\n/**\n * Settings key for persisting user preferences\n */\nconst SYSTEM_DIAGNOSTICS_SETTINGS_KEY = 'SystemDiagnostics.UserPreferences';\n\n/**\n * Interface for persisted user preferences\n */\nexport interface SystemDiagnosticsUserPreferences {\n kpiCardsCollapsed: boolean;\n activeSection: 'engines' | 'redundant' | 'performance' | 'cache';\n perfTab: 'monitor' | 'overview' | 'events' | 'patterns' | 'insights';\n telemetrySource: 'client' | 'server';\n categoryFilter: 'all' | TelemetryCategory;\n chartZoomLevel: number;\n chartGapCompression: boolean;\n autoRefresh: boolean;\n}\n/**\n * System Diagnostics Resource Component\n *\n * Provides a comprehensive view of:\n * - All registered BaseEngine instances and their memory usage\n * - Entity load tracking across engines (identifies redundant loading)\n *\n * This is a client-side only dashboard - all data comes from in-memory registries.\n */\n@RegisterClass(BaseResourceComponent, 'SystemDiagnosticsResource')\n@Component({\n standalone: false,\n selector: 'app-system-diagnostics',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"system-diagnostics\">\n <!-- Header -->\n <div class=\"diagnostics-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-stethoscope\"></i>\n <h2>System Diagnostics</h2>\n </div>\n <div class=\"header-controls\">\n <div class=\"auto-refresh-control\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"autoRefresh\" (change)=\"toggleAutoRefresh()\">\n Auto-refresh\n </label>\n @if (autoRefresh) {\n <span class=\"refresh-indicator\">\n <i class=\"fa-solid fa-sync-alt spinning\"></i>\n Every 5s\n </span>\n }\n </div>\n <button class=\"refresh-btn\" (click)=\"refreshData()\" [disabled]=\"isLoading\">\n <i class=\"fa-solid fa-refresh\" [class.spinning]=\"isLoading\"></i>\n Refresh Now\n </button>\n </div>\n </div>\n \n <!-- Overview Cards (Collapsible) -->\n <div class=\"overview-cards-container\" [class.collapsed]=\"kpiCardsCollapsed\">\n <button class=\"kpi-toggle-btn\" (click)=\"toggleKpiCards()\" [title]=\"kpiCardsCollapsed ? 'Expand KPI cards' : 'Collapse KPI cards'\">\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"!kpiCardsCollapsed\" [class.fa-chevron-down]=\"kpiCardsCollapsed\"></i>\n </button>\n \n @if (!kpiCardsCollapsed) {\n <!-- Expanded View -->\n <div class=\"overview-cards\">\n <div class=\"overview-card\">\n <div class=\"card-icon card-icon--engines\">\n <i class=\"fa-solid fa-cogs\"></i>\n </div>\n <div class=\"card-content\">\n <div class=\"card-value\">{{ engineStats?.totalEngines || 0 }}</div>\n <div class=\"card-label\">Registered Engines</div>\n <div class=\"card-subtitle\">{{ engineStats?.loadedEngines || 0 }} loaded</div>\n </div>\n </div>\n \n <div class=\"overview-card\">\n <div class=\"card-icon card-icon--memory\">\n <i class=\"fa-solid fa-microchip\"></i>\n </div>\n <div class=\"card-content\">\n <div class=\"card-value\">{{ formatBytes(engineStats?.totalEstimatedMemoryBytes || 0) }}</div>\n <div class=\"card-label\">Engine Memory</div>\n <div class=\"card-subtitle\">Estimated total</div>\n </div>\n </div>\n \n <div class=\"overview-card\">\n <div class=\"card-icon\" [class.card-icon--warning]=\"redundantLoads.length > 0\" [class.card-icon--success]=\"redundantLoads.length === 0\">\n <i class=\"fa-solid fa-copy\"></i>\n </div>\n <div class=\"card-content\">\n <div class=\"card-value\">{{ redundantLoads.length }}</div>\n <div class=\"card-label\">Redundant Loads</div>\n <div class=\"card-subtitle\">\n @if (redundantLoads.length === 0) {\n No redundant loading detected\n } @else {\n {{ redundantLoads.length }} entities loaded by multiple engines\n }\n </div>\n </div>\n </div>\n </div>\n } @else {\n <!-- Collapsed View - Mini KPI bar -->\n <div class=\"overview-cards-mini\">\n <div class=\"mini-kpi\" title=\"Registered Engines\">\n <i class=\"fa-solid fa-cogs\"></i>\n <span class=\"mini-value\">{{ engineStats?.totalEngines || 0 }}</span>\n <span class=\"mini-label\">Engines</span>\n </div>\n <div class=\"mini-divider\"></div>\n <div class=\"mini-kpi\" title=\"Engine Memory\">\n <i class=\"fa-solid fa-microchip\"></i>\n <span class=\"mini-value\">{{ formatBytes(engineStats?.totalEstimatedMemoryBytes || 0) }}</span>\n <span class=\"mini-label\">Memory</span>\n </div>\n <div class=\"mini-divider\"></div>\n <div class=\"mini-kpi\" [class.warning]=\"redundantLoads.length > 0\" title=\"Redundant Loads\">\n <i class=\"fa-solid fa-copy\"></i>\n <span class=\"mini-value\">{{ redundantLoads.length }}</span>\n <span class=\"mini-label\">Redundant</span>\n </div>\n </div>\n }\n </div>\n \n <!-- Main Content with Left Nav -->\n <div class=\"main-content\">\n <!-- Left Navigation -->\n <div class=\"left-nav\">\n <div class=\"nav-section\">\n <div class=\"nav-section-title\">Diagnostics</div>\n <div\n class=\"nav-item\"\n [class.active]=\"activeSection === 'engines'\"\n (click)=\"setActiveSection('engines')\"\n >\n <i class=\"fa-solid fa-cogs\"></i>\n <span>Engine Registry</span>\n <span class=\"nav-badge\">{{ engineStats?.totalEngines || 0 }}</span>\n </div>\n <div\n class=\"nav-item\"\n [class.active]=\"activeSection === 'redundant'\"\n (click)=\"setActiveSection('redundant')\"\n >\n <i class=\"fa-solid fa-copy\"></i>\n <span>Redundant Loading</span>\n @if (redundantLoads.length > 0) {\n <span class=\"nav-badge nav-badge--warning\">{{ redundantLoads.length }}</span>\n } @else {\n <span class=\"nav-badge nav-badge--success\">0</span>\n }\n </div>\n <div\n class=\"nav-item\"\n [class.active]=\"activeSection === 'performance'\"\n (click)=\"setActiveSection('performance')\"\n >\n <i class=\"fa-solid fa-chart-line\"></i>\n <span>Performance</span>\n <span class=\"nav-badge\">{{ telemetrySummary?.totalEvents || 0 }}</span>\n </div>\n <div\n class=\"nav-item\"\n [class.active]=\"activeSection === 'cache'\"\n (click)=\"setActiveSection('cache')\"\n >\n <i class=\"fa-solid fa-database\"></i>\n <span>Local Cache</span>\n <span class=\"nav-badge\">{{ cacheStats?.totalEntries || 0 }}</span>\n </div>\n </div>\n </div>\n \n <!-- Content Area -->\n <div class=\"content-area\">\n <!-- Engine Registry Section -->\n @if (activeSection === 'engines') {\n <div class=\"section-panel\">\n <div class=\"panel-header\">\n <h3>\n <i class=\"fa-solid fa-cogs\"></i>\n Registered Engines\n </h3>\n <div class=\"panel-actions\">\n <button class=\"action-btn\" (click)=\"refreshAllEngines()\" [disabled]=\"isRefreshingEngines\">\n <i class=\"fa-solid fa-sync\" [class.spinning]=\"isRefreshingEngines\"></i>\n Refresh All Engines\n </button>\n </div>\n </div>\n \n <div class=\"section-panel-content\">\n @if (engines.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No engines registered yet</p>\n <span class=\"empty-hint\">Engines register themselves when they are first configured</span>\n </div>\n } @else {\n <div class=\"engine-grid\">\n @for (engine of engines; track engine.className) {\n <div class=\"engine-card\" [class.loaded]=\"engine.isLoaded\">\n <div class=\"engine-header\">\n <div class=\"engine-name\" [title]=\"engine.className\">{{ engine.className }}</div>\n <div class=\"engine-status\" [class.status-loaded]=\"engine.isLoaded\" [class.status-pending]=\"!engine.isLoaded\">\n {{ engine.isLoaded ? 'Loaded' : 'Not Loaded' }}\n </div>\n </div>\n <div class=\"engine-stats\">\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-microchip\"></i>\n <span class=\"stat-label\">Memory:</span>\n <span class=\"stat-value\">{{ engine.memoryDisplay }}</span>\n </div>\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span class=\"stat-label\">Items:</span>\n <span class=\"stat-value\">{{ engine.itemCount.toLocaleString() }}</span>\n </div>\n @if (engine.lastLoadedAt) {\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span class=\"stat-label\">Loaded:</span>\n <span class=\"stat-value\">{{ formatTime(engine.lastLoadedAt) }}</span>\n </div>\n }\n </div>\n <div class=\"engine-actions\">\n <button class=\"engine-action-btn\" (click)=\"refreshSingleEngine(engine, $event)\" [disabled]=\"!engine.isLoaded || isRefreshingSingleEngine === engine.className\" title=\"Refresh this engine\">\n <i class=\"fa-solid fa-sync\" [class.spinning]=\"isRefreshingSingleEngine === engine.className\"></i>\n </button>\n <button class=\"engine-action-btn\" (click)=\"openEngineDetailPanel(engine)\" [disabled]=\"!engine.isLoaded\" title=\"View engine details\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Redundant Loading Section -->\n @if (activeSection === 'redundant') {\n <div class=\"section-panel\">\n <div class=\"panel-header\">\n <h3>\n <i class=\"fa-solid fa-copy\"></i>\n Redundant Entity Loading\n </h3>\n </div>\n \n <div class=\"section-panel-content\">\n <div class=\"info-banner\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <div>\n <strong>What is this?</strong>\n This section shows entities that are loaded by multiple engines.\n Redundant loading indicates potential optimization opportunities where engines\n could share data or consolidate their loading logic.\n </div>\n </div>\n \n @if (redundantLoads.length === 0) {\n <div class=\"empty-state success-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No redundant entity loading detected</p>\n <span class=\"empty-hint\">Each entity is being loaded by only one engine</span>\n </div>\n } @else {\n <div class=\"redundant-loads-table-wrapper\">\n <table class=\"redundant-loads-table\">\n <thead>\n <tr>\n <th>Entity Name</th>\n <th>Loaded By Engines</th>\n <th class=\"text-right\">Engine Count</th>\n </tr>\n </thead>\n <tbody>\n @for (load of redundantLoads; track load.entityName) {\n <tr>\n <td class=\"entity-name\">{{ load.entityName }}</td>\n <td class=\"engines-cell\">\n <div class=\"engine-chips\">\n @for (engine of load.engines; track engine) {\n <span class=\"engine-chip\">{{ engine }}</span>\n }\n </div>\n </td>\n <td class=\"text-right count-cell\">\n <span class=\"count-badge\">{{ load.engines.length }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n \n <div class=\"recommendation-banner\">\n <i class=\"fa-solid fa-lightbulb\"></i>\n <div>\n <strong>Recommendation:</strong>\n Consider consolidating data loading by having dependent engines\n access data from a parent engine, or restructuring the engine\n hierarchy to avoid duplicate data fetches.\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Performance Section -->\n @if (activeSection === 'performance') {\n <div class=\"section-panel perf-panel\">\n <div class=\"panel-header\">\n <h3>\n <i class=\"fa-solid fa-chart-line\"></i>\n Performance Telemetry\n </h3>\n <div class=\"panel-actions\">\n <!-- Source toggle -->\n <div class=\"source-toggle\">\n <button class=\"source-btn\" [class.active]=\"telemetrySource === 'client'\" (click)=\"setTelemetrySource('client')\">\n <i class=\"fa-solid fa-browser\"></i>\n Client\n </button>\n <button class=\"source-btn\" [class.active]=\"telemetrySource === 'server'\" (click)=\"setTelemetrySource('server')\">\n <i class=\"fa-solid fa-server\"></i>\n Server\n </button>\n </div>\n <span class=\"action-divider\"></span>\n @if (telemetrySource === 'client') {\n <button class=\"action-btn\" [class.active]=\"telemetryEnabled\" (click)=\"toggleTelemetry()\">\n <i class=\"fa-solid\" [class.fa-toggle-on]=\"telemetryEnabled\" [class.fa-toggle-off]=\"!telemetryEnabled\"></i>\n {{ telemetryEnabled ? 'Enabled' : 'Disabled' }}\n </button>\n <button class=\"action-btn\" (click)=\"clearTelemetry()\" [disabled]=\"!telemetryEnabled\">\n <i class=\"fa-solid fa-trash\"></i>\n Clear\n </button>\n } @else {\n <span class=\"status-indicator\" [class.enabled]=\"serverTelemetryEnabled\" [class.disabled]=\"!serverTelemetryEnabled\">\n <i class=\"fa-solid\" [class.fa-circle-check]=\"serverTelemetryEnabled\" [class.fa-circle-xmark]=\"!serverTelemetryEnabled\"></i>\n {{ serverTelemetryEnabled ? 'Enabled' : 'Disabled' }}\n <span class=\"config-note\" title=\"Configure via mj.config.cjs telemetry section\">(config)</span>\n </span>\n }\n @if (serverTelemetryLoading) {\n <span class=\"loading-indicator\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </span>\n }\n </div>\n </div>\n @if (serverTelemetryError) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ serverTelemetryError }}\n <button class=\"dismiss-btn\" (click)=\"serverTelemetryError = null\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n \n <!-- Performance Sub-Navigation Tabs -->\n <div class=\"perf-tabs\">\n <button class=\"perf-tab\" [class.active]=\"perfTab === 'monitor'\" (click)=\"setPerfTab('monitor')\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <span>Monitor</span>\n </button>\n <button class=\"perf-tab\" [class.active]=\"perfTab === 'overview'\" (click)=\"setPerfTab('overview')\">\n <i class=\"fa-solid fa-gauge\"></i>\n <span>Overview</span>\n @if (slowQueries.length > 0) {\n <span class=\"tab-badge warning\">{{ slowQueries.length }}</span>\n }\n </button>\n <button class=\"perf-tab\" [class.active]=\"perfTab === 'events'\" (click)=\"setPerfTab('events')\">\n <i class=\"fa-solid fa-timeline\"></i>\n <span>Events</span>\n <span class=\"tab-badge\">{{ telemetrySummary?.totalEvents || 0 }}</span>\n </button>\n <button class=\"perf-tab\" [class.active]=\"perfTab === 'patterns'\" (click)=\"setPerfTab('patterns')\">\n <i class=\"fa-solid fa-fingerprint\"></i>\n <span>Patterns</span>\n <span class=\"tab-badge\">{{ telemetrySummary?.totalPatterns || 0 }}</span>\n </button>\n <button class=\"perf-tab\" [class.active]=\"perfTab === 'insights'\" (click)=\"setPerfTab('insights')\">\n <i class=\"fa-solid fa-lightbulb\"></i>\n <span>Insights</span>\n @if (telemetryInsights.length > 0) {\n <span class=\"tab-badge insight\">{{ telemetryInsights.length }}</span>\n }\n </button>\n </div>\n \n <div class=\"section-panel-content\">\n @if (!telemetryEnabled) {\n <div class=\"info-banner warning-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <div>\n <strong>Telemetry is disabled.</strong>\n Enable telemetry to track RunView, RunQuery, and Engine loading performance.\n </div>\n </div>\n }\n \n <!-- Monitor Tab (PerfMon Chart) -->\n @if (perfTab === 'monitor') {\n <div class=\"perfmon-section\">\n <div class=\"perfmon-header\">\n <div class=\"perfmon-legend\">\n <span class=\"legend-item runview\"><span class=\"legend-dot\"></span> RunView</span>\n <span class=\"legend-item runquery\"><span class=\"legend-dot\"></span> RunQuery</span>\n <span class=\"legend-item engine\"><span class=\"legend-dot\"></span> Engine</span>\n <span class=\"legend-item ai\"><span class=\"legend-dot\"></span> AI</span>\n </div>\n <div class=\"perfmon-controls\">\n <!-- Interaction Mode Toggle -->\n <div class=\"mode-toggle\" title=\"Chart Interaction Mode\">\n <button\n class=\"mode-btn\"\n [class.active]=\"chartInteractionMode === 'pointer'\"\n (click)=\"setChartInteractionMode('pointer')\"\n title=\"Pointer mode - click events to view details\">\n <i class=\"fa-solid fa-arrow-pointer\"></i>\n </button>\n <button\n class=\"mode-btn\"\n [class.active]=\"chartInteractionMode === 'select'\"\n (click)=\"setChartInteractionMode('select')\"\n title=\"Select mode - drag to zoom into a time range\">\n <i class=\"fa-solid fa-vector-square\"></i>\n </button>\n <button\n class=\"mode-btn\"\n [class.active]=\"chartInteractionMode === 'pan'\"\n (click)=\"setChartInteractionMode('pan')\"\n title=\"Pan mode - drag to pan the chart\">\n <i class=\"fa-solid fa-hand\"></i>\n </button>\n </div>\n <span class=\"control-divider\"></span>\n <button class=\"chart-control-btn\" (click)=\"zoomPerfChart('in')\" title=\"Zoom In\">\n <i class=\"fa-solid fa-search-plus\"></i>\n </button>\n <button class=\"chart-control-btn\" (click)=\"zoomPerfChart('out')\" title=\"Zoom Out\">\n <i class=\"fa-solid fa-search-minus\"></i>\n </button>\n <button class=\"chart-control-btn\" (click)=\"resetPerfChartZoom()\" title=\"Reset Zoom\">\n <i class=\"fa-solid fa-expand\"></i>\n </button>\n <span class=\"control-divider\"></span>\n <label class=\"compress-toggle\" title=\"Automatically compress gaps with no activity\">\n <input type=\"checkbox\" [(ngModel)]=\"chartGapCompression\" (change)=\"onGapCompressionChange()\">\n <span>Compress Gaps</span>\n </label>\n </div>\n </div>\n <div class=\"perfmon-chart-container\">\n <div class=\"perfmon-y-axis\">\n <span class=\"axis-label\">Duration (ms)</span>\n </div>\n <div #perfChart class=\"perfmon-chart\"></div>\n </div>\n <div class=\"perfmon-footer\">\n <span class=\"footer-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n @if (chartTimeRangeStart !== null && chartTimeRangeEnd !== null) {\n Viewing {{ formatRelativeTime(chartTimeRangeStart) }} - {{ formatRelativeTime(chartTimeRangeEnd) }}. Click Reset to show all.\n } @else if (chartGapCompression) {\n Drag to select a time range. Gaps >5s compressed.\n } @else {\n Drag to select a time range. Hover over points for details.\n }\n </span>\n @if (telemetrySummary) {\n <span class=\"footer-stats\">\n {{ telemetrySummary.totalEvents }} events\n @if (chartZoomLevel !== 1) {\n • {{ (chartZoomLevel * 100) | number:'1.0-0' }}% zoom\n }\n </span>\n }\n </div>\n </div>\n }\n \n <!-- Overview Tab -->\n @if (perfTab === 'overview') {\n <!-- Summary Stats -->\n <div class=\"telemetry-summary\">\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ telemetrySummary?.totalEvents || 0 }}</div>\n <div class=\"summary-label\">Total Events</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ telemetrySummary?.totalPatterns || 0 }}</div>\n <div class=\"summary-label\">Unique Patterns</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ telemetrySummary?.totalInsights || 0 }}</div>\n <div class=\"summary-label\">Insights</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ telemetrySummary?.activeEvents || 0 }}</div>\n <div class=\"summary-label\">Active</div>\n </div>\n </div>\n \n <!-- Category Breakdown -->\n @if (telemetrySummary && telemetrySummary.totalEvents > 0) {\n <div class=\"category-breakdown\">\n <h4>By Category</h4>\n <div class=\"category-grid\">\n @for (cat of categoriesWithData; track cat.name) {\n <div class=\"category-item\" (click)=\"jumpToPatternsByCategory(cat.name)\">\n <span class=\"category-name\">{{ cat.name }}</span>\n <span class=\"category-events\">{{ cat.events }}</span>\n <span class=\"category-avg\">avg {{ cat.avgMs | number:'1.0-0' }}ms</span>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Slow Queries Section -->\n @if (slowQueries.length > 0) {\n <div class=\"slow-queries-section\">\n <h4>\n <i class=\"fa-solid fa-turtle\"></i>\n Slow Operations (>{{ slowQueryThresholdMs }}ms)\n </h4>\n <div class=\"slow-queries-list\">\n @for (query of slowQueries.slice(0, 10); track query.id) {\n <div class=\"slow-query-item clickable\" [class.cache-hit]=\"isCacheHit(query)\" (click)=\"openEventDetailPanel(query)\">\n <div class=\"slow-query-main\">\n <span class=\"category-chip small\" [class]=\"'cat-' + query.category.toLowerCase()\">\n {{ query.category }}\n </span>\n <span class=\"slow-query-entity\">{{ query.entityName || query.operation }}</span>\n @if (isCacheHit(query)) {\n <span class=\"cache-hit-badge small\" title=\"Data served from local cache\">\n <i class=\"fa-solid fa-bolt\"></i>\n CACHED\n </span>\n }\n <span class=\"slow-query-time\">{{ query.elapsedMs | number:'1.0-0' }}ms</span>\n </div>\n <!-- Show entities for RunViews batch operation -->\n @if (isRunViewsOperation(query)) {\n <div class=\"slow-query-entities\">\n @for (entity of getRunViewsEntities(query, 4); track entity) {\n <span class=\"entity-pill small\">{{ entity }}</span>\n }\n @if (hasMoreEntities(query, 4)) {\n <span class=\"entity-pill small more\">+{{ getRunViewsEntityCount(query) - 4 }} more</span>\n }\n </div>\n }\n <!-- RunView parameter pills -->\n @if (isRunViewOperation(query) && getRunViewPills(query).length > 0) {\n <div class=\"slow-query-pills\">\n @for (pill of getRunViewPills(query); track pill.label) {\n <span class=\"param-pill small\" [class]=\"'pill-' + pill.type\" [title]=\"pill.value\">\n <span class=\"pill-label\">{{ pill.label }}:</span>\n <span class=\"pill-value\">{{ pill.value }}</span>\n </span>\n }\n </div>\n }\n @if (query.filter) {\n <div class=\"slow-query-filter\">{{ truncateString(query.filter, 60) }}</div>\n }\n <div class=\"slow-query-timestamp\">{{ formatTimestamp(query.timestamp) }}</div>\n </div>\n }\n </div>\n </div>\n } @else if (telemetryEnabled && telemetrySummary && telemetrySummary.totalEvents > 0) {\n <div class=\"success-banner\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>No slow operations detected. All operations completed under {{ slowQueryThresholdMs }}ms.</span>\n </div>\n }\n }\n \n <!-- Events Tab (Timeline) -->\n @if (perfTab === 'events') {\n <!-- Filter Bar for Events -->\n <div class=\"filter-bar compact\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n placeholder=\"Search events...\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\">\n @if (searchQuery) {\n <button class=\"clear-search\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <div class=\"filter-buttons\">\n <button class=\"filter-btn\" [class.active]=\"categoryFilter === 'all'\" (click)=\"setCategoryFilter('all')\">\n All\n </button>\n @for (cat of categoriesWithData; track cat.name) {\n <button class=\"filter-btn\" [class.active]=\"categoryFilter === cat.name\" (click)=\"setCategoryFilterByName(cat.name)\">\n {{ cat.name }}\n </button>\n }\n </div>\n </div>\n \n <div class=\"timeline-section\">\n <div class=\"timeline-container\">\n @if (filteredEvents.length > 0) {\n @for (event of filteredEvents.slice(0, 50); track event.id) {\n <div class=\"timeline-item clickable\" [class]=\"'tl-' + event.category.toLowerCase()\" [class.cache-hit]=\"isCacheHit(event)\" (click)=\"openEventDetailPanel(event)\">\n <div class=\"timeline-marker\">\n @if (isCacheHit(event)) {\n <div class=\"marker-bolt\">\n <i class=\"fa-solid fa-bolt\"></i>\n </div>\n } @else {\n <div class=\"marker-dot\"></div>\n }\n <div class=\"marker-line\"></div>\n </div>\n <div class=\"timeline-content\">\n <div class=\"timeline-header\">\n <span class=\"timeline-time\">{{ formatTimestamp(event.timestamp) }}</span>\n <span class=\"category-chip small\" [class]=\"'cat-' + event.category.toLowerCase()\">\n {{ event.category }}\n </span>\n @if (isCacheHit(event)) {\n <span class=\"cache-hit-badge\" title=\"Data served from local cache\">\n <i class=\"fa-solid fa-bolt\"></i>\n CACHED\n </span>\n }\n @if (event.elapsedMs !== undefined) {\n <span class=\"timeline-duration\" [class.slow]=\"(event.elapsedMs || 0) >= slowQueryThresholdMs\">\n {{ event.elapsedMs | number:'1.0-0' }}ms\n </span>\n }\n </div>\n <div class=\"timeline-body\">\n <span class=\"timeline-operation\">{{ event.operation }}</span>\n @if (event.entityName) {\n <span class=\"timeline-entity\">{{ event.entityName }}</span>\n }\n <!-- Show entities for RunViews batch operation -->\n @if (isRunViewsOperation(event)) {\n <div class=\"timeline-entities\">\n @for (entity of getRunViewsEntities(event, 3); track entity) {\n <span class=\"entity-pill\">{{ entity }}</span>\n }\n @if (hasMoreEntities(event, 3)) {\n <span class=\"entity-pill more\">+{{ getRunViewsEntityCount(event) - 3 }} more</span>\n }\n </div>\n }\n </div>\n <!-- RunView parameter pills -->\n @if (isRunViewOperation(event) && getRunViewPills(event).length > 0) {\n <div class=\"timeline-pills\">\n @for (pill of getRunViewPills(event); track pill.label) {\n <span class=\"param-pill\" [class]=\"'pill-' + pill.type\" [title]=\"pill.value\">\n <span class=\"pill-label\">{{ pill.label }}:</span>\n <span class=\"pill-value\">{{ pill.value }}</span>\n </span>\n }\n </div>\n }\n @if (event.filter) {\n <div class=\"timeline-filter\">{{ truncateString(event.filter, 80) }}</div>\n }\n </div>\n </div>\n }\n } @else {\n <div class=\"empty-state small\">\n <i class=\"fa-solid fa-hourglass-start\"></i>\n <p>No events recorded yet</p>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Patterns Tab -->\n @if (perfTab === 'patterns') {\n <!-- Filter Bar -->\n <div class=\"filter-bar compact\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n placeholder=\"Search patterns...\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\">\n @if (searchQuery) {\n <button class=\"clear-search\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <div class=\"filter-buttons\">\n <button class=\"filter-btn\" [class.active]=\"categoryFilter === 'all'\" (click)=\"setCategoryFilter('all')\">\n All\n </button>\n @for (cat of categoriesWithData; track cat.name) {\n <button class=\"filter-btn\" [class.active]=\"categoryFilter === cat.name\" (click)=\"setCategoryFilterByName(cat.name)\">\n {{ cat.name }}\n </button>\n }\n </div>\n </div>\n \n @if (filteredPatterns.length > 0) {\n <div class=\"patterns-section\">\n <div class=\"patterns-table-wrapper\">\n <table class=\"patterns-table sortable\">\n <thead>\n <tr>\n <th class=\"sortable-header\" (click)=\"sortPatternsBy('category')\">\n Category\n <i class=\"fa-solid\" [class]=\"getSortIcon('category')\"></i>\n </th>\n <th class=\"sortable-header\" (click)=\"sortPatternsBy('operation')\">\n Operation\n <i class=\"fa-solid\" [class]=\"getSortIcon('operation')\"></i>\n </th>\n <th class=\"sortable-header\" (click)=\"sortPatternsBy('entity')\">\n Entity/Query\n <i class=\"fa-solid\" [class]=\"getSortIcon('entity')\"></i>\n </th>\n <th>Filter</th>\n <th class=\"sortable-header text-right\" (click)=\"sortPatternsBy('count')\">\n Count\n <i class=\"fa-solid\" [class]=\"getSortIcon('count')\"></i>\n </th>\n <th class=\"sortable-header text-right\" (click)=\"sortPatternsBy('avgMs')\">\n Avg (ms)\n <i class=\"fa-solid\" [class]=\"getSortIcon('avgMs')\"></i>\n </th>\n <th class=\"sortable-header text-right\" (click)=\"sortPatternsBy('totalMs')\">\n Total (ms)\n <i class=\"fa-solid\" [class]=\"getSortIcon('totalMs')\"></i>\n </th>\n </tr>\n </thead>\n <tbody>\n @for (pattern of filteredPatterns; track pattern.fingerprint) {\n <tr [class.duplicate-row]=\"pattern.count >= 2\" [class.slow-row]=\"pattern.avgElapsedMs >= slowQueryThresholdMs\">\n <td>\n <span class=\"category-chip\" [class]=\"'cat-' + pattern.category.toLowerCase()\">\n {{ pattern.category }}\n </span>\n </td>\n <td class=\"operation-cell\">{{ pattern.operation }}</td>\n <td class=\"entity-cell\">{{ pattern.entityName || '-' }}</td>\n <td class=\"filter-cell\" [title]=\"pattern.filter || ''\">\n {{ truncateString(pattern.filter, 30) }}\n </td>\n <td class=\"text-right\">\n @if (pattern.count >= 2) {\n <span class=\"count-warning\">{{ pattern.count }}</span>\n } @else {\n {{ pattern.count }}\n }\n </td>\n <td class=\"text-right\" [class.slow-value]=\"pattern.avgElapsedMs >= slowQueryThresholdMs\">\n {{ pattern.avgElapsedMs | number:'1.1-1' }}\n </td>\n <td class=\"text-right\">{{ pattern.totalElapsedMs | number:'1.0-0' }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n } @else if (telemetryEnabled && telemetryPatterns.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-hourglass-start\"></i>\n <p>No telemetry data yet</p>\n <span class=\"empty-hint\">Navigate around the app to generate performance data</span>\n </div>\n } @else if (searchQuery || categoryFilter !== 'all') {\n <div class=\"empty-state small\">\n <i class=\"fa-solid fa-filter\"></i>\n <p>No patterns match your filter</p>\n </div>\n }\n }\n \n <!-- Insights Tab -->\n @if (perfTab === 'insights') {\n @if (telemetryInsights.length > 0) {\n <div class=\"insights-section\">\n <div class=\"insights-list\">\n @for (insight of telemetryInsights; track insight.id) {\n <div class=\"insight-card expandable\" [class]=\"getSeverityClass(insight.severity)\" [class.expanded]=\"insight.expanded\">\n <div class=\"insight-header\" (click)=\"toggleInsightExpanded(insight)\">\n <i class=\"fa-solid\" [class]=\"getSeverityIcon(insight.severity)\"></i>\n <span class=\"insight-title\">{{ insight.title }}</span>\n <span class=\"insight-category\">{{ insight.category }}</span>\n <i class=\"fa-solid expand-icon\" [class.fa-chevron-down]=\"!insight.expanded\" [class.fa-chevron-up]=\"insight.expanded\"></i>\n </div>\n \n <!-- Always show key info for actionability -->\n <div class=\"insight-key-info\">\n @if (insight.entityName) {\n <div class=\"key-info-item\">\n <span class=\"key-label\">Entity:</span>\n <span class=\"key-value entity-name\">{{ insight.entityName }}</span>\n </div>\n }\n @if (getInsightFilter(insight)) {\n <div class=\"key-info-item\">\n <span class=\"key-label\">Filter:</span>\n <code class=\"key-value filter-code\">{{ getInsightFilter(insight) }}</code>\n </div>\n }\n </div>\n \n <div class=\"insight-message\">{{ insight.message }}</div>\n <div class=\"insight-suggestion\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n {{ insight.suggestion }}\n </div>\n \n <!-- Expanded Details -->\n @if (insight.expanded) {\n <div class=\"insight-details\">\n <!-- Show all params from first related event -->\n @if (insight.relatedEvents.length > 0) {\n <div class=\"detail-section\">\n <div class=\"detail-label\">Full Parameters</div>\n <div class=\"params-display\">\n @for (param of getEventParams(insight.relatedEvents[0]); track param.key) {\n <div class=\"param-row\">\n <span class=\"param-key\">{{ param.key }}:</span>\n <span class=\"param-value\">{{ param.value }}</span>\n </div>\n }\n </div>\n </div>\n <div class=\"detail-section\">\n <div class=\"detail-label\">Related Calls ({{ insight.relatedEvents.length }})</div>\n <div class=\"related-events\">\n @for (event of insight.relatedEvents; track event.id) {\n <div class=\"related-event\">\n <span class=\"event-time\">{{ formatTimestamp(event.timestamp) }}</span>\n <span class=\"event-duration\">{{ event.elapsedMs | number:'1.0-0' }}ms</span>\n @if (event.entityName) {\n <span class=\"event-entity\">{{ event.entityName }}</span>\n }\n @if (event.filter) {\n <span class=\"event-filter\">{{ truncateString(event.filter, 40) }}</span>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-check-circle\" style=\"color: #4caf50;\"></i>\n <p>No optimization insights</p>\n <span class=\"empty-hint\">Insights will appear when potential optimizations are detected</span>\n </div>\n }\n }\n </div>\n </div>\n }\n \n <!-- Local Cache Section -->\n @if (activeSection === 'cache') {\n <div class=\"section-panel\">\n <div class=\"panel-header\">\n <h3>\n <i class=\"fa-solid fa-database\"></i>\n Local Cache\n </h3>\n <div class=\"panel-actions\">\n <button class=\"action-btn\" (click)=\"clearAllCache()\" [disabled]=\"!cacheStats || cacheStats.totalEntries === 0\">\n <i class=\"fa-solid fa-trash\"></i>\n Clear All\n </button>\n </div>\n </div>\n \n <div class=\"section-panel-content\">\n @if (!cacheInitialized) {\n <div class=\"info-banner warning-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <div>\n <strong>Cache not initialized.</strong>\n The LocalCacheManager requires initialization with a storage provider during app startup.\n </div>\n </div>\n } @else {\n <!-- Cache Summary Stats -->\n <div class=\"cache-summary\">\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ cacheStats?.totalEntries || 0 }}</div>\n <div class=\"summary-label\">Total Entries</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ formatBytes(cacheStats?.totalSizeBytes || 0) }}</div>\n <div class=\"summary-label\">Total Size</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ cacheStats?.hits || 0 }}</div>\n <div class=\"summary-label\">Cache Hits</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ cacheStats?.misses || 0 }}</div>\n <div class=\"summary-label\">Cache Misses</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ cacheHitRate | number:'1.1-1' }}%</div>\n <div class=\"summary-label\">Hit Rate</div>\n </div>\n </div>\n \n <!-- Cache Type Breakdown -->\n <div class=\"cache-type-breakdown\">\n <h4>By Type</h4>\n <div class=\"type-grid\">\n <div class=\"type-item\" (click)=\"setCacheTypeFilter('dataset')\">\n <span class=\"type-icon\"><i class=\"fa-solid fa-layer-group\"></i></span>\n <span class=\"type-name\">Datasets</span>\n <span class=\"type-count\">{{ cacheStats?.byType?.dataset?.count || 0 }}</span>\n <span class=\"type-size\">{{ formatBytes(cacheStats?.byType?.dataset?.sizeBytes || 0) }}</span>\n </div>\n <div class=\"type-item\" (click)=\"setCacheTypeFilter('runview')\">\n <span class=\"type-icon\"><i class=\"fa-solid fa-table\"></i></span>\n <span class=\"type-name\">RunViews</span>\n <span class=\"type-count\">{{ cacheStats?.byType?.runview?.count || 0 }}</span>\n <span class=\"type-size\">{{ formatBytes(cacheStats?.byType?.runview?.sizeBytes || 0) }}</span>\n </div>\n <div class=\"type-item\" (click)=\"setCacheTypeFilter('runquery')\">\n <span class=\"type-icon\"><i class=\"fa-solid fa-code\"></i></span>\n <span class=\"type-name\">RunQueries</span>\n <span class=\"type-count\">{{ cacheStats?.byType?.runquery?.count || 0 }}</span>\n <span class=\"type-size\">{{ formatBytes(cacheStats?.byType?.runquery?.sizeBytes || 0) }}</span>\n </div>\n </div>\n </div>\n \n <!-- Cache Entries Table -->\n @if (filteredCacheEntries.length > 0) {\n <div class=\"cache-entries-section\">\n <div class=\"section-header\">\n <h4>Cache Entries</h4>\n <div class=\"filter-controls\">\n <button class=\"filter-btn\" [class.active]=\"cacheTypeFilter === 'all'\" (click)=\"setCacheTypeFilter('all')\">All</button>\n <button class=\"filter-btn\" [class.active]=\"cacheTypeFilter === 'dataset'\" (click)=\"setCacheTypeFilter('dataset')\">Datasets</button>\n <button class=\"filter-btn\" [class.active]=\"cacheTypeFilter === 'runview'\" (click)=\"setCacheTypeFilter('runview')\">RunViews</button>\n <button class=\"filter-btn\" [class.active]=\"cacheTypeFilter === 'runquery'\" (click)=\"setCacheTypeFilter('runquery')\">RunQueries</button>\n </div>\n </div>\n <div class=\"cache-entries-table-wrapper\">\n <table class=\"cache-entries-table\">\n <thead>\n <tr>\n <th>Type</th>\n <th>Name</th>\n <th class=\"text-right\">Size</th>\n <th class=\"text-right\">Hits</th>\n <th>Cached At</th>\n <th>Last Accessed</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (entry of filteredCacheEntries.slice(0, 50); track entry.key) {\n <tr>\n <td>\n <span class=\"cache-type-chip\" [class]=\"'type-' + entry.type\">\n {{ entry.type }}\n </span>\n </td>\n <td class=\"entry-name\">\n {{ entry.name }}\n @if (entry.fingerprint) {\n <code class=\"entry-fingerprint\">{{ truncateString(entry.fingerprint, 20) }}</code>\n }\n </td>\n <td class=\"text-right\">{{ formatBytes(entry.sizeBytes) }}</td>\n <td class=\"text-right\">{{ entry.accessCount }}</td>\n <td>{{ formatCacheTimestamp(entry.cachedAt) }}</td>\n <td>{{ formatCacheTimestamp(entry.lastAccessedAt) }}</td>\n <td>\n <button class=\"icon-btn\" (click)=\"invalidateCacheEntry(entry)\" title=\"Invalidate\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n @if (filteredCacheEntries.length > 50) {\n <div class=\"table-footer\">\n Showing 50 of {{ filteredCacheEntries.length }} entries\n </div>\n }\n </div>\n } @else if (cacheStats && cacheStats.totalEntries === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database\"></i>\n <p>No cached data</p>\n <span class=\"empty-hint\">Data will be cached as you use the application</span>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n </div>\n \n <!-- Last Updated -->\n <div class=\"footer\">\n <span class=\"last-updated\">\n <i class=\"fa-solid fa-clock\"></i>\n Last updated: {{ lastUpdated | date:'medium' }}\n </span>\n <button class=\"export-btn\" (click)=\"exportTelemetryData()\" [disabled]=\"!telemetryEnabled || telemetryEvents.length === 0\">\n <i class=\"fa-solid fa-download\"></i>\n Export JSON\n </button>\n </div>\n </div>\n \n <!-- Event Detail Slide-in Panel -->\n @if (eventDetailPanel.isOpen && eventDetailPanel.event) {\n <div class=\"event-detail-overlay\" (click)=\"closeEventDetailPanel()\"></div>\n <div class=\"event-detail-panel\" [class.open]=\"eventDetailPanel.isOpen\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <span class=\"category-chip\" [class]=\"'cat-' + eventDetailPanel.event.category.toLowerCase()\">\n {{ eventDetailPanel.event.category }}\n </span>\n <h3>Event Details</h3>\n </div>\n <button class=\"close-btn\" (click)=\"closeEventDetailPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n \n <div class=\"panel-body\">\n <!-- Key Metrics -->\n <div class=\"detail-metrics\">\n <div class=\"metric\">\n <div class=\"metric-value\" [class.slow]=\"(eventDetailPanel.event.elapsedMs || 0) >= slowQueryThresholdMs\">\n {{ eventDetailPanel.event.elapsedMs !== undefined ? (eventDetailPanel.event.elapsedMs | number:'1.0-0') + 'ms' : 'In Progress' }}\n </div>\n <div class=\"metric-label\">Duration</div>\n </div>\n <div class=\"metric\">\n <div class=\"metric-value\">{{ formatTimestamp(eventDetailPanel.event.timestamp) }}</div>\n <div class=\"metric-label\">Time</div>\n </div>\n <div class=\"metric\">\n <div class=\"metric-value\">+{{ formatRelativeTime(eventDetailPanel.event.startTime - telemetryBootTime) }}</div>\n <div class=\"metric-label\">Relative</div>\n </div>\n </div>\n \n <!-- Operation Info -->\n <div class=\"detail-section\">\n <h4><i class=\"fa-solid fa-code\"></i> Operation</h4>\n <div class=\"detail-content\">\n <div class=\"detail-row\">\n <span class=\"detail-key\">Operation:</span>\n <span class=\"detail-val\">{{ eventDetailPanel.event.operation }}</span>\n </div>\n @if (eventDetailPanel.event.entityName) {\n <div class=\"detail-row\">\n <span class=\"detail-key\">Entity:</span>\n <span class=\"detail-val entity-highlight\">{{ eventDetailPanel.event.entityName }}</span>\n </div>\n }\n @if (eventDetailPanel.event.filter) {\n <div class=\"detail-row\">\n <span class=\"detail-key\">Filter:</span>\n <code class=\"detail-val filter-val\">{{ eventDetailPanel.event.filter }}</code>\n </div>\n }\n </div>\n </div>\n \n <!-- All Parameters -->\n <div class=\"detail-section\">\n <h4><i class=\"fa-solid fa-sliders\"></i> Parameters</h4>\n <div class=\"params-grid\">\n @for (param of getEventParams(eventDetailPanel.event); track param.key) {\n <div class=\"param-item\">\n <span class=\"param-name\">{{ param.key }}</span>\n <span class=\"param-val\">{{ param.value }}</span>\n </div>\n }\n </div>\n </div>\n \n <!-- Related Pattern -->\n @if (eventDetailPanel.relatedPattern) {\n <div class=\"detail-section\">\n <h4><i class=\"fa-solid fa-fingerprint\"></i> Related Pattern</h4>\n <div class=\"pattern-summary\">\n <div class=\"pattern-stat\">\n <span class=\"stat-val\">{{ eventDetailPanel.relatedPattern.count }}</span>\n <span class=\"stat-label\">Total Calls</span>\n </div>\n <div class=\"pattern-stat\">\n <span class=\"stat-val\">{{ eventDetailPanel.relatedPattern.avgElapsedMs | number:'1.1-1' }}ms</span>\n <span class=\"stat-label\">Avg Duration</span>\n </div>\n <div class=\"pattern-stat\">\n <span class=\"stat-val\">{{ eventDetailPanel.relatedPattern.minElapsedMs | number:'1.0-0' }} - {{ eventDetailPanel.relatedPattern.maxElapsedMs | number:'1.0-0' }}ms</span>\n <span class=\"stat-label\">Range</span>\n </div>\n </div>\n @if (eventDetailPanel.relatedPattern.count >= 2) {\n <div class=\"pattern-warning\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n This pattern has been called {{ eventDetailPanel.relatedPattern.count }} times. Consider caching or batching.\n </div>\n }\n </div>\n }\n \n <!-- Actions -->\n <div class=\"detail-actions\">\n <button class=\"action-button\" (click)=\"copyEventToClipboard(eventDetailPanel.event)\">\n <i class=\"fa-solid fa-copy\"></i>\n Copy JSON\n </button>\n @if (eventDetailPanel.event.entityName) {\n <button class=\"action-button\" (click)=\"filterByEntity(eventDetailPanel.event.entityName)\">\n <i class=\"fa-solid fa-filter\"></i>\n Filter by Entity\n </button>\n }\n </div>\n </div>\n </div>\n }\n \n <!-- Engine Detail Slide-in Panel -->\n @if (engineDetailPanel.isOpen && engineDetailPanel.engine) {\n <div class=\"engine-detail-overlay\" (click)=\"closeEngineDetailPanel()\"></div>\n <div class=\"engine-detail-panel\" [class.open]=\"engineDetailPanel.isOpen\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-cogs\"></i>\n <h3>{{ engineDetailPanel.engine.className }}</h3>\n </div>\n <div class=\"panel-header-actions\">\n <button class=\"icon-btn\" (click)=\"refreshEngineInDetailPanel()\" [disabled]=\"engineDetailPanel.isRefreshing\" title=\"Refresh engine\">\n <i class=\"fa-solid fa-sync\" [class.spinning]=\"engineDetailPanel.isRefreshing\"></i>\n </button>\n <button class=\"close-btn\" (click)=\"closeEngineDetailPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"panel-body\">\n <!-- Engine Summary -->\n <div class=\"engine-summary-section\">\n <div class=\"summary-stat\">\n <span class=\"summary-label\">Status</span>\n <span class=\"summary-value\">\n <span class=\"status-dot\" [class.status-loaded]=\"engineDetailPanel.engine.isLoaded\"></span>\n {{ engineDetailPanel.engine.isLoaded ? 'Loaded' : 'Not Loaded' }}\n </span>\n </div>\n <div class=\"summary-stat\">\n <span class=\"summary-label\">Memory</span>\n <span class=\"summary-value\">{{ engineDetailPanel.engine.memoryDisplay }}</span>\n </div>\n <div class=\"summary-stat\">\n <span class=\"summary-label\">Items</span>\n <span class=\"summary-value\">{{ engineDetailPanel.engine.itemCount.toLocaleString() }}</span>\n </div>\n @if (engineDetailPanel.engine.lastLoadedAt) {\n <div class=\"summary-stat\">\n <span class=\"summary-label\">Last Loaded</span>\n <span class=\"summary-value\">{{ formatTime(engineDetailPanel.engine.lastLoadedAt) }}</span>\n </div>\n }\n </div>\n \n <!-- Config Items -->\n <div class=\"config-items-section\">\n <h4>\n <i class=\"fa-solid fa-database\"></i>\n Data Configs ({{ engineDetailPanel.configItems.length }})\n </h4>\n \n @if (engineDetailPanel.configItems.length === 0) {\n <div class=\"empty-state small\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No config items found</p>\n </div>\n } @else {\n <div class=\"config-items-list\">\n @for (item of engineDetailPanel.configItems; track item.propertyName) {\n <div class=\"config-item\" [class.expanded]=\"item.expanded\">\n <div class=\"config-item-header\" (click)=\"toggleConfigItemExpanded(item)\">\n <div class=\"config-item-info\">\n <span class=\"config-type-chip\" [class]=\"'type-' + item.type\">{{ item.type }}</span>\n <span class=\"config-name\">{{ item.entityName || item.datasetName || item.propertyName }}</span>\n </div>\n <div class=\"config-item-stats\">\n <span class=\"config-stat\">{{ item.itemCount }} items</span>\n <span class=\"config-stat\">{{ item.memoryDisplay }}</span>\n <i class=\"fa-solid expand-icon\" [class.fa-chevron-down]=\"!item.expanded\" [class.fa-chevron-up]=\"item.expanded\"></i>\n </div>\n </div>\n \n @if (item.expanded) {\n <div class=\"config-item-details\">\n <div class=\"config-detail-row\">\n <span class=\"detail-label\">Property:</span>\n <code class=\"detail-value\">{{ item.propertyName }}</code>\n </div>\n @if (item.filter) {\n <div class=\"config-detail-row\">\n <span class=\"detail-label\">Filter:</span>\n <code class=\"detail-value\">{{ item.filter }}</code>\n </div>\n }\n @if (item.orderBy) {\n <div class=\"config-detail-row\">\n <span class=\"detail-label\">Order By:</span>\n <code class=\"detail-value\">{{ item.orderBy }}</code>\n </div>\n }\n \n <!-- Data Table with Paging -->\n @if (item.displayedData.length > 0) {\n <div class=\"sample-data-section\">\n <div class=\"sample-header\">\n <span class=\"sample-title\">Data ({{ item.displayedData.length }} of {{ item.itemCount }})</span>\n <div class=\"sample-header-actions\">\n @if (!item.allDataLoaded && item.itemCount > item.displayedData.length) {\n <button class=\"load-more-btn\" (click)=\"loadMoreData(item)\" [disabled]=\"item.isLoadingMore\" title=\"Load more records\">\n @if (item.isLoadingMore) {\n <i class=\"fa-solid fa-spinner spinning\"></i>\n } @else {\n <i class=\"fa-solid fa-plus\"></i>\n }\n Load More\n </button>\n <button class=\"load-all-btn\" (click)=\"loadAllData(item)\" [disabled]=\"item.isLoadingMore\" title=\"Load all records\">\n @if (item.isLoadingMore) {\n <i class=\"fa-solid fa-spinner spinning\"></i>\n } @else {\n <i class=\"fa-solid fa-download\"></i>\n }\n Load All\n </button>\n }\n @if (item.allDataLoaded) {\n <span class=\"all-loaded-badge\">\n <i class=\"fa-solid fa-check\"></i>\n All Loaded\n </span>\n }\n </div>\n </div>\n <div class=\"sample-data-table-wrapper\">\n <table class=\"sample-data-table\">\n <thead>\n <tr>\n <th class=\"action-col\"></th>\n @for (col of getSampleDataColumns(item); track col) {\n <th>{{ col }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of item.displayedData; track $index) {\n <tr>\n <td class=\"action-col\">\n @if (item.entityName && getRecordId(row)) {\n <button class=\"open-record-btn\" (click)=\"openEntityRecord(item.entityName, row)\" title=\"Open record\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n }\n </td>\n @for (col of getSampleDataColumns(item); track col) {\n <td [title]=\"getSampleDataValue(row, col)\">{{ truncateString(getSampleDataValue(row, col), 30) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n `,\n styleUrls: ['./system-diagnostics.component.css']\n})\nexport class SystemDiagnosticsComponent extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n private destroy$ = new Subject<void>();\n\n // User settings persistence\n private metadata = new Metadata();\n private userSettingEntity: MJUserSettingEntity | null = null;\n private saveSettingsTimeout: ReturnType<typeof setTimeout> | null = null;\n private settingsLoaded = false;\n\n // State\n isLoading = false;\n autoRefresh = false;\n activeSection: 'engines' | 'redundant' | 'performance' | 'cache' = 'engines';\n lastUpdated = new Date();\n isRefreshingEngines = false;\n kpiCardsCollapsed = false;\n\n // Data\n engineStats: EngineMemoryStats | null = null;\n engines: EngineDiagnosticInfo[] = [];\n redundantLoads: RedundantLoadInfo[] = [];\n\n // Telemetry data\n telemetrySummary: TelemetrySummary | null = null;\n telemetryPatterns: TelemetryPatternDisplay[] = [];\n telemetryInsights: TelemetryInsightDisplay[] = [];\n telemetryEnabled = false;\n categoriesWithData: { name: string; events: number; avgMs: number }[] = [];\n\n // Telemetry source toggle (client vs server)\n telemetrySource: 'client' | 'server' = 'client';\n serverTelemetryLoading = false;\n serverTelemetryError: string | null = null;\n serverTelemetryEnabled = false; // Read from server config, not changeable at runtime\n\n // Timeline data\n telemetryEvents: TelemetryEventDisplay[] = [];\n timelineView: 'insights' | 'timeline' | 'chart' = 'insights';\n\n // Performance sub-tabs\n perfTab: 'monitor' | 'overview' | 'events' | 'patterns' | 'insights' = 'monitor';\n\n // D3 Chart reference\n @ViewChild('perfChart', { static: false }) perfChartRef!: ElementRef<HTMLDivElement>;\n private chartInitialized = false;\n\n // Chart zoom and gap compression state\n chartZoomLevel = 1;\n chartGapCompression = true;\n private chartViewportStart = 0;\n private chartViewportEnd = 0;\n private expandedGaps = new Set<number>(); // Track which gaps are expanded\n\n // Selection-based zoom state\n private isSelecting = false;\n private selectionStartX = 0;\n private selectionRect: d3.Selection<SVGRectElement, unknown, null, undefined> | null = null;\n private chartXScale: d3.ScaleLinear<number, number> | null = null;\n private chartMarginLeft = 50;\n chartTimeRangeStart: number | null = null; // Currently visible time range start\n\n // Chart interaction mode: 'pointer' to click events, 'select' for drag-to-zoom, 'pan' for panning\n chartInteractionMode: 'pointer' | 'select' | 'pan' = 'pointer';\n\n // Store gap segments for inverse mapping (x -> time)\n private chartGapSegments: Array<{ type: 'events' | 'gap'; startTime: number; endTime: number; gapIndex?: number; displayStart: number; displayEnd: number }> = [];\n chartTimeRangeEnd: number | null = null; // Currently visible time range end\n\n // Slow queries\n slowQueries: TelemetryEventDisplay[] = [];\n slowQueryThresholdMs = 500;\n\n // Patterns sorting\n patternSort: PatternSortConfig = { column: 'count', direction: 'desc' };\n\n // Search/Filter\n searchQuery = '';\n categoryFilter: TelemetryCategory | 'all' = 'all';\n\n // Store telemetry boot time for relative time calculations (public for template access)\n telemetryBootTime: number = 0;\n\n // Event detail panel state\n eventDetailPanel: EventDetailPanelState = {\n isOpen: false,\n event: null,\n relatedPattern: null\n };\n\n // Local Cache data\n cacheStats: CacheStats | null = null;\n cacheEntries: CacheEntryInfo[] = [];\n cacheTypeFilter: CacheEntryType | 'all' = 'all';\n cacheInitialized = false;\n cacheHitRate = 0;\n\n // Engine detail panel state\n engineDetailPanel: EngineDetailPanelState = {\n isOpen: false,\n engine: null,\n configItems: [],\n isRefreshing: false\n };\n isRefreshingSingleEngine: string | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private ngZone: NgZone,\n private navigationService: NavigationService,\n private route: ActivatedRoute\n ) {\n super();\n }\n\n async ngOnInit() {\n // Load user preferences first\n await this.loadUserPreferences();\n\n // Apply query params (override preferences if present)\n this.applyQueryParams();\n\n // Subscribe to query param changes\n this.route.queryParams\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n // Only apply if we've already loaded settings\n if (this.settingsLoaded) {\n this.applyQueryParams();\n }\n });\n\n this.refreshData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n // Clear any pending save timeout\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n }\n\n ngAfterViewInit() {\n // Render the PerfMon chart if we're on the monitor tab\n // Need a small delay to ensure the DOM is fully ready\n if (this.activeSection === 'performance' && this.perfTab === 'monitor') {\n setTimeout(() => this.renderPerfChart(), 100);\n }\n }\n\n setActiveSection(section: 'engines' | 'redundant' | 'performance' | 'cache'): void {\n this.activeSection = section;\n if (section === 'cache') {\n this.refreshCacheData();\n }\n if (section === 'performance' && this.perfTab === 'monitor') {\n // Need to wait for DOM to render before chart can be drawn\n setTimeout(() => this.renderPerfChart(), 50);\n }\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n toggleAutoRefresh(): void {\n if (this.autoRefresh) {\n // Start auto-refresh interval\n interval(5000)\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (this.autoRefresh) {\n this.refreshData();\n }\n });\n }\n this.saveUserPreferencesDebounced();\n }\n\n toggleKpiCards(): void {\n this.kpiCardsCollapsed = !this.kpiCardsCollapsed;\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n async refreshData(): Promise<void> {\n this.isLoading = true;\n this.cdr.markForCheck();\n\n try {\n // Get engine registry stats\n this.engineStats = BaseEngineRegistry.Instance.GetMemoryStats();\n\n // Transform to display format\n this.engines = this.engineStats.engineStats.map(engine => ({\n className: engine.className,\n isLoaded: engine.isLoaded,\n registeredAt: engine.registeredAt,\n lastLoadedAt: engine.lastLoadedAt,\n estimatedMemoryBytes: engine.estimatedMemoryBytes,\n itemCount: engine.itemCount,\n memoryDisplay: this.formatBytes(engine.estimatedMemoryBytes)\n }));\n\n // Get redundantly loaded entities\n const redundantMap = BaseEngineRegistry.Instance.GetRedundantlyLoadedEntities();\n this.redundantLoads = Array.from(redundantMap.entries())\n .map(([entityName, engines]) => ({\n entityName,\n engines\n }))\n .sort((a, b) => b.engines.length - a.engines.length);\n\n // Get telemetry data\n this.refreshTelemetryData();\n\n this.lastUpdated = new Date();\n } catch (error) {\n console.error('Error refreshing diagnostics data:', error);\n } finally {\n this.isLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private refreshTelemetryData(): void {\n const tm = TelemetryManager.Instance;\n this.telemetryEnabled = tm.IsEnabled;\n\n // Get summary stats\n const stats = tm.GetStats();\n this.telemetrySummary = {\n totalEvents: stats.totalEvents,\n totalPatterns: stats.totalPatterns,\n totalInsights: stats.totalInsights,\n activeEvents: stats.activeEvents,\n byCategory: stats.byCategory\n };\n\n // Build categories with data for display\n const categoryNames: TelemetryCategory[] = ['RunView', 'RunQuery', 'Engine', 'AI', 'Cache'];\n this.categoriesWithData = categoryNames\n .filter(cat => stats.byCategory[cat]?.events > 0)\n .map(cat => ({\n name: cat,\n events: stats.byCategory[cat].events,\n avgMs: stats.byCategory[cat].avgMs\n }));\n\n // Get patterns and apply sorting\n const patterns = tm.GetPatterns({ minCount: 1, sortBy: 'count' });\n this.telemetryPatterns = this.sortPatterns(patterns.slice(0, 100).map(p => ({\n fingerprint: p.fingerprint,\n category: p.category,\n operation: p.operation,\n entityName: this.getEntityName(p.sampleParams),\n filter: this.getFilter(p.sampleParams),\n orderBy: this.getOrderBy(p.sampleParams),\n count: p.count,\n avgElapsedMs: Math.round(p.avgElapsedMs * 100) / 100,\n totalElapsedMs: Math.round(p.totalElapsedMs),\n minElapsedMs: p.minElapsedMs === Infinity ? 0 : Math.round(p.minElapsedMs),\n maxElapsedMs: Math.round(p.maxElapsedMs),\n lastSeen: new Date(p.lastSeen),\n sampleParams: p.sampleParams\n })));\n\n // Get all events for timeline\n const events = tm.GetEvents({ limit: 200 });\n this.telemetryEvents = events.map(e => this.eventToDisplay(e));\n\n // Get slow queries (operations above threshold)\n this.slowQueries = this.telemetryEvents\n .filter(e => e.elapsedMs !== undefined && e.elapsedMs >= this.slowQueryThresholdMs)\n .sort((a, b) => (b.elapsedMs || 0) - (a.elapsedMs || 0))\n .slice(0, 20);\n\n // Get insights and convert to display format with expansion support\n const insights = tm.GetInsights({ limit: 20 });\n this.telemetryInsights = insights.map(insight => ({\n ...insight,\n expanded: false,\n relatedEvents: this.getRelatedEventsForInsight(insight)\n }));\n }\n\n private eventToDisplay(e: TelemetryEvent): TelemetryEventDisplay {\n return {\n id: e.id,\n category: e.category,\n operation: e.operation,\n entityName: this.getEntityName(e.params),\n filter: this.getFilter(e.params),\n startTime: e.startTime,\n endTime: e.endTime,\n elapsedMs: e.elapsedMs,\n timestamp: new Date(e.startTime),\n params: e.params\n };\n }\n\n private getRelatedEventsForInsight(insight: TelemetryInsight): TelemetryEventDisplay[] {\n const tm = TelemetryManager.Instance;\n const events = tm.GetEvents({ limit: 500 });\n return events\n .filter(e => insight.relatedEventIds?.includes(e.id))\n .map(e => this.eventToDisplay(e));\n }\n\n private sortPatterns(patterns: TelemetryPatternDisplay[]): TelemetryPatternDisplay[] {\n return [...patterns].sort((a, b) => {\n let comparison = 0;\n switch (this.patternSort.column) {\n case 'category':\n comparison = a.category.localeCompare(b.category);\n break;\n case 'operation':\n comparison = a.operation.localeCompare(b.operation);\n break;\n case 'entity':\n comparison = (a.entityName || '').localeCompare(b.entityName || '');\n break;\n case 'count':\n comparison = a.count - b.count;\n break;\n case 'avgMs':\n comparison = a.avgElapsedMs - b.avgElapsedMs;\n break;\n case 'totalMs':\n comparison = a.totalElapsedMs - b.totalElapsedMs;\n break;\n }\n return this.patternSort.direction === 'asc' ? comparison : -comparison;\n });\n }\n\n sortPatternsBy(column: PatternSortConfig['column']): void {\n if (this.patternSort.column === column) {\n // Toggle direction\n this.patternSort.direction = this.patternSort.direction === 'asc' ? 'desc' : 'asc';\n } else {\n this.patternSort.column = column;\n this.patternSort.direction = 'desc';\n }\n this.telemetryPatterns = this.sortPatterns(this.telemetryPatterns);\n this.cdr.markForCheck();\n }\n\n getSortIcon(column: PatternSortConfig['column']): string {\n if (this.patternSort.column !== column) {\n return 'fa-sort';\n }\n return this.patternSort.direction === 'asc' ? 'fa-sort-up' : 'fa-sort-down';\n }\n\n toggleInsightExpanded(insight: TelemetryInsightDisplay): void {\n insight.expanded = !insight.expanded;\n this.cdr.markForCheck();\n }\n\n setTimelineView(view: 'insights' | 'timeline' | 'chart'): void {\n this.timelineView = view;\n if (view === 'chart') {\n // Render chart after view updates\n setTimeout(() => this.renderPerfChart(), 0);\n }\n this.cdr.markForCheck();\n }\n\n setPerfTab(tab: 'monitor' | 'overview' | 'events' | 'patterns' | 'insights'): void {\n this.perfTab = tab;\n if (tab === 'monitor') {\n // Render chart after view updates\n setTimeout(() => this.renderPerfChart(), 0);\n }\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n jumpToPatternsByCategory(categoryName: string): void {\n this.perfTab = 'patterns';\n this.categoryFilter = categoryName as TelemetryCategory;\n this.cdr.markForCheck();\n }\n\n getInsightFilter(insight: TelemetryInsightDisplay): string | null {\n // Get filter from first related event\n if (insight.relatedEvents.length > 0) {\n return insight.relatedEvents[0].filter;\n }\n return null;\n }\n\n getEventParams(event: TelemetryEventDisplay): Array<{ key: string; value: string }> {\n const params: Array<{ key: string; value: string }> = [];\n if (!event.params) return params;\n\n // Cast to record for dynamic iteration - params have been validated by type guards\n const paramsRecord = event.params as unknown as Record<string, unknown>;\n\n // Show important params first\n const priorityKeys = ['EntityName', 'ViewName', 'ViewID', 'QueryName', 'ExtraFilter', 'OrderBy', 'ResultType', 'MaxRows'];\n const shownKeys = new Set<string>();\n\n // Add priority keys first if they exist\n for (const key of priorityKeys) {\n if (paramsRecord[key] !== undefined && paramsRecord[key] !== null) {\n const value = this.formatParamValue(paramsRecord[key]);\n if (value) {\n params.push({ key, value });\n shownKeys.add(key);\n }\n }\n }\n\n // Add remaining keys\n for (const [key, val] of Object.entries(paramsRecord)) {\n if (!shownKeys.has(key) && !key.startsWith('_')) {\n const value = this.formatParamValue(val);\n if (value) {\n params.push({ key, value });\n }\n }\n }\n\n return params;\n }\n\n private formatParamValue(val: unknown): string {\n if (val === null || val === undefined) return '';\n if (typeof val === 'string') return val || '(empty)';\n if (typeof val === 'boolean') return val ? 'true' : 'false';\n if (typeof val === 'number') return val.toString();\n if (Array.isArray(val)) return val.join(', ');\n if (typeof val === 'object') return JSON.stringify(val);\n return String(val);\n }\n\n /**\n * Check if this is a RunView/RunViews operation\n */\n isRunViewOperation(event: TelemetryEventDisplay): boolean {\n return event.operation === 'ProviderBase.RunView' || event.operation === 'ProviderBase.RunViews';\n }\n\n /**\n * Check if this is a batch RunViews operation\n */\n isRunViewsOperation(event: TelemetryEventDisplay): boolean {\n return event.operation === 'ProviderBase.RunViews';\n }\n\n /**\n * Get entity names for RunViews batch operation (first few for display)\n */\n getRunViewsEntities(event: TelemetryEventDisplay, maxDisplay: number = 3): string[] {\n if (!event.params || !isBatchRunViewParams(event.params)) return [];\n const entities = event.params.Entities;\n if (!entities || !Array.isArray(entities)) return [];\n return entities.slice(0, maxDisplay);\n }\n\n /**\n * Get total entity count for RunViews batch operation\n */\n getRunViewsEntityCount(event: TelemetryEventDisplay): number {\n if (!event.params || !isBatchRunViewParams(event.params)) return 0;\n return event.params.Entities?.length || 0;\n }\n\n /**\n * Check if there are more entities than displayed\n */\n hasMoreEntities(event: TelemetryEventDisplay, maxDisplay: number = 3): boolean {\n return this.getRunViewsEntityCount(event) > maxDisplay;\n }\n\n /**\n * Check if the event was a cache hit (safe accessor for union type params)\n */\n isCacheHit(event: TelemetryEventDisplay | { params: TelemetryParamsUnion }): boolean {\n if (!event?.params) return false;\n // Use isSingleRunViewParams or isSingleRunQueryParams to safely access cacheHit\n if (isSingleRunViewParams(event.params)) {\n return event.params.cacheHit === true;\n }\n if (isSingleRunQueryParams(event.params)) {\n return event.params.cacheHit === true;\n }\n // Handle batch RunViews operations - check cacheHits/cacheMisses counts\n if (isBatchRunViewParams(event.params)) {\n const p = event.params as { cacheHits?: number; cacheMisses?: number };\n // Consider it a cache hit if all items were served from cache\n return (p.cacheHits ?? 0) > 0 && (p.cacheMisses ?? 0) === 0;\n }\n return false;\n }\n\n /**\n * Get entity name from telemetry params (safe accessor for union type)\n */\n getEntityName(params: TelemetryParamsUnion | undefined): string | null {\n if (!params) return null;\n if (isSingleRunViewParams(params)) {\n return params.EntityName || null;\n }\n if (isSingleRunQueryParams(params)) {\n return params.QueryName || null;\n }\n return null;\n }\n\n /**\n * Get filter from telemetry params (safe accessor for union type)\n */\n getFilter(params: TelemetryParamsUnion | undefined): string | null {\n if (!params) return null;\n if (isSingleRunViewParams(params)) {\n return params.ExtraFilter || null;\n }\n return null;\n }\n\n /**\n * Get order by from telemetry params (safe accessor for union type)\n */\n getOrderBy(params: TelemetryParamsUnion | undefined): string | null {\n if (!params) return null;\n if (isSingleRunViewParams(params)) {\n return params.OrderBy || null;\n }\n return null;\n }\n\n /**\n * Get RunView parameter pills for display\n */\n getRunViewPills(event: TelemetryEventDisplay): Array<{ label: string; value: string; type: 'filter' | 'order' | 'result' | 'limit' | 'batch' | 'info' }> {\n const pills: Array<{ label: string; value: string; type: 'filter' | 'order' | 'result' | 'limit' | 'batch' | 'info' }> = [];\n\n // For batch operations, show batch size\n if (this.isRunViewsOperation(event) && event.params && isBatchRunViewParams(event.params)) {\n const batchSize = event.params.BatchSize;\n if (batchSize) {\n pills.push({ label: 'Batch', value: String(batchSize), type: 'batch' });\n }\n }\n\n // For single RunView, show params\n if (!this.isRunViewsOperation(event) && event.params && isSingleRunViewParams(event.params)) {\n const extraFilter = event.params.ExtraFilter;\n if (extraFilter) {\n pills.push({ label: 'Filter', value: this.truncateString(extraFilter, 25), type: 'filter' });\n }\n\n const orderBy = event.params.OrderBy;\n if (orderBy) {\n pills.push({ label: 'Order', value: this.truncateString(orderBy, 20), type: 'order' });\n }\n\n const resultType = event.params.ResultType;\n if (resultType && resultType !== 'simple') {\n pills.push({ label: 'Type', value: resultType, type: 'result' });\n }\n\n const maxRows = event.params.MaxRows;\n if (maxRows && maxRows > 0) {\n pills.push({ label: 'Limit', value: String(maxRows), type: 'limit' });\n }\n }\n\n return pills;\n }\n\n // === Event Detail Panel Methods ===\n\n openEventDetailPanel(event: TelemetryEventDisplay): void {\n // Find related pattern\n const relatedPattern = this.telemetryPatterns.find(p =>\n p.category === event.category &&\n p.operation === event.operation &&\n p.entityName === event.entityName\n ) || null;\n\n this.eventDetailPanel = {\n isOpen: true,\n event,\n relatedPattern\n };\n this.cdr.markForCheck();\n }\n\n closeEventDetailPanel(): void {\n this.eventDetailPanel = {\n isOpen: false,\n event: null,\n relatedPattern: null\n };\n this.cdr.markForCheck();\n }\n\n copyEventToClipboard(event: TelemetryEventDisplay): void {\n const eventData = {\n id: event.id,\n category: event.category,\n operation: event.operation,\n entityName: event.entityName,\n filter: event.filter,\n startTime: event.startTime,\n endTime: event.endTime,\n elapsedMs: event.elapsedMs,\n timestamp: event.timestamp.toISOString(),\n params: event.params\n };\n\n navigator.clipboard.writeText(JSON.stringify(eventData, null, 2))\n .then(() => {\n // Could show a toast notification here\n console.log('Event copied to clipboard');\n })\n .catch(err => {\n console.error('Failed to copy event:', err);\n });\n }\n\n filterByEntity(entityName: string | null): void {\n if (!entityName) return;\n\n this.closeEventDetailPanel();\n this.searchQuery = entityName;\n this.perfTab = 'patterns';\n this.cdr.markForCheck();\n }\n\n exportTelemetryData(): void {\n const exportData = {\n exportedAt: new Date().toISOString(),\n bootTime: this.telemetryBootTime,\n summary: this.telemetrySummary,\n events: this.telemetryEvents.map(e => ({\n id: e.id,\n category: e.category,\n operation: e.operation,\n entityName: e.entityName,\n filter: e.filter,\n startTime: e.startTime,\n endTime: e.endTime,\n elapsedMs: e.elapsedMs,\n timestamp: e.timestamp.toISOString(),\n params: e.params\n })),\n patterns: this.telemetryPatterns.map(p => ({\n fingerprint: p.fingerprint,\n category: p.category,\n operation: p.operation,\n entityName: p.entityName,\n filter: p.filter,\n count: p.count,\n avgElapsedMs: p.avgElapsedMs,\n totalElapsedMs: p.totalElapsedMs,\n minElapsedMs: p.minElapsedMs,\n maxElapsedMs: p.maxElapsedMs,\n lastSeen: p.lastSeen.toISOString()\n })),\n insights: this.telemetryInsights.map(i => ({\n id: i.id,\n category: i.category,\n severity: i.severity,\n title: i.title,\n message: i.message,\n suggestion: i.suggestion,\n entityName: i.entityName,\n timestamp: typeof i.timestamp === 'number' ? new Date(i.timestamp).toISOString() : i.timestamp\n }))\n };\n\n const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `telemetry-export-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.json`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n\n setCategoryFilter(category: TelemetryCategory | 'all'): void {\n this.categoryFilter = category;\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n setCategoryFilterByName(name: string): void {\n // Cast string to TelemetryCategory since we know it comes from categoriesWithData\n this.categoryFilter = name as TelemetryCategory;\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n onSearchChange(): void {\n this.cdr.markForCheck();\n // Debounce URL update for search to avoid too many history changes\n this.updateQueryParamsDebounced();\n }\n\n clearSearch(): void {\n this.searchQuery = '';\n this.cdr.markForCheck();\n this.updateQueryParams();\n }\n\n private searchParamsTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private updateQueryParamsDebounced(): void {\n if (this.searchParamsTimeout) {\n clearTimeout(this.searchParamsTimeout);\n }\n this.searchParamsTimeout = setTimeout(() => {\n this.updateQueryParams();\n }, 300);\n }\n\n get filteredPatterns(): TelemetryPatternDisplay[] {\n let patterns = this.telemetryPatterns;\n\n // Apply category filter\n if (this.categoryFilter !== 'all') {\n patterns = patterns.filter(p => p.category === this.categoryFilter);\n }\n\n // Apply search filter\n if (this.searchQuery.trim()) {\n const query = this.searchQuery.toLowerCase();\n patterns = patterns.filter(p =>\n p.entityName?.toLowerCase().includes(query) ||\n p.operation.toLowerCase().includes(query) ||\n p.filter?.toLowerCase().includes(query) ||\n p.category.toLowerCase().includes(query)\n );\n }\n\n return patterns;\n }\n\n get filteredEvents(): TelemetryEventDisplay[] {\n let events = this.telemetryEvents;\n\n // Apply category filter\n if (this.categoryFilter !== 'all') {\n events = events.filter(e => e.category === this.categoryFilter);\n }\n\n // Apply search filter\n if (this.searchQuery.trim()) {\n const query = this.searchQuery.toLowerCase();\n events = events.filter(e =>\n e.entityName?.toLowerCase().includes(query) ||\n e.operation.toLowerCase().includes(query) ||\n e.filter?.toLowerCase().includes(query) ||\n e.category.toLowerCase().includes(query)\n );\n }\n\n return events;\n }\n\n formatTimestamp(date: Date): string {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n fractionalSecondDigits: 3\n });\n }\n\n truncateString(str: string | null, maxLength: number): string {\n if (!str) return '-';\n if (str.length <= maxLength) return str;\n return str.substring(0, maxLength) + '...';\n }\n\n toggleTelemetry(): void {\n const tm = TelemetryManager.Instance;\n tm.SetEnabled(!tm.IsEnabled);\n this.telemetryEnabled = tm.IsEnabled;\n this.cdr.markForCheck();\n }\n\n clearTelemetry(): void {\n // Only client telemetry can be cleared (server telemetry is read-only)\n TelemetryManager.Instance.Clear();\n TelemetryManager.Instance.ClearInsights();\n this.refreshTelemetryData();\n this.cdr.markForCheck();\n }\n\n /**\n * Switch between client and server telemetry sources\n */\n setTelemetrySource(source: 'client' | 'server'): void {\n if (this.telemetrySource === source) return;\n\n this.telemetrySource = source;\n this.serverTelemetryError = null;\n\n if (source === 'server') {\n this.loadServerTelemetry();\n } else {\n this.refreshTelemetryData();\n }\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Load telemetry data from the server via GraphQL\n */\n private async loadServerTelemetry(): Promise<void> {\n this.serverTelemetryLoading = true;\n this.serverTelemetryError = null;\n this.cdr.markForCheck();\n\n try {\n const gqlProvider = GraphQLDataProvider.Instance;\n\n // Query for server telemetry settings (read-only, configured via mj.config.cjs)\n const settingsQuery = `\n query GetServerTelemetrySettings {\n GetServerTelemetrySettings {\n enabled\n level\n }\n }\n `;\n\n // Query for server telemetry stats\n const statsQuery = `\n query GetServerTelemetryStats {\n GetServerTelemetryStats {\n totalEvents\n totalPatterns\n totalInsights\n activeEvents\n byCategory {\n category\n events\n avgMs\n }\n }\n }\n `;\n\n // Query for server telemetry events\n const eventsQuery = `\n query GetServerTelemetryEvents($filter: TelemetryEventFilterInput) {\n GetServerTelemetryEvents(filter: $filter) {\n id\n category\n operation\n fingerprint\n startTime\n endTime\n elapsedMs\n userId\n params\n tags\n parentEventId\n }\n }\n `;\n\n // Query for server telemetry patterns\n const patternsQuery = `\n query GetServerTelemetryPatterns($filter: TelemetryPatternFilterInput) {\n GetServerTelemetryPatterns(filter: $filter) {\n fingerprint\n category\n operation\n sampleParams\n count\n totalElapsedMs\n avgElapsedMs\n minElapsedMs\n maxElapsedMs\n firstSeen\n lastSeen\n }\n }\n `;\n\n // Query for server telemetry insights\n const insightsQuery = `\n query GetServerTelemetryInsights($filter: TelemetryInsightFilterInput) {\n GetServerTelemetryInsights(filter: $filter) {\n id\n severity\n analyzerName\n category\n title\n message\n suggestion\n relatedEventIds\n entityName\n metadata\n timestamp\n }\n }\n `;\n\n // Execute queries in parallel\n const [settingsResult, statsResult, eventsResult, patternsResult, insightsResult] = await Promise.all([\n gqlProvider.ExecuteGQL(settingsQuery, {}),\n gqlProvider.ExecuteGQL(statsQuery, {}),\n gqlProvider.ExecuteGQL(eventsQuery, { filter: { limit: 200 } }),\n gqlProvider.ExecuteGQL(patternsQuery, { filter: { minCount: 1 } }),\n gqlProvider.ExecuteGQL(insightsQuery, { filter: { limit: 20 } })\n ]);\n\n // Process settings (read-only status from server config)\n if (settingsResult?.GetServerTelemetrySettings) {\n this.serverTelemetryEnabled = settingsResult.GetServerTelemetrySettings.enabled;\n }\n\n // Process stats\n if (statsResult?.GetServerTelemetryStats) {\n const stats = statsResult.GetServerTelemetryStats;\n const byCategory: Record<TelemetryCategory, { events: number; avgMs: number }> = {\n 'RunView': { events: 0, avgMs: 0 },\n 'RunQuery': { events: 0, avgMs: 0 },\n 'Engine': { events: 0, avgMs: 0 },\n 'AI': { events: 0, avgMs: 0 },\n 'Cache': { events: 0, avgMs: 0 },\n 'Coalesce': { events: 0, avgMs: 0 },\n 'Network': { events: 0, avgMs: 0 },\n 'Custom': { events: 0, avgMs: 0 }\n };\n\n for (const cat of stats.byCategory || []) {\n if (cat.category in byCategory) {\n byCategory[cat.category as TelemetryCategory] = {\n events: cat.events,\n avgMs: cat.avgMs\n };\n }\n }\n\n this.telemetrySummary = {\n totalEvents: stats.totalEvents,\n totalPatterns: stats.totalPatterns,\n totalInsights: stats.totalInsights,\n activeEvents: stats.activeEvents,\n byCategory\n };\n\n // Build categories with data\n const categoryNames: TelemetryCategory[] = ['RunView', 'RunQuery', 'Engine', 'AI', 'Cache'];\n this.categoriesWithData = categoryNames\n .filter(cat => byCategory[cat]?.events > 0)\n .map(cat => ({\n name: cat,\n events: byCategory[cat].events,\n avgMs: byCategory[cat].avgMs\n }));\n }\n\n // Process events\n if (eventsResult?.GetServerTelemetryEvents) {\n this.telemetryEvents = eventsResult.GetServerTelemetryEvents.map((e: {\n id: string;\n category: string;\n operation: string;\n startTime: number;\n endTime?: number;\n elapsedMs?: number;\n params: string;\n }) => {\n const params = e.params ? JSON.parse(e.params) : {};\n return {\n id: e.id,\n category: e.category as TelemetryCategory,\n operation: e.operation,\n entityName: params?.EntityName || params?.QueryName || null,\n filter: params?.ExtraFilter || null,\n startTime: e.startTime,\n endTime: e.endTime,\n elapsedMs: e.elapsedMs,\n timestamp: new Date(e.startTime),\n params\n };\n });\n\n // Update slow queries\n this.slowQueries = this.telemetryEvents\n .filter(e => e.elapsedMs !== undefined && e.elapsedMs >= this.slowQueryThresholdMs)\n .sort((a, b) => (b.elapsedMs || 0) - (a.elapsedMs || 0))\n .slice(0, 20);\n }\n\n // Process patterns\n if (patternsResult?.GetServerTelemetryPatterns) {\n this.telemetryPatterns = patternsResult.GetServerTelemetryPatterns.slice(0, 100).map((p: {\n fingerprint: string;\n category: string;\n operation: string;\n sampleParams: string;\n count: number;\n avgElapsedMs: number;\n totalElapsedMs: number;\n minElapsedMs: number;\n maxElapsedMs: number;\n lastSeen: number;\n }) => {\n const sampleParams = p.sampleParams ? JSON.parse(p.sampleParams) : {};\n return {\n fingerprint: p.fingerprint,\n category: p.category as TelemetryCategory,\n operation: p.operation,\n entityName: sampleParams?.EntityName || sampleParams?.QueryName || null,\n filter: sampleParams?.ExtraFilter || null,\n orderBy: sampleParams?.OrderBy || null,\n count: p.count,\n avgElapsedMs: Math.round(p.avgElapsedMs * 100) / 100,\n totalElapsedMs: Math.round(p.totalElapsedMs),\n minElapsedMs: Math.round(p.minElapsedMs),\n maxElapsedMs: Math.round(p.maxElapsedMs),\n lastSeen: new Date(p.lastSeen),\n sampleParams\n };\n });\n }\n\n // Process insights\n if (insightsResult?.GetServerTelemetryInsights) {\n this.telemetryInsights = insightsResult.GetServerTelemetryInsights.map((i: {\n id: string;\n severity: string;\n analyzerName: string;\n category: string;\n title: string;\n message: string;\n suggestion: string;\n relatedEventIds: string[];\n entityName?: string;\n metadata?: string;\n timestamp: number;\n }) => ({\n id: i.id,\n severity: i.severity,\n analyzerName: i.analyzerName,\n category: i.category,\n title: i.title,\n message: i.message,\n suggestion: i.suggestion,\n relatedEventIds: i.relatedEventIds || [],\n entityName: i.entityName,\n metadata: i.metadata ? JSON.parse(i.metadata) : undefined,\n timestamp: i.timestamp,\n expanded: false,\n relatedEvents: []\n }));\n }\n\n this.telemetryEnabled = true; // Server telemetry is available\n } catch (error) {\n console.error('Failed to load server telemetry:', error);\n this.serverTelemetryError = `Failed to load server telemetry: ${error instanceof Error ? error.message : String(error)}`;\n // Clear data on error\n this.telemetrySummary = null;\n this.telemetryEvents = [];\n this.telemetryPatterns = [];\n this.telemetryInsights = [];\n this.slowQueries = [];\n } finally {\n this.serverTelemetryLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n getSeverityClass(severity: string): string {\n switch (severity) {\n case 'info': return 'severity-info';\n case 'warning': return 'severity-warning';\n case 'optimization': return 'severity-optimization';\n default: return '';\n }\n }\n\n getSeverityIcon(severity: string): string {\n switch (severity) {\n case 'info': return 'fa-info-circle';\n case 'warning': return 'fa-exclamation-triangle';\n case 'optimization': return 'fa-lightbulb';\n default: return 'fa-circle';\n }\n }\n\n async refreshAllEngines(): Promise<void> {\n this.isRefreshingEngines = true;\n this.cdr.markForCheck();\n\n try {\n const count = await BaseEngineRegistry.Instance.RefreshAllEngines();\n console.log(`Refreshed ${count} engines`);\n this.refreshData();\n } catch (error) {\n console.error('Error refreshing engines:', error);\n } finally {\n this.isRefreshingEngines = false;\n this.cdr.markForCheck();\n }\n }\n\n formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n\n formatTime(date: Date): string {\n return date.toLocaleTimeString();\n }\n\n formatRelativeTime(ms: number): string {\n if (ms < 1000) {\n return `${ms.toFixed(0)}ms`;\n } else if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n } else {\n const mins = Math.floor(ms / 60000);\n const secs = ((ms % 60000) / 1000).toFixed(0);\n return `${mins}m ${secs}s`;\n }\n }\n\n /**\n * Renders a Windows PerfMon-style D3 time series chart\n * Shows performance events over time with duration spikes\n */\n renderPerfChart(): void {\n if (!this.perfChartRef?.nativeElement) {\n return;\n }\n\n const container = this.perfChartRef.nativeElement;\n const events = this.telemetryEvents.filter(e => e.elapsedMs !== undefined);\n\n if (events.length === 0) {\n container.innerHTML = '<div style=\"color: var(--mj-text-secondary); text-align: center; padding: 100px 20px;\">No telemetry events with timing data yet.<br>Navigate around the app to generate performance data.</div>';\n return;\n }\n\n // Clear previous chart\n container.innerHTML = '';\n\n // Get dimensions\n const rect = container.getBoundingClientRect();\n const width = rect.width || 800;\n const height = rect.height || 300;\n const margin = { top: 20, right: 30, bottom: 40, left: 50 };\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n\n // Calculate boot time (earliest event)\n this.telemetryBootTime = Math.min(...events.map(e => e.startTime));\n\n // Prepare data with relative time\n const allChartData = events.map(e => ({\n ...e,\n relativeTime: e.startTime - this.telemetryBootTime,\n duration: e.elapsedMs || 0\n })).sort((a, b) => a.relativeTime - b.relativeTime);\n\n // Calculate full time range\n const fullTimeRange = d3.max(allChartData, d => d.relativeTime) || 1000;\n\n // Determine viewport bounds\n let viewportStart = this.chartViewportStart;\n let viewportEnd = this.chartViewportEnd;\n\n // If no viewport set or zoom level is 1, show everything\n if (this.chartZoomLevel <= 1 || (viewportStart === 0 && viewportEnd === 0)) {\n viewportStart = 0;\n viewportEnd = fullTimeRange;\n }\n\n // Filter data to only include events within the viewport (with some padding for edge visibility)\n const padding = (viewportEnd - viewportStart) * 0.05; // 5% padding\n const chartData = allChartData.filter(d =>\n d.relativeTime >= (viewportStart - padding) &&\n d.relativeTime <= (viewportEnd + padding)\n );\n\n // If no data in viewport, show a message\n if (chartData.length === 0) {\n container.innerHTML = '<div style=\"color: var(--mj-text-secondary); text-align: center; padding: 100px 20px;\">No events in the current view.<br>Try zooming out or panning to see events.</div>';\n return;\n }\n\n // Calculate effective width with zoom\n const effectiveWidth = innerWidth * this.chartZoomLevel;\n\n // Create SVG with potential scroll for zoomed view\n const svg = d3.select(container)\n .append('svg')\n .attr('width', Math.max(width, effectiveWidth + margin.left + margin.right))\n .attr('height', height);\n\n const g = svg.append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n\n // Handle gap compression\n let xScale: d3.ScaleLinear<number, number>;\n let gapSegments: Array<{ type: 'events' | 'gap'; startTime: number; endTime: number; gapIndex?: number; displayStart: number; displayEnd: number }> = [];\n\n if (this.chartGapCompression && chartData.length > 1) {\n // Identify gaps and create compressed scale\n const segments = this.identifyGaps(chartData, 5000); // 5 second threshold\n const compressedGapWidth = 30; // Fixed width for compressed gaps\n\n // Calculate total display width needed\n let currentX = 0;\n for (const segment of segments) {\n const segmentDuration = segment.endTime - segment.startTime;\n\n if (segment.type === 'gap') {\n const isExpanded = segment.gapIndex !== undefined && this.expandedGaps.has(segment.gapIndex);\n const gapWidth = isExpanded ? (segmentDuration / (d3.max(chartData, d => d.relativeTime) || 1000)) * effectiveWidth : compressedGapWidth;\n\n gapSegments.push({\n ...segment,\n displayStart: currentX,\n displayEnd: currentX + gapWidth\n });\n currentX += gapWidth;\n } else {\n // Event segments get proportional width\n const proportionalWidth = (segmentDuration / (d3.max(chartData, d => d.relativeTime) || 1000)) * effectiveWidth;\n const segmentWidth = Math.max(proportionalWidth, 50); // Minimum width for visibility\n\n gapSegments.push({\n ...segment,\n displayStart: currentX,\n displayEnd: currentX + segmentWidth\n });\n currentX += segmentWidth;\n }\n }\n\n // Create custom scale function based on segments\n const totalDisplayWidth = currentX;\n const baseScale = d3.scaleLinear()\n .domain([0, d3.max(chartData, d => d.relativeTime) || 1000])\n .range([0, Math.min(totalDisplayWidth, effectiveWidth)]);\n\n // Store gap segments for inverse mapping\n this.chartGapSegments = gapSegments;\n\n // Create a custom mapping function for segment-based positioning\n const mapTimeToX = (time: number): number => {\n // Find which segment this time falls into\n for (const seg of gapSegments) {\n if (time >= seg.startTime && time <= seg.endTime) {\n if (seg.type === 'gap') {\n const isExpanded = seg.gapIndex !== undefined && this.expandedGaps.has(seg.gapIndex);\n if (isExpanded) {\n // Linear interpolation within expanded gap\n const ratio = (time - seg.startTime) / (seg.endTime - seg.startTime);\n return seg.displayStart + ratio * (seg.displayEnd - seg.displayStart);\n }\n // Compressed gap - map to center\n return seg.displayStart + (seg.displayEnd - seg.displayStart) / 2;\n } else {\n // Event segment - linear interpolation\n const ratio = (time - seg.startTime) / Math.max(seg.endTime - seg.startTime, 1);\n return seg.displayStart + ratio * (seg.displayEnd - seg.displayStart);\n }\n }\n }\n return baseScale(time);\n };\n\n // Create inverse mapping function for x -> time (used by selection brush)\n const mapXToTime = (x: number): number => {\n // Find which segment this x position falls into\n for (const seg of gapSegments) {\n if (x >= seg.displayStart && x <= seg.displayEnd) {\n if (seg.type === 'gap') {\n const isExpanded = seg.gapIndex !== undefined && this.expandedGaps.has(seg.gapIndex);\n if (isExpanded) {\n // Linear interpolation within expanded gap\n const displayRange = seg.displayEnd - seg.displayStart;\n if (displayRange <= 0) return seg.startTime;\n const ratio = (x - seg.displayStart) / displayRange;\n return seg.startTime + ratio * (seg.endTime - seg.startTime);\n }\n // Compressed gap - return start time (the gap itself has no meaningful selection)\n return seg.startTime;\n } else {\n // Event segment - linear interpolation\n const displayRange = seg.displayEnd - seg.displayStart;\n if (displayRange <= 0) return seg.startTime;\n const ratio = (x - seg.displayStart) / displayRange;\n return seg.startTime + ratio * (seg.endTime - seg.startTime);\n }\n }\n }\n return baseScale.invert(x);\n };\n\n // Use base scale but override the call behavior via a proxy-like wrapper\n xScale = Object.assign(\n (time: number) => mapTimeToX(time),\n {\n domain: baseScale.domain.bind(baseScale),\n range: () => [0, Math.min(totalDisplayWidth, effectiveWidth)] as [number, number],\n ticks: baseScale.ticks.bind(baseScale),\n tickFormat: baseScale.tickFormat.bind(baseScale),\n nice: baseScale.nice.bind(baseScale),\n copy: baseScale.copy.bind(baseScale),\n invert: mapXToTime, // Use our custom inverse function!\n clamp: baseScale.clamp.bind(baseScale),\n unknown: baseScale.unknown.bind(baseScale),\n interpolate: baseScale.interpolate.bind(baseScale),\n rangeRound: baseScale.rangeRound.bind(baseScale)\n }\n ) as unknown as d3.ScaleLinear<number, number>;\n\n // Draw gap indicators\n for (const seg of gapSegments) {\n if (seg.type === 'gap' && seg.gapIndex !== undefined) {\n const isExpanded = this.expandedGaps.has(seg.gapIndex);\n if (!isExpanded) {\n this.drawGapIndicator(\n g,\n seg.displayStart,\n seg.displayEnd - seg.displayStart,\n innerHeight,\n seg.endTime - seg.startTime,\n seg.gapIndex\n );\n }\n }\n }\n } else {\n // Standard linear scale - clear gap segments\n this.chartGapSegments = [];\n // Use viewport bounds for domain when zoomed\n xScale = d3.scaleLinear()\n .domain([viewportStart, viewportEnd])\n .range([0, innerWidth]); // Use innerWidth, not effectiveWidth for proper fit\n }\n\n // Calculate Y-scale from VISIBLE data only (not all data)\n const visibleMaxDuration = d3.max(chartData, d => d.duration) || 100;\n const yScale = d3.scaleLinear()\n .domain([0, visibleMaxDuration * 1.1]) // Add 10% padding at top\n .range([innerHeight, 0])\n .nice();\n\n // Draw grid lines\n this.drawGridLines(g, xScale, yScale, effectiveWidth, innerHeight);\n\n // Draw axes\n this.drawAxes(g, xScale, yScale, innerHeight);\n\n // Color mapping for categories\n const categoryColors: Record<string, string> = {\n 'RunView': '#00bcd4',\n 'RunQuery': '#e040fb',\n 'Engine': '#00ff88',\n 'AI': '#ff9800',\n 'Cache': '#f06292',\n 'Network': '#26a69a',\n 'Custom': '#78909c'\n };\n\n // Draw area fill for each category (like PerfMon background)\n const categories = [...new Set(chartData.map(d => d.category))];\n categories.forEach(category => {\n const categoryData = chartData.filter(d => d.category === category);\n if (categoryData.length > 1) {\n this.drawCategoryArea(g, categoryData, xScale, yScale, innerHeight, categoryColors[category] || '#78909c');\n }\n });\n\n // Draw event points\n this.drawEventPoints(g, chartData, xScale, yScale, categoryColors, container);\n\n // Draw threshold line for slow queries\n this.drawThresholdLine(g, yScale, effectiveWidth, this.slowQueryThresholdMs);\n\n // Add selection brush for drag-to-zoom and pan\n this.addSelectionBrush(svg, g, xScale, innerHeight, margin, allChartData, fullTimeRange);\n\n // Store scale and dimensions for selection calculations\n this.chartXScale = xScale;\n this.chartMarginLeft = margin.left;\n\n this.chartInitialized = true;\n }\n\n private drawGridLines(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n xScale: d3.ScaleLinear<number, number>,\n yScale: d3.ScaleLinear<number, number>,\n width: number,\n height: number\n ): void {\n // Horizontal grid lines\n const yTicks = yScale.ticks(5);\n g.selectAll('.grid-line-h')\n .data(yTicks)\n .enter()\n .append('line')\n .attr('class', 'grid-line')\n .attr('x1', 0)\n .attr('x2', width)\n .attr('y1', d => yScale(d))\n .attr('y2', d => yScale(d))\n .attr('stroke', '#333')\n .attr('stroke-dasharray', '2,2');\n\n // Vertical grid lines\n const xTicks = xScale.ticks(10);\n g.selectAll('.grid-line-v')\n .data(xTicks)\n .enter()\n .append('line')\n .attr('class', 'grid-line')\n .attr('x1', d => xScale(d))\n .attr('x2', d => xScale(d))\n .attr('y1', 0)\n .attr('y2', height)\n .attr('stroke', '#333')\n .attr('stroke-dasharray', '2,2');\n }\n\n private drawAxes(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n xScale: d3.ScaleLinear<number, number>,\n yScale: d3.ScaleLinear<number, number>,\n height: number\n ): void {\n // X axis with better time formatting\n const xDomain = xScale.domain();\n const timeRange = xDomain[1] - xDomain[0];\n\n // Choose appropriate number of ticks based on range\n const numTicks = Math.min(10, Math.max(5, Math.floor(timeRange / 1000)));\n\n const xAxis = d3.axisBottom(xScale)\n .ticks(numTicks)\n .tickFormat(d => this.formatAxisTime(d as number));\n\n const xAxisGroup = g.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(xAxis)\n .attr('class', 'axis-line');\n\n xAxisGroup.selectAll('text')\n .attr('class', 'axis-text')\n .attr('fill', '#888')\n .attr('font-size', '11px');\n\n // X axis label\n xAxisGroup.append('text')\n .attr('class', 'axis-label')\n .attr('x', xScale.range()[1] / 2)\n .attr('y', 35)\n .attr('fill', '#666')\n .attr('font-size', '11px')\n .attr('text-anchor', 'middle')\n .text('Time since process start');\n\n // Y axis with proper duration formatting\n const yMax = yScale.domain()[1];\n const yAxis = d3.axisLeft(yScale)\n .ticks(6)\n .tickFormat(d => this.formatAxisDuration(d as number, yMax));\n\n const yAxisGroup = g.append('g')\n .call(yAxis)\n .attr('class', 'axis-line');\n\n yAxisGroup.selectAll('text')\n .attr('class', 'axis-text')\n .attr('fill', '#888')\n .attr('font-size', '11px');\n\n // Y axis label\n yAxisGroup.append('text')\n .attr('class', 'axis-label')\n .attr('transform', 'rotate(-90)')\n .attr('x', -height / 2)\n .attr('y', -40)\n .attr('fill', '#666')\n .attr('font-size', '11px')\n .attr('text-anchor', 'middle')\n .text('Duration');\n }\n\n /**\n * Format time for axis labels - shows relative time since process start\n */\n private formatAxisTime(ms: number): string {\n if (ms < 1000) {\n return `${Math.round(ms)}ms`;\n } else if (ms < 60000) {\n const secs = ms / 1000;\n return secs % 1 === 0 ? `${secs}s` : `${secs.toFixed(1)}s`;\n } else if (ms < 3600000) {\n const mins = Math.floor(ms / 60000);\n const secs = Math.floor((ms % 60000) / 1000);\n return secs > 0 ? `${mins}m${secs}s` : `${mins}m`;\n } else {\n const hours = Math.floor(ms / 3600000);\n const mins = Math.floor((ms % 3600000) / 60000);\n return mins > 0 ? `${hours}h${mins}m` : `${hours}h`;\n }\n }\n\n /**\n * Format duration for Y axis labels\n */\n private formatAxisDuration(ms: number, maxValue: number): string {\n // If max is >= 1000ms, show in seconds for values >= 1000\n if (maxValue >= 1000 && ms >= 1000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n return `${Math.round(ms)}ms`;\n }\n\n private drawCategoryArea(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n data: Array<{ relativeTime: number; duration: number }>,\n xScale: d3.ScaleLinear<number, number>,\n yScale: d3.ScaleLinear<number, number>,\n height: number,\n color: string\n ): void {\n const area = d3.area<{ relativeTime: number; duration: number }>()\n .x(d => xScale(d.relativeTime))\n .y0(height)\n .y1(d => yScale(d.duration))\n .curve(d3.curveMonotoneX);\n\n g.append('path')\n .datum(data)\n .attr('class', 'area-fill')\n .attr('d', area)\n .attr('fill', color)\n .attr('opacity', 0.1);\n\n // Line on top\n const line = d3.line<{ relativeTime: number; duration: number }>()\n .x(d => xScale(d.relativeTime))\n .y(d => yScale(d.duration))\n .curve(d3.curveMonotoneX);\n\n g.append('path')\n .datum(data)\n .attr('class', 'line-path')\n .attr('d', line)\n .attr('stroke', color)\n .attr('fill', 'none')\n .attr('stroke-width', 1.5)\n .attr('opacity', 0.6);\n }\n\n private drawEventPoints(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n data: Array<TelemetryEventDisplay & { relativeTime: number; duration: number }>,\n xScale: d3.ScaleLinear<number, number>,\n yScale: d3.ScaleLinear<number, number>,\n categoryColors: Record<string, string>,\n container: HTMLDivElement\n ): void {\n // Create tooltip\n const tooltip = g.append('g')\n .attr('class', 'tooltip')\n .style('display', 'none');\n\n tooltip.append('rect')\n .attr('class', 'tooltip-bg')\n .attr('fill', 'rgba(0, 0, 0, 0.9)')\n .attr('rx', 4);\n\n const tooltipText = tooltip.append('text')\n .attr('class', 'tooltip-text')\n .attr('fill', '#fff')\n .attr('font-size', '11px')\n .attr('font-family', 'monospace');\n\n // Split data into cached and non-cached events\n const nonCachedData = data.filter(d => !this.isCacheHit(d));\n const cachedData = data.filter(d => this.isCacheHit(d));\n\n // Helper to show tooltip\n const showTooltip = (event: MouseEvent, d: TelemetryEventDisplay & { relativeTime: number; duration: number }) => {\n // Update tooltip content\n const isCached = this.isCacheHit(d);\n const lines = [\n `${d.category}: ${d.operation}`,\n d.entityName ? `Entity: ${d.entityName}` : null,\n `Duration: ${d.duration.toFixed(0)}ms`,\n isCached ? '⚡ CACHED' : null,\n `Time: +${this.formatRelativeTime(d.relativeTime)}`\n ].filter(Boolean);\n\n tooltipText.selectAll('tspan').remove();\n lines.forEach((line, i) => {\n tooltipText.append('tspan')\n .attr('x', 8)\n .attr('dy', i === 0 ? '1.2em' : '1.4em')\n .text(line as string);\n });\n\n // Size tooltip background\n const textBBox = (tooltipText.node() as SVGTextElement).getBBox();\n tooltip.select('.tooltip-bg')\n .attr('width', textBBox.width + 16)\n .attr('height', textBBox.height + 12)\n .attr('y', textBBox.y - 6);\n\n // Position tooltip\n const x = xScale(d.relativeTime);\n const y = yScale(d.duration);\n const tooltipWidth = textBBox.width + 16;\n\n // Flip tooltip if too close to right edge\n const translateX = x + tooltipWidth + 20 > (container.clientWidth - 80) ? x - tooltipWidth - 10 : x + 10;\n tooltip.attr('transform', `translate(${translateX},${y - 20})`);\n tooltip.style('display', 'block');\n };\n\n const hideTooltip = () => {\n tooltip.style('display', 'none');\n };\n\n // Draw circles for non-cached events\n g.selectAll('.event-point-circle')\n .data(nonCachedData)\n .enter()\n .append('circle')\n .attr('class', 'event-point event-point-circle')\n .attr('cx', d => xScale(d.relativeTime))\n .attr('cy', d => yScale(d.duration))\n .attr('r', d => d.duration >= this.slowQueryThresholdMs ? 5 : 3)\n .attr('fill', d => categoryColors[d.category] || '#78909c')\n .attr('stroke', d => d.duration >= this.slowQueryThresholdMs ? '#ff5252' : 'none')\n .attr('stroke-width', 2)\n .style('cursor', 'pointer')\n .on('mouseenter', (event: MouseEvent, d) => {\n const target = event.target as SVGCircleElement;\n d3.select(target).attr('r', 7);\n showTooltip(event, d);\n })\n .on('mouseleave', (event: MouseEvent, d) => {\n const target = event.target as SVGCircleElement;\n d3.select(target).attr('r', d.duration >= this.slowQueryThresholdMs ? 5 : 3);\n hideTooltip();\n })\n .on('click', (_event: MouseEvent, d) => {\n // Open detail panel for this event\n this.ngZone.run(() => {\n this.openEventDetailPanel(d);\n });\n });\n\n // Draw bolt symbols for cached events\n // SVG path for a lightning bolt shape\n const boltPath = 'M-3,-6 L1,-6 L0,-1 L4,-1 L-2,6 L0,1 L-4,1 Z';\n\n g.selectAll('.event-point-bolt')\n .data(cachedData)\n .enter()\n .append('path')\n .attr('class', 'event-point event-point-bolt')\n .attr('d', boltPath)\n .attr('transform', d => `translate(${xScale(d.relativeTime)},${yScale(d.duration)}) scale(${d.duration >= this.slowQueryThresholdMs ? 1.3 : 1})`)\n .attr('fill', '#f59e0b')\n .attr('stroke', d => d.duration >= this.slowQueryThresholdMs ? '#ff5252' : categoryColors[d.category] || '#78909c')\n .attr('stroke-width', 1.5)\n .style('cursor', 'pointer')\n .style('filter', 'drop-shadow(0 0 2px rgba(245, 158, 11, 0.5))')\n .on('mouseenter', (event: MouseEvent, d) => {\n const target = event.target as SVGPathElement;\n d3.select(target)\n .attr('transform', `translate(${xScale(d.relativeTime)},${yScale(d.duration)}) scale(1.5)`)\n .style('filter', 'drop-shadow(0 0 4px rgba(245, 158, 11, 0.8))');\n showTooltip(event, d);\n })\n .on('mouseleave', (event: MouseEvent, d) => {\n const target = event.target as SVGPathElement;\n d3.select(target)\n .attr('transform', `translate(${xScale(d.relativeTime)},${yScale(d.duration)}) scale(${d.duration >= this.slowQueryThresholdMs ? 1.3 : 1})`)\n .style('filter', 'drop-shadow(0 0 2px rgba(245, 158, 11, 0.5))');\n hideTooltip();\n })\n .on('click', (_event: MouseEvent, d) => {\n // Open detail panel for this event\n this.ngZone.run(() => {\n this.openEventDetailPanel(d);\n });\n });\n }\n\n private drawThresholdLine(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n yScale: d3.ScaleLinear<number, number>,\n width: number,\n threshold: number\n ): void {\n const yPos = yScale(threshold);\n\n // Only draw if threshold is within visible range\n if (yPos > 0 && yPos < yScale.range()[0]) {\n g.append('line')\n .attr('x1', 0)\n .attr('x2', width)\n .attr('y1', yPos)\n .attr('y2', yPos)\n .attr('stroke', '#ff5252')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '5,3')\n .attr('opacity', 0.7);\n\n g.append('text')\n .attr('x', width - 5)\n .attr('y', yPos - 5)\n .attr('text-anchor', 'end')\n .attr('fill', '#ff5252')\n .attr('font-size', '10px')\n .text(`Slow (>${threshold}ms)`);\n }\n }\n\n // === Chart Zoom and Gap Compression Methods ===\n\n /**\n * Zoom the chart in or out\n */\n zoomPerfChart(direction: 'in' | 'out'): void {\n const zoomFactor = 1.5;\n if (direction === 'in') {\n this.chartZoomLevel = Math.min(this.chartZoomLevel * zoomFactor, 100); // Allow up to 100x zoom\n } else {\n this.chartZoomLevel = Math.max(this.chartZoomLevel / zoomFactor, 0.25); // Allow zoom out to 25%\n }\n this.renderPerfChart();\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Reset chart zoom to default\n */\n resetPerfChartZoom(): void {\n this.chartZoomLevel = 1;\n this.chartViewportStart = 0;\n this.chartViewportEnd = 0;\n this.chartTimeRangeStart = null;\n this.chartTimeRangeEnd = null;\n this.expandedGaps.clear();\n this.renderPerfChart();\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Handle gap compression toggle\n */\n onGapCompressionChange(): void {\n this.expandedGaps.clear();\n this.renderPerfChart();\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Set chart interaction mode (select for drag-to-zoom, pan for click-to-view)\n */\n setChartInteractionMode(mode: 'pointer' | 'select' | 'pan'): void {\n this.chartInteractionMode = mode;\n this.renderPerfChart(); // Re-render to update cursor and behavior\n this.cdr.markForCheck();\n }\n\n /**\n * Returns the appropriate cursor style based on the current chart interaction mode\n */\n private getChartCursor(): string {\n switch (this.chartInteractionMode) {\n case 'pointer':\n return 'default';\n case 'select':\n return 'crosshair';\n case 'pan':\n return 'grab';\n default:\n return 'default';\n }\n }\n\n /**\n * Returns whether the overlay should intercept pointer events based on the current mode\n */\n private getOverlayPointerEvents(): string {\n // In pointer mode, let events pass through to the data points\n // In select/pan mode, the overlay needs to capture events\n return this.chartInteractionMode === 'pointer' ? 'none' : 'all';\n }\n\n /**\n * Identifies gaps in the data where there's no activity\n * Returns segments with their type (events or gap)\n */\n private identifyGaps(\n events: Array<{ relativeTime: number; duration: number }>,\n gapThresholdMs: number = 5000\n ): Array<{ type: 'events' | 'gap'; startTime: number; endTime: number; gapIndex?: number; events?: typeof events }> {\n if (events.length === 0) return [];\n\n const segments: Array<{ type: 'events' | 'gap'; startTime: number; endTime: number; gapIndex?: number; events?: typeof events }> = [];\n let gapIndex = 0;\n\n // Sort events by time\n const sortedEvents = [...events].sort((a, b) => a.relativeTime - b.relativeTime);\n\n let currentSegmentStart = sortedEvents[0].relativeTime;\n let currentSegmentEvents: typeof events = [];\n let lastEventTime = sortedEvents[0].relativeTime;\n\n for (let i = 0; i < sortedEvents.length; i++) {\n const event = sortedEvents[i];\n const timeSinceLastEvent = event.relativeTime - lastEventTime;\n\n if (timeSinceLastEvent > gapThresholdMs && currentSegmentEvents.length > 0) {\n // Close current event segment\n segments.push({\n type: 'events',\n startTime: currentSegmentStart,\n endTime: lastEventTime,\n events: currentSegmentEvents\n });\n\n // Add gap segment\n segments.push({\n type: 'gap',\n startTime: lastEventTime,\n endTime: event.relativeTime,\n gapIndex: gapIndex++\n });\n\n // Start new segment\n currentSegmentStart = event.relativeTime;\n currentSegmentEvents = [event];\n } else {\n currentSegmentEvents.push(event);\n }\n\n lastEventTime = event.relativeTime;\n }\n\n // Close final segment\n if (currentSegmentEvents.length > 0) {\n segments.push({\n type: 'events',\n startTime: currentSegmentStart,\n endTime: lastEventTime,\n events: currentSegmentEvents\n });\n }\n\n return segments;\n }\n\n /**\n * Draws a compressed gap indicator\n */\n private drawGapIndicator(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n x: number,\n width: number,\n height: number,\n gapDurationMs: number,\n gapIndex: number\n ): void {\n const isExpanded = this.expandedGaps.has(gapIndex);\n\n // Draw striped background\n const pattern = g.append('defs')\n .append('pattern')\n .attr('id', `gap-pattern-${gapIndex}`)\n .attr('patternUnits', 'userSpaceOnUse')\n .attr('width', 8)\n .attr('height', 8)\n .attr('patternTransform', 'rotate(45)');\n\n pattern.append('rect')\n .attr('width', 8)\n .attr('height', 8)\n .attr('fill', '#f5f5f5');\n\n pattern.append('line')\n .attr('x1', 0)\n .attr('y1', 0)\n .attr('x2', 0)\n .attr('y2', 8)\n .attr('stroke', '#e0e0e0')\n .attr('stroke-width', 4);\n\n // Gap rectangle\n const gapRect = g.append('rect')\n .attr('x', x)\n .attr('y', 0)\n .attr('width', width)\n .attr('height', height)\n .attr('fill', `url(#gap-pattern-${gapIndex})`)\n .attr('stroke', '#ccc')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '4,2')\n .style('cursor', 'pointer');\n\n // Vertical text showing gap duration\n const gapText = this.formatRelativeTime(gapDurationMs);\n const textG = g.append('g')\n .attr('transform', `translate(${x + width / 2}, ${height / 2})`)\n .style('pointer-events', 'none');\n\n textG.append('text')\n .attr('transform', 'rotate(-90)')\n .attr('text-anchor', 'middle')\n .attr('fill', '#888')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text(`${gapText} gap`);\n\n // Click handler to expand/collapse\n gapRect.on('click', () => {\n this.ngZone.run(() => {\n if (this.expandedGaps.has(gapIndex)) {\n this.expandedGaps.delete(gapIndex);\n } else {\n this.expandedGaps.add(gapIndex);\n }\n this.renderPerfChart();\n });\n });\n }\n\n /**\n * Adds a drag-to-select brush overlay for zooming into a time range\n * Only active when chartInteractionMode is 'select'\n */\n private addSelectionBrush(\n svg: d3.Selection<SVGSVGElement, unknown, null, undefined>,\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n xScale: d3.ScaleLinear<number, number>,\n innerHeight: number,\n _margin: { top: number; right: number; bottom: number; left: number },\n allChartData: Array<{ relativeTime: number; duration: number }>,\n fullTimeRange: number\n ): void {\n // Create a transparent overlay for mouse events\n // Cursor and pointer-events depend on interaction mode\n const overlay = g.append('rect')\n .attr('class', 'selection-overlay')\n .attr('width', xScale.range()[1])\n .attr('height', innerHeight)\n .attr('fill', 'transparent')\n .style('cursor', this.getChartCursor())\n .style('pointer-events', this.getOverlayPointerEvents());\n\n // Selection rectangle (initially hidden) - only used in select mode\n const selectionRect = g.append('rect')\n .attr('class', 'selection-rect')\n .attr('fill', 'rgba(0, 255, 136, 0.15)')\n .attr('stroke', '#00ff88')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '4,2')\n .style('display', 'none');\n\n let startX = 0;\n let isDragging = false;\n let isPanning = false;\n let panStartX = 0;\n let panStartViewportStart = 0;\n\n // Store the inverse scale function for mapping x back to time\n const getTimeFromX = (x: number): number => {\n // For gap-compressed scales, we need to use invert if available\n if (typeof xScale.invert === 'function') {\n return xScale.invert(x);\n }\n // Fallback: linear interpolation\n const domain = xScale.domain();\n const range = xScale.range();\n const ratio = (x - range[0]) / (range[1] - range[0]);\n return domain[0] + ratio * (domain[1] - domain[0]);\n };\n\n overlay.on('mousedown', (event: MouseEvent) => {\n if (this.chartInteractionMode === 'select') {\n // Selection mode - drag to zoom\n isDragging = true;\n this.isSelecting = true;\n const [x] = d3.pointer(event, overlay.node());\n startX = Math.max(0, Math.min(x, xScale.range()[1]));\n this.selectionStartX = startX;\n\n selectionRect\n .attr('x', startX)\n .attr('y', 0)\n .attr('width', 0)\n .attr('height', innerHeight)\n .style('display', 'block');\n } else if (this.chartInteractionMode === 'pan') {\n // Pan mode - drag to pan\n isPanning = true;\n const [x] = d3.pointer(event, overlay.node());\n panStartX = x;\n panStartViewportStart = this.chartViewportStart;\n overlay.style('cursor', 'grabbing');\n }\n });\n\n svg.on('mousemove', (event: MouseEvent) => {\n if (isDragging && this.chartInteractionMode === 'select') {\n const [x] = d3.pointer(event, g.node());\n const currentX = Math.max(0, Math.min(x, xScale.range()[1]));\n\n const rectX = Math.min(startX, currentX);\n const rectWidth = Math.abs(currentX - startX);\n\n selectionRect\n .attr('x', rectX)\n .attr('width', rectWidth);\n } else if (isPanning && this.chartInteractionMode === 'pan') {\n const [x] = d3.pointer(event, g.node());\n const deltaX = x - panStartX;\n\n // Convert pixel delta to time delta\n const pixelsPerMs = xScale.range()[1] / ((xScale.domain()[1] - xScale.domain()[0]) || 1);\n const timeDelta = -deltaX / pixelsPerMs; // Negative because dragging right should move viewport left\n\n // Calculate new viewport position using the full time range\n const viewportSize = (this.chartViewportEnd - this.chartViewportStart) || fullTimeRange / this.chartZoomLevel;\n\n let newStart = panStartViewportStart + timeDelta;\n // Clamp to valid range\n newStart = Math.max(0, Math.min(newStart, fullTimeRange - viewportSize));\n\n this.chartViewportStart = newStart;\n this.chartViewportEnd = newStart + viewportSize;\n\n // Re-render chart with new viewport\n this.ngZone.run(() => {\n this.renderPerfChart();\n });\n }\n });\n\n svg.on('mouseup', (event: MouseEvent) => {\n if (isDragging && this.chartInteractionMode === 'select') {\n isDragging = false;\n this.isSelecting = false;\n\n const [x] = d3.pointer(event, g.node());\n const endX = Math.max(0, Math.min(x, xScale.range()[1]));\n\n selectionRect.style('display', 'none');\n\n // Only zoom if selection is significant (> 20 pixels)\n const selectionWidth = Math.abs(endX - startX);\n if (selectionWidth > 20) {\n const startTime = getTimeFromX(Math.min(startX, endX));\n const endTime = getTimeFromX(Math.max(startX, endX));\n\n this.ngZone.run(() => {\n this.zoomToTimeRange(startTime, endTime, allChartData);\n });\n }\n } else if (isPanning) {\n isPanning = false;\n overlay.style('cursor', 'grab');\n }\n });\n\n // Cancel selection/pan on mouse leave\n svg.on('mouseleave', () => {\n if (isDragging) {\n isDragging = false;\n this.isSelecting = false;\n selectionRect.style('display', 'none');\n }\n if (isPanning) {\n isPanning = false;\n overlay.style('cursor', 'grab');\n }\n });\n }\n\n /**\n * Zooms the chart to show only events within the specified time range\n */\n private zoomToTimeRange(\n startTime: number,\n endTime: number,\n allData: Array<{ relativeTime: number; duration: number }>\n ): void {\n // Store the time range for filtering\n this.chartTimeRangeStart = startTime;\n this.chartTimeRangeEnd = endTime;\n\n // Calculate zoom level based on selection\n const fullRange = (d3.max(allData, d => d.relativeTime) || 1000) - (d3.min(allData, d => d.relativeTime) || 0);\n const selectedRange = endTime - startTime;\n const newZoomLevel = fullRange / Math.max(selectedRange, 10); // Allow very fine selections (down to 10ms)\n\n this.chartZoomLevel = Math.min(Math.max(newZoomLevel, 1), 100); // Allow up to 100x zoom\n this.chartViewportStart = startTime;\n this.chartViewportEnd = endTime;\n\n this.renderPerfChart();\n this.cdr.markForCheck();\n }\n\n // === Local Cache Methods ===\n\n /**\n * Refreshes cache data from LocalCacheManager\n */\n refreshCacheData(): void {\n const lcm = LocalCacheManager.Instance;\n this.cacheInitialized = lcm.IsInitialized;\n\n if (this.cacheInitialized) {\n this.cacheStats = lcm.GetStats();\n this.cacheEntries = lcm.GetAllEntries();\n this.cacheHitRate = lcm.GetHitRate();\n } else {\n this.cacheStats = null;\n this.cacheEntries = [];\n this.cacheHitRate = 0;\n }\n\n this.cdr.markForCheck();\n }\n\n /**\n * Getter for filtered cache entries based on type filter\n */\n get filteredCacheEntries(): CacheEntryInfo[] {\n if (this.cacheTypeFilter === 'all') {\n return this.cacheEntries;\n }\n return this.cacheEntries.filter(e => e.type === this.cacheTypeFilter);\n }\n\n /**\n * Sets the cache type filter\n */\n setCacheTypeFilter(type: CacheEntryType | 'all'): void {\n this.cacheTypeFilter = type;\n this.cdr.markForCheck();\n }\n\n /**\n * Clears all cache entries\n */\n async clearAllCache(): Promise<void> {\n const lcm = LocalCacheManager.Instance;\n if (lcm.IsInitialized) {\n await lcm.ClearAll();\n this.refreshCacheData();\n }\n }\n\n /**\n * Invalidates a single cache entry\n */\n async invalidateCacheEntry(entry: CacheEntryInfo): Promise<void> {\n const lcm = LocalCacheManager.Instance;\n if (!lcm.IsInitialized) return;\n\n // Remove based on type\n if (entry.type === 'runview' && entry.fingerprint) {\n await lcm.InvalidateRunViewResult(entry.fingerprint);\n } else if (entry.type === 'dataset') {\n // For datasets, we need to call ClearDataset with proper params\n // Since we don't have the full params, use the key directly\n // This is a simplified approach - in production you'd want more robust handling\n await lcm.InvalidateRunViewResult(entry.key);\n } else if (entry.type === 'runquery' && entry.fingerprint) {\n await lcm.InvalidateRunViewResult(entry.fingerprint);\n }\n\n this.refreshCacheData();\n }\n\n /**\n * Formats a cache timestamp (unix ms) to display string\n */\n formatCacheTimestamp(timestamp: number): string {\n const date = new Date(timestamp);\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n });\n }\n\n // === Engine Detail Panel Methods ===\n\n /**\n * Refresh a single engine\n */\n async refreshSingleEngine(engine: EngineDiagnosticInfo, event: Event): Promise<void> {\n event.stopPropagation();\n this.isRefreshingSingleEngine = engine.className;\n this.cdr.markForCheck();\n\n try {\n const engineInstance = BaseEngineRegistry.Instance.GetEngine<{ RefreshAllItems: () => Promise<void> }>(engine.className);\n if (engineInstance && typeof engineInstance.RefreshAllItems === 'function') {\n await engineInstance.RefreshAllItems();\n console.log(`Refreshed engine: ${engine.className}`);\n }\n this.refreshData();\n } catch (error) {\n console.error(`Error refreshing engine ${engine.className}:`, error);\n } finally {\n this.isRefreshingSingleEngine = null;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Opens the engine detail panel for a specific engine\n */\n openEngineDetailPanel(engine: EngineDiagnosticInfo): void {\n const configItems = this.getEngineConfigItems(engine.className);\n\n this.engineDetailPanel = {\n isOpen: true,\n engine,\n configItems,\n isRefreshing: false\n };\n this.cdr.markForCheck();\n }\n\n /**\n * Closes the engine detail panel\n */\n closeEngineDetailPanel(): void {\n this.engineDetailPanel = {\n isOpen: false,\n engine: null,\n configItems: [],\n isRefreshing: false\n };\n this.cdr.markForCheck();\n }\n\n /**\n * Refreshes the engine shown in the detail panel\n */\n async refreshEngineInDetailPanel(): Promise<void> {\n if (!this.engineDetailPanel.engine) return;\n\n this.engineDetailPanel.isRefreshing = true;\n this.cdr.markForCheck();\n\n try {\n const engineInstance = BaseEngineRegistry.Instance.GetEngine<{ RefreshAllItems: () => Promise<void> }>(\n this.engineDetailPanel.engine.className\n );\n if (engineInstance && typeof engineInstance.RefreshAllItems === 'function') {\n await engineInstance.RefreshAllItems();\n }\n\n // Refresh the data and reopen panel with updated info\n await this.refreshData();\n\n // Update the panel with refreshed data\n const updatedEngine = this.engines.find(e => e.className === this.engineDetailPanel.engine?.className);\n if (updatedEngine) {\n this.engineDetailPanel.engine = updatedEngine;\n this.engineDetailPanel.configItems = this.getEngineConfigItems(updatedEngine.className);\n }\n } catch (error) {\n console.error('Error refreshing engine in detail panel:', error);\n } finally {\n this.engineDetailPanel.isRefreshing = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Gets config items for an engine by examining its Configs property\n */\n private getEngineConfigItems(className: string): EngineConfigItemDisplay[] {\n const engineInstance = BaseEngineRegistry.Instance.GetEngine<{\n Configs?: Array<{\n Type: 'entity' | 'dataset';\n PropertyName: string;\n EntityName?: string;\n DatasetName?: string;\n Filter?: string;\n OrderBy?: string;\n }>;\n }>(className);\n\n if (!engineInstance || !engineInstance.Configs) {\n return [];\n }\n\n const engineObj = engineInstance as Record<string, unknown>;\n const items: EngineConfigItemDisplay[] = [];\n\n for (const config of engineInstance.Configs) {\n const propValue = engineObj[config.PropertyName];\n const dataArray = Array.isArray(propValue) ? propValue : [];\n const estimatedBytes = this.estimateArrayMemory(dataArray);\n const initialPageSize = 10;\n const initialData = dataArray.slice(0, initialPageSize);\n\n items.push({\n propertyName: config.PropertyName,\n type: config.Type || 'entity',\n entityName: config.EntityName,\n datasetName: config.DatasetName,\n filter: config.Filter,\n orderBy: config.OrderBy,\n itemCount: dataArray.length,\n estimatedMemoryBytes: estimatedBytes,\n memoryDisplay: this.formatBytes(estimatedBytes),\n sampleData: dataArray, // Store all data for paging\n expanded: false,\n // Paging support\n displayedData: initialData,\n allDataLoaded: dataArray.length <= initialPageSize,\n isLoadingMore: false,\n currentPage: 1,\n pageSize: initialPageSize\n });\n }\n\n return items.sort((a, b) => b.itemCount - a.itemCount);\n }\n\n /**\n * Estimates memory for an array of objects\n */\n private estimateArrayMemory(arr: unknown[]): number {\n if (arr.length === 0) return 0;\n\n // Sample first item to estimate size\n const sample = arr[0];\n let bytesPerItem = 100; // default\n\n if (sample && typeof sample === 'object') {\n try {\n // For MJ entity objects, use GetAll() to get just the data values\n // This avoids serializing the massive metadata/prototype chain\n const sampleObj = sample as { GetAll?: () => Record<string, unknown> };\n const dataToSerialize = sampleObj.GetAll ? sampleObj.GetAll() : sample;\n const json = JSON.stringify(dataToSerialize);\n bytesPerItem = json.length * 2; // UTF-16\n } catch {\n bytesPerItem = 500;\n }\n }\n\n return arr.length * bytesPerItem;\n }\n\n /**\n * Toggle expansion of a config item\n */\n toggleConfigItemExpanded(item: EngineConfigItemDisplay): void {\n item.expanded = !item.expanded;\n this.cdr.markForCheck();\n }\n\n /**\n * Get column names for sample data display\n */\n getSampleDataColumns(item: EngineConfigItemDisplay): string[] {\n if (item.sampleData.length === 0) return [];\n\n const sample = item.sampleData[0];\n if (!sample || typeof sample !== 'object') return [];\n\n // For BaseEntity objects, try to get key properties\n const obj = sample as Record<string, unknown>;\n\n // Check if it's a BaseEntity with GetAll method\n if ('GetAll' in obj && typeof obj.GetAll === 'function') {\n const allData = (obj as { GetAll: () => Record<string, unknown> }).GetAll();\n // Return priority columns first\n const priorityKeys = ['ID', 'Name', 'Description', 'Code', 'Status', 'Type'];\n const availableKeys = Object.keys(allData);\n const result: string[] = [];\n\n for (const key of priorityKeys) {\n if (availableKeys.includes(key)) {\n result.push(key);\n }\n }\n\n // Add remaining keys up to 6 total\n for (const key of availableKeys) {\n if (!result.includes(key) && result.length < 6 && !key.startsWith('_')) {\n result.push(key);\n }\n }\n\n return result;\n }\n\n // For plain objects\n const keys = Object.keys(obj).filter(k => !k.startsWith('_'));\n return keys.slice(0, 6);\n }\n\n /**\n * Get a value from sample data for display\n */\n getSampleDataValue(row: unknown, column: string): string {\n if (!row || typeof row !== 'object') return '';\n\n const obj = row as Record<string, unknown>;\n\n // For BaseEntity objects, use GetAll\n if ('GetAll' in obj && typeof obj.GetAll === 'function') {\n const allData = (obj as { GetAll: () => Record<string, unknown> }).GetAll();\n const value = allData[column];\n return this.formatValueForDisplay(value);\n }\n\n // For plain objects\n const value = obj[column];\n return this.formatValueForDisplay(value);\n }\n\n /**\n * Format a value for display in sample data table\n */\n private formatValueForDisplay(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return value.toString();\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n if (value instanceof Date) return value.toLocaleDateString();\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n }\n\n /**\n * Load more data for a config item (paging)\n */\n loadMoreData(item: EngineConfigItemDisplay): void {\n if (item.isLoadingMore || item.allDataLoaded) return;\n\n item.isLoadingMore = true;\n this.cdr.markForCheck();\n\n // Simulate async loading (data is already in memory)\n setTimeout(() => {\n const nextPage = item.currentPage + 1;\n const startIndex = item.currentPage * item.pageSize;\n const endIndex = startIndex + item.pageSize;\n const newData = item.sampleData.slice(startIndex, endIndex);\n\n item.displayedData = [...item.displayedData, ...newData];\n item.currentPage = nextPage;\n item.allDataLoaded = item.displayedData.length >= item.sampleData.length;\n item.isLoadingMore = false;\n this.cdr.markForCheck();\n }, 100);\n }\n\n /**\n * Load all remaining data for a config item\n */\n loadAllData(item: EngineConfigItemDisplay): void {\n if (item.isLoadingMore || item.allDataLoaded) return;\n\n item.isLoadingMore = true;\n this.cdr.markForCheck();\n\n // Simulate async loading (data is already in memory)\n setTimeout(() => {\n item.displayedData = [...item.sampleData];\n item.allDataLoaded = true;\n item.isLoadingMore = false;\n this.cdr.markForCheck();\n }, 100);\n }\n\n /**\n * Get the record ID from a row (for opening entity records)\n */\n getRecordId(row: unknown): string | null {\n if (!row || typeof row !== 'object') return null;\n\n const obj = row as Record<string, unknown>;\n\n // For BaseEntity objects, use the ID property\n if ('ID' in obj) {\n return String(obj.ID);\n }\n\n // Try GetAll for BaseEntity\n if ('GetAll' in obj && typeof obj.GetAll === 'function') {\n const allData = (obj as { GetAll: () => Record<string, unknown> }).GetAll();\n if ('ID' in allData) {\n return String(allData.ID);\n }\n }\n\n return null;\n }\n\n /**\n * Open an entity record using NavigationService\n */\n openEntityRecord(entityName: string, row: unknown): void {\n const recordId = this.getRecordId(row);\n if (!recordId || !entityName) return;\n\n // Create a CompositeKey with the ID\n const compositeKey = new CompositeKey([\n { FieldName: 'ID', Value: recordId }\n ]);\n\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n }\n\n /**\n * Open an entity in the explorer (placeholder - would need routing integration)\n */\n openEntityInExplorer(entityName: string): void {\n // This would integrate with the app's navigation/routing system\n // For now, just log and could be extended to emit an event or use router\n console.log(`Would open entity in explorer: ${entityName}`);\n // Could emit an event or use router:\n // this.router.navigate(['/entities', entityName]);\n }\n\n // === Deep Linking via Query Parameters ===\n\n /**\n * Apply query parameters to component state (deep linking support)\n * Query params take precedence over saved preferences\n */\n private applyQueryParams(): void {\n const params = this.route.snapshot.queryParams;\n\n // Section: ?section=engines|redundant|performance|cache\n if (params['section']) {\n const section = params['section'] as string;\n if (['engines', 'redundant', 'performance', 'cache'].includes(section)) {\n this.activeSection = section as 'engines' | 'redundant' | 'performance' | 'cache';\n }\n }\n\n // Performance tab: ?tab=monitor|overview|events|patterns|insights\n if (params['tab']) {\n const tab = params['tab'] as string;\n if (['monitor', 'overview', 'events', 'patterns', 'insights'].includes(tab)) {\n this.perfTab = tab as 'monitor' | 'overview' | 'events' | 'patterns' | 'insights';\n }\n }\n\n // Telemetry source: ?source=client|server\n if (params['source']) {\n const source = params['source'] as string;\n if (['client', 'server'].includes(source)) {\n this.telemetrySource = source as 'client' | 'server';\n }\n }\n\n // Category filter: ?category=all|data|api|render|...\n if (params['category']) {\n const category = params['category'] as string;\n if (category === 'all') {\n this.categoryFilter = 'all';\n } else {\n this.categoryFilter = category as TelemetryCategory;\n }\n }\n\n // Search query: ?search=...\n if (params['search']) {\n this.searchQuery = params['search'] as string;\n }\n\n // KPI cards collapsed: ?kpi=collapsed|expanded\n if (params['kpi']) {\n this.kpiCardsCollapsed = params['kpi'] === 'collapsed';\n }\n\n this.cdr.markForCheck();\n }\n\n /**\n * Update query parameters to reflect current state (for deep linking)\n * Uses NavigationService for proper URL management that respects app-scoped routes.\n */\n private updateQueryParams(): void {\n const queryParams: Record<string, string | null> = {\n section: this.activeSection !== 'engines' ? this.activeSection : null,\n tab: this.perfTab !== 'monitor' ? this.perfTab : null,\n source: this.telemetrySource !== 'client' ? this.telemetrySource : null,\n category: this.categoryFilter !== 'all' ? this.categoryFilter : null,\n search: this.searchQuery.trim() || null,\n kpi: this.kpiCardsCollapsed ? 'collapsed' : null\n };\n\n // Use NavigationService to update query params properly\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n // === User Preferences Persistence ===\n\n /**\n * Load user preferences from MJ: User Settings entity using UserInfoEngine for cached access\n */\n private async loadUserPreferences(): Promise<void> {\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) {\n this.settingsLoaded = true;\n return;\n }\n\n const engine = UserInfoEngine.Instance;\n\n // Find setting from cached user settings\n const setting = engine.UserSettings.find(s => s.Setting === SYSTEM_DIAGNOSTICS_SETTINGS_KEY);\n\n if (setting) {\n this.userSettingEntity = setting;\n if (this.userSettingEntity.Value) {\n const prefs = JSON.parse(this.userSettingEntity.Value) as Partial<SystemDiagnosticsUserPreferences>;\n this.applyUserPreferences(prefs);\n }\n }\n\n this.settingsLoaded = true;\n } catch (error) {\n console.warn('Failed to load user preferences:', error);\n this.settingsLoaded = true;\n }\n }\n\n /**\n * Apply loaded user preferences to component state\n */\n private applyUserPreferences(prefs: Partial<SystemDiagnosticsUserPreferences>): void {\n if (prefs.kpiCardsCollapsed !== undefined) this.kpiCardsCollapsed = prefs.kpiCardsCollapsed;\n if (prefs.activeSection !== undefined) this.activeSection = prefs.activeSection;\n if (prefs.perfTab !== undefined) this.perfTab = prefs.perfTab;\n if (prefs.telemetrySource !== undefined) this.telemetrySource = prefs.telemetrySource;\n if (prefs.categoryFilter !== undefined) this.categoryFilter = prefs.categoryFilter;\n if (prefs.chartZoomLevel !== undefined) this.chartZoomLevel = prefs.chartZoomLevel;\n if (prefs.chartGapCompression !== undefined) this.chartGapCompression = prefs.chartGapCompression;\n if (prefs.autoRefresh !== undefined) this.autoRefresh = prefs.autoRefresh;\n this.cdr.markForCheck();\n }\n\n /**\n * Get current preferences as an object\n */\n private getCurrentPreferences(): SystemDiagnosticsUserPreferences {\n return {\n kpiCardsCollapsed: this.kpiCardsCollapsed,\n activeSection: this.activeSection,\n perfTab: this.perfTab,\n telemetrySource: this.telemetrySource,\n categoryFilter: this.categoryFilter,\n chartZoomLevel: this.chartZoomLevel,\n chartGapCompression: this.chartGapCompression,\n autoRefresh: this.autoRefresh\n };\n }\n\n /**\n * Debounced save of user preferences (500ms delay)\n * Also updates query params for deep linking\n */\n private saveUserPreferencesDebounced(): void {\n if (!this.settingsLoaded) return; // Don't save until we've loaded\n\n // Update query params immediately for deep linking\n this.updateQueryParams();\n\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n\n this.saveSettingsTimeout = setTimeout(() => {\n this.saveUserPreferences();\n }, 500);\n }\n\n /**\n * Save user preferences to MJ: User Settings entity using UserInfoEngine for cached lookup\n */\n private async saveUserPreferences(): Promise<void> {\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n // Find existing setting from cached user settings if not already loaded\n if (!this.userSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SYSTEM_DIAGNOSTICS_SETTINGS_KEY);\n\n if (setting) {\n this.userSettingEntity = setting;\n } else {\n this.userSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.userSettingEntity.UserID = userId;\n this.userSettingEntity.Setting = SYSTEM_DIAGNOSTICS_SETTINGS_KEY;\n }\n }\n\n // Save the preferences as JSON\n this.userSettingEntity.Value = JSON.stringify(this.getCurrentPreferences());\n await this.userSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save user preferences:', error);\n }\n }\n\n // === BaseResourceComponent Required Methods ===\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'System Diagnostics';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-stethoscope';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"system-diagnostics.component.js","sourceRoot":"","sources":["../../src/SystemDiagnostics/system-diagnostics.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ElementRef, ViewChild, AfterViewInit, NgZone } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Subject, interval } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { CompositeKey, TelemetryManager, TelemetryEvent, TelemetryPattern, TelemetryInsight, TelemetryCategory, TelemetryParamsUnion, isSingleRunViewParams, isSingleRunQueryParams, isBatchRunViewParams } from '@memberjunction/core';\nimport { ResourceData, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseEngineRegistry, EngineMemoryStats, LocalCacheManager, CacheEntryInfo, CacheStats, CacheEntryType, Metadata } from '@memberjunction/core';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport * as d3 from 'd3';\n\n/**\n * Interface representing a single engine's diagnostic info for display\n */\nexport interface EngineDiagnosticInfo {\n className: string;\n isLoaded: boolean;\n registeredAt: Date;\n lastLoadedAt: Date | null;\n estimatedMemoryBytes: number;\n itemCount: number;\n memoryDisplay: string;\n}\n\n/**\n * Interface for engine config items for drill-down detail\n */\nexport interface EngineConfigItemDisplay {\n propertyName: string;\n type: 'entity' | 'dataset';\n entityName?: string;\n datasetName?: string;\n filter?: string;\n orderBy?: string;\n itemCount: number;\n estimatedMemoryBytes: number;\n memoryDisplay: string;\n sampleData: unknown[];\n expanded: boolean;\n // Paging support\n displayedData: unknown[];\n allDataLoaded: boolean;\n isLoadingMore: boolean;\n currentPage: number;\n pageSize: number;\n}\n\n/**\n * Engine detail panel state\n */\nexport interface EngineDetailPanelState {\n isOpen: boolean;\n engine: EngineDiagnosticInfo | null;\n configItems: EngineConfigItemDisplay[];\n isRefreshing: boolean;\n}\n\n/**\n * Interface for redundant entity loading info\n */\nexport interface RedundantLoadInfo {\n entityName: string;\n engines: string[];\n}\n\n/**\n * Display-friendly telemetry pattern info\n */\nexport interface TelemetryPatternDisplay {\n fingerprint: string;\n category: TelemetryCategory;\n operation: string;\n entityName: string | null;\n filter: string | null;\n orderBy: string | null;\n count: number;\n avgElapsedMs: number;\n totalElapsedMs: number;\n minElapsedMs: number;\n maxElapsedMs: number;\n lastSeen: Date;\n sampleParams: TelemetryParamsUnion;\n}\n\n/**\n * Display-friendly telemetry event for timeline\n */\nexport interface TelemetryEventDisplay {\n id: string;\n category: TelemetryCategory;\n operation: string;\n entityName: string | null;\n filter: string | null;\n startTime: number;\n endTime: number | undefined;\n elapsedMs: number | undefined;\n timestamp: Date;\n params: TelemetryParamsUnion;\n}\n\n/**\n * Extended insight with expansion state\n */\nexport interface TelemetryInsightDisplay extends TelemetryInsight {\n expanded: boolean;\n relatedEvents: TelemetryEventDisplay[];\n}\n\n/**\n * Sort configuration for patterns table\n */\nexport interface PatternSortConfig {\n column: 'category' | 'operation' | 'entity' | 'count' | 'avgMs' | 'totalMs';\n direction: 'asc' | 'desc';\n}\n\n/**\n * Event detail panel state\n */\nexport interface EventDetailPanelState {\n isOpen: boolean;\n event: TelemetryEventDisplay | null;\n relatedPattern: TelemetryPatternDisplay | null;\n}\n\n/**\n * Summary stats for telemetry\n */\nexport interface TelemetrySummary {\n totalEvents: number;\n totalPatterns: number;\n totalInsights: number;\n activeEvents: number;\n byCategory: Record<TelemetryCategory, { events: number; avgMs: number }>;\n}\n\n/**\n * Settings key for persisting user preferences\n */\nconst SYSTEM_DIAGNOSTICS_SETTINGS_KEY = 'SystemDiagnostics.UserPreferences';\n\n/**\n * Interface for persisted user preferences\n */\nexport interface SystemDiagnosticsUserPreferences {\n kpiCardsCollapsed: boolean;\n activeSection: 'engines' | 'redundant' | 'performance' | 'cache';\n perfTab: 'monitor' | 'overview' | 'events' | 'patterns' | 'insights';\n telemetrySource: 'client' | 'server';\n categoryFilter: 'all' | TelemetryCategory;\n chartZoomLevel: number;\n chartGapCompression: boolean;\n autoRefresh: boolean;\n}\n/**\n * System Diagnostics Resource Component\n *\n * Provides a comprehensive view of:\n * - All registered BaseEngine instances and their memory usage\n * - Entity load tracking across engines (identifies redundant loading)\n *\n * This is a client-side only dashboard - all data comes from in-memory registries.\n */\n@RegisterClass(BaseResourceComponent, 'SystemDiagnosticsResource')\n@Component({\n standalone: false,\n selector: 'app-system-diagnostics',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"system-diagnostics\">\n <!-- Header -->\n <div class=\"diagnostics-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-stethoscope\"></i>\n <h2>System Diagnostics</h2>\n </div>\n <div class=\"header-controls\">\n <div class=\"auto-refresh-control\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"autoRefresh\" (change)=\"toggleAutoRefresh()\">\n Auto-refresh\n </label>\n @if (autoRefresh) {\n <span class=\"refresh-indicator\">\n <i class=\"fa-solid fa-sync-alt spinning\"></i>\n Every 5s\n </span>\n }\n </div>\n <button class=\"refresh-btn\" (click)=\"refreshData()\" [disabled]=\"isLoading\">\n <i class=\"fa-solid fa-refresh\" [class.spinning]=\"isLoading\"></i>\n Refresh Now\n </button>\n </div>\n </div>\n \n <!-- Overview Cards (Collapsible) -->\n <div class=\"overview-cards-container\" [class.collapsed]=\"kpiCardsCollapsed\">\n <button class=\"kpi-toggle-btn\" (click)=\"toggleKpiCards()\" [title]=\"kpiCardsCollapsed ? 'Expand KPI cards' : 'Collapse KPI cards'\">\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"!kpiCardsCollapsed\" [class.fa-chevron-down]=\"kpiCardsCollapsed\"></i>\n </button>\n \n @if (!kpiCardsCollapsed) {\n <!-- Expanded View -->\n <div class=\"overview-cards\">\n <div class=\"overview-card\">\n <div class=\"card-icon card-icon--engines\">\n <i class=\"fa-solid fa-cogs\"></i>\n </div>\n <div class=\"card-content\">\n <div class=\"card-value\">{{ engineStats?.totalEngines || 0 }}</div>\n <div class=\"card-label\">Registered Engines</div>\n <div class=\"card-subtitle\">{{ engineStats?.loadedEngines || 0 }} loaded</div>\n </div>\n </div>\n \n <div class=\"overview-card\">\n <div class=\"card-icon card-icon--memory\">\n <i class=\"fa-solid fa-microchip\"></i>\n </div>\n <div class=\"card-content\">\n <div class=\"card-value\">{{ formatBytes(engineStats?.totalEstimatedMemoryBytes || 0) }}</div>\n <div class=\"card-label\">Engine Memory</div>\n <div class=\"card-subtitle\">Estimated total</div>\n </div>\n </div>\n \n <div class=\"overview-card\">\n <div class=\"card-icon\" [class.card-icon--warning]=\"redundantLoads.length > 0\" [class.card-icon--success]=\"redundantLoads.length === 0\">\n <i class=\"fa-solid fa-copy\"></i>\n </div>\n <div class=\"card-content\">\n <div class=\"card-value\">{{ redundantLoads.length }}</div>\n <div class=\"card-label\">Redundant Loads</div>\n <div class=\"card-subtitle\">\n @if (redundantLoads.length === 0) {\n No redundant loading detected\n } @else {\n {{ redundantLoads.length }} entities loaded by multiple engines\n }\n </div>\n </div>\n </div>\n </div>\n } @else {\n <!-- Collapsed View - Mini KPI bar -->\n <div class=\"overview-cards-mini\">\n <div class=\"mini-kpi\" title=\"Registered Engines\">\n <i class=\"fa-solid fa-cogs\"></i>\n <span class=\"mini-value\">{{ engineStats?.totalEngines || 0 }}</span>\n <span class=\"mini-label\">Engines</span>\n </div>\n <div class=\"mini-divider\"></div>\n <div class=\"mini-kpi\" title=\"Engine Memory\">\n <i class=\"fa-solid fa-microchip\"></i>\n <span class=\"mini-value\">{{ formatBytes(engineStats?.totalEstimatedMemoryBytes || 0) }}</span>\n <span class=\"mini-label\">Memory</span>\n </div>\n <div class=\"mini-divider\"></div>\n <div class=\"mini-kpi\" [class.warning]=\"redundantLoads.length > 0\" title=\"Redundant Loads\">\n <i class=\"fa-solid fa-copy\"></i>\n <span class=\"mini-value\">{{ redundantLoads.length }}</span>\n <span class=\"mini-label\">Redundant</span>\n </div>\n </div>\n }\n </div>\n \n <!-- Main Content with Left Nav -->\n <div class=\"main-content\">\n <!-- Left Navigation -->\n <div class=\"left-nav\">\n <div class=\"nav-section\">\n <div class=\"nav-section-title\">Diagnostics</div>\n <div\n class=\"nav-item\"\n [class.active]=\"activeSection === 'engines'\"\n (click)=\"setActiveSection('engines')\"\n >\n <i class=\"fa-solid fa-cogs\"></i>\n <span>Engine Registry</span>\n <span class=\"nav-badge\">{{ engineStats?.totalEngines || 0 }}</span>\n </div>\n <div\n class=\"nav-item\"\n [class.active]=\"activeSection === 'redundant'\"\n (click)=\"setActiveSection('redundant')\"\n >\n <i class=\"fa-solid fa-copy\"></i>\n <span>Redundant Loading</span>\n @if (redundantLoads.length > 0) {\n <span class=\"nav-badge nav-badge--warning\">{{ redundantLoads.length }}</span>\n } @else {\n <span class=\"nav-badge nav-badge--success\">0</span>\n }\n </div>\n <div\n class=\"nav-item\"\n [class.active]=\"activeSection === 'performance'\"\n (click)=\"setActiveSection('performance')\"\n >\n <i class=\"fa-solid fa-chart-line\"></i>\n <span>Performance</span>\n <span class=\"nav-badge\">{{ telemetrySummary?.totalEvents || 0 }}</span>\n </div>\n <div\n class=\"nav-item\"\n [class.active]=\"activeSection === 'cache'\"\n (click)=\"setActiveSection('cache')\"\n >\n <i class=\"fa-solid fa-database\"></i>\n <span>Local Cache</span>\n <span class=\"nav-badge\">{{ cacheStats?.totalEntries || 0 }}</span>\n </div>\n </div>\n </div>\n \n <!-- Content Area -->\n <div class=\"content-area\">\n <!-- Engine Registry Section -->\n @if (activeSection === 'engines') {\n <div class=\"section-panel\">\n <div class=\"panel-header\">\n <h3>\n <i class=\"fa-solid fa-cogs\"></i>\n Registered Engines\n </h3>\n <div class=\"panel-actions\">\n <button class=\"action-btn\" (click)=\"refreshAllEngines()\" [disabled]=\"isRefreshingEngines\">\n <i class=\"fa-solid fa-sync\" [class.spinning]=\"isRefreshingEngines\"></i>\n Refresh All Engines\n </button>\n </div>\n </div>\n \n <div class=\"section-panel-content\">\n @if (engines.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No engines registered yet</p>\n <span class=\"empty-hint\">Engines register themselves when they are first configured</span>\n </div>\n } @else {\n <div class=\"engine-grid\">\n @for (engine of engines; track engine.className) {\n <div class=\"engine-card\" [class.loaded]=\"engine.isLoaded\">\n <div class=\"engine-header\">\n <div class=\"engine-name\" [title]=\"engine.className\">{{ engine.className }}</div>\n <div class=\"engine-status\" [class.status-loaded]=\"engine.isLoaded\" [class.status-pending]=\"!engine.isLoaded\">\n {{ engine.isLoaded ? 'Loaded' : 'Not Loaded' }}\n </div>\n </div>\n <div class=\"engine-stats\">\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-microchip\"></i>\n <span class=\"stat-label\">Memory:</span>\n <span class=\"stat-value\">{{ engine.memoryDisplay }}</span>\n </div>\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span class=\"stat-label\">Items:</span>\n <span class=\"stat-value\">{{ engine.itemCount.toLocaleString() }}</span>\n </div>\n @if (engine.lastLoadedAt) {\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span class=\"stat-label\">Loaded:</span>\n <span class=\"stat-value\">{{ formatTime(engine.lastLoadedAt) }}</span>\n </div>\n }\n </div>\n <div class=\"engine-actions\">\n <button class=\"engine-action-btn\" (click)=\"refreshSingleEngine(engine, $event)\" [disabled]=\"!engine.isLoaded || isRefreshingSingleEngine === engine.className\" title=\"Refresh this engine\">\n <i class=\"fa-solid fa-sync\" [class.spinning]=\"isRefreshingSingleEngine === engine.className\"></i>\n </button>\n <button class=\"engine-action-btn\" (click)=\"openEngineDetailPanel(engine)\" [disabled]=\"!engine.isLoaded\" title=\"View engine details\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Redundant Loading Section -->\n @if (activeSection === 'redundant') {\n <div class=\"section-panel\">\n <div class=\"panel-header\">\n <h3>\n <i class=\"fa-solid fa-copy\"></i>\n Redundant Entity Loading\n </h3>\n </div>\n \n <div class=\"section-panel-content\">\n <div class=\"info-banner\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <div>\n <strong>What is this?</strong>\n This section shows entities that are loaded by multiple engines.\n Redundant loading indicates potential optimization opportunities where engines\n could share data or consolidate their loading logic.\n </div>\n </div>\n \n @if (redundantLoads.length === 0) {\n <div class=\"empty-state success-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No redundant entity loading detected</p>\n <span class=\"empty-hint\">Each entity is being loaded by only one engine</span>\n </div>\n } @else {\n <div class=\"redundant-loads-table-wrapper\">\n <table class=\"redundant-loads-table\">\n <thead>\n <tr>\n <th>Entity Name</th>\n <th>Loaded By Engines</th>\n <th class=\"text-right\">Engine Count</th>\n </tr>\n </thead>\n <tbody>\n @for (load of redundantLoads; track load.entityName) {\n <tr>\n <td class=\"entity-name\">{{ load.entityName }}</td>\n <td class=\"engines-cell\">\n <div class=\"engine-chips\">\n @for (engine of load.engines; track engine) {\n <span class=\"engine-chip\">{{ engine }}</span>\n }\n </div>\n </td>\n <td class=\"text-right count-cell\">\n <span class=\"count-badge\">{{ load.engines.length }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n \n <div class=\"recommendation-banner\">\n <i class=\"fa-solid fa-lightbulb\"></i>\n <div>\n <strong>Recommendation:</strong>\n Consider consolidating data loading by having dependent engines\n access data from a parent engine, or restructuring the engine\n hierarchy to avoid duplicate data fetches.\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Performance Section -->\n @if (activeSection === 'performance') {\n <div class=\"section-panel perf-panel\">\n <div class=\"panel-header\">\n <h3>\n <i class=\"fa-solid fa-chart-line\"></i>\n Performance Telemetry\n </h3>\n <div class=\"panel-actions\">\n <!-- Source toggle -->\n <div class=\"source-toggle\">\n <button class=\"source-btn\" [class.active]=\"telemetrySource === 'client'\" (click)=\"setTelemetrySource('client')\">\n <i class=\"fa-solid fa-browser\"></i>\n Client\n </button>\n <button class=\"source-btn\" [class.active]=\"telemetrySource === 'server'\" (click)=\"setTelemetrySource('server')\">\n <i class=\"fa-solid fa-server\"></i>\n Server\n </button>\n </div>\n <span class=\"action-divider\"></span>\n @if (telemetrySource === 'client') {\n <button class=\"action-btn\" [class.active]=\"telemetryEnabled\" (click)=\"toggleTelemetry()\">\n <i class=\"fa-solid\" [class.fa-toggle-on]=\"telemetryEnabled\" [class.fa-toggle-off]=\"!telemetryEnabled\"></i>\n {{ telemetryEnabled ? 'Enabled' : 'Disabled' }}\n </button>\n <button class=\"action-btn\" (click)=\"clearTelemetry()\" [disabled]=\"!telemetryEnabled\">\n <i class=\"fa-solid fa-trash\"></i>\n Clear\n </button>\n } @else {\n <span class=\"status-indicator\" [class.enabled]=\"serverTelemetryEnabled\" [class.disabled]=\"!serverTelemetryEnabled\">\n <i class=\"fa-solid\" [class.fa-circle-check]=\"serverTelemetryEnabled\" [class.fa-circle-xmark]=\"!serverTelemetryEnabled\"></i>\n {{ serverTelemetryEnabled ? 'Enabled' : 'Disabled' }}\n <span class=\"config-note\" title=\"Configure via mj.config.cjs telemetry section\">(config)</span>\n </span>\n }\n @if (serverTelemetryLoading) {\n <span class=\"loading-indicator\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </span>\n }\n </div>\n </div>\n @if (serverTelemetryError) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ serverTelemetryError }}\n <button class=\"dismiss-btn\" (click)=\"serverTelemetryError = null\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n \n <!-- Performance Sub-Navigation Tabs -->\n <div class=\"perf-tabs\">\n <button class=\"perf-tab\" [class.active]=\"perfTab === 'monitor'\" (click)=\"setPerfTab('monitor')\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <span>Monitor</span>\n </button>\n <button class=\"perf-tab\" [class.active]=\"perfTab === 'overview'\" (click)=\"setPerfTab('overview')\">\n <i class=\"fa-solid fa-gauge\"></i>\n <span>Overview</span>\n @if (slowQueries.length > 0) {\n <span class=\"tab-badge warning\">{{ slowQueries.length }}</span>\n }\n </button>\n <button class=\"perf-tab\" [class.active]=\"perfTab === 'events'\" (click)=\"setPerfTab('events')\">\n <i class=\"fa-solid fa-timeline\"></i>\n <span>Events</span>\n <span class=\"tab-badge\">{{ telemetrySummary?.totalEvents || 0 }}</span>\n </button>\n <button class=\"perf-tab\" [class.active]=\"perfTab === 'patterns'\" (click)=\"setPerfTab('patterns')\">\n <i class=\"fa-solid fa-fingerprint\"></i>\n <span>Patterns</span>\n <span class=\"tab-badge\">{{ telemetrySummary?.totalPatterns || 0 }}</span>\n </button>\n <button class=\"perf-tab\" [class.active]=\"perfTab === 'insights'\" (click)=\"setPerfTab('insights')\">\n <i class=\"fa-solid fa-lightbulb\"></i>\n <span>Insights</span>\n @if (telemetryInsights.length > 0) {\n <span class=\"tab-badge insight\">{{ telemetryInsights.length }}</span>\n }\n </button>\n </div>\n \n <div class=\"section-panel-content\">\n @if (!telemetryEnabled) {\n <div class=\"info-banner warning-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <div>\n <strong>Telemetry is disabled.</strong>\n Enable telemetry to track RunView, RunQuery, and Engine loading performance.\n </div>\n </div>\n }\n \n <!-- Monitor Tab (PerfMon Chart) -->\n @if (perfTab === 'monitor') {\n <div class=\"perfmon-section\">\n <div class=\"perfmon-header\">\n <div class=\"perfmon-legend\">\n <span class=\"legend-item runview\"><span class=\"legend-dot\"></span> RunView</span>\n <span class=\"legend-item runquery\"><span class=\"legend-dot\"></span> RunQuery</span>\n <span class=\"legend-item engine\"><span class=\"legend-dot\"></span> Engine</span>\n <span class=\"legend-item ai\"><span class=\"legend-dot\"></span> AI</span>\n </div>\n <div class=\"perfmon-controls\">\n <!-- Interaction Mode Toggle -->\n <div class=\"mode-toggle\" title=\"Chart Interaction Mode\">\n <button\n class=\"mode-btn\"\n [class.active]=\"chartInteractionMode === 'pointer'\"\n (click)=\"setChartInteractionMode('pointer')\"\n title=\"Pointer mode - click events to view details\">\n <i class=\"fa-solid fa-arrow-pointer\"></i>\n </button>\n <button\n class=\"mode-btn\"\n [class.active]=\"chartInteractionMode === 'select'\"\n (click)=\"setChartInteractionMode('select')\"\n title=\"Select mode - drag to zoom into a time range\">\n <i class=\"fa-solid fa-vector-square\"></i>\n </button>\n <button\n class=\"mode-btn\"\n [class.active]=\"chartInteractionMode === 'pan'\"\n (click)=\"setChartInteractionMode('pan')\"\n title=\"Pan mode - drag to pan the chart\">\n <i class=\"fa-solid fa-hand\"></i>\n </button>\n </div>\n <span class=\"control-divider\"></span>\n <button class=\"chart-control-btn\" (click)=\"zoomPerfChart('in')\" title=\"Zoom In\">\n <i class=\"fa-solid fa-search-plus\"></i>\n </button>\n <button class=\"chart-control-btn\" (click)=\"zoomPerfChart('out')\" title=\"Zoom Out\">\n <i class=\"fa-solid fa-search-minus\"></i>\n </button>\n <button class=\"chart-control-btn\" (click)=\"resetPerfChartZoom()\" title=\"Reset Zoom\">\n <i class=\"fa-solid fa-expand\"></i>\n </button>\n <span class=\"control-divider\"></span>\n <label class=\"compress-toggle\" title=\"Automatically compress gaps with no activity\">\n <input type=\"checkbox\" [(ngModel)]=\"chartGapCompression\" (change)=\"onGapCompressionChange()\">\n <span>Compress Gaps</span>\n </label>\n </div>\n </div>\n <div class=\"perfmon-chart-container\">\n <div class=\"perfmon-y-axis\">\n <span class=\"axis-label\">Duration (ms)</span>\n </div>\n <div #perfChart class=\"perfmon-chart\"></div>\n </div>\n <div class=\"perfmon-footer\">\n <span class=\"footer-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n @if (chartTimeRangeStart !== null && chartTimeRangeEnd !== null) {\n Viewing {{ formatRelativeTime(chartTimeRangeStart) }} - {{ formatRelativeTime(chartTimeRangeEnd) }}. Click Reset to show all.\n } @else if (chartGapCompression) {\n Drag to select a time range. Gaps >5s compressed.\n } @else {\n Drag to select a time range. Hover over points for details.\n }\n </span>\n @if (telemetrySummary) {\n <span class=\"footer-stats\">\n {{ telemetrySummary.totalEvents }} events\n @if (chartZoomLevel !== 1) {\n • {{ (chartZoomLevel * 100) | number:'1.0-0' }}% zoom\n }\n </span>\n }\n </div>\n </div>\n }\n \n <!-- Overview Tab -->\n @if (perfTab === 'overview') {\n <!-- Summary Stats -->\n <div class=\"telemetry-summary\">\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ telemetrySummary?.totalEvents || 0 }}</div>\n <div class=\"summary-label\">Total Events</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ telemetrySummary?.totalPatterns || 0 }}</div>\n <div class=\"summary-label\">Unique Patterns</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ telemetrySummary?.totalInsights || 0 }}</div>\n <div class=\"summary-label\">Insights</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ telemetrySummary?.activeEvents || 0 }}</div>\n <div class=\"summary-label\">Active</div>\n </div>\n </div>\n \n <!-- Category Breakdown -->\n @if (telemetrySummary && telemetrySummary.totalEvents > 0) {\n <div class=\"category-breakdown\">\n <h4>By Category</h4>\n <div class=\"category-grid\">\n @for (cat of categoriesWithData; track cat.name) {\n <div class=\"category-item\" (click)=\"jumpToPatternsByCategory(cat.name)\">\n <span class=\"category-name\">{{ cat.name }}</span>\n <span class=\"category-events\">{{ cat.events }}</span>\n <span class=\"category-avg\">avg {{ cat.avgMs | number:'1.0-0' }}ms</span>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Slow Queries Section -->\n @if (slowQueries.length > 0) {\n <div class=\"slow-queries-section\">\n <h4>\n <i class=\"fa-solid fa-turtle\"></i>\n Slow Operations (>{{ slowQueryThresholdMs }}ms)\n </h4>\n <div class=\"slow-queries-list\">\n @for (query of slowQueries.slice(0, 10); track query.id) {\n <div class=\"slow-query-item clickable\" [class.cache-hit]=\"isCacheHit(query)\" (click)=\"openEventDetailPanel(query)\">\n <div class=\"slow-query-main\">\n <span class=\"category-chip small\" [class]=\"'cat-' + query.category.toLowerCase()\">\n {{ query.category }}\n </span>\n <span class=\"slow-query-entity\">{{ query.entityName || query.operation }}</span>\n @if (isCacheHit(query)) {\n <span class=\"cache-hit-badge small\" title=\"Data served from local cache\">\n <i class=\"fa-solid fa-bolt\"></i>\n CACHED\n </span>\n }\n <span class=\"slow-query-time\">{{ query.elapsedMs | number:'1.0-0' }}ms</span>\n </div>\n <!-- Show entities for RunViews batch operation -->\n @if (isRunViewsOperation(query)) {\n <div class=\"slow-query-entities\">\n @for (entity of getRunViewsEntities(query, 4); track entity) {\n <span class=\"entity-pill small\">{{ entity }}</span>\n }\n @if (hasMoreEntities(query, 4)) {\n <span class=\"entity-pill small more\">+{{ getRunViewsEntityCount(query) - 4 }} more</span>\n }\n </div>\n }\n <!-- RunView parameter pills -->\n @if (isRunViewOperation(query) && getRunViewPills(query).length > 0) {\n <div class=\"slow-query-pills\">\n @for (pill of getRunViewPills(query); track pill.label) {\n <span class=\"param-pill small\" [class]=\"'pill-' + pill.type\" [title]=\"pill.value\">\n <span class=\"pill-label\">{{ pill.label }}:</span>\n <span class=\"pill-value\">{{ pill.value }}</span>\n </span>\n }\n </div>\n }\n @if (query.filter) {\n <div class=\"slow-query-filter\">{{ truncateString(query.filter, 60) }}</div>\n }\n <div class=\"slow-query-timestamp\">{{ formatTimestamp(query.timestamp) }}</div>\n </div>\n }\n </div>\n </div>\n } @else if (telemetryEnabled && telemetrySummary && telemetrySummary.totalEvents > 0) {\n <div class=\"success-banner\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>No slow operations detected. All operations completed under {{ slowQueryThresholdMs }}ms.</span>\n </div>\n }\n }\n \n <!-- Events Tab (Timeline) -->\n @if (perfTab === 'events') {\n <!-- Filter Bar for Events -->\n <div class=\"filter-bar compact\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n placeholder=\"Search events...\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\">\n @if (searchQuery) {\n <button class=\"clear-search\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <div class=\"filter-buttons\">\n <button class=\"filter-btn\" [class.active]=\"categoryFilter === 'all'\" (click)=\"setCategoryFilter('all')\">\n All\n </button>\n @for (cat of categoriesWithData; track cat.name) {\n <button class=\"filter-btn\" [class.active]=\"categoryFilter === cat.name\" (click)=\"setCategoryFilterByName(cat.name)\">\n {{ cat.name }}\n </button>\n }\n </div>\n </div>\n \n <div class=\"timeline-section\">\n <div class=\"timeline-container\">\n @if (filteredEvents.length > 0) {\n @for (event of filteredEvents.slice(0, 50); track event.id) {\n <div class=\"timeline-item clickable\" [class]=\"'tl-' + event.category.toLowerCase()\" [class.cache-hit]=\"isCacheHit(event)\" (click)=\"openEventDetailPanel(event)\">\n <div class=\"timeline-marker\">\n @if (isCacheHit(event)) {\n <div class=\"marker-bolt\">\n <i class=\"fa-solid fa-bolt\"></i>\n </div>\n } @else {\n <div class=\"marker-dot\"></div>\n }\n <div class=\"marker-line\"></div>\n </div>\n <div class=\"timeline-content\">\n <div class=\"timeline-header\">\n <span class=\"timeline-time\">{{ formatTimestamp(event.timestamp) }}</span>\n <span class=\"category-chip small\" [class]=\"'cat-' + event.category.toLowerCase()\">\n {{ event.category }}\n </span>\n @if (isCacheHit(event)) {\n <span class=\"cache-hit-badge\" title=\"Data served from local cache\">\n <i class=\"fa-solid fa-bolt\"></i>\n CACHED\n </span>\n }\n @if (event.elapsedMs !== undefined) {\n <span class=\"timeline-duration\" [class.slow]=\"(event.elapsedMs || 0) >= slowQueryThresholdMs\">\n {{ event.elapsedMs | number:'1.0-0' }}ms\n </span>\n }\n </div>\n <div class=\"timeline-body\">\n <span class=\"timeline-operation\">{{ event.operation }}</span>\n @if (event.entityName) {\n <span class=\"timeline-entity\">{{ event.entityName }}</span>\n }\n <!-- Show entities for RunViews batch operation -->\n @if (isRunViewsOperation(event)) {\n <div class=\"timeline-entities\">\n @for (entity of getRunViewsEntities(event, 3); track entity) {\n <span class=\"entity-pill\">{{ entity }}</span>\n }\n @if (hasMoreEntities(event, 3)) {\n <span class=\"entity-pill more\">+{{ getRunViewsEntityCount(event) - 3 }} more</span>\n }\n </div>\n }\n </div>\n <!-- RunView parameter pills -->\n @if (isRunViewOperation(event) && getRunViewPills(event).length > 0) {\n <div class=\"timeline-pills\">\n @for (pill of getRunViewPills(event); track pill.label) {\n <span class=\"param-pill\" [class]=\"'pill-' + pill.type\" [title]=\"pill.value\">\n <span class=\"pill-label\">{{ pill.label }}:</span>\n <span class=\"pill-value\">{{ pill.value }}</span>\n </span>\n }\n </div>\n }\n @if (event.filter) {\n <div class=\"timeline-filter\">{{ truncateString(event.filter, 80) }}</div>\n }\n </div>\n </div>\n }\n } @else {\n <div class=\"empty-state small\">\n <i class=\"fa-solid fa-hourglass-start\"></i>\n <p>No events recorded yet</p>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Patterns Tab -->\n @if (perfTab === 'patterns') {\n <!-- Filter Bar -->\n <div class=\"filter-bar compact\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n placeholder=\"Search patterns...\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\">\n @if (searchQuery) {\n <button class=\"clear-search\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <div class=\"filter-buttons\">\n <button class=\"filter-btn\" [class.active]=\"categoryFilter === 'all'\" (click)=\"setCategoryFilter('all')\">\n All\n </button>\n @for (cat of categoriesWithData; track cat.name) {\n <button class=\"filter-btn\" [class.active]=\"categoryFilter === cat.name\" (click)=\"setCategoryFilterByName(cat.name)\">\n {{ cat.name }}\n </button>\n }\n </div>\n </div>\n \n @if (filteredPatterns.length > 0) {\n <div class=\"patterns-section\">\n <div class=\"patterns-table-wrapper\">\n <table class=\"patterns-table sortable\">\n <thead>\n <tr>\n <th class=\"sortable-header\" (click)=\"sortPatternsBy('category')\">\n Category\n <i class=\"fa-solid\" [class]=\"getSortIcon('category')\"></i>\n </th>\n <th class=\"sortable-header\" (click)=\"sortPatternsBy('operation')\">\n Operation\n <i class=\"fa-solid\" [class]=\"getSortIcon('operation')\"></i>\n </th>\n <th class=\"sortable-header\" (click)=\"sortPatternsBy('entity')\">\n Entity/Query\n <i class=\"fa-solid\" [class]=\"getSortIcon('entity')\"></i>\n </th>\n <th>Filter</th>\n <th class=\"sortable-header text-right\" (click)=\"sortPatternsBy('count')\">\n Count\n <i class=\"fa-solid\" [class]=\"getSortIcon('count')\"></i>\n </th>\n <th class=\"sortable-header text-right\" (click)=\"sortPatternsBy('avgMs')\">\n Avg (ms)\n <i class=\"fa-solid\" [class]=\"getSortIcon('avgMs')\"></i>\n </th>\n <th class=\"sortable-header text-right\" (click)=\"sortPatternsBy('totalMs')\">\n Total (ms)\n <i class=\"fa-solid\" [class]=\"getSortIcon('totalMs')\"></i>\n </th>\n </tr>\n </thead>\n <tbody>\n @for (pattern of filteredPatterns; track pattern.fingerprint) {\n <tr [class.duplicate-row]=\"pattern.count >= 2\" [class.slow-row]=\"pattern.avgElapsedMs >= slowQueryThresholdMs\">\n <td>\n <span class=\"category-chip\" [class]=\"'cat-' + pattern.category.toLowerCase()\">\n {{ pattern.category }}\n </span>\n </td>\n <td class=\"operation-cell\">{{ pattern.operation }}</td>\n <td class=\"entity-cell\">{{ pattern.entityName || '-' }}</td>\n <td class=\"filter-cell\" [title]=\"pattern.filter || ''\">\n {{ truncateString(pattern.filter, 30) }}\n </td>\n <td class=\"text-right\">\n @if (pattern.count >= 2) {\n <span class=\"count-warning\">{{ pattern.count }}</span>\n } @else {\n {{ pattern.count }}\n }\n </td>\n <td class=\"text-right\" [class.slow-value]=\"pattern.avgElapsedMs >= slowQueryThresholdMs\">\n {{ pattern.avgElapsedMs | number:'1.1-1' }}\n </td>\n <td class=\"text-right\">{{ pattern.totalElapsedMs | number:'1.0-0' }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n } @else if (telemetryEnabled && telemetryPatterns.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-hourglass-start\"></i>\n <p>No telemetry data yet</p>\n <span class=\"empty-hint\">Navigate around the app to generate performance data</span>\n </div>\n } @else if (searchQuery || categoryFilter !== 'all') {\n <div class=\"empty-state small\">\n <i class=\"fa-solid fa-filter\"></i>\n <p>No patterns match your filter</p>\n </div>\n }\n }\n \n <!-- Insights Tab -->\n @if (perfTab === 'insights') {\n @if (telemetryInsights.length > 0) {\n <div class=\"insights-section\">\n <div class=\"insights-list\">\n @for (insight of telemetryInsights; track insight.id) {\n <div class=\"insight-card expandable\" [class]=\"getSeverityClass(insight.severity)\" [class.expanded]=\"insight.expanded\">\n <div class=\"insight-header\" (click)=\"toggleInsightExpanded(insight)\">\n <i class=\"fa-solid\" [class]=\"getSeverityIcon(insight.severity)\"></i>\n <span class=\"insight-title\">{{ insight.title }}</span>\n <span class=\"insight-category\">{{ insight.category }}</span>\n <i class=\"fa-solid expand-icon\" [class.fa-chevron-down]=\"!insight.expanded\" [class.fa-chevron-up]=\"insight.expanded\"></i>\n </div>\n \n <!-- Always show key info for actionability -->\n <div class=\"insight-key-info\">\n @if (insight.entityName) {\n <div class=\"key-info-item\">\n <span class=\"key-label\">Entity:</span>\n <span class=\"key-value entity-name\">{{ insight.entityName }}</span>\n </div>\n }\n @if (getInsightFilter(insight)) {\n <div class=\"key-info-item\">\n <span class=\"key-label\">Filter:</span>\n <code class=\"key-value filter-code\">{{ getInsightFilter(insight) }}</code>\n </div>\n }\n </div>\n \n <div class=\"insight-message\">{{ insight.message }}</div>\n <div class=\"insight-suggestion\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n {{ insight.suggestion }}\n </div>\n \n <!-- Expanded Details -->\n @if (insight.expanded) {\n <div class=\"insight-details\">\n <!-- Show all params from first related event -->\n @if (insight.relatedEvents.length > 0) {\n <div class=\"detail-section\">\n <div class=\"detail-label\">Full Parameters</div>\n <div class=\"params-display\">\n @for (param of getEventParams(insight.relatedEvents[0]); track param.key) {\n <div class=\"param-row\">\n <span class=\"param-key\">{{ param.key }}:</span>\n <span class=\"param-value\">{{ param.value }}</span>\n </div>\n }\n </div>\n </div>\n <div class=\"detail-section\">\n <div class=\"detail-label\">Related Calls ({{ insight.relatedEvents.length }})</div>\n <div class=\"related-events\">\n @for (event of insight.relatedEvents; track event.id) {\n <div class=\"related-event\">\n <span class=\"event-time\">{{ formatTimestamp(event.timestamp) }}</span>\n <span class=\"event-duration\">{{ event.elapsedMs | number:'1.0-0' }}ms</span>\n @if (event.entityName) {\n <span class=\"event-entity\">{{ event.entityName }}</span>\n }\n @if (event.filter) {\n <span class=\"event-filter\">{{ truncateString(event.filter, 40) }}</span>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-check-circle\" style=\"color: #4caf50;\"></i>\n <p>No optimization insights</p>\n <span class=\"empty-hint\">Insights will appear when potential optimizations are detected</span>\n </div>\n }\n }\n </div>\n </div>\n }\n \n <!-- Local Cache Section -->\n @if (activeSection === 'cache') {\n <div class=\"section-panel\">\n <div class=\"panel-header\">\n <h3>\n <i class=\"fa-solid fa-database\"></i>\n Local Cache\n </h3>\n <div class=\"panel-actions\">\n <button class=\"action-btn\" (click)=\"clearAllCache()\" [disabled]=\"!cacheStats || cacheStats.totalEntries === 0\">\n <i class=\"fa-solid fa-trash\"></i>\n Clear All\n </button>\n </div>\n </div>\n \n <div class=\"section-panel-content\">\n @if (!cacheInitialized) {\n <div class=\"info-banner warning-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <div>\n <strong>Cache not initialized.</strong>\n The LocalCacheManager requires initialization with a storage provider during app startup.\n </div>\n </div>\n } @else {\n <!-- Cache Summary Stats -->\n <div class=\"cache-summary\">\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ cacheStats?.totalEntries || 0 }}</div>\n <div class=\"summary-label\">Total Entries</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ formatBytes(cacheStats?.totalSizeBytes || 0) }}</div>\n <div class=\"summary-label\">Total Size</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ cacheStats?.hits || 0 }}</div>\n <div class=\"summary-label\">Cache Hits</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ cacheStats?.misses || 0 }}</div>\n <div class=\"summary-label\">Cache Misses</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-value\">{{ cacheHitRate | number:'1.1-1' }}%</div>\n <div class=\"summary-label\">Hit Rate</div>\n </div>\n </div>\n \n <!-- Cache Type Breakdown -->\n <div class=\"cache-type-breakdown\">\n <h4>By Type</h4>\n <div class=\"type-grid\">\n <div class=\"type-item\" (click)=\"setCacheTypeFilter('dataset')\">\n <span class=\"type-icon\"><i class=\"fa-solid fa-layer-group\"></i></span>\n <span class=\"type-name\">Datasets</span>\n <span class=\"type-count\">{{ cacheStats?.byType?.dataset?.count || 0 }}</span>\n <span class=\"type-size\">{{ formatBytes(cacheStats?.byType?.dataset?.sizeBytes || 0) }}</span>\n </div>\n <div class=\"type-item\" (click)=\"setCacheTypeFilter('runview')\">\n <span class=\"type-icon\"><i class=\"fa-solid fa-table\"></i></span>\n <span class=\"type-name\">RunViews</span>\n <span class=\"type-count\">{{ cacheStats?.byType?.runview?.count || 0 }}</span>\n <span class=\"type-size\">{{ formatBytes(cacheStats?.byType?.runview?.sizeBytes || 0) }}</span>\n </div>\n <div class=\"type-item\" (click)=\"setCacheTypeFilter('runquery')\">\n <span class=\"type-icon\"><i class=\"fa-solid fa-code\"></i></span>\n <span class=\"type-name\">RunQueries</span>\n <span class=\"type-count\">{{ cacheStats?.byType?.runquery?.count || 0 }}</span>\n <span class=\"type-size\">{{ formatBytes(cacheStats?.byType?.runquery?.sizeBytes || 0) }}</span>\n </div>\n </div>\n </div>\n \n <!-- Cache Entries Table -->\n @if (filteredCacheEntries.length > 0) {\n <div class=\"cache-entries-section\">\n <div class=\"section-header\">\n <h4>Cache Entries</h4>\n <div class=\"filter-controls\">\n <button class=\"filter-btn\" [class.active]=\"cacheTypeFilter === 'all'\" (click)=\"setCacheTypeFilter('all')\">All</button>\n <button class=\"filter-btn\" [class.active]=\"cacheTypeFilter === 'dataset'\" (click)=\"setCacheTypeFilter('dataset')\">Datasets</button>\n <button class=\"filter-btn\" [class.active]=\"cacheTypeFilter === 'runview'\" (click)=\"setCacheTypeFilter('runview')\">RunViews</button>\n <button class=\"filter-btn\" [class.active]=\"cacheTypeFilter === 'runquery'\" (click)=\"setCacheTypeFilter('runquery')\">RunQueries</button>\n </div>\n </div>\n <div class=\"cache-entries-table-wrapper\">\n <table class=\"cache-entries-table\">\n <thead>\n <tr>\n <th>Type</th>\n <th>Name</th>\n <th class=\"text-right\">Size</th>\n <th class=\"text-right\">Hits</th>\n <th>Cached At</th>\n <th>Last Accessed</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (entry of filteredCacheEntries.slice(0, 50); track entry.key) {\n <tr>\n <td>\n <span class=\"cache-type-chip\" [class]=\"'type-' + entry.type\">\n {{ entry.type }}\n </span>\n </td>\n <td class=\"entry-name\">\n {{ entry.name }}\n @if (entry.fingerprint) {\n <code class=\"entry-fingerprint\">{{ truncateString(entry.fingerprint, 20) }}</code>\n }\n </td>\n <td class=\"text-right\">{{ formatBytes(entry.sizeBytes) }}</td>\n <td class=\"text-right\">{{ entry.accessCount }}</td>\n <td>{{ formatCacheTimestamp(entry.cachedAt) }}</td>\n <td>{{ formatCacheTimestamp(entry.lastAccessedAt) }}</td>\n <td>\n <button class=\"icon-btn\" (click)=\"invalidateCacheEntry(entry)\" title=\"Invalidate\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n @if (filteredCacheEntries.length > 50) {\n <div class=\"table-footer\">\n Showing 50 of {{ filteredCacheEntries.length }} entries\n </div>\n }\n </div>\n } @else if (cacheStats && cacheStats.totalEntries === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database\"></i>\n <p>No cached data</p>\n <span class=\"empty-hint\">Data will be cached as you use the application</span>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n </div>\n \n <!-- Last Updated -->\n <div class=\"footer\">\n <span class=\"last-updated\">\n <i class=\"fa-solid fa-clock\"></i>\n Last updated: {{ lastUpdated | date:'medium' }}\n </span>\n <button class=\"export-btn\" (click)=\"exportTelemetryData()\" [disabled]=\"!telemetryEnabled || telemetryEvents.length === 0\">\n <i class=\"fa-solid fa-download\"></i>\n Export JSON\n </button>\n </div>\n </div>\n \n <!-- Event Detail Slide-in Panel -->\n @if (eventDetailPanel.isOpen && eventDetailPanel.event) {\n <div class=\"event-detail-overlay\" (click)=\"closeEventDetailPanel()\"></div>\n <div class=\"event-detail-panel\" [class.open]=\"eventDetailPanel.isOpen\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <span class=\"category-chip\" [class]=\"'cat-' + eventDetailPanel.event.category.toLowerCase()\">\n {{ eventDetailPanel.event.category }}\n </span>\n <h3>Event Details</h3>\n </div>\n <button class=\"close-btn\" (click)=\"closeEventDetailPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n \n <div class=\"panel-body\">\n <!-- Key Metrics -->\n <div class=\"detail-metrics\">\n <div class=\"metric\">\n <div class=\"metric-value\" [class.slow]=\"(eventDetailPanel.event.elapsedMs || 0) >= slowQueryThresholdMs\">\n {{ eventDetailPanel.event.elapsedMs !== undefined ? (eventDetailPanel.event.elapsedMs | number:'1.0-0') + 'ms' : 'In Progress' }}\n </div>\n <div class=\"metric-label\">Duration</div>\n </div>\n <div class=\"metric\">\n <div class=\"metric-value\">{{ formatTimestamp(eventDetailPanel.event.timestamp) }}</div>\n <div class=\"metric-label\">Time</div>\n </div>\n <div class=\"metric\">\n <div class=\"metric-value\">+{{ formatRelativeTime(eventDetailPanel.event.startTime - telemetryBootTime) }}</div>\n <div class=\"metric-label\">Relative</div>\n </div>\n </div>\n \n <!-- Operation Info -->\n <div class=\"detail-section\">\n <h4><i class=\"fa-solid fa-code\"></i> Operation</h4>\n <div class=\"detail-content\">\n <div class=\"detail-row\">\n <span class=\"detail-key\">Operation:</span>\n <span class=\"detail-val\">{{ eventDetailPanel.event.operation }}</span>\n </div>\n @if (eventDetailPanel.event.entityName) {\n <div class=\"detail-row\">\n <span class=\"detail-key\">Entity:</span>\n <span class=\"detail-val entity-highlight\">{{ eventDetailPanel.event.entityName }}</span>\n </div>\n }\n @if (eventDetailPanel.event.filter) {\n <div class=\"detail-row\">\n <span class=\"detail-key\">Filter:</span>\n <code class=\"detail-val filter-val\">{{ eventDetailPanel.event.filter }}</code>\n </div>\n }\n </div>\n </div>\n \n <!-- All Parameters -->\n <div class=\"detail-section\">\n <h4><i class=\"fa-solid fa-sliders\"></i> Parameters</h4>\n <div class=\"params-grid\">\n @for (param of getEventParams(eventDetailPanel.event); track param.key) {\n <div class=\"param-item\">\n <span class=\"param-name\">{{ param.key }}</span>\n <span class=\"param-val\">{{ param.value }}</span>\n </div>\n }\n </div>\n </div>\n \n <!-- Related Pattern -->\n @if (eventDetailPanel.relatedPattern) {\n <div class=\"detail-section\">\n <h4><i class=\"fa-solid fa-fingerprint\"></i> Related Pattern</h4>\n <div class=\"pattern-summary\">\n <div class=\"pattern-stat\">\n <span class=\"stat-val\">{{ eventDetailPanel.relatedPattern.count }}</span>\n <span class=\"stat-label\">Total Calls</span>\n </div>\n <div class=\"pattern-stat\">\n <span class=\"stat-val\">{{ eventDetailPanel.relatedPattern.avgElapsedMs | number:'1.1-1' }}ms</span>\n <span class=\"stat-label\">Avg Duration</span>\n </div>\n <div class=\"pattern-stat\">\n <span class=\"stat-val\">{{ eventDetailPanel.relatedPattern.minElapsedMs | number:'1.0-0' }} - {{ eventDetailPanel.relatedPattern.maxElapsedMs | number:'1.0-0' }}ms</span>\n <span class=\"stat-label\">Range</span>\n </div>\n </div>\n @if (eventDetailPanel.relatedPattern.count >= 2) {\n <div class=\"pattern-warning\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n This pattern has been called {{ eventDetailPanel.relatedPattern.count }} times. Consider caching or batching.\n </div>\n }\n </div>\n }\n \n <!-- Actions -->\n <div class=\"detail-actions\">\n <button class=\"action-button\" (click)=\"copyEventToClipboard(eventDetailPanel.event)\">\n <i class=\"fa-solid fa-copy\"></i>\n Copy JSON\n </button>\n @if (eventDetailPanel.event.entityName) {\n <button class=\"action-button\" (click)=\"filterByEntity(eventDetailPanel.event.entityName)\">\n <i class=\"fa-solid fa-filter\"></i>\n Filter by Entity\n </button>\n }\n </div>\n </div>\n </div>\n }\n \n <!-- Engine Detail Slide-in Panel -->\n @if (engineDetailPanel.isOpen && engineDetailPanel.engine) {\n <div class=\"engine-detail-overlay\" (click)=\"closeEngineDetailPanel()\"></div>\n <div class=\"engine-detail-panel\" [class.open]=\"engineDetailPanel.isOpen\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-cogs\"></i>\n <h3>{{ engineDetailPanel.engine.className }}</h3>\n </div>\n <div class=\"panel-header-actions\">\n <button class=\"icon-btn\" (click)=\"refreshEngineInDetailPanel()\" [disabled]=\"engineDetailPanel.isRefreshing\" title=\"Refresh engine\">\n <i class=\"fa-solid fa-sync\" [class.spinning]=\"engineDetailPanel.isRefreshing\"></i>\n </button>\n <button class=\"close-btn\" (click)=\"closeEngineDetailPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"panel-body\">\n <!-- Engine Summary -->\n <div class=\"engine-summary-section\">\n <div class=\"summary-stat\">\n <span class=\"summary-label\">Status</span>\n <span class=\"summary-value\">\n <span class=\"status-dot\" [class.status-loaded]=\"engineDetailPanel.engine.isLoaded\"></span>\n {{ engineDetailPanel.engine.isLoaded ? 'Loaded' : 'Not Loaded' }}\n </span>\n </div>\n <div class=\"summary-stat\">\n <span class=\"summary-label\">Memory</span>\n <span class=\"summary-value\">{{ engineDetailPanel.engine.memoryDisplay }}</span>\n </div>\n <div class=\"summary-stat\">\n <span class=\"summary-label\">Items</span>\n <span class=\"summary-value\">{{ engineDetailPanel.engine.itemCount.toLocaleString() }}</span>\n </div>\n @if (engineDetailPanel.engine.lastLoadedAt) {\n <div class=\"summary-stat\">\n <span class=\"summary-label\">Last Loaded</span>\n <span class=\"summary-value\">{{ formatTime(engineDetailPanel.engine.lastLoadedAt) }}</span>\n </div>\n }\n </div>\n \n <!-- Config Items -->\n <div class=\"config-items-section\">\n <h4>\n <i class=\"fa-solid fa-database\"></i>\n Data Configs ({{ engineDetailPanel.configItems.length }})\n </h4>\n \n @if (engineDetailPanel.configItems.length === 0) {\n <div class=\"empty-state small\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No config items found</p>\n </div>\n } @else {\n <div class=\"config-items-list\">\n @for (item of engineDetailPanel.configItems; track item.propertyName) {\n <div class=\"config-item\" [class.expanded]=\"item.expanded\">\n <div class=\"config-item-header\" (click)=\"toggleConfigItemExpanded(item)\">\n <div class=\"config-item-info\">\n <span class=\"config-type-chip\" [class]=\"'type-' + item.type\">{{ item.type }}</span>\n <span class=\"config-name\">{{ item.entityName || item.datasetName || item.propertyName }}</span>\n </div>\n <div class=\"config-item-stats\">\n <span class=\"config-stat\">{{ item.itemCount }} items</span>\n <span class=\"config-stat\">{{ item.memoryDisplay }}</span>\n <i class=\"fa-solid expand-icon\" [class.fa-chevron-down]=\"!item.expanded\" [class.fa-chevron-up]=\"item.expanded\"></i>\n </div>\n </div>\n \n @if (item.expanded) {\n <div class=\"config-item-details\">\n <div class=\"config-detail-row\">\n <span class=\"detail-label\">Property:</span>\n <code class=\"detail-value\">{{ item.propertyName }}</code>\n </div>\n @if (item.filter) {\n <div class=\"config-detail-row\">\n <span class=\"detail-label\">Filter:</span>\n <code class=\"detail-value\">{{ item.filter }}</code>\n </div>\n }\n @if (item.orderBy) {\n <div class=\"config-detail-row\">\n <span class=\"detail-label\">Order By:</span>\n <code class=\"detail-value\">{{ item.orderBy }}</code>\n </div>\n }\n \n <!-- Data Table with Paging -->\n @if (item.displayedData.length > 0) {\n <div class=\"sample-data-section\">\n <div class=\"sample-header\">\n <span class=\"sample-title\">Data ({{ item.displayedData.length }} of {{ item.itemCount }})</span>\n <div class=\"sample-header-actions\">\n @if (!item.allDataLoaded && item.itemCount > item.displayedData.length) {\n <button class=\"load-more-btn\" (click)=\"loadMoreData(item)\" [disabled]=\"item.isLoadingMore\" title=\"Load more records\">\n @if (item.isLoadingMore) {\n <i class=\"fa-solid fa-spinner spinning\"></i>\n } @else {\n <i class=\"fa-solid fa-plus\"></i>\n }\n Load More\n </button>\n <button class=\"load-all-btn\" (click)=\"loadAllData(item)\" [disabled]=\"item.isLoadingMore\" title=\"Load all records\">\n @if (item.isLoadingMore) {\n <i class=\"fa-solid fa-spinner spinning\"></i>\n } @else {\n <i class=\"fa-solid fa-download\"></i>\n }\n Load All\n </button>\n }\n @if (item.allDataLoaded) {\n <span class=\"all-loaded-badge\">\n <i class=\"fa-solid fa-check\"></i>\n All Loaded\n </span>\n }\n </div>\n </div>\n <div class=\"sample-data-table-wrapper\">\n <table class=\"sample-data-table\">\n <thead>\n <tr>\n <th class=\"action-col\"></th>\n @for (col of getSampleDataColumns(item); track col) {\n <th>{{ col }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of item.displayedData; track $index) {\n <tr>\n <td class=\"action-col\">\n @if (item.entityName && getRecordId(row)) {\n <button class=\"open-record-btn\" (click)=\"openEntityRecord(item.entityName, row)\" title=\"Open record\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n }\n </td>\n @for (col of getSampleDataColumns(item); track col) {\n <td [title]=\"getSampleDataValue(row, col)\">{{ truncateString(getSampleDataValue(row, col), 30) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n `,\n styleUrls: ['./system-diagnostics.component.css']\n})\nexport class SystemDiagnosticsComponent extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n protected override destroy$ = new Subject<void>();\n\n // User settings persistence\n private metadata = new Metadata();\n private userSettingEntity: MJUserSettingEntity | null = null;\n private saveSettingsTimeout: ReturnType<typeof setTimeout> | null = null;\n private settingsLoaded = false;\n\n // State\n isLoading = false;\n autoRefresh = false;\n activeSection: 'engines' | 'redundant' | 'performance' | 'cache' = 'engines';\n lastUpdated = new Date();\n isRefreshingEngines = false;\n kpiCardsCollapsed = false;\n\n // Data\n engineStats: EngineMemoryStats | null = null;\n engines: EngineDiagnosticInfo[] = [];\n redundantLoads: RedundantLoadInfo[] = [];\n\n // Telemetry data\n telemetrySummary: TelemetrySummary | null = null;\n telemetryPatterns: TelemetryPatternDisplay[] = [];\n telemetryInsights: TelemetryInsightDisplay[] = [];\n telemetryEnabled = false;\n categoriesWithData: { name: string; events: number; avgMs: number }[] = [];\n\n // Telemetry source toggle (client vs server)\n telemetrySource: 'client' | 'server' = 'client';\n serverTelemetryLoading = false;\n serverTelemetryError: string | null = null;\n serverTelemetryEnabled = false; // Read from server config, not changeable at runtime\n\n // Timeline data\n telemetryEvents: TelemetryEventDisplay[] = [];\n timelineView: 'insights' | 'timeline' | 'chart' = 'insights';\n\n // Performance sub-tabs\n perfTab: 'monitor' | 'overview' | 'events' | 'patterns' | 'insights' = 'monitor';\n\n // D3 Chart reference\n @ViewChild('perfChart', { static: false }) perfChartRef!: ElementRef<HTMLDivElement>;\n private chartInitialized = false;\n\n // Chart zoom and gap compression state\n chartZoomLevel = 1;\n chartGapCompression = true;\n private chartViewportStart = 0;\n private chartViewportEnd = 0;\n private expandedGaps = new Set<number>(); // Track which gaps are expanded\n\n // Selection-based zoom state\n private isSelecting = false;\n private selectionStartX = 0;\n private selectionRect: d3.Selection<SVGRectElement, unknown, null, undefined> | null = null;\n private chartXScale: d3.ScaleLinear<number, number> | null = null;\n private chartMarginLeft = 50;\n chartTimeRangeStart: number | null = null; // Currently visible time range start\n\n // Chart interaction mode: 'pointer' to click events, 'select' for drag-to-zoom, 'pan' for panning\n chartInteractionMode: 'pointer' | 'select' | 'pan' = 'pointer';\n\n // Store gap segments for inverse mapping (x -> time)\n private chartGapSegments: Array<{ type: 'events' | 'gap'; startTime: number; endTime: number; gapIndex?: number; displayStart: number; displayEnd: number }> = [];\n chartTimeRangeEnd: number | null = null; // Currently visible time range end\n\n // Slow queries\n slowQueries: TelemetryEventDisplay[] = [];\n slowQueryThresholdMs = 500;\n\n // Patterns sorting\n patternSort: PatternSortConfig = { column: 'count', direction: 'desc' };\n\n // Search/Filter\n searchQuery = '';\n categoryFilter: TelemetryCategory | 'all' = 'all';\n\n // Store telemetry boot time for relative time calculations (public for template access)\n telemetryBootTime: number = 0;\n\n // Event detail panel state\n eventDetailPanel: EventDetailPanelState = {\n isOpen: false,\n event: null,\n relatedPattern: null\n };\n\n // Local Cache data\n cacheStats: CacheStats | null = null;\n cacheEntries: CacheEntryInfo[] = [];\n cacheTypeFilter: CacheEntryType | 'all' = 'all';\n cacheInitialized = false;\n cacheHitRate = 0;\n\n // Engine detail panel state\n engineDetailPanel: EngineDetailPanelState = {\n isOpen: false,\n engine: null,\n configItems: [],\n isRefreshing: false\n };\n isRefreshingSingleEngine: string | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private ngZone: NgZone,\n private route: ActivatedRoute\n ) {\n super();\n }\n\n async ngOnInit() {\n super.ngOnInit();\n // Load user preferences first\n await this.loadUserPreferences();\n\n // Apply query params (override preferences if present)\n this.applyQueryParams();\n\n // Subscribe to query param changes\n this.route.queryParams\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n // Only apply if we've already loaded settings\n if (this.settingsLoaded) {\n this.applyQueryParams();\n }\n });\n\n this.refreshData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n // Clear any pending save timeout\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n }\n\n ngAfterViewInit() {\n // Render the PerfMon chart if we're on the monitor tab\n // Need a small delay to ensure the DOM is fully ready\n if (this.activeSection === 'performance' && this.perfTab === 'monitor') {\n setTimeout(() => this.renderPerfChart(), 100);\n }\n }\n\n setActiveSection(section: 'engines' | 'redundant' | 'performance' | 'cache'): void {\n this.activeSection = section;\n if (section === 'cache') {\n this.refreshCacheData();\n }\n if (section === 'performance' && this.perfTab === 'monitor') {\n // Need to wait for DOM to render before chart can be drawn\n setTimeout(() => this.renderPerfChart(), 50);\n }\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n toggleAutoRefresh(): void {\n if (this.autoRefresh) {\n // Start auto-refresh interval\n interval(5000)\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (this.autoRefresh) {\n this.refreshData();\n }\n });\n }\n this.saveUserPreferencesDebounced();\n }\n\n toggleKpiCards(): void {\n this.kpiCardsCollapsed = !this.kpiCardsCollapsed;\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n async refreshData(): Promise<void> {\n this.isLoading = true;\n this.cdr.markForCheck();\n\n try {\n // Get engine registry stats\n this.engineStats = BaseEngineRegistry.Instance.GetMemoryStats();\n\n // Transform to display format\n this.engines = this.engineStats.engineStats.map(engine => ({\n className: engine.className,\n isLoaded: engine.isLoaded,\n registeredAt: engine.registeredAt,\n lastLoadedAt: engine.lastLoadedAt,\n estimatedMemoryBytes: engine.estimatedMemoryBytes,\n itemCount: engine.itemCount,\n memoryDisplay: this.formatBytes(engine.estimatedMemoryBytes)\n }));\n\n // Get redundantly loaded entities\n const redundantMap = BaseEngineRegistry.Instance.GetRedundantlyLoadedEntities();\n this.redundantLoads = Array.from(redundantMap.entries())\n .map(([entityName, engines]) => ({\n entityName,\n engines\n }))\n .sort((a, b) => b.engines.length - a.engines.length);\n\n // Get telemetry data\n this.refreshTelemetryData();\n\n this.lastUpdated = new Date();\n } catch (error) {\n console.error('Error refreshing diagnostics data:', error);\n } finally {\n this.isLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private refreshTelemetryData(): void {\n const tm = TelemetryManager.Instance;\n this.telemetryEnabled = tm.IsEnabled;\n\n // Get summary stats\n const stats = tm.GetStats();\n this.telemetrySummary = {\n totalEvents: stats.totalEvents,\n totalPatterns: stats.totalPatterns,\n totalInsights: stats.totalInsights,\n activeEvents: stats.activeEvents,\n byCategory: stats.byCategory\n };\n\n // Build categories with data for display\n const categoryNames: TelemetryCategory[] = ['RunView', 'RunQuery', 'Engine', 'AI', 'Cache'];\n this.categoriesWithData = categoryNames\n .filter(cat => stats.byCategory[cat]?.events > 0)\n .map(cat => ({\n name: cat,\n events: stats.byCategory[cat].events,\n avgMs: stats.byCategory[cat].avgMs\n }));\n\n // Get patterns and apply sorting\n const patterns = tm.GetPatterns({ minCount: 1, sortBy: 'count' });\n this.telemetryPatterns = this.sortPatterns(patterns.slice(0, 100).map(p => ({\n fingerprint: p.fingerprint,\n category: p.category,\n operation: p.operation,\n entityName: this.getEntityName(p.sampleParams),\n filter: this.getFilter(p.sampleParams),\n orderBy: this.getOrderBy(p.sampleParams),\n count: p.count,\n avgElapsedMs: Math.round(p.avgElapsedMs * 100) / 100,\n totalElapsedMs: Math.round(p.totalElapsedMs),\n minElapsedMs: p.minElapsedMs === Infinity ? 0 : Math.round(p.minElapsedMs),\n maxElapsedMs: Math.round(p.maxElapsedMs),\n lastSeen: new Date(p.lastSeen),\n sampleParams: p.sampleParams\n })));\n\n // Get all events for timeline\n const events = tm.GetEvents({ limit: 200 });\n this.telemetryEvents = events.map(e => this.eventToDisplay(e));\n\n // Get slow queries (operations above threshold)\n this.slowQueries = this.telemetryEvents\n .filter(e => e.elapsedMs !== undefined && e.elapsedMs >= this.slowQueryThresholdMs)\n .sort((a, b) => (b.elapsedMs || 0) - (a.elapsedMs || 0))\n .slice(0, 20);\n\n // Get insights and convert to display format with expansion support\n const insights = tm.GetInsights({ limit: 20 });\n this.telemetryInsights = insights.map(insight => ({\n ...insight,\n expanded: false,\n relatedEvents: this.getRelatedEventsForInsight(insight)\n }));\n }\n\n private eventToDisplay(e: TelemetryEvent): TelemetryEventDisplay {\n return {\n id: e.id,\n category: e.category,\n operation: e.operation,\n entityName: this.getEntityName(e.params),\n filter: this.getFilter(e.params),\n startTime: e.startTime,\n endTime: e.endTime,\n elapsedMs: e.elapsedMs,\n timestamp: new Date(e.startTime),\n params: e.params\n };\n }\n\n private getRelatedEventsForInsight(insight: TelemetryInsight): TelemetryEventDisplay[] {\n const tm = TelemetryManager.Instance;\n const events = tm.GetEvents({ limit: 500 });\n return events\n .filter(e => insight.relatedEventIds?.includes(e.id))\n .map(e => this.eventToDisplay(e));\n }\n\n private sortPatterns(patterns: TelemetryPatternDisplay[]): TelemetryPatternDisplay[] {\n return [...patterns].sort((a, b) => {\n let comparison = 0;\n switch (this.patternSort.column) {\n case 'category':\n comparison = a.category.localeCompare(b.category);\n break;\n case 'operation':\n comparison = a.operation.localeCompare(b.operation);\n break;\n case 'entity':\n comparison = (a.entityName || '').localeCompare(b.entityName || '');\n break;\n case 'count':\n comparison = a.count - b.count;\n break;\n case 'avgMs':\n comparison = a.avgElapsedMs - b.avgElapsedMs;\n break;\n case 'totalMs':\n comparison = a.totalElapsedMs - b.totalElapsedMs;\n break;\n }\n return this.patternSort.direction === 'asc' ? comparison : -comparison;\n });\n }\n\n sortPatternsBy(column: PatternSortConfig['column']): void {\n if (this.patternSort.column === column) {\n // Toggle direction\n this.patternSort.direction = this.patternSort.direction === 'asc' ? 'desc' : 'asc';\n } else {\n this.patternSort.column = column;\n this.patternSort.direction = 'desc';\n }\n this.telemetryPatterns = this.sortPatterns(this.telemetryPatterns);\n this.cdr.markForCheck();\n }\n\n getSortIcon(column: PatternSortConfig['column']): string {\n if (this.patternSort.column !== column) {\n return 'fa-sort';\n }\n return this.patternSort.direction === 'asc' ? 'fa-sort-up' : 'fa-sort-down';\n }\n\n toggleInsightExpanded(insight: TelemetryInsightDisplay): void {\n insight.expanded = !insight.expanded;\n this.cdr.markForCheck();\n }\n\n setTimelineView(view: 'insights' | 'timeline' | 'chart'): void {\n this.timelineView = view;\n if (view === 'chart') {\n // Render chart after view updates\n setTimeout(() => this.renderPerfChart(), 0);\n }\n this.cdr.markForCheck();\n }\n\n setPerfTab(tab: 'monitor' | 'overview' | 'events' | 'patterns' | 'insights'): void {\n this.perfTab = tab;\n if (tab === 'monitor') {\n // Render chart after view updates\n setTimeout(() => this.renderPerfChart(), 0);\n }\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n jumpToPatternsByCategory(categoryName: string): void {\n this.perfTab = 'patterns';\n this.categoryFilter = categoryName as TelemetryCategory;\n this.cdr.markForCheck();\n }\n\n getInsightFilter(insight: TelemetryInsightDisplay): string | null {\n // Get filter from first related event\n if (insight.relatedEvents.length > 0) {\n return insight.relatedEvents[0].filter;\n }\n return null;\n }\n\n getEventParams(event: TelemetryEventDisplay): Array<{ key: string; value: string }> {\n const params: Array<{ key: string; value: string }> = [];\n if (!event.params) return params;\n\n // Cast to record for dynamic iteration - params have been validated by type guards\n const paramsRecord = event.params as unknown as Record<string, unknown>;\n\n // Show important params first\n const priorityKeys = ['EntityName', 'ViewName', 'ViewID', 'QueryName', 'ExtraFilter', 'OrderBy', 'ResultType', 'MaxRows'];\n const shownKeys = new Set<string>();\n\n // Add priority keys first if they exist\n for (const key of priorityKeys) {\n if (paramsRecord[key] !== undefined && paramsRecord[key] !== null) {\n const value = this.formatParamValue(paramsRecord[key]);\n if (value) {\n params.push({ key, value });\n shownKeys.add(key);\n }\n }\n }\n\n // Add remaining keys\n for (const [key, val] of Object.entries(paramsRecord)) {\n if (!shownKeys.has(key) && !key.startsWith('_')) {\n const value = this.formatParamValue(val);\n if (value) {\n params.push({ key, value });\n }\n }\n }\n\n return params;\n }\n\n private formatParamValue(val: unknown): string {\n if (val === null || val === undefined) return '';\n if (typeof val === 'string') return val || '(empty)';\n if (typeof val === 'boolean') return val ? 'true' : 'false';\n if (typeof val === 'number') return val.toString();\n if (Array.isArray(val)) return val.join(', ');\n if (typeof val === 'object') return JSON.stringify(val);\n return String(val);\n }\n\n /**\n * Check if this is a RunView/RunViews operation\n */\n isRunViewOperation(event: TelemetryEventDisplay): boolean {\n return event.operation === 'ProviderBase.RunView' || event.operation === 'ProviderBase.RunViews';\n }\n\n /**\n * Check if this is a batch RunViews operation\n */\n isRunViewsOperation(event: TelemetryEventDisplay): boolean {\n return event.operation === 'ProviderBase.RunViews';\n }\n\n /**\n * Get entity names for RunViews batch operation (first few for display)\n */\n getRunViewsEntities(event: TelemetryEventDisplay, maxDisplay: number = 3): string[] {\n if (!event.params || !isBatchRunViewParams(event.params)) return [];\n const entities = event.params.Entities;\n if (!entities || !Array.isArray(entities)) return [];\n return entities.slice(0, maxDisplay);\n }\n\n /**\n * Get total entity count for RunViews batch operation\n */\n getRunViewsEntityCount(event: TelemetryEventDisplay): number {\n if (!event.params || !isBatchRunViewParams(event.params)) return 0;\n return event.params.Entities?.length || 0;\n }\n\n /**\n * Check if there are more entities than displayed\n */\n hasMoreEntities(event: TelemetryEventDisplay, maxDisplay: number = 3): boolean {\n return this.getRunViewsEntityCount(event) > maxDisplay;\n }\n\n /**\n * Check if the event was a cache hit (safe accessor for union type params)\n */\n isCacheHit(event: TelemetryEventDisplay | { params: TelemetryParamsUnion }): boolean {\n if (!event?.params) return false;\n // Use isSingleRunViewParams or isSingleRunQueryParams to safely access cacheHit\n if (isSingleRunViewParams(event.params)) {\n return event.params.cacheHit === true;\n }\n if (isSingleRunQueryParams(event.params)) {\n return event.params.cacheHit === true;\n }\n // Handle batch RunViews operations - check cacheHits/cacheMisses counts\n if (isBatchRunViewParams(event.params)) {\n const p = event.params as { cacheHits?: number; cacheMisses?: number };\n // Consider it a cache hit if all items were served from cache\n return (p.cacheHits ?? 0) > 0 && (p.cacheMisses ?? 0) === 0;\n }\n return false;\n }\n\n /**\n * Get entity name from telemetry params (safe accessor for union type)\n */\n getEntityName(params: TelemetryParamsUnion | undefined): string | null {\n if (!params) return null;\n if (isSingleRunViewParams(params)) {\n return params.EntityName || null;\n }\n if (isSingleRunQueryParams(params)) {\n return params.QueryName || null;\n }\n return null;\n }\n\n /**\n * Get filter from telemetry params (safe accessor for union type)\n */\n getFilter(params: TelemetryParamsUnion | undefined): string | null {\n if (!params) return null;\n if (isSingleRunViewParams(params)) {\n return params.ExtraFilter || null;\n }\n return null;\n }\n\n /**\n * Get order by from telemetry params (safe accessor for union type)\n */\n getOrderBy(params: TelemetryParamsUnion | undefined): string | null {\n if (!params) return null;\n if (isSingleRunViewParams(params)) {\n return params.OrderBy || null;\n }\n return null;\n }\n\n /**\n * Get RunView parameter pills for display\n */\n getRunViewPills(event: TelemetryEventDisplay): Array<{ label: string; value: string; type: 'filter' | 'order' | 'result' | 'limit' | 'batch' | 'info' }> {\n const pills: Array<{ label: string; value: string; type: 'filter' | 'order' | 'result' | 'limit' | 'batch' | 'info' }> = [];\n\n // For batch operations, show batch size\n if (this.isRunViewsOperation(event) && event.params && isBatchRunViewParams(event.params)) {\n const batchSize = event.params.BatchSize;\n if (batchSize) {\n pills.push({ label: 'Batch', value: String(batchSize), type: 'batch' });\n }\n }\n\n // For single RunView, show params\n if (!this.isRunViewsOperation(event) && event.params && isSingleRunViewParams(event.params)) {\n const extraFilter = event.params.ExtraFilter;\n if (extraFilter) {\n pills.push({ label: 'Filter', value: this.truncateString(extraFilter, 25), type: 'filter' });\n }\n\n const orderBy = event.params.OrderBy;\n if (orderBy) {\n pills.push({ label: 'Order', value: this.truncateString(orderBy, 20), type: 'order' });\n }\n\n const resultType = event.params.ResultType;\n if (resultType && resultType !== 'simple') {\n pills.push({ label: 'Type', value: resultType, type: 'result' });\n }\n\n const maxRows = event.params.MaxRows;\n if (maxRows && maxRows > 0) {\n pills.push({ label: 'Limit', value: String(maxRows), type: 'limit' });\n }\n }\n\n return pills;\n }\n\n // === Event Detail Panel Methods ===\n\n openEventDetailPanel(event: TelemetryEventDisplay): void {\n // Find related pattern\n const relatedPattern = this.telemetryPatterns.find(p =>\n p.category === event.category &&\n p.operation === event.operation &&\n p.entityName === event.entityName\n ) || null;\n\n this.eventDetailPanel = {\n isOpen: true,\n event,\n relatedPattern\n };\n this.cdr.markForCheck();\n }\n\n closeEventDetailPanel(): void {\n this.eventDetailPanel = {\n isOpen: false,\n event: null,\n relatedPattern: null\n };\n this.cdr.markForCheck();\n }\n\n copyEventToClipboard(event: TelemetryEventDisplay): void {\n const eventData = {\n id: event.id,\n category: event.category,\n operation: event.operation,\n entityName: event.entityName,\n filter: event.filter,\n startTime: event.startTime,\n endTime: event.endTime,\n elapsedMs: event.elapsedMs,\n timestamp: event.timestamp.toISOString(),\n params: event.params\n };\n\n navigator.clipboard.writeText(JSON.stringify(eventData, null, 2))\n .then(() => {\n // Could show a toast notification here\n console.log('Event copied to clipboard');\n })\n .catch(err => {\n console.error('Failed to copy event:', err);\n });\n }\n\n filterByEntity(entityName: string | null): void {\n if (!entityName) return;\n\n this.closeEventDetailPanel();\n this.searchQuery = entityName;\n this.perfTab = 'patterns';\n this.cdr.markForCheck();\n }\n\n exportTelemetryData(): void {\n const exportData = {\n exportedAt: new Date().toISOString(),\n bootTime: this.telemetryBootTime,\n summary: this.telemetrySummary,\n events: this.telemetryEvents.map(e => ({\n id: e.id,\n category: e.category,\n operation: e.operation,\n entityName: e.entityName,\n filter: e.filter,\n startTime: e.startTime,\n endTime: e.endTime,\n elapsedMs: e.elapsedMs,\n timestamp: e.timestamp.toISOString(),\n params: e.params\n })),\n patterns: this.telemetryPatterns.map(p => ({\n fingerprint: p.fingerprint,\n category: p.category,\n operation: p.operation,\n entityName: p.entityName,\n filter: p.filter,\n count: p.count,\n avgElapsedMs: p.avgElapsedMs,\n totalElapsedMs: p.totalElapsedMs,\n minElapsedMs: p.minElapsedMs,\n maxElapsedMs: p.maxElapsedMs,\n lastSeen: p.lastSeen.toISOString()\n })),\n insights: this.telemetryInsights.map(i => ({\n id: i.id,\n category: i.category,\n severity: i.severity,\n title: i.title,\n message: i.message,\n suggestion: i.suggestion,\n entityName: i.entityName,\n timestamp: typeof i.timestamp === 'number' ? new Date(i.timestamp).toISOString() : i.timestamp\n }))\n };\n\n const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `telemetry-export-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.json`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n\n setCategoryFilter(category: TelemetryCategory | 'all'): void {\n this.categoryFilter = category;\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n setCategoryFilterByName(name: string): void {\n // Cast string to TelemetryCategory since we know it comes from categoriesWithData\n this.categoryFilter = name as TelemetryCategory;\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n onSearchChange(): void {\n this.cdr.markForCheck();\n // Debounce URL update for search to avoid too many history changes\n this.updateQueryParamsDebounced();\n }\n\n clearSearch(): void {\n this.searchQuery = '';\n this.cdr.markForCheck();\n this.updateQueryParams();\n }\n\n private searchParamsTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private updateQueryParamsDebounced(): void {\n if (this.searchParamsTimeout) {\n clearTimeout(this.searchParamsTimeout);\n }\n this.searchParamsTimeout = setTimeout(() => {\n this.updateQueryParams();\n }, 300);\n }\n\n get filteredPatterns(): TelemetryPatternDisplay[] {\n let patterns = this.telemetryPatterns;\n\n // Apply category filter\n if (this.categoryFilter !== 'all') {\n patterns = patterns.filter(p => p.category === this.categoryFilter);\n }\n\n // Apply search filter\n if (this.searchQuery.trim()) {\n const query = this.searchQuery.toLowerCase();\n patterns = patterns.filter(p =>\n p.entityName?.toLowerCase().includes(query) ||\n p.operation.toLowerCase().includes(query) ||\n p.filter?.toLowerCase().includes(query) ||\n p.category.toLowerCase().includes(query)\n );\n }\n\n return patterns;\n }\n\n get filteredEvents(): TelemetryEventDisplay[] {\n let events = this.telemetryEvents;\n\n // Apply category filter\n if (this.categoryFilter !== 'all') {\n events = events.filter(e => e.category === this.categoryFilter);\n }\n\n // Apply search filter\n if (this.searchQuery.trim()) {\n const query = this.searchQuery.toLowerCase();\n events = events.filter(e =>\n e.entityName?.toLowerCase().includes(query) ||\n e.operation.toLowerCase().includes(query) ||\n e.filter?.toLowerCase().includes(query) ||\n e.category.toLowerCase().includes(query)\n );\n }\n\n return events;\n }\n\n formatTimestamp(date: Date): string {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n fractionalSecondDigits: 3\n });\n }\n\n truncateString(str: string | null, maxLength: number): string {\n if (!str) return '-';\n if (str.length <= maxLength) return str;\n return str.substring(0, maxLength) + '...';\n }\n\n toggleTelemetry(): void {\n const tm = TelemetryManager.Instance;\n tm.SetEnabled(!tm.IsEnabled);\n this.telemetryEnabled = tm.IsEnabled;\n this.cdr.markForCheck();\n }\n\n clearTelemetry(): void {\n // Only client telemetry can be cleared (server telemetry is read-only)\n TelemetryManager.Instance.Clear();\n TelemetryManager.Instance.ClearInsights();\n this.refreshTelemetryData();\n this.cdr.markForCheck();\n }\n\n /**\n * Switch between client and server telemetry sources\n */\n setTelemetrySource(source: 'client' | 'server'): void {\n if (this.telemetrySource === source) return;\n\n this.telemetrySource = source;\n this.serverTelemetryError = null;\n\n if (source === 'server') {\n this.loadServerTelemetry();\n } else {\n this.refreshTelemetryData();\n }\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Load telemetry data from the server via GraphQL\n */\n private async loadServerTelemetry(): Promise<void> {\n this.serverTelemetryLoading = true;\n this.serverTelemetryError = null;\n this.cdr.markForCheck();\n\n try {\n const gqlProvider = GraphQLDataProvider.Instance;\n\n // Query for server telemetry settings (read-only, configured via mj.config.cjs)\n const settingsQuery = `\n query GetServerTelemetrySettings {\n GetServerTelemetrySettings {\n enabled\n level\n }\n }\n `;\n\n // Query for server telemetry stats\n const statsQuery = `\n query GetServerTelemetryStats {\n GetServerTelemetryStats {\n totalEvents\n totalPatterns\n totalInsights\n activeEvents\n byCategory {\n category\n events\n avgMs\n }\n }\n }\n `;\n\n // Query for server telemetry events\n const eventsQuery = `\n query GetServerTelemetryEvents($filter: TelemetryEventFilterInput) {\n GetServerTelemetryEvents(filter: $filter) {\n id\n category\n operation\n fingerprint\n startTime\n endTime\n elapsedMs\n userId\n params\n tags\n parentEventId\n }\n }\n `;\n\n // Query for server telemetry patterns\n const patternsQuery = `\n query GetServerTelemetryPatterns($filter: TelemetryPatternFilterInput) {\n GetServerTelemetryPatterns(filter: $filter) {\n fingerprint\n category\n operation\n sampleParams\n count\n totalElapsedMs\n avgElapsedMs\n minElapsedMs\n maxElapsedMs\n firstSeen\n lastSeen\n }\n }\n `;\n\n // Query for server telemetry insights\n const insightsQuery = `\n query GetServerTelemetryInsights($filter: TelemetryInsightFilterInput) {\n GetServerTelemetryInsights(filter: $filter) {\n id\n severity\n analyzerName\n category\n title\n message\n suggestion\n relatedEventIds\n entityName\n metadata\n timestamp\n }\n }\n `;\n\n // Execute queries in parallel\n const [settingsResult, statsResult, eventsResult, patternsResult, insightsResult] = await Promise.all([\n gqlProvider.ExecuteGQL(settingsQuery, {}),\n gqlProvider.ExecuteGQL(statsQuery, {}),\n gqlProvider.ExecuteGQL(eventsQuery, { filter: { limit: 200 } }),\n gqlProvider.ExecuteGQL(patternsQuery, { filter: { minCount: 1 } }),\n gqlProvider.ExecuteGQL(insightsQuery, { filter: { limit: 20 } })\n ]);\n\n // Process settings (read-only status from server config)\n if (settingsResult?.GetServerTelemetrySettings) {\n this.serverTelemetryEnabled = settingsResult.GetServerTelemetrySettings.enabled;\n }\n\n // Process stats\n if (statsResult?.GetServerTelemetryStats) {\n const stats = statsResult.GetServerTelemetryStats;\n const byCategory: Record<TelemetryCategory, { events: number; avgMs: number }> = {\n 'RunView': { events: 0, avgMs: 0 },\n 'RunQuery': { events: 0, avgMs: 0 },\n 'Engine': { events: 0, avgMs: 0 },\n 'AI': { events: 0, avgMs: 0 },\n 'Cache': { events: 0, avgMs: 0 },\n 'Coalesce': { events: 0, avgMs: 0 },\n 'Network': { events: 0, avgMs: 0 },\n 'Custom': { events: 0, avgMs: 0 }\n };\n\n for (const cat of stats.byCategory || []) {\n if (cat.category in byCategory) {\n byCategory[cat.category as TelemetryCategory] = {\n events: cat.events,\n avgMs: cat.avgMs\n };\n }\n }\n\n this.telemetrySummary = {\n totalEvents: stats.totalEvents,\n totalPatterns: stats.totalPatterns,\n totalInsights: stats.totalInsights,\n activeEvents: stats.activeEvents,\n byCategory\n };\n\n // Build categories with data\n const categoryNames: TelemetryCategory[] = ['RunView', 'RunQuery', 'Engine', 'AI', 'Cache'];\n this.categoriesWithData = categoryNames\n .filter(cat => byCategory[cat]?.events > 0)\n .map(cat => ({\n name: cat,\n events: byCategory[cat].events,\n avgMs: byCategory[cat].avgMs\n }));\n }\n\n // Process events\n if (eventsResult?.GetServerTelemetryEvents) {\n this.telemetryEvents = eventsResult.GetServerTelemetryEvents.map((e: {\n id: string;\n category: string;\n operation: string;\n startTime: number;\n endTime?: number;\n elapsedMs?: number;\n params: string;\n }) => {\n const params = e.params ? JSON.parse(e.params) : {};\n return {\n id: e.id,\n category: e.category as TelemetryCategory,\n operation: e.operation,\n entityName: params?.EntityName || params?.QueryName || null,\n filter: params?.ExtraFilter || null,\n startTime: e.startTime,\n endTime: e.endTime,\n elapsedMs: e.elapsedMs,\n timestamp: new Date(e.startTime),\n params\n };\n });\n\n // Update slow queries\n this.slowQueries = this.telemetryEvents\n .filter(e => e.elapsedMs !== undefined && e.elapsedMs >= this.slowQueryThresholdMs)\n .sort((a, b) => (b.elapsedMs || 0) - (a.elapsedMs || 0))\n .slice(0, 20);\n }\n\n // Process patterns\n if (patternsResult?.GetServerTelemetryPatterns) {\n this.telemetryPatterns = patternsResult.GetServerTelemetryPatterns.slice(0, 100).map((p: {\n fingerprint: string;\n category: string;\n operation: string;\n sampleParams: string;\n count: number;\n avgElapsedMs: number;\n totalElapsedMs: number;\n minElapsedMs: number;\n maxElapsedMs: number;\n lastSeen: number;\n }) => {\n const sampleParams = p.sampleParams ? JSON.parse(p.sampleParams) : {};\n return {\n fingerprint: p.fingerprint,\n category: p.category as TelemetryCategory,\n operation: p.operation,\n entityName: sampleParams?.EntityName || sampleParams?.QueryName || null,\n filter: sampleParams?.ExtraFilter || null,\n orderBy: sampleParams?.OrderBy || null,\n count: p.count,\n avgElapsedMs: Math.round(p.avgElapsedMs * 100) / 100,\n totalElapsedMs: Math.round(p.totalElapsedMs),\n minElapsedMs: Math.round(p.minElapsedMs),\n maxElapsedMs: Math.round(p.maxElapsedMs),\n lastSeen: new Date(p.lastSeen),\n sampleParams\n };\n });\n }\n\n // Process insights\n if (insightsResult?.GetServerTelemetryInsights) {\n this.telemetryInsights = insightsResult.GetServerTelemetryInsights.map((i: {\n id: string;\n severity: string;\n analyzerName: string;\n category: string;\n title: string;\n message: string;\n suggestion: string;\n relatedEventIds: string[];\n entityName?: string;\n metadata?: string;\n timestamp: number;\n }) => ({\n id: i.id,\n severity: i.severity,\n analyzerName: i.analyzerName,\n category: i.category,\n title: i.title,\n message: i.message,\n suggestion: i.suggestion,\n relatedEventIds: i.relatedEventIds || [],\n entityName: i.entityName,\n metadata: i.metadata ? JSON.parse(i.metadata) : undefined,\n timestamp: i.timestamp,\n expanded: false,\n relatedEvents: []\n }));\n }\n\n this.telemetryEnabled = true; // Server telemetry is available\n } catch (error) {\n console.error('Failed to load server telemetry:', error);\n this.serverTelemetryError = `Failed to load server telemetry: ${error instanceof Error ? error.message : String(error)}`;\n // Clear data on error\n this.telemetrySummary = null;\n this.telemetryEvents = [];\n this.telemetryPatterns = [];\n this.telemetryInsights = [];\n this.slowQueries = [];\n } finally {\n this.serverTelemetryLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n getSeverityClass(severity: string): string {\n switch (severity) {\n case 'info': return 'severity-info';\n case 'warning': return 'severity-warning';\n case 'optimization': return 'severity-optimization';\n default: return '';\n }\n }\n\n getSeverityIcon(severity: string): string {\n switch (severity) {\n case 'info': return 'fa-info-circle';\n case 'warning': return 'fa-exclamation-triangle';\n case 'optimization': return 'fa-lightbulb';\n default: return 'fa-circle';\n }\n }\n\n async refreshAllEngines(): Promise<void> {\n this.isRefreshingEngines = true;\n this.cdr.markForCheck();\n\n try {\n const count = await BaseEngineRegistry.Instance.RefreshAllEngines();\n console.log(`Refreshed ${count} engines`);\n this.refreshData();\n } catch (error) {\n console.error('Error refreshing engines:', error);\n } finally {\n this.isRefreshingEngines = false;\n this.cdr.markForCheck();\n }\n }\n\n formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n\n formatTime(date: Date): string {\n return date.toLocaleTimeString();\n }\n\n formatRelativeTime(ms: number): string {\n if (ms < 1000) {\n return `${ms.toFixed(0)}ms`;\n } else if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n } else {\n const mins = Math.floor(ms / 60000);\n const secs = ((ms % 60000) / 1000).toFixed(0);\n return `${mins}m ${secs}s`;\n }\n }\n\n /**\n * Renders a Windows PerfMon-style D3 time series chart\n * Shows performance events over time with duration spikes\n */\n renderPerfChart(): void {\n if (!this.perfChartRef?.nativeElement) {\n return;\n }\n\n const container = this.perfChartRef.nativeElement;\n const events = this.telemetryEvents.filter(e => e.elapsedMs !== undefined);\n\n if (events.length === 0) {\n container.innerHTML = '<div style=\"color: var(--mj-text-secondary); text-align: center; padding: 100px 20px;\">No telemetry events with timing data yet.<br>Navigate around the app to generate performance data.</div>';\n return;\n }\n\n // Clear previous chart\n container.innerHTML = '';\n\n // Get dimensions\n const rect = container.getBoundingClientRect();\n const width = rect.width || 800;\n const height = rect.height || 300;\n const margin = { top: 20, right: 30, bottom: 40, left: 50 };\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n\n // Calculate boot time (earliest event)\n this.telemetryBootTime = Math.min(...events.map(e => e.startTime));\n\n // Prepare data with relative time\n const allChartData = events.map(e => ({\n ...e,\n relativeTime: e.startTime - this.telemetryBootTime,\n duration: e.elapsedMs || 0\n })).sort((a, b) => a.relativeTime - b.relativeTime);\n\n // Calculate full time range\n const fullTimeRange = d3.max(allChartData, d => d.relativeTime) || 1000;\n\n // Determine viewport bounds\n let viewportStart = this.chartViewportStart;\n let viewportEnd = this.chartViewportEnd;\n\n // If no viewport set or zoom level is 1, show everything\n if (this.chartZoomLevel <= 1 || (viewportStart === 0 && viewportEnd === 0)) {\n viewportStart = 0;\n viewportEnd = fullTimeRange;\n }\n\n // Filter data to only include events within the viewport (with some padding for edge visibility)\n const padding = (viewportEnd - viewportStart) * 0.05; // 5% padding\n const chartData = allChartData.filter(d =>\n d.relativeTime >= (viewportStart - padding) &&\n d.relativeTime <= (viewportEnd + padding)\n );\n\n // If no data in viewport, show a message\n if (chartData.length === 0) {\n container.innerHTML = '<div style=\"color: var(--mj-text-secondary); text-align: center; padding: 100px 20px;\">No events in the current view.<br>Try zooming out or panning to see events.</div>';\n return;\n }\n\n // Calculate effective width with zoom\n const effectiveWidth = innerWidth * this.chartZoomLevel;\n\n // Create SVG with potential scroll for zoomed view\n const svg = d3.select(container)\n .append('svg')\n .attr('width', Math.max(width, effectiveWidth + margin.left + margin.right))\n .attr('height', height);\n\n const g = svg.append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`);\n\n // Handle gap compression\n let xScale: d3.ScaleLinear<number, number>;\n let gapSegments: Array<{ type: 'events' | 'gap'; startTime: number; endTime: number; gapIndex?: number; displayStart: number; displayEnd: number }> = [];\n\n if (this.chartGapCompression && chartData.length > 1) {\n // Identify gaps and create compressed scale\n const segments = this.identifyGaps(chartData, 5000); // 5 second threshold\n const compressedGapWidth = 30; // Fixed width for compressed gaps\n\n // Calculate total display width needed\n let currentX = 0;\n for (const segment of segments) {\n const segmentDuration = segment.endTime - segment.startTime;\n\n if (segment.type === 'gap') {\n const isExpanded = segment.gapIndex !== undefined && this.expandedGaps.has(segment.gapIndex);\n const gapWidth = isExpanded ? (segmentDuration / (d3.max(chartData, d => d.relativeTime) || 1000)) * effectiveWidth : compressedGapWidth;\n\n gapSegments.push({\n ...segment,\n displayStart: currentX,\n displayEnd: currentX + gapWidth\n });\n currentX += gapWidth;\n } else {\n // Event segments get proportional width\n const proportionalWidth = (segmentDuration / (d3.max(chartData, d => d.relativeTime) || 1000)) * effectiveWidth;\n const segmentWidth = Math.max(proportionalWidth, 50); // Minimum width for visibility\n\n gapSegments.push({\n ...segment,\n displayStart: currentX,\n displayEnd: currentX + segmentWidth\n });\n currentX += segmentWidth;\n }\n }\n\n // Create custom scale function based on segments\n const totalDisplayWidth = currentX;\n const baseScale = d3.scaleLinear()\n .domain([0, d3.max(chartData, d => d.relativeTime) || 1000])\n .range([0, Math.min(totalDisplayWidth, effectiveWidth)]);\n\n // Store gap segments for inverse mapping\n this.chartGapSegments = gapSegments;\n\n // Create a custom mapping function for segment-based positioning\n const mapTimeToX = (time: number): number => {\n // Find which segment this time falls into\n for (const seg of gapSegments) {\n if (time >= seg.startTime && time <= seg.endTime) {\n if (seg.type === 'gap') {\n const isExpanded = seg.gapIndex !== undefined && this.expandedGaps.has(seg.gapIndex);\n if (isExpanded) {\n // Linear interpolation within expanded gap\n const ratio = (time - seg.startTime) / (seg.endTime - seg.startTime);\n return seg.displayStart + ratio * (seg.displayEnd - seg.displayStart);\n }\n // Compressed gap - map to center\n return seg.displayStart + (seg.displayEnd - seg.displayStart) / 2;\n } else {\n // Event segment - linear interpolation\n const ratio = (time - seg.startTime) / Math.max(seg.endTime - seg.startTime, 1);\n return seg.displayStart + ratio * (seg.displayEnd - seg.displayStart);\n }\n }\n }\n return baseScale(time);\n };\n\n // Create inverse mapping function for x -> time (used by selection brush)\n const mapXToTime = (x: number): number => {\n // Find which segment this x position falls into\n for (const seg of gapSegments) {\n if (x >= seg.displayStart && x <= seg.displayEnd) {\n if (seg.type === 'gap') {\n const isExpanded = seg.gapIndex !== undefined && this.expandedGaps.has(seg.gapIndex);\n if (isExpanded) {\n // Linear interpolation within expanded gap\n const displayRange = seg.displayEnd - seg.displayStart;\n if (displayRange <= 0) return seg.startTime;\n const ratio = (x - seg.displayStart) / displayRange;\n return seg.startTime + ratio * (seg.endTime - seg.startTime);\n }\n // Compressed gap - return start time (the gap itself has no meaningful selection)\n return seg.startTime;\n } else {\n // Event segment - linear interpolation\n const displayRange = seg.displayEnd - seg.displayStart;\n if (displayRange <= 0) return seg.startTime;\n const ratio = (x - seg.displayStart) / displayRange;\n return seg.startTime + ratio * (seg.endTime - seg.startTime);\n }\n }\n }\n return baseScale.invert(x);\n };\n\n // Use base scale but override the call behavior via a proxy-like wrapper\n xScale = Object.assign(\n (time: number) => mapTimeToX(time),\n {\n domain: baseScale.domain.bind(baseScale),\n range: () => [0, Math.min(totalDisplayWidth, effectiveWidth)] as [number, number],\n ticks: baseScale.ticks.bind(baseScale),\n tickFormat: baseScale.tickFormat.bind(baseScale),\n nice: baseScale.nice.bind(baseScale),\n copy: baseScale.copy.bind(baseScale),\n invert: mapXToTime, // Use our custom inverse function!\n clamp: baseScale.clamp.bind(baseScale),\n unknown: baseScale.unknown.bind(baseScale),\n interpolate: baseScale.interpolate.bind(baseScale),\n rangeRound: baseScale.rangeRound.bind(baseScale)\n }\n ) as unknown as d3.ScaleLinear<number, number>;\n\n // Draw gap indicators\n for (const seg of gapSegments) {\n if (seg.type === 'gap' && seg.gapIndex !== undefined) {\n const isExpanded = this.expandedGaps.has(seg.gapIndex);\n if (!isExpanded) {\n this.drawGapIndicator(\n g,\n seg.displayStart,\n seg.displayEnd - seg.displayStart,\n innerHeight,\n seg.endTime - seg.startTime,\n seg.gapIndex\n );\n }\n }\n }\n } else {\n // Standard linear scale - clear gap segments\n this.chartGapSegments = [];\n // Use viewport bounds for domain when zoomed\n xScale = d3.scaleLinear()\n .domain([viewportStart, viewportEnd])\n .range([0, innerWidth]); // Use innerWidth, not effectiveWidth for proper fit\n }\n\n // Calculate Y-scale from VISIBLE data only (not all data)\n const visibleMaxDuration = d3.max(chartData, d => d.duration) || 100;\n const yScale = d3.scaleLinear()\n .domain([0, visibleMaxDuration * 1.1]) // Add 10% padding at top\n .range([innerHeight, 0])\n .nice();\n\n // Draw grid lines\n this.drawGridLines(g, xScale, yScale, effectiveWidth, innerHeight);\n\n // Draw axes\n this.drawAxes(g, xScale, yScale, innerHeight);\n\n // Color mapping for categories\n const categoryColors: Record<string, string> = {\n 'RunView': '#00bcd4',\n 'RunQuery': '#e040fb',\n 'Engine': '#00ff88',\n 'AI': '#ff9800',\n 'Cache': '#f06292',\n 'Network': '#26a69a',\n 'Custom': '#78909c'\n };\n\n // Draw area fill for each category (like PerfMon background)\n const categories = [...new Set(chartData.map(d => d.category))];\n categories.forEach(category => {\n const categoryData = chartData.filter(d => d.category === category);\n if (categoryData.length > 1) {\n this.drawCategoryArea(g, categoryData, xScale, yScale, innerHeight, categoryColors[category] || '#78909c');\n }\n });\n\n // Draw event points\n this.drawEventPoints(g, chartData, xScale, yScale, categoryColors, container);\n\n // Draw threshold line for slow queries\n this.drawThresholdLine(g, yScale, effectiveWidth, this.slowQueryThresholdMs);\n\n // Add selection brush for drag-to-zoom and pan\n this.addSelectionBrush(svg, g, xScale, innerHeight, margin, allChartData, fullTimeRange);\n\n // Store scale and dimensions for selection calculations\n this.chartXScale = xScale;\n this.chartMarginLeft = margin.left;\n\n this.chartInitialized = true;\n }\n\n private drawGridLines(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n xScale: d3.ScaleLinear<number, number>,\n yScale: d3.ScaleLinear<number, number>,\n width: number,\n height: number\n ): void {\n // Horizontal grid lines\n const yTicks = yScale.ticks(5);\n g.selectAll('.grid-line-h')\n .data(yTicks)\n .enter()\n .append('line')\n .attr('class', 'grid-line')\n .attr('x1', 0)\n .attr('x2', width)\n .attr('y1', d => yScale(d))\n .attr('y2', d => yScale(d))\n .attr('stroke', '#333')\n .attr('stroke-dasharray', '2,2');\n\n // Vertical grid lines\n const xTicks = xScale.ticks(10);\n g.selectAll('.grid-line-v')\n .data(xTicks)\n .enter()\n .append('line')\n .attr('class', 'grid-line')\n .attr('x1', d => xScale(d))\n .attr('x2', d => xScale(d))\n .attr('y1', 0)\n .attr('y2', height)\n .attr('stroke', '#333')\n .attr('stroke-dasharray', '2,2');\n }\n\n private drawAxes(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n xScale: d3.ScaleLinear<number, number>,\n yScale: d3.ScaleLinear<number, number>,\n height: number\n ): void {\n // X axis with better time formatting\n const xDomain = xScale.domain();\n const timeRange = xDomain[1] - xDomain[0];\n\n // Choose appropriate number of ticks based on range\n const numTicks = Math.min(10, Math.max(5, Math.floor(timeRange / 1000)));\n\n const xAxis = d3.axisBottom(xScale)\n .ticks(numTicks)\n .tickFormat(d => this.formatAxisTime(d as number));\n\n const xAxisGroup = g.append('g')\n .attr('transform', `translate(0,${height})`)\n .call(xAxis)\n .attr('class', 'axis-line');\n\n xAxisGroup.selectAll('text')\n .attr('class', 'axis-text')\n .attr('fill', '#888')\n .attr('font-size', '11px');\n\n // X axis label\n xAxisGroup.append('text')\n .attr('class', 'axis-label')\n .attr('x', xScale.range()[1] / 2)\n .attr('y', 35)\n .attr('fill', '#666')\n .attr('font-size', '11px')\n .attr('text-anchor', 'middle')\n .text('Time since process start');\n\n // Y axis with proper duration formatting\n const yMax = yScale.domain()[1];\n const yAxis = d3.axisLeft(yScale)\n .ticks(6)\n .tickFormat(d => this.formatAxisDuration(d as number, yMax));\n\n const yAxisGroup = g.append('g')\n .call(yAxis)\n .attr('class', 'axis-line');\n\n yAxisGroup.selectAll('text')\n .attr('class', 'axis-text')\n .attr('fill', '#888')\n .attr('font-size', '11px');\n\n // Y axis label\n yAxisGroup.append('text')\n .attr('class', 'axis-label')\n .attr('transform', 'rotate(-90)')\n .attr('x', -height / 2)\n .attr('y', -40)\n .attr('fill', '#666')\n .attr('font-size', '11px')\n .attr('text-anchor', 'middle')\n .text('Duration');\n }\n\n /**\n * Format time for axis labels - shows relative time since process start\n */\n private formatAxisTime(ms: number): string {\n if (ms < 1000) {\n return `${Math.round(ms)}ms`;\n } else if (ms < 60000) {\n const secs = ms / 1000;\n return secs % 1 === 0 ? `${secs}s` : `${secs.toFixed(1)}s`;\n } else if (ms < 3600000) {\n const mins = Math.floor(ms / 60000);\n const secs = Math.floor((ms % 60000) / 1000);\n return secs > 0 ? `${mins}m${secs}s` : `${mins}m`;\n } else {\n const hours = Math.floor(ms / 3600000);\n const mins = Math.floor((ms % 3600000) / 60000);\n return mins > 0 ? `${hours}h${mins}m` : `${hours}h`;\n }\n }\n\n /**\n * Format duration for Y axis labels\n */\n private formatAxisDuration(ms: number, maxValue: number): string {\n // If max is >= 1000ms, show in seconds for values >= 1000\n if (maxValue >= 1000 && ms >= 1000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n return `${Math.round(ms)}ms`;\n }\n\n private drawCategoryArea(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n data: Array<{ relativeTime: number; duration: number }>,\n xScale: d3.ScaleLinear<number, number>,\n yScale: d3.ScaleLinear<number, number>,\n height: number,\n color: string\n ): void {\n const area = d3.area<{ relativeTime: number; duration: number }>()\n .x(d => xScale(d.relativeTime))\n .y0(height)\n .y1(d => yScale(d.duration))\n .curve(d3.curveMonotoneX);\n\n g.append('path')\n .datum(data)\n .attr('class', 'area-fill')\n .attr('d', area)\n .attr('fill', color)\n .attr('opacity', 0.1);\n\n // Line on top\n const line = d3.line<{ relativeTime: number; duration: number }>()\n .x(d => xScale(d.relativeTime))\n .y(d => yScale(d.duration))\n .curve(d3.curveMonotoneX);\n\n g.append('path')\n .datum(data)\n .attr('class', 'line-path')\n .attr('d', line)\n .attr('stroke', color)\n .attr('fill', 'none')\n .attr('stroke-width', 1.5)\n .attr('opacity', 0.6);\n }\n\n private drawEventPoints(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n data: Array<TelemetryEventDisplay & { relativeTime: number; duration: number }>,\n xScale: d3.ScaleLinear<number, number>,\n yScale: d3.ScaleLinear<number, number>,\n categoryColors: Record<string, string>,\n container: HTMLDivElement\n ): void {\n // Create tooltip\n const tooltip = g.append('g')\n .attr('class', 'tooltip')\n .style('display', 'none');\n\n tooltip.append('rect')\n .attr('class', 'tooltip-bg')\n .attr('fill', 'rgba(0, 0, 0, 0.9)')\n .attr('rx', 4);\n\n const tooltipText = tooltip.append('text')\n .attr('class', 'tooltip-text')\n .attr('fill', '#fff')\n .attr('font-size', '11px')\n .attr('font-family', 'monospace');\n\n // Split data into cached and non-cached events\n const nonCachedData = data.filter(d => !this.isCacheHit(d));\n const cachedData = data.filter(d => this.isCacheHit(d));\n\n // Helper to show tooltip\n const showTooltip = (event: MouseEvent, d: TelemetryEventDisplay & { relativeTime: number; duration: number }) => {\n // Update tooltip content\n const isCached = this.isCacheHit(d);\n const lines = [\n `${d.category}: ${d.operation}`,\n d.entityName ? `Entity: ${d.entityName}` : null,\n `Duration: ${d.duration.toFixed(0)}ms`,\n isCached ? '⚡ CACHED' : null,\n `Time: +${this.formatRelativeTime(d.relativeTime)}`\n ].filter(Boolean);\n\n tooltipText.selectAll('tspan').remove();\n lines.forEach((line, i) => {\n tooltipText.append('tspan')\n .attr('x', 8)\n .attr('dy', i === 0 ? '1.2em' : '1.4em')\n .text(line as string);\n });\n\n // Size tooltip background\n const textBBox = (tooltipText.node() as SVGTextElement).getBBox();\n tooltip.select('.tooltip-bg')\n .attr('width', textBBox.width + 16)\n .attr('height', textBBox.height + 12)\n .attr('y', textBBox.y - 6);\n\n // Position tooltip\n const x = xScale(d.relativeTime);\n const y = yScale(d.duration);\n const tooltipWidth = textBBox.width + 16;\n\n // Flip tooltip if too close to right edge\n const translateX = x + tooltipWidth + 20 > (container.clientWidth - 80) ? x - tooltipWidth - 10 : x + 10;\n tooltip.attr('transform', `translate(${translateX},${y - 20})`);\n tooltip.style('display', 'block');\n };\n\n const hideTooltip = () => {\n tooltip.style('display', 'none');\n };\n\n // Draw circles for non-cached events\n g.selectAll('.event-point-circle')\n .data(nonCachedData)\n .enter()\n .append('circle')\n .attr('class', 'event-point event-point-circle')\n .attr('cx', d => xScale(d.relativeTime))\n .attr('cy', d => yScale(d.duration))\n .attr('r', d => d.duration >= this.slowQueryThresholdMs ? 5 : 3)\n .attr('fill', d => categoryColors[d.category] || '#78909c')\n .attr('stroke', d => d.duration >= this.slowQueryThresholdMs ? '#ff5252' : 'none')\n .attr('stroke-width', 2)\n .style('cursor', 'pointer')\n .on('mouseenter', (event: MouseEvent, d) => {\n const target = event.target as SVGCircleElement;\n d3.select(target).attr('r', 7);\n showTooltip(event, d);\n })\n .on('mouseleave', (event: MouseEvent, d) => {\n const target = event.target as SVGCircleElement;\n d3.select(target).attr('r', d.duration >= this.slowQueryThresholdMs ? 5 : 3);\n hideTooltip();\n })\n .on('click', (_event: MouseEvent, d) => {\n // Open detail panel for this event\n this.ngZone.run(() => {\n this.openEventDetailPanel(d);\n });\n });\n\n // Draw bolt symbols for cached events\n // SVG path for a lightning bolt shape\n const boltPath = 'M-3,-6 L1,-6 L0,-1 L4,-1 L-2,6 L0,1 L-4,1 Z';\n\n g.selectAll('.event-point-bolt')\n .data(cachedData)\n .enter()\n .append('path')\n .attr('class', 'event-point event-point-bolt')\n .attr('d', boltPath)\n .attr('transform', d => `translate(${xScale(d.relativeTime)},${yScale(d.duration)}) scale(${d.duration >= this.slowQueryThresholdMs ? 1.3 : 1})`)\n .attr('fill', '#f59e0b')\n .attr('stroke', d => d.duration >= this.slowQueryThresholdMs ? '#ff5252' : categoryColors[d.category] || '#78909c')\n .attr('stroke-width', 1.5)\n .style('cursor', 'pointer')\n .style('filter', 'drop-shadow(0 0 2px rgba(245, 158, 11, 0.5))')\n .on('mouseenter', (event: MouseEvent, d) => {\n const target = event.target as SVGPathElement;\n d3.select(target)\n .attr('transform', `translate(${xScale(d.relativeTime)},${yScale(d.duration)}) scale(1.5)`)\n .style('filter', 'drop-shadow(0 0 4px rgba(245, 158, 11, 0.8))');\n showTooltip(event, d);\n })\n .on('mouseleave', (event: MouseEvent, d) => {\n const target = event.target as SVGPathElement;\n d3.select(target)\n .attr('transform', `translate(${xScale(d.relativeTime)},${yScale(d.duration)}) scale(${d.duration >= this.slowQueryThresholdMs ? 1.3 : 1})`)\n .style('filter', 'drop-shadow(0 0 2px rgba(245, 158, 11, 0.5))');\n hideTooltip();\n })\n .on('click', (_event: MouseEvent, d) => {\n // Open detail panel for this event\n this.ngZone.run(() => {\n this.openEventDetailPanel(d);\n });\n });\n }\n\n private drawThresholdLine(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n yScale: d3.ScaleLinear<number, number>,\n width: number,\n threshold: number\n ): void {\n const yPos = yScale(threshold);\n\n // Only draw if threshold is within visible range\n if (yPos > 0 && yPos < yScale.range()[0]) {\n g.append('line')\n .attr('x1', 0)\n .attr('x2', width)\n .attr('y1', yPos)\n .attr('y2', yPos)\n .attr('stroke', '#ff5252')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '5,3')\n .attr('opacity', 0.7);\n\n g.append('text')\n .attr('x', width - 5)\n .attr('y', yPos - 5)\n .attr('text-anchor', 'end')\n .attr('fill', '#ff5252')\n .attr('font-size', '10px')\n .text(`Slow (>${threshold}ms)`);\n }\n }\n\n // === Chart Zoom and Gap Compression Methods ===\n\n /**\n * Zoom the chart in or out\n */\n zoomPerfChart(direction: 'in' | 'out'): void {\n const zoomFactor = 1.5;\n if (direction === 'in') {\n this.chartZoomLevel = Math.min(this.chartZoomLevel * zoomFactor, 100); // Allow up to 100x zoom\n } else {\n this.chartZoomLevel = Math.max(this.chartZoomLevel / zoomFactor, 0.25); // Allow zoom out to 25%\n }\n this.renderPerfChart();\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Reset chart zoom to default\n */\n resetPerfChartZoom(): void {\n this.chartZoomLevel = 1;\n this.chartViewportStart = 0;\n this.chartViewportEnd = 0;\n this.chartTimeRangeStart = null;\n this.chartTimeRangeEnd = null;\n this.expandedGaps.clear();\n this.renderPerfChart();\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Handle gap compression toggle\n */\n onGapCompressionChange(): void {\n this.expandedGaps.clear();\n this.renderPerfChart();\n this.cdr.markForCheck();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Set chart interaction mode (select for drag-to-zoom, pan for click-to-view)\n */\n setChartInteractionMode(mode: 'pointer' | 'select' | 'pan'): void {\n this.chartInteractionMode = mode;\n this.renderPerfChart(); // Re-render to update cursor and behavior\n this.cdr.markForCheck();\n }\n\n /**\n * Returns the appropriate cursor style based on the current chart interaction mode\n */\n private getChartCursor(): string {\n switch (this.chartInteractionMode) {\n case 'pointer':\n return 'default';\n case 'select':\n return 'crosshair';\n case 'pan':\n return 'grab';\n default:\n return 'default';\n }\n }\n\n /**\n * Returns whether the overlay should intercept pointer events based on the current mode\n */\n private getOverlayPointerEvents(): string {\n // In pointer mode, let events pass through to the data points\n // In select/pan mode, the overlay needs to capture events\n return this.chartInteractionMode === 'pointer' ? 'none' : 'all';\n }\n\n /**\n * Identifies gaps in the data where there's no activity\n * Returns segments with their type (events or gap)\n */\n private identifyGaps(\n events: Array<{ relativeTime: number; duration: number }>,\n gapThresholdMs: number = 5000\n ): Array<{ type: 'events' | 'gap'; startTime: number; endTime: number; gapIndex?: number; events?: typeof events }> {\n if (events.length === 0) return [];\n\n const segments: Array<{ type: 'events' | 'gap'; startTime: number; endTime: number; gapIndex?: number; events?: typeof events }> = [];\n let gapIndex = 0;\n\n // Sort events by time\n const sortedEvents = [...events].sort((a, b) => a.relativeTime - b.relativeTime);\n\n let currentSegmentStart = sortedEvents[0].relativeTime;\n let currentSegmentEvents: typeof events = [];\n let lastEventTime = sortedEvents[0].relativeTime;\n\n for (let i = 0; i < sortedEvents.length; i++) {\n const event = sortedEvents[i];\n const timeSinceLastEvent = event.relativeTime - lastEventTime;\n\n if (timeSinceLastEvent > gapThresholdMs && currentSegmentEvents.length > 0) {\n // Close current event segment\n segments.push({\n type: 'events',\n startTime: currentSegmentStart,\n endTime: lastEventTime,\n events: currentSegmentEvents\n });\n\n // Add gap segment\n segments.push({\n type: 'gap',\n startTime: lastEventTime,\n endTime: event.relativeTime,\n gapIndex: gapIndex++\n });\n\n // Start new segment\n currentSegmentStart = event.relativeTime;\n currentSegmentEvents = [event];\n } else {\n currentSegmentEvents.push(event);\n }\n\n lastEventTime = event.relativeTime;\n }\n\n // Close final segment\n if (currentSegmentEvents.length > 0) {\n segments.push({\n type: 'events',\n startTime: currentSegmentStart,\n endTime: lastEventTime,\n events: currentSegmentEvents\n });\n }\n\n return segments;\n }\n\n /**\n * Draws a compressed gap indicator\n */\n private drawGapIndicator(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n x: number,\n width: number,\n height: number,\n gapDurationMs: number,\n gapIndex: number\n ): void {\n const isExpanded = this.expandedGaps.has(gapIndex);\n\n // Draw striped background\n const pattern = g.append('defs')\n .append('pattern')\n .attr('id', `gap-pattern-${gapIndex}`)\n .attr('patternUnits', 'userSpaceOnUse')\n .attr('width', 8)\n .attr('height', 8)\n .attr('patternTransform', 'rotate(45)');\n\n pattern.append('rect')\n .attr('width', 8)\n .attr('height', 8)\n .attr('fill', '#f5f5f5');\n\n pattern.append('line')\n .attr('x1', 0)\n .attr('y1', 0)\n .attr('x2', 0)\n .attr('y2', 8)\n .attr('stroke', '#e0e0e0')\n .attr('stroke-width', 4);\n\n // Gap rectangle\n const gapRect = g.append('rect')\n .attr('x', x)\n .attr('y', 0)\n .attr('width', width)\n .attr('height', height)\n .attr('fill', `url(#gap-pattern-${gapIndex})`)\n .attr('stroke', '#ccc')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '4,2')\n .style('cursor', 'pointer');\n\n // Vertical text showing gap duration\n const gapText = this.formatRelativeTime(gapDurationMs);\n const textG = g.append('g')\n .attr('transform', `translate(${x + width / 2}, ${height / 2})`)\n .style('pointer-events', 'none');\n\n textG.append('text')\n .attr('transform', 'rotate(-90)')\n .attr('text-anchor', 'middle')\n .attr('fill', '#888')\n .attr('font-size', '10px')\n .attr('font-weight', '500')\n .text(`${gapText} gap`);\n\n // Click handler to expand/collapse\n gapRect.on('click', () => {\n this.ngZone.run(() => {\n if (this.expandedGaps.has(gapIndex)) {\n this.expandedGaps.delete(gapIndex);\n } else {\n this.expandedGaps.add(gapIndex);\n }\n this.renderPerfChart();\n });\n });\n }\n\n /**\n * Adds a drag-to-select brush overlay for zooming into a time range\n * Only active when chartInteractionMode is 'select'\n */\n private addSelectionBrush(\n svg: d3.Selection<SVGSVGElement, unknown, null, undefined>,\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n xScale: d3.ScaleLinear<number, number>,\n innerHeight: number,\n _margin: { top: number; right: number; bottom: number; left: number },\n allChartData: Array<{ relativeTime: number; duration: number }>,\n fullTimeRange: number\n ): void {\n // Create a transparent overlay for mouse events\n // Cursor and pointer-events depend on interaction mode\n const overlay = g.append('rect')\n .attr('class', 'selection-overlay')\n .attr('width', xScale.range()[1])\n .attr('height', innerHeight)\n .attr('fill', 'transparent')\n .style('cursor', this.getChartCursor())\n .style('pointer-events', this.getOverlayPointerEvents());\n\n // Selection rectangle (initially hidden) - only used in select mode\n const selectionRect = g.append('rect')\n .attr('class', 'selection-rect')\n .attr('fill', 'rgba(0, 255, 136, 0.15)')\n .attr('stroke', '#00ff88')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '4,2')\n .style('display', 'none');\n\n let startX = 0;\n let isDragging = false;\n let isPanning = false;\n let panStartX = 0;\n let panStartViewportStart = 0;\n\n // Store the inverse scale function for mapping x back to time\n const getTimeFromX = (x: number): number => {\n // For gap-compressed scales, we need to use invert if available\n if (typeof xScale.invert === 'function') {\n return xScale.invert(x);\n }\n // Fallback: linear interpolation\n const domain = xScale.domain();\n const range = xScale.range();\n const ratio = (x - range[0]) / (range[1] - range[0]);\n return domain[0] + ratio * (domain[1] - domain[0]);\n };\n\n overlay.on('mousedown', (event: MouseEvent) => {\n if (this.chartInteractionMode === 'select') {\n // Selection mode - drag to zoom\n isDragging = true;\n this.isSelecting = true;\n const [x] = d3.pointer(event, overlay.node());\n startX = Math.max(0, Math.min(x, xScale.range()[1]));\n this.selectionStartX = startX;\n\n selectionRect\n .attr('x', startX)\n .attr('y', 0)\n .attr('width', 0)\n .attr('height', innerHeight)\n .style('display', 'block');\n } else if (this.chartInteractionMode === 'pan') {\n // Pan mode - drag to pan\n isPanning = true;\n const [x] = d3.pointer(event, overlay.node());\n panStartX = x;\n panStartViewportStart = this.chartViewportStart;\n overlay.style('cursor', 'grabbing');\n }\n });\n\n svg.on('mousemove', (event: MouseEvent) => {\n if (isDragging && this.chartInteractionMode === 'select') {\n const [x] = d3.pointer(event, g.node());\n const currentX = Math.max(0, Math.min(x, xScale.range()[1]));\n\n const rectX = Math.min(startX, currentX);\n const rectWidth = Math.abs(currentX - startX);\n\n selectionRect\n .attr('x', rectX)\n .attr('width', rectWidth);\n } else if (isPanning && this.chartInteractionMode === 'pan') {\n const [x] = d3.pointer(event, g.node());\n const deltaX = x - panStartX;\n\n // Convert pixel delta to time delta\n const pixelsPerMs = xScale.range()[1] / ((xScale.domain()[1] - xScale.domain()[0]) || 1);\n const timeDelta = -deltaX / pixelsPerMs; // Negative because dragging right should move viewport left\n\n // Calculate new viewport position using the full time range\n const viewportSize = (this.chartViewportEnd - this.chartViewportStart) || fullTimeRange / this.chartZoomLevel;\n\n let newStart = panStartViewportStart + timeDelta;\n // Clamp to valid range\n newStart = Math.max(0, Math.min(newStart, fullTimeRange - viewportSize));\n\n this.chartViewportStart = newStart;\n this.chartViewportEnd = newStart + viewportSize;\n\n // Re-render chart with new viewport\n this.ngZone.run(() => {\n this.renderPerfChart();\n });\n }\n });\n\n svg.on('mouseup', (event: MouseEvent) => {\n if (isDragging && this.chartInteractionMode === 'select') {\n isDragging = false;\n this.isSelecting = false;\n\n const [x] = d3.pointer(event, g.node());\n const endX = Math.max(0, Math.min(x, xScale.range()[1]));\n\n selectionRect.style('display', 'none');\n\n // Only zoom if selection is significant (> 20 pixels)\n const selectionWidth = Math.abs(endX - startX);\n if (selectionWidth > 20) {\n const startTime = getTimeFromX(Math.min(startX, endX));\n const endTime = getTimeFromX(Math.max(startX, endX));\n\n this.ngZone.run(() => {\n this.zoomToTimeRange(startTime, endTime, allChartData);\n });\n }\n } else if (isPanning) {\n isPanning = false;\n overlay.style('cursor', 'grab');\n }\n });\n\n // Cancel selection/pan on mouse leave\n svg.on('mouseleave', () => {\n if (isDragging) {\n isDragging = false;\n this.isSelecting = false;\n selectionRect.style('display', 'none');\n }\n if (isPanning) {\n isPanning = false;\n overlay.style('cursor', 'grab');\n }\n });\n }\n\n /**\n * Zooms the chart to show only events within the specified time range\n */\n private zoomToTimeRange(\n startTime: number,\n endTime: number,\n allData: Array<{ relativeTime: number; duration: number }>\n ): void {\n // Store the time range for filtering\n this.chartTimeRangeStart = startTime;\n this.chartTimeRangeEnd = endTime;\n\n // Calculate zoom level based on selection\n const fullRange = (d3.max(allData, d => d.relativeTime) || 1000) - (d3.min(allData, d => d.relativeTime) || 0);\n const selectedRange = endTime - startTime;\n const newZoomLevel = fullRange / Math.max(selectedRange, 10); // Allow very fine selections (down to 10ms)\n\n this.chartZoomLevel = Math.min(Math.max(newZoomLevel, 1), 100); // Allow up to 100x zoom\n this.chartViewportStart = startTime;\n this.chartViewportEnd = endTime;\n\n this.renderPerfChart();\n this.cdr.markForCheck();\n }\n\n // === Local Cache Methods ===\n\n /**\n * Refreshes cache data from LocalCacheManager\n */\n refreshCacheData(): void {\n const lcm = LocalCacheManager.Instance;\n this.cacheInitialized = lcm.IsInitialized;\n\n if (this.cacheInitialized) {\n this.cacheStats = lcm.GetStats();\n this.cacheEntries = lcm.GetAllEntries();\n this.cacheHitRate = lcm.GetHitRate();\n } else {\n this.cacheStats = null;\n this.cacheEntries = [];\n this.cacheHitRate = 0;\n }\n\n this.cdr.markForCheck();\n }\n\n /**\n * Getter for filtered cache entries based on type filter\n */\n get filteredCacheEntries(): CacheEntryInfo[] {\n if (this.cacheTypeFilter === 'all') {\n return this.cacheEntries;\n }\n return this.cacheEntries.filter(e => e.type === this.cacheTypeFilter);\n }\n\n /**\n * Sets the cache type filter\n */\n setCacheTypeFilter(type: CacheEntryType | 'all'): void {\n this.cacheTypeFilter = type;\n this.cdr.markForCheck();\n }\n\n /**\n * Clears all cache entries\n */\n async clearAllCache(): Promise<void> {\n const lcm = LocalCacheManager.Instance;\n if (lcm.IsInitialized) {\n await lcm.ClearAll();\n this.refreshCacheData();\n }\n }\n\n /**\n * Invalidates a single cache entry\n */\n async invalidateCacheEntry(entry: CacheEntryInfo): Promise<void> {\n const lcm = LocalCacheManager.Instance;\n if (!lcm.IsInitialized) return;\n\n // Remove based on type\n if (entry.type === 'runview' && entry.fingerprint) {\n await lcm.InvalidateRunViewResult(entry.fingerprint);\n } else if (entry.type === 'dataset') {\n // For datasets, we need to call ClearDataset with proper params\n // Since we don't have the full params, use the key directly\n // This is a simplified approach - in production you'd want more robust handling\n await lcm.InvalidateRunViewResult(entry.key);\n } else if (entry.type === 'runquery' && entry.fingerprint) {\n await lcm.InvalidateRunViewResult(entry.fingerprint);\n }\n\n this.refreshCacheData();\n }\n\n /**\n * Formats a cache timestamp (unix ms) to display string\n */\n formatCacheTimestamp(timestamp: number): string {\n const date = new Date(timestamp);\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n });\n }\n\n // === Engine Detail Panel Methods ===\n\n /**\n * Refresh a single engine\n */\n async refreshSingleEngine(engine: EngineDiagnosticInfo, event: Event): Promise<void> {\n event.stopPropagation();\n this.isRefreshingSingleEngine = engine.className;\n this.cdr.markForCheck();\n\n try {\n const engineInstance = BaseEngineRegistry.Instance.GetEngine<{ RefreshAllItems: () => Promise<void> }>(engine.className);\n if (engineInstance && typeof engineInstance.RefreshAllItems === 'function') {\n await engineInstance.RefreshAllItems();\n console.log(`Refreshed engine: ${engine.className}`);\n }\n this.refreshData();\n } catch (error) {\n console.error(`Error refreshing engine ${engine.className}:`, error);\n } finally {\n this.isRefreshingSingleEngine = null;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Opens the engine detail panel for a specific engine\n */\n openEngineDetailPanel(engine: EngineDiagnosticInfo): void {\n const configItems = this.getEngineConfigItems(engine.className);\n\n this.engineDetailPanel = {\n isOpen: true,\n engine,\n configItems,\n isRefreshing: false\n };\n this.cdr.markForCheck();\n }\n\n /**\n * Closes the engine detail panel\n */\n closeEngineDetailPanel(): void {\n this.engineDetailPanel = {\n isOpen: false,\n engine: null,\n configItems: [],\n isRefreshing: false\n };\n this.cdr.markForCheck();\n }\n\n /**\n * Refreshes the engine shown in the detail panel\n */\n async refreshEngineInDetailPanel(): Promise<void> {\n if (!this.engineDetailPanel.engine) return;\n\n this.engineDetailPanel.isRefreshing = true;\n this.cdr.markForCheck();\n\n try {\n const engineInstance = BaseEngineRegistry.Instance.GetEngine<{ RefreshAllItems: () => Promise<void> }>(\n this.engineDetailPanel.engine.className\n );\n if (engineInstance && typeof engineInstance.RefreshAllItems === 'function') {\n await engineInstance.RefreshAllItems();\n }\n\n // Refresh the data and reopen panel with updated info\n await this.refreshData();\n\n // Update the panel with refreshed data\n const updatedEngine = this.engines.find(e => e.className === this.engineDetailPanel.engine?.className);\n if (updatedEngine) {\n this.engineDetailPanel.engine = updatedEngine;\n this.engineDetailPanel.configItems = this.getEngineConfigItems(updatedEngine.className);\n }\n } catch (error) {\n console.error('Error refreshing engine in detail panel:', error);\n } finally {\n this.engineDetailPanel.isRefreshing = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Gets config items for an engine by examining its Configs property\n */\n private getEngineConfigItems(className: string): EngineConfigItemDisplay[] {\n const engineInstance = BaseEngineRegistry.Instance.GetEngine<{\n Configs?: Array<{\n Type: 'entity' | 'dataset';\n PropertyName: string;\n EntityName?: string;\n DatasetName?: string;\n Filter?: string;\n OrderBy?: string;\n }>;\n }>(className);\n\n if (!engineInstance || !engineInstance.Configs) {\n return [];\n }\n\n const engineObj = engineInstance as Record<string, unknown>;\n const items: EngineConfigItemDisplay[] = [];\n\n for (const config of engineInstance.Configs) {\n const propValue = engineObj[config.PropertyName];\n const dataArray = Array.isArray(propValue) ? propValue : [];\n const estimatedBytes = this.estimateArrayMemory(dataArray);\n const initialPageSize = 10;\n const initialData = dataArray.slice(0, initialPageSize);\n\n items.push({\n propertyName: config.PropertyName,\n type: config.Type || 'entity',\n entityName: config.EntityName,\n datasetName: config.DatasetName,\n filter: config.Filter,\n orderBy: config.OrderBy,\n itemCount: dataArray.length,\n estimatedMemoryBytes: estimatedBytes,\n memoryDisplay: this.formatBytes(estimatedBytes),\n sampleData: dataArray, // Store all data for paging\n expanded: false,\n // Paging support\n displayedData: initialData,\n allDataLoaded: dataArray.length <= initialPageSize,\n isLoadingMore: false,\n currentPage: 1,\n pageSize: initialPageSize\n });\n }\n\n return items.sort((a, b) => b.itemCount - a.itemCount);\n }\n\n /**\n * Estimates memory for an array of objects\n */\n private estimateArrayMemory(arr: unknown[]): number {\n if (arr.length === 0) return 0;\n\n // Sample first item to estimate size\n const sample = arr[0];\n let bytesPerItem = 100; // default\n\n if (sample && typeof sample === 'object') {\n try {\n // For MJ entity objects, use GetAll() to get just the data values\n // This avoids serializing the massive metadata/prototype chain\n const sampleObj = sample as { GetAll?: () => Record<string, unknown> };\n const dataToSerialize = sampleObj.GetAll ? sampleObj.GetAll() : sample;\n const json = JSON.stringify(dataToSerialize);\n bytesPerItem = json.length * 2; // UTF-16\n } catch {\n bytesPerItem = 500;\n }\n }\n\n return arr.length * bytesPerItem;\n }\n\n /**\n * Toggle expansion of a config item\n */\n toggleConfigItemExpanded(item: EngineConfigItemDisplay): void {\n item.expanded = !item.expanded;\n this.cdr.markForCheck();\n }\n\n /**\n * Get column names for sample data display\n */\n getSampleDataColumns(item: EngineConfigItemDisplay): string[] {\n if (item.sampleData.length === 0) return [];\n\n const sample = item.sampleData[0];\n if (!sample || typeof sample !== 'object') return [];\n\n // For BaseEntity objects, try to get key properties\n const obj = sample as Record<string, unknown>;\n\n // Check if it's a BaseEntity with GetAll method\n if ('GetAll' in obj && typeof obj.GetAll === 'function') {\n const allData = (obj as { GetAll: () => Record<string, unknown> }).GetAll();\n // Return priority columns first\n const priorityKeys = ['ID', 'Name', 'Description', 'Code', 'Status', 'Type'];\n const availableKeys = Object.keys(allData);\n const result: string[] = [];\n\n for (const key of priorityKeys) {\n if (availableKeys.includes(key)) {\n result.push(key);\n }\n }\n\n // Add remaining keys up to 6 total\n for (const key of availableKeys) {\n if (!result.includes(key) && result.length < 6 && !key.startsWith('_')) {\n result.push(key);\n }\n }\n\n return result;\n }\n\n // For plain objects\n const keys = Object.keys(obj).filter(k => !k.startsWith('_'));\n return keys.slice(0, 6);\n }\n\n /**\n * Get a value from sample data for display\n */\n getSampleDataValue(row: unknown, column: string): string {\n if (!row || typeof row !== 'object') return '';\n\n const obj = row as Record<string, unknown>;\n\n // For BaseEntity objects, use GetAll\n if ('GetAll' in obj && typeof obj.GetAll === 'function') {\n const allData = (obj as { GetAll: () => Record<string, unknown> }).GetAll();\n const value = allData[column];\n return this.formatValueForDisplay(value);\n }\n\n // For plain objects\n const value = obj[column];\n return this.formatValueForDisplay(value);\n }\n\n /**\n * Format a value for display in sample data table\n */\n private formatValueForDisplay(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return value.toString();\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n if (value instanceof Date) return value.toLocaleDateString();\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n }\n\n /**\n * Load more data for a config item (paging)\n */\n loadMoreData(item: EngineConfigItemDisplay): void {\n if (item.isLoadingMore || item.allDataLoaded) return;\n\n item.isLoadingMore = true;\n this.cdr.markForCheck();\n\n // Simulate async loading (data is already in memory)\n setTimeout(() => {\n const nextPage = item.currentPage + 1;\n const startIndex = item.currentPage * item.pageSize;\n const endIndex = startIndex + item.pageSize;\n const newData = item.sampleData.slice(startIndex, endIndex);\n\n item.displayedData = [...item.displayedData, ...newData];\n item.currentPage = nextPage;\n item.allDataLoaded = item.displayedData.length >= item.sampleData.length;\n item.isLoadingMore = false;\n this.cdr.markForCheck();\n }, 100);\n }\n\n /**\n * Load all remaining data for a config item\n */\n loadAllData(item: EngineConfigItemDisplay): void {\n if (item.isLoadingMore || item.allDataLoaded) return;\n\n item.isLoadingMore = true;\n this.cdr.markForCheck();\n\n // Simulate async loading (data is already in memory)\n setTimeout(() => {\n item.displayedData = [...item.sampleData];\n item.allDataLoaded = true;\n item.isLoadingMore = false;\n this.cdr.markForCheck();\n }, 100);\n }\n\n /**\n * Get the record ID from a row (for opening entity records)\n */\n getRecordId(row: unknown): string | null {\n if (!row || typeof row !== 'object') return null;\n\n const obj = row as Record<string, unknown>;\n\n // For BaseEntity objects, use the ID property\n if ('ID' in obj) {\n return String(obj.ID);\n }\n\n // Try GetAll for BaseEntity\n if ('GetAll' in obj && typeof obj.GetAll === 'function') {\n const allData = (obj as { GetAll: () => Record<string, unknown> }).GetAll();\n if ('ID' in allData) {\n return String(allData.ID);\n }\n }\n\n return null;\n }\n\n /**\n * Open an entity record using NavigationService\n */\n openEntityRecord(entityName: string, row: unknown): void {\n const recordId = this.getRecordId(row);\n if (!recordId || !entityName) return;\n\n // Create a CompositeKey with the ID\n const compositeKey = new CompositeKey([\n { FieldName: 'ID', Value: recordId }\n ]);\n\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n }\n\n /**\n * Open an entity in the explorer (placeholder - would need routing integration)\n */\n openEntityInExplorer(entityName: string): void {\n // This would integrate with the app's navigation/routing system\n // For now, just log and could be extended to emit an event or use router\n console.log(`Would open entity in explorer: ${entityName}`);\n // Could emit an event or use router:\n // this.router.navigate(['/entities', entityName]);\n }\n\n // === Deep Linking via Query Parameters ===\n\n /**\n * Apply query parameters to component state (deep linking support)\n * Query params take precedence over saved preferences\n */\n private applyQueryParams(): void {\n const params = this.route.snapshot.queryParams;\n\n // Section: ?section=engines|redundant|performance|cache\n if (params['section']) {\n const section = params['section'] as string;\n if (['engines', 'redundant', 'performance', 'cache'].includes(section)) {\n this.activeSection = section as 'engines' | 'redundant' | 'performance' | 'cache';\n }\n }\n\n // Performance tab: ?tab=monitor|overview|events|patterns|insights\n if (params['tab']) {\n const tab = params['tab'] as string;\n if (['monitor', 'overview', 'events', 'patterns', 'insights'].includes(tab)) {\n this.perfTab = tab as 'monitor' | 'overview' | 'events' | 'patterns' | 'insights';\n }\n }\n\n // Telemetry source: ?source=client|server\n if (params['source']) {\n const source = params['source'] as string;\n if (['client', 'server'].includes(source)) {\n this.telemetrySource = source as 'client' | 'server';\n }\n }\n\n // Category filter: ?category=all|data|api|render|...\n if (params['category']) {\n const category = params['category'] as string;\n if (category === 'all') {\n this.categoryFilter = 'all';\n } else {\n this.categoryFilter = category as TelemetryCategory;\n }\n }\n\n // Search query: ?search=...\n if (params['search']) {\n this.searchQuery = params['search'] as string;\n }\n\n // KPI cards collapsed: ?kpi=collapsed|expanded\n if (params['kpi']) {\n this.kpiCardsCollapsed = params['kpi'] === 'collapsed';\n }\n\n this.cdr.markForCheck();\n }\n\n /**\n * Update query parameters to reflect current state (for deep linking)\n * Uses NavigationService for proper URL management that respects app-scoped routes.\n */\n private updateQueryParams(): void {\n const queryParams: Record<string, string | null> = {\n section: this.activeSection !== 'engines' ? this.activeSection : null,\n tab: this.perfTab !== 'monitor' ? this.perfTab : null,\n source: this.telemetrySource !== 'client' ? this.telemetrySource : null,\n category: this.categoryFilter !== 'all' ? this.categoryFilter : null,\n search: this.searchQuery.trim() || null,\n kpi: this.kpiCardsCollapsed ? 'collapsed' : null\n };\n\n // Use NavigationService to update query params properly\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n // === User Preferences Persistence ===\n\n /**\n * Load user preferences from MJ: User Settings entity using UserInfoEngine for cached access\n */\n private async loadUserPreferences(): Promise<void> {\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) {\n this.settingsLoaded = true;\n return;\n }\n\n const engine = UserInfoEngine.Instance;\n\n // Find setting from cached user settings\n const setting = engine.UserSettings.find(s => s.Setting === SYSTEM_DIAGNOSTICS_SETTINGS_KEY);\n\n if (setting) {\n this.userSettingEntity = setting;\n if (this.userSettingEntity.Value) {\n const prefs = JSON.parse(this.userSettingEntity.Value) as Partial<SystemDiagnosticsUserPreferences>;\n this.applyUserPreferences(prefs);\n }\n }\n\n this.settingsLoaded = true;\n } catch (error) {\n console.warn('Failed to load user preferences:', error);\n this.settingsLoaded = true;\n }\n }\n\n /**\n * Apply loaded user preferences to component state\n */\n private applyUserPreferences(prefs: Partial<SystemDiagnosticsUserPreferences>): void {\n if (prefs.kpiCardsCollapsed !== undefined) this.kpiCardsCollapsed = prefs.kpiCardsCollapsed;\n if (prefs.activeSection !== undefined) this.activeSection = prefs.activeSection;\n if (prefs.perfTab !== undefined) this.perfTab = prefs.perfTab;\n if (prefs.telemetrySource !== undefined) this.telemetrySource = prefs.telemetrySource;\n if (prefs.categoryFilter !== undefined) this.categoryFilter = prefs.categoryFilter;\n if (prefs.chartZoomLevel !== undefined) this.chartZoomLevel = prefs.chartZoomLevel;\n if (prefs.chartGapCompression !== undefined) this.chartGapCompression = prefs.chartGapCompression;\n if (prefs.autoRefresh !== undefined) this.autoRefresh = prefs.autoRefresh;\n this.cdr.markForCheck();\n }\n\n /**\n * Get current preferences as an object\n */\n private getCurrentPreferences(): SystemDiagnosticsUserPreferences {\n return {\n kpiCardsCollapsed: this.kpiCardsCollapsed,\n activeSection: this.activeSection,\n perfTab: this.perfTab,\n telemetrySource: this.telemetrySource,\n categoryFilter: this.categoryFilter,\n chartZoomLevel: this.chartZoomLevel,\n chartGapCompression: this.chartGapCompression,\n autoRefresh: this.autoRefresh\n };\n }\n\n /**\n * Debounced save of user preferences (500ms delay)\n * Also updates query params for deep linking\n */\n private saveUserPreferencesDebounced(): void {\n if (!this.settingsLoaded) return; // Don't save until we've loaded\n\n // Update query params immediately for deep linking\n this.updateQueryParams();\n\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n\n this.saveSettingsTimeout = setTimeout(() => {\n this.saveUserPreferences();\n }, 500);\n }\n\n /**\n * Save user preferences to MJ: User Settings entity using UserInfoEngine for cached lookup\n */\n private async saveUserPreferences(): Promise<void> {\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n // Find existing setting from cached user settings if not already loaded\n if (!this.userSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === SYSTEM_DIAGNOSTICS_SETTINGS_KEY);\n\n if (setting) {\n this.userSettingEntity = setting;\n } else {\n this.userSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.userSettingEntity.UserID = userId;\n this.userSettingEntity.Setting = SYSTEM_DIAGNOSTICS_SETTINGS_KEY;\n }\n }\n\n // Save the preferences as JSON\n this.userSettingEntity.Value = JSON.stringify(this.getCurrentPreferences());\n await this.userSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save user preferences:', error);\n }\n }\n\n // === BaseResourceComponent Required Methods ===\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'System Diagnostics';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-stethoscope';\n }\n}\n"]}
|