@memberjunction/ng-dashboards 5.30.1 → 5.31.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.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +4 -4
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +2 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +8 -6
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +6 -5
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +2 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +6 -5
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +6 -5
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +2 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +7 -4
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +3 -2
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +10 -6
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +6 -5
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +2 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +6 -5
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +55 -52
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -15
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +4 -3
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +2 -2
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +10 -8
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +2 -2
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts +2 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +13 -10
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1181 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -0
- package/dist/AI/components/tags/tags-resource.component.js +7487 -0
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +25 -21
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/index.d.ts +1 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +5 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +12 -4
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +5 -4
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.d.ts +2 -1
- package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +5 -5
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +11 -10
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-list.component.d.ts +2 -1
- package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-list.component.js +6 -5
- package/dist/APIKeys/api-key-list.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +4 -4
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +8 -6
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.js +10 -8
- package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.d.ts +2 -1
- package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +6 -5
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +2 -2
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts +2 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +6 -5
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +1 -1
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts +2 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +6 -4
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts +2 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.js +7 -5
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts +2 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +7 -5
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +4 -4
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +1 -1
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +1 -1
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +3 -3
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +1 -1
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +3 -3
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +5 -4
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +2 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +6 -4
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +11 -2
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +61 -27
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -2
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +19 -11
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts +4 -2
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +11 -3
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +10 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +18 -9
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts +11 -1
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.js +23 -3
- package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts +6 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.js +16 -6
- package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +1 -1
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +13 -13
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +4 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.js +5 -2
- package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +3 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -4
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +3 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +7 -6
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +3 -2
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +6 -5
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +10 -9
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts +6 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +15 -5
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts +64 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js +400 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts +42 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js +232 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts +14 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js +38 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts +24 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js +77 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts +88 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js +404 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts +12 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js +116 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +55 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +204 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +61 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/entity-list.component.js +485 -0
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts +52 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js +320 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts +79 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js +378 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts +85 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js +429 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts +58 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js +333 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts +36 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js +345 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts +13 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js +81 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +30 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +131 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer-erd.d.ts +19 -0
- package/dist/DatabaseDesigner/database-designer-erd.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer-erd.js +84 -0
- package/dist/DatabaseDesigner/database-designer-erd.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer.types.d.ts +167 -0
- package/dist/DatabaseDesigner/database-designer.types.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer.types.js +26 -0
- package/dist/DatabaseDesigner/database-designer.types.js.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.d.ts +94 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.js +392 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.js.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.service.d.ts +78 -0
- package/dist/DatabaseDesigner/services/database-designer.service.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.service.js +273 -0
- package/dist/DatabaseDesigner/services/database-designer.service.js.map +1 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts +79 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.js +204 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.js.map +1 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/action-pin-config-dialog.component.d.ts +2 -1
- package/dist/Home/action-pin-config-dialog.component.d.ts.map +1 -1
- package/dist/Home/action-pin-config-dialog.component.js +6 -4
- package/dist/Home/action-pin-config-dialog.component.js.map +1 -1
- package/dist/Home/action-pin-runner-dialog.component.d.ts +2 -1
- package/dist/Home/action-pin-runner-dialog.component.d.ts.map +1 -1
- package/dist/Home/action-pin-runner-dialog.component.js +5 -4
- package/dist/Home/action-pin-runner-dialog.component.js.map +1 -1
- package/dist/Home/home-application.d.ts.map +1 -1
- package/dist/Home/home-application.js +10 -12
- package/dist/Home/home-application.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +3 -3
- 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 +1 -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 +11 -10
- 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 -2
- 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 +1 -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 +1 -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 +5 -4
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +5 -1
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +27 -19
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +6 -6
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +8 -6
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +6 -6
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +3 -3
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +6 -6
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +4 -4
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +6 -6
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +11 -10
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +5 -0
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +11 -3
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts +2 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +8 -6
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.d.ts +2 -1
- package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +7 -5
- package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +12 -12
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/Permissions/permissions-shared.d.ts +3 -3
- package/dist/Permissions/permissions-shared.d.ts.map +1 -1
- package/dist/Permissions/permissions-shared.js +5 -5
- package/dist/Permissions/permissions-shared.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +1 -1
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +1 -2
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-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/Scheduling/services/scheduling-instrumentation.service.d.ts +5 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +21 -13
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +2 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +9 -7
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.d.ts +6 -1
- package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.js +21 -11
- package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +3 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +15 -11
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +5 -5
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +1 -2
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +3 -3
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +35 -34
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +6 -0
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +3 -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 +4 -3
- package/dist/shared/entity-field-display.d.ts.map +1 -1
- package/dist/shared/entity-field-display.js +9 -9
- package/dist/shared/entity-field-display.js.map +1 -1
- package/package.json +52 -51
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
+
import { IMetadataProvider } from '@memberjunction/core';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
export interface TestingDashboardKPIs {
|
|
4
5
|
totalTestsActive: number;
|
|
@@ -145,7 +146,11 @@ export declare class TestingInstrumentationService {
|
|
|
145
146
|
private readonly _testTypeFilter$;
|
|
146
147
|
private readonly _refreshTrigger$;
|
|
147
148
|
private readonly _isLoading$;
|
|
148
|
-
private
|
|
149
|
+
private _provider;
|
|
150
|
+
/** Set the metadata provider this service should use. Components should call this after injection. */
|
|
151
|
+
set Provider(value: IMetadataProvider | null);
|
|
152
|
+
get Provider(): IMetadataProvider;
|
|
153
|
+
private get metadata();
|
|
149
154
|
readonly isLoading$: Observable<boolean>;
|
|
150
155
|
readonly dateRange$: Observable<{
|
|
151
156
|
start: Date;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing-instrumentation.service.d.ts","sourceRoot":"","sources":["../../../src/Testing/services/testing-instrumentation.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAwC,MAAM,MAAM,CAAC;;
|
|
1
|
+
{"version":3,"file":"testing-instrumentation.service.d.ts","sourceRoot":"","sources":["../../../src/Testing/services/testing-instrumentation.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,17 @@ export class TestingInstrumentationService {
|
|
|
13
13
|
_testTypeFilter$ = new BehaviorSubject(null);
|
|
14
14
|
_refreshTrigger$ = new BehaviorSubject(0);
|
|
15
15
|
_isLoading$ = new BehaviorSubject(false);
|
|
16
|
-
|
|
16
|
+
_provider = null;
|
|
17
|
+
/** Set the metadata provider this service should use. Components should call this after injection. */
|
|
18
|
+
set Provider(value) {
|
|
19
|
+
this._provider = value;
|
|
20
|
+
}
|
|
21
|
+
get Provider() {
|
|
22
|
+
return this._provider ?? Metadata.Provider;
|
|
23
|
+
}
|
|
24
|
+
get metadata() {
|
|
25
|
+
return this.Provider;
|
|
26
|
+
}
|
|
17
27
|
// Expose observables
|
|
18
28
|
isLoading$ = this._isLoading$.asObservable();
|
|
19
29
|
dateRange$ = this._dateRange$.asObservable();
|
|
@@ -63,7 +73,7 @@ export class TestingInstrumentationService {
|
|
|
63
73
|
}
|
|
64
74
|
async loadKPIs() {
|
|
65
75
|
const { start, end } = this._dateRange$.value;
|
|
66
|
-
const rv =
|
|
76
|
+
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
67
77
|
// Get Tests from TestEngineBase cache instead of querying DB
|
|
68
78
|
const engine = TestEngineBase.Instance;
|
|
69
79
|
const activeTests = engine.Tests.filter(t => t.Status === 'Active');
|
|
@@ -128,7 +138,7 @@ export class TestingInstrumentationService {
|
|
|
128
138
|
async countTestsPendingReview(testRunIDs) {
|
|
129
139
|
if (testRunIDs.length === 0)
|
|
130
140
|
return 0;
|
|
131
|
-
const rv =
|
|
141
|
+
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
132
142
|
const idList = testRunIDs.join("','");
|
|
133
143
|
const feedbackResult = await rv.RunView({
|
|
134
144
|
EntityName: 'MJ: Test Run Feedbacks',
|
|
@@ -152,7 +162,7 @@ export class TestingInstrumentationService {
|
|
|
152
162
|
if (typeFilter) {
|
|
153
163
|
filter += ` AND TestID IN (SELECT ID FROM [__mj].[vwTests] WHERE TypeID = '${typeFilter}')`;
|
|
154
164
|
}
|
|
155
|
-
const rv =
|
|
165
|
+
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
156
166
|
const result = await rv.RunView({
|
|
157
167
|
EntityName: 'MJ: Test Runs',
|
|
158
168
|
ExtraFilter: filter,
|
|
@@ -188,7 +198,7 @@ export class TestingInstrumentationService {
|
|
|
188
198
|
}
|
|
189
199
|
async loadSuiteHierarchy() {
|
|
190
200
|
const { start, end } = this._dateRange$.value;
|
|
191
|
-
const rv =
|
|
201
|
+
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
192
202
|
// Get Test Suites from TestEngineBase cache instead of querying DB
|
|
193
203
|
const engine = TestEngineBase.Instance;
|
|
194
204
|
const suites = engine.TestSuites.filter(s => s.Status === 'Active');
|
|
@@ -259,7 +269,7 @@ export class TestingInstrumentationService {
|
|
|
259
269
|
const { start, end } = this._dateRange$.value;
|
|
260
270
|
// Create time buckets
|
|
261
271
|
const buckets = this.createTimeBuckets(start, end);
|
|
262
|
-
const rv =
|
|
272
|
+
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
263
273
|
const result = await rv.RunView({
|
|
264
274
|
EntityName: 'MJ: Test Runs',
|
|
265
275
|
ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,
|
|
@@ -310,7 +320,7 @@ export class TestingInstrumentationService {
|
|
|
310
320
|
}
|
|
311
321
|
async loadAnalytics() {
|
|
312
322
|
const { start, end } = this._dateRange$.value;
|
|
313
|
-
const rv =
|
|
323
|
+
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
314
324
|
const result = await rv.RunView({
|
|
315
325
|
EntityName: 'MJ: Test Runs',
|
|
316
326
|
ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,
|
|
@@ -417,7 +427,7 @@ export class TestingInstrumentationService {
|
|
|
417
427
|
}
|
|
418
428
|
async loadPendingFeedback() {
|
|
419
429
|
const { start, end } = this._dateRange$.value;
|
|
420
|
-
const rv =
|
|
430
|
+
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
421
431
|
const [testRunsResult, feedbackResult] = await rv.RunViews([
|
|
422
432
|
{
|
|
423
433
|
EntityName: 'MJ: Test Runs',
|
|
@@ -479,7 +489,7 @@ export class TestingInstrumentationService {
|
|
|
479
489
|
}
|
|
480
490
|
async loadFeedbackStats() {
|
|
481
491
|
const { start, end } = this._dateRange$.value;
|
|
482
|
-
const rv =
|
|
492
|
+
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
483
493
|
const feedbackResult = await rv.RunView({
|
|
484
494
|
EntityName: 'MJ: Test Run Feedbacks',
|
|
485
495
|
ExtraFilter: `CreatedAt >= '${start.toISOString()}' AND CreatedAt <= '${end.toISOString()}'`,
|
|
@@ -537,7 +547,7 @@ export class TestingInstrumentationService {
|
|
|
537
547
|
}
|
|
538
548
|
}
|
|
539
549
|
async getVersionMetrics() {
|
|
540
|
-
const rv =
|
|
550
|
+
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
541
551
|
const result = await rv.RunView({
|
|
542
552
|
EntityName: 'MJ: Test Suite Runs',
|
|
543
553
|
ExtraFilter: '',
|
|
@@ -620,7 +630,7 @@ export class TestingInstrumentationService {
|
|
|
620
630
|
if (typeFilter) {
|
|
621
631
|
filter += ` AND TestID IN (SELECT ID FROM [__mj].[vwTests] WHERE TypeID = '${typeFilter}')`;
|
|
622
632
|
}
|
|
623
|
-
const rv =
|
|
633
|
+
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
624
634
|
const [testRunsResult, feedbackResult] = await rv.RunViews([
|
|
625
635
|
{
|
|
626
636
|
EntityName: 'MJ: Test Runs',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing-instrumentation.service.js","sourceRoot":"","sources":["../../../src/Testing/services/testing-instrumentation.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { Observable, BehaviorSubject, from, combineLatest } from 'rxjs';\nimport { map, switchMap, shareReplay, tap } from 'rxjs/operators';\nimport { RunView, Metadata } from '@memberjunction/core';\nimport { MJTestRunFeedbackEntity } from '@memberjunction/core-entities';\nimport { TestEngineBase } from '@memberjunction/testing-engine-base';\n\nexport interface TestingDashboardKPIs {\n totalTestsActive: number;\n passRateThisMonth: number;\n totalCostThisMonth: number;\n averageDuration: number;\n testsPendingReview: number;\n totalTestRuns: number;\n failedTests: number;\n skippedTests: number;\n passRateTrend: number; // Percentage change from previous period\n}\n\nexport interface TestRunSummary {\n id: string;\n testId: string;\n testName: string;\n suiteName: string;\n testType: string;\n status: 'Passed' | 'Failed' | 'Skipped' | 'Error' | 'Running' | 'Timeout';\n score: number; // 0-1.0000\n duration: number; // milliseconds\n cost: number; // USD\n runDateTime: Date;\n targetType: string;\n targetLogID: string;\n}\n\nexport interface SuiteHierarchyNode {\n id: string;\n name: string;\n parentID: string | null;\n level: number;\n children: SuiteHierarchyNode[];\n testCount: number;\n passRate: number;\n totalCost: number;\n averageScore: number;\n expanded?: boolean;\n}\n\nexport interface VersionMetrics {\n version: string; // GitCommit + AgentVersion combination\n gitCommit: string;\n agentVersion: string;\n runDate: Date;\n totalTests: number;\n passRate: number;\n averageScore: number;\n totalCost: number;\n averageDuration: number;\n newFailures: number;\n newPasses: number;\n}\n\nexport interface TestTrendData {\n timestamp: Date;\n totalRuns: number;\n passed: number;\n failed: number;\n skipped: number;\n errors: number;\n averageScore: number;\n totalCost: number;\n averageDuration: number;\n}\n\nexport interface FeedbackPending {\n testRunID: string;\n testName: string;\n automatedScore: number;\n automatedStatus: string;\n runDateTime: Date;\n reason: 'no-feedback' | 'high-score-failed' | 'low-score-passed';\n}\n\nexport interface TestAnalytics {\n topFailingTests: Array<{ testName: string; failureCount: number; failureRate: number }>;\n mostExpensiveTests: Array<{ testName: string; totalCost: number; avgCost: number }>;\n slowestTests: Array<{ testName: string; avgDuration: number; maxDuration: number }>;\n costByType: Array<{ testType: string; totalCost: number; testCount: number }>;\n costBySuite: Array<{ suiteName: string; totalCost: number; testCount: number }>;\n passingRateByType: Array<{ testType: string; passRate: number; totalTests: number }>;\n}\n\nexport interface FeedbackStats {\n totalFeedback: number;\n reviewedCount: number;\n avgRating: number;\n agreementRate: number;\n disagreementRate: number;\n accuracyRate: number;\n}\n\n/**\n * Extended test run summary with human feedback data included\n */\nexport interface TestRunWithFeedbackSummary extends TestRunSummary {\n // Human feedback\n humanRating: number | null;\n humanIsCorrect: boolean | null;\n humanComments: string | null;\n hasHumanFeedback: boolean;\n feedbackId: string | null;\n // Checks (from automated evaluation)\n passedChecks: number | null;\n failedChecks: number | null;\n totalChecks: number | null;\n}\n\n/**\n * Aggregated evaluation metrics\n */\nexport interface EvaluationSummaryMetrics {\n totalRuns: number;\n // Execution\n execCompletedCount: number;\n execErrorCount: number;\n execSuccessRate: number;\n // Human\n humanReviewedCount: number;\n humanPendingCount: number;\n humanAvgRating: number;\n humanCorrectRate: number;\n // Auto\n autoEvaluatedCount: number;\n autoAvgScore: number;\n autoPassRate: number;\n // Agreement\n agreementRate: number;\n}\n\n// Simple result types for optimized queries (only fields needed for display)\ninterface TestRunSimple {\n ID: string;\n TestID: string;\n Test: string;\n Status: string;\n Score: number;\n CostUSD: number;\n StartedAt: Date;\n CompletedAt: Date | null;\n TargetType: string;\n TargetLogID: string;\n}\n\ninterface TestSuiteRunSimple {\n ID: string;\n TestSuiteID: string;\n TotalTests: number;\n PassedTests: number;\n TotalCostUSD: number;\n StartedAt: Date;\n GitCommit: string;\n AgentVersion: string;\n}\n\ninterface TestRunFeedbackSimple {\n ID: string;\n TestRunID: string;\n Rating: number;\n IsCorrect: boolean;\n Comments: string;\n CreatedAt: Date;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TestingInstrumentationService {\n private readonly _dateRange$ = new BehaviorSubject<{ start: Date; end: Date }>({\n start: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000), // Last 30 days\n end: new Date()\n });\n\n private readonly _suiteFilter$ = new BehaviorSubject<string | null>(null);\n private readonly _testTypeFilter$ = new BehaviorSubject<string | null>(null);\n private readonly _refreshTrigger$ = new BehaviorSubject<number>(0);\n private readonly _isLoading$ = new BehaviorSubject<boolean>(false);\n private readonly metadata = new Metadata();\n\n // Expose observables\n readonly isLoading$ = this._isLoading$.asObservable();\n readonly dateRange$ = this._dateRange$.asObservable();\n\n constructor() {}\n\n // Main data streams\n readonly kpis$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadKPIs())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n readonly testRuns$ = combineLatest([\n this._refreshTrigger$,\n this._dateRange$,\n this._suiteFilter$,\n this._testTypeFilter$\n ]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadTestRuns())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n readonly suiteHierarchy$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadSuiteHierarchy())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n readonly trends$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadTrends())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n readonly analytics$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadAnalytics())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n readonly pendingFeedback$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadPendingFeedback())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n readonly feedbackStats$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadFeedbackStats())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n /**\n * Test runs with feedback data joined - for evaluation display\n */\n readonly testRunsWithFeedback$ = combineLatest([\n this._refreshTrigger$,\n this._dateRange$,\n this._suiteFilter$,\n this._testTypeFilter$\n ]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadTestRunsWithFeedback())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n /**\n * Aggregated evaluation metrics from test runs with feedback\n */\n readonly evaluationMetrics$ = this.testRunsWithFeedback$.pipe(\n map(runs => this.calculateEvaluationMetrics(runs)),\n shareReplay(1)\n );\n\n private checkLoadingComplete(): void {\n setTimeout(() => {\n this._isLoading$.next(false);\n }, 100);\n }\n\n setDateRange(start: Date, end: Date): void {\n this._dateRange$.next({ start, end });\n }\n\n setSuiteFilter(suiteId: string | null): void {\n this._suiteFilter$.next(suiteId);\n }\n\n setTestTypeFilter(typeId: string | null): void {\n this._testTypeFilter$.next(typeId);\n }\n\n refresh(): void {\n this._refreshTrigger$.next(this._refreshTrigger$.value + 1);\n }\n\n private async loadKPIs(): Promise<TestingDashboardKPIs> {\n const { start, end } = this._dateRange$.value;\n const rv = new RunView();\n\n // Get Tests from TestEngineBase cache instead of querying DB\n const engine = TestEngineBase.Instance;\n const activeTests = engine.Tests.filter(t => t.Status === 'Active');\n\n // Only load runs via RunView (not cached in engine) - use simple result type with only needed fields\n const [testRunsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,\n Fields: ['ID', 'Status', 'Score', 'CostUSD', 'StartedAt', 'CompletedAt'],\n ResultType: 'simple',\n CacheLocal: true\n }\n ]);\n\n const testRuns = testRunsResult.Results as TestRunSimple[];\n\n // Calculate KPIs\n const totalTestsActive = activeTests.length;\n const totalTestRuns = testRuns.length;\n\n const passedRuns = testRuns.filter(r => r.Status === 'Passed');\n const failedRuns = testRuns.filter(r => r.Status === 'Failed');\n const skippedRuns = testRuns.filter(r => r.Status === 'Skipped');\n\n const passRateThisMonth = totalTestRuns > 0 ? (passedRuns.length / totalTestRuns) * 100 : 0;\n\n const totalCostThisMonth = testRuns.reduce((sum, r) => sum + (r.CostUSD || 0), 0);\n\n const completedRuns = testRuns.filter(r => r.CompletedAt != null && r.StartedAt != null);\n const averageDuration = completedRuns.length > 0\n ? completedRuns.reduce((sum, r) => {\n const startTime = r.StartedAt instanceof Date ? r.StartedAt.getTime() : new Date(r.StartedAt).getTime();\n const endTime = r.CompletedAt instanceof Date ? r.CompletedAt.getTime() : new Date(r.CompletedAt!).getTime();\n return sum + (endTime - startTime);\n }, 0) / completedRuns.length\n : 0;\n\n // Count tests pending review (no feedback)\n const testRunIDs = testRuns.map(r => r.ID);\n const testsPendingReview = await this.countTestsPendingReview(testRunIDs);\n\n // Calculate trend (compare to previous period)\n const periodDuration = end.getTime() - start.getTime();\n const previousStart = new Date(start.getTime() - periodDuration);\n const previousEnd = new Date(start.getTime());\n\n const previousRunsResult = await rv.RunView<TestRunSimple>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `StartedAt >= '${previousStart.toISOString()}' AND StartedAt < '${previousEnd.toISOString()}'`,\n Fields: ['ID', 'Status'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const previousRuns = previousRunsResult.Results || [];\n const previousPassRate = previousRuns.length > 0\n ? (previousRuns.filter(r => r.Status === 'Passed').length / previousRuns.length) * 100\n : 0;\n\n const passRateTrend = previousPassRate > 0 ? passRateThisMonth - previousPassRate : 0;\n\n return {\n totalTestsActive,\n passRateThisMonth,\n totalCostThisMonth,\n averageDuration,\n testsPendingReview,\n totalTestRuns,\n failedTests: failedRuns.length,\n skippedTests: skippedRuns.length,\n passRateTrend\n };\n }\n\n private async countTestsPendingReview(testRunIDs: string[]): Promise<number> {\n if (testRunIDs.length === 0) return 0;\n\n const rv = new RunView();\n const idList = testRunIDs.join(\"','\");\n\n const feedbackResult = await rv.RunView<{TestRunID: string}>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `TestRunID IN ('${idList}')`,\n Fields: ['TestRunID'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const feedbackTestRunIDs = new Set((feedbackResult.Results || []).map(f => f.TestRunID));\n\n return testRunIDs.filter(id => !feedbackTestRunIDs.has(id)).length;\n }\n\n private async loadTestRuns(): Promise<TestRunSummary[]> {\n const { start, end } = this._dateRange$.value;\n const suiteFilter = this._suiteFilter$.value;\n const typeFilter = this._testTypeFilter$.value;\n\n let filter = `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`;\n\n if (suiteFilter) {\n // Need to join through TestSuiteTest\n filter += ` AND TestID IN (SELECT TestID FROM [__mj].[vwTestSuiteTests] WHERE TestSuiteID = '${suiteFilter}')`;\n }\n\n if (typeFilter) {\n filter += ` AND TestID IN (SELECT ID FROM [__mj].[vwTests] WHERE TypeID = '${typeFilter}')`;\n }\n\n const rv = new RunView();\n const result = await rv.RunView<TestRunSimple>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: filter,\n OrderBy: 'StartedAt DESC',\n MaxRows: 1000,\n Fields: ['ID', 'TestID', 'Test', 'Status', 'Score', 'CostUSD', 'StartedAt', 'CompletedAt', 'TargetType', 'TargetLogID'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const testRuns = result.Results || [];\n\n return testRuns.map(run => {\n const startedAt = run.StartedAt instanceof Date ? run.StartedAt : new Date(run.StartedAt);\n const completedAt = run.CompletedAt\n ? (run.CompletedAt instanceof Date ? run.CompletedAt : new Date(run.CompletedAt))\n : null;\n\n return {\n id: run.ID,\n testId: run.TestID || '',\n testName: run.Test || 'Unknown Test',\n suiteName: '', // Will be populated from join\n testType: run.Test || 'Unknown',\n status: run.Status as 'Passed' | 'Failed' | 'Skipped' | 'Error' | 'Running',\n score: run.Score || 0,\n duration: completedAt && startedAt\n ? completedAt.getTime() - startedAt.getTime()\n : (startedAt ? Date.now() - startedAt.getTime() : 0),\n cost: run.CostUSD || 0,\n runDateTime: startedAt,\n targetType: run.TargetType || '',\n targetLogID: run.TargetLogID || ''\n };\n });\n }\n\n private async loadSuiteHierarchy(): Promise<SuiteHierarchyNode[]> {\n const { start, end } = this._dateRange$.value;\n const rv = new RunView();\n\n // Get Test Suites from TestEngineBase cache instead of querying DB\n const engine = TestEngineBase.Instance;\n const suites = engine.TestSuites.filter(s => s.Status === 'Active');\n\n // Only load test runs via RunView (not cached in engine) - use simple result type\n const testRunsResult = await rv.RunView<{ID: string; TestID: string; Status: string; Score: number; CostUSD: number}>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,\n Fields: ['ID', 'TestID', 'Status', 'Score', 'CostUSD'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const testRuns = testRunsResult.Results || [];\n\n // Build hierarchy\n const nodes: SuiteHierarchyNode[] = suites.map(suite => ({\n id: suite.ID,\n name: suite.Name,\n parentID: suite.ParentID || null,\n level: 0,\n children: [],\n testCount: 0,\n passRate: 0,\n totalCost: 0,\n averageScore: 0,\n expanded: false\n }));\n\n // Calculate metrics for each suite (simplified - would need TestSuiteTest join for accuracy)\n type SimpleTestRun = {ID: string; TestID: string; Status: string; Score: number; CostUSD: number};\n const suiteTestRuns = new Map<string, SimpleTestRun[]>();\n\n testRuns.forEach(run => {\n // This is simplified - would need to query TestSuiteTest to get actual suite membership\n const suiteID = run.TestID; // Placeholder\n if (!suiteTestRuns.has(suiteID)) {\n suiteTestRuns.set(suiteID, []);\n }\n suiteTestRuns.get(suiteID)!.push(run);\n });\n\n nodes.forEach(node => {\n const runs = suiteTestRuns.get(node.id) || [];\n node.testCount = runs.length;\n node.passRate = runs.length > 0\n ? (runs.filter(r => r.Status === 'Passed').length / runs.length) * 100\n : 0;\n node.totalCost = runs.reduce((sum, r) => sum + (r.CostUSD || 0), 0);\n node.averageScore = runs.length > 0\n ? runs.reduce((sum, r) => sum + (r.Score || 0), 0) / runs.length\n : 0;\n });\n\n // Build tree structure\n const rootNodes: SuiteHierarchyNode[] = [];\n const nodeMap = new Map<string, SuiteHierarchyNode>();\n\n nodes.forEach(node => nodeMap.set(node.id, node));\n\n nodes.forEach(node => {\n if (node.parentID) {\n const parent = nodeMap.get(node.parentID);\n if (parent) {\n parent.children.push(node);\n node.level = parent.level + 1;\n } else {\n rootNodes.push(node);\n }\n } else {\n rootNodes.push(node);\n }\n });\n\n return rootNodes;\n }\n\n private async loadTrends(): Promise<TestTrendData[]> {\n const { start, end } = this._dateRange$.value;\n\n // Create time buckets\n const buckets = this.createTimeBuckets(start, end);\n const rv = new RunView();\n\n // Load all test runs for the period - use simple result type with only needed fields\n type TrendRun = {Status: string; Score: number; CostUSD: number; StartedAt: string | Date; CompletedAt: string | Date | null};\n const result = await rv.RunView<TrendRun>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,\n OrderBy: 'StartedAt',\n Fields: ['Status', 'Score', 'CostUSD', 'StartedAt', 'CompletedAt'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const allRuns = result.Results || [];\n\n // Aggregate into buckets\n const trends: TestTrendData[] = buckets.map(bucketStart => {\n const bucketEnd = new Date(bucketStart.getTime() + this.getBucketSize(start, end));\n\n const bucketRuns = allRuns.filter(r => {\n if (!r.StartedAt) return false;\n const runTime = r.StartedAt instanceof Date ? r.StartedAt : new Date(r.StartedAt);\n return runTime >= bucketStart && runTime < bucketEnd;\n });\n\n const passed = bucketRuns.filter(r => r.Status === 'Passed').length;\n const failed = bucketRuns.filter(r => r.Status === 'Failed').length;\n const skipped = bucketRuns.filter(r => r.Status === 'Skipped').length;\n const errors = bucketRuns.filter(r => r.Status === 'Error').length;\n\n const averageScore = bucketRuns.length > 0\n ? bucketRuns.reduce((sum, r) => sum + (r.Score || 0), 0) / bucketRuns.length\n : 0;\n\n const totalCost = bucketRuns.reduce((sum, r) => sum + (r.CostUSD || 0), 0);\n\n const completedRuns = bucketRuns.filter(r => r.CompletedAt != null && r.StartedAt != null);\n const averageDuration = completedRuns.length > 0\n ? completedRuns.reduce((sum, r) => {\n const startTime = r.StartedAt instanceof Date ? r.StartedAt.getTime() : new Date(r.StartedAt).getTime();\n const endTime = r.CompletedAt instanceof Date ? r.CompletedAt.getTime() : new Date(r.CompletedAt!).getTime();\n return sum + (endTime - startTime);\n }, 0) / completedRuns.length\n : 0;\n\n return {\n timestamp: bucketStart,\n totalRuns: bucketRuns.length,\n passed,\n failed,\n skipped,\n errors,\n averageScore,\n totalCost,\n averageDuration\n };\n });\n\n return trends;\n }\n\n private async loadAnalytics(): Promise<TestAnalytics> {\n const { start, end } = this._dateRange$.value;\n const rv = new RunView();\n\n // Use simple result type with only needed fields\n type AnalyticsRun = {Test: string; Status: string; Score: number; CostUSD: number; StartedAt: string | Date; CompletedAt: string | Date | null};\n const result = await rv.RunView<AnalyticsRun>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,\n Fields: ['Test', 'Status', 'Score', 'CostUSD', 'StartedAt', 'CompletedAt'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const testRuns = result.Results || [];\n\n // Group by test name\n const testMetrics = new Map<string, { runs: AnalyticsRun[], failures: number }>();\n\n testRuns.forEach(run => {\n const testName = run.Test || 'Unknown';\n if (!testMetrics.has(testName)) {\n testMetrics.set(testName, { runs: [], failures: 0 });\n }\n const metrics = testMetrics.get(testName)!;\n metrics.runs.push(run);\n if (run.Status === 'Failed' || run.Status === 'Error') {\n metrics.failures++;\n }\n });\n\n // Top failing tests\n const topFailingTests = Array.from(testMetrics.entries())\n .map(([testName, metrics]) => ({\n testName,\n failureCount: metrics.failures,\n failureRate: metrics.runs.length > 0 ? (metrics.failures / metrics.runs.length) * 100 : 0\n }))\n .sort((a, b) => b.failureCount - a.failureCount)\n .slice(0, 10);\n\n // Most expensive tests\n const mostExpensiveTests = Array.from(testMetrics.entries())\n .map(([testName, metrics]) => {\n const totalCost = metrics.runs.reduce((sum, r) => sum + (r.CostUSD || 0), 0);\n const avgCost = metrics.runs.length > 0 ? totalCost / metrics.runs.length : 0;\n return { testName, totalCost, avgCost };\n })\n .sort((a, b) => b.totalCost - a.totalCost)\n .slice(0, 10);\n\n // Slowest tests\n const slowestTests = Array.from(testMetrics.entries())\n .map(([testName, metrics]) => {\n const durations = metrics.runs\n .filter(r => r.CompletedAt != null && r.StartedAt != null)\n .map(r => {\n const startTime = r.StartedAt instanceof Date ? r.StartedAt.getTime() : new Date(r.StartedAt).getTime();\n const endTime = r.CompletedAt instanceof Date ? r.CompletedAt.getTime() : new Date(r.CompletedAt!).getTime();\n return endTime - startTime;\n });\n\n const avgDuration = durations.length > 0\n ? durations.reduce((sum, d) => sum + d, 0) / durations.length\n : 0;\n const maxDuration = durations.length > 0 ? Math.max(...durations) : 0;\n\n return { testName, avgDuration, maxDuration };\n })\n .sort((a, b) => b.avgDuration - a.avgDuration)\n .slice(0, 10);\n\n // Cost by type (simplified - would need actual type data)\n const typeMetrics = new Map<string, { cost: number, count: number }>();\n testRuns.forEach(run => {\n const type = run.Test || 'Unknown';\n if (!typeMetrics.has(type)) {\n typeMetrics.set(type, { cost: 0, count: 0 });\n }\n const metrics = typeMetrics.get(type)!;\n metrics.cost += run.CostUSD || 0;\n metrics.count++;\n });\n\n const costByType = Array.from(typeMetrics.entries())\n .map(([testType, metrics]) => ({\n testType,\n totalCost: metrics.cost,\n testCount: metrics.count\n }))\n .sort((a, b) => b.totalCost - a.totalCost);\n\n // Passing rate by type\n const typePassingMetrics = new Map<string, { total: number, passed: number }>();\n testRuns.forEach(run => {\n const type = run.Test || 'Unknown';\n if (!typePassingMetrics.has(type)) {\n typePassingMetrics.set(type, { total: 0, passed: 0 });\n }\n const metrics = typePassingMetrics.get(type)!;\n metrics.total++;\n if (run.Status === 'Passed') {\n metrics.passed++;\n }\n });\n\n const passingRateByType = Array.from(typePassingMetrics.entries())\n .map(([testType, metrics]) => ({\n testType,\n passRate: metrics.total > 0 ? (metrics.passed / metrics.total) * 100 : 0,\n totalTests: metrics.total\n }))\n .sort((a, b) => a.passRate - b.passRate);\n\n return {\n topFailingTests,\n mostExpensiveTests,\n slowestTests,\n costByType,\n costBySuite: [], // Would need suite data\n passingRateByType\n };\n }\n\n private async loadPendingFeedback(): Promise<FeedbackPending[]> {\n const { start, end } = this._dateRange$.value;\n const rv = new RunView();\n\n // Use simple result types with only needed fields\n type FeedbackTestRun = {ID: string; Test: string; Score: number; Status: string; StartedAt: string | Date};\n type FeedbackItem = {TestRunID: string};\n\n const [testRunsResult, feedbackResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,\n Fields: ['ID', 'Test', 'Score', 'Status', 'StartedAt'],\n ResultType: 'simple',\n CacheLocal: true\n },\n {\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `CreatedAt >= '${start.toISOString()}'`,\n Fields: ['TestRunID'],\n ResultType: 'simple',\n CacheLocal: true\n }\n ]);\n\n const testRuns = testRunsResult.Results as FeedbackTestRun[];\n const feedbacks = feedbackResult.Results as FeedbackItem[];\n\n const feedbackTestRunIDs = new Set(feedbacks.map(f => f.TestRunID));\n\n const pending: FeedbackPending[] = [];\n\n testRuns.forEach(run => {\n const hasFeedback = feedbackTestRunIDs.has(run.ID);\n const runDateTime = run.StartedAt instanceof Date ? run.StartedAt : new Date(run.StartedAt);\n\n if (!hasFeedback) {\n pending.push({\n testRunID: run.ID,\n testName: run.Test || 'Unknown',\n automatedScore: run.Score || 0,\n automatedStatus: run.Status,\n runDateTime,\n reason: 'no-feedback'\n });\n } else {\n // Check for discrepancies\n if (run.Status === 'Failed' && run.Score != null && run.Score >= 0.8) {\n pending.push({\n testRunID: run.ID,\n testName: run.Test || 'Unknown',\n automatedScore: run.Score,\n automatedStatus: run.Status,\n runDateTime,\n reason: 'high-score-failed'\n });\n } else if (run.Status === 'Passed' && run.Score != null && run.Score < 0.5) {\n pending.push({\n testRunID: run.ID,\n testName: run.Test || 'Unknown',\n automatedScore: run.Score,\n automatedStatus: run.Status,\n runDateTime,\n reason: 'low-score-passed'\n });\n }\n }\n });\n\n return pending.sort((a, b) => b.runDateTime.getTime() - a.runDateTime.getTime());\n }\n\n private async loadFeedbackStats(): Promise<FeedbackStats> {\n const { start, end } = this._dateRange$.value;\n const rv = new RunView();\n\n // Load all feedback for the period - use simple result type with only needed fields\n type FeedbackStatItem = {Rating: number; IsCorrect: boolean};\n const feedbackResult = await rv.RunView<FeedbackStatItem>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `CreatedAt >= '${start.toISOString()}' AND CreatedAt <= '${end.toISOString()}'`,\n Fields: ['Rating', 'IsCorrect'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const feedbacks = feedbackResult.Results || [];\n const totalFeedback = feedbacks.length;\n\n if (totalFeedback === 0) {\n return {\n totalFeedback: 0,\n reviewedCount: 0,\n avgRating: 0,\n agreementRate: 0,\n disagreementRate: 0,\n accuracyRate: 0\n };\n }\n\n // Calculate average rating\n const avgRating = feedbacks.reduce((sum, f) => sum + (f.Rating || 0), 0) / totalFeedback;\n\n // Calculate agreement/disagreement rates based on IsCorrect field\n const correctCount = feedbacks.filter(f => f.IsCorrect === true).length;\n const incorrectCount = feedbacks.filter(f => f.IsCorrect === false).length;\n\n const agreementRate = (correctCount / totalFeedback) * 100;\n const disagreementRate = (incorrectCount / totalFeedback) * 100;\n\n // Accuracy rate is the same as agreement rate (% of times human agreed with automated result)\n const accuracyRate = agreementRate;\n\n return {\n totalFeedback,\n reviewedCount: totalFeedback, // All feedbacks in this query are reviewed\n avgRating,\n agreementRate,\n disagreementRate,\n accuracyRate\n };\n }\n\n async submitFeedback(testRunID: string, rating: number, isCorrect: boolean, comments: string): Promise<boolean> {\n try {\n const feedback = await this.metadata.GetEntityObject<MJTestRunFeedbackEntity>('MJ: Test Run Feedbacks');\n feedback.TestRunID = testRunID;\n feedback.Rating = rating;\n feedback.IsCorrect = isCorrect;\n feedback.Comments = comments;\n\n const result = await feedback.Save();\n if (result) {\n this.refresh(); // Refresh data after submission\n return true;\n }\n return false;\n } catch (error) {\n console.error('Error submitting feedback:', error);\n return false;\n }\n }\n\n async getVersionMetrics(): Promise<VersionMetrics[]> {\n const rv = new RunView();\n\n // Use simple result type with only needed fields\n type VersionRun = {TotalTests: number; PassedTests: number; TotalCostUSD: number; StartedAt: string | Date; GitCommit: string; AgentVersion: string};\n const result = await rv.RunView<VersionRun>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: '',\n OrderBy: 'StartedAt DESC',\n MaxRows: 100,\n Fields: ['TotalTests', 'PassedTests', 'TotalCostUSD', 'StartedAt', 'GitCommit', 'AgentVersion'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const suiteRuns = result.Results || [];\n\n // Group by version combination\n const versionMap = new Map<string, VersionRun[]>();\n\n suiteRuns.forEach(run => {\n const key = `${run.GitCommit || 'unknown'}_${run.AgentVersion || 'unknown'}`;\n if (!versionMap.has(key)) {\n versionMap.set(key, []);\n }\n versionMap.get(key)!.push(run);\n });\n\n const metrics: VersionMetrics[] = Array.from(versionMap.entries()).map(([key, runs]) => {\n const [gitCommit, agentVersion] = key.split('_');\n const latest = runs[0];\n\n const totalTests = runs.reduce((sum, r) => sum + (r.TotalTests || 0), 0);\n const totalPassed = runs.reduce((sum, r) => sum + (r.PassedTests || 0), 0);\n const totalCost = runs.reduce((sum, r) => sum + (r.TotalCostUSD || 0), 0);\n\n const runDate = latest.StartedAt instanceof Date ? latest.StartedAt : new Date(latest.StartedAt);\n\n return {\n version: `${gitCommit.substring(0, 7)} / ${agentVersion}`,\n gitCommit,\n agentVersion,\n runDate,\n totalTests,\n passRate: totalTests > 0 ? (totalPassed / totalTests) * 100 : 0,\n averageScore: 0, // Would need to calculate from test runs\n totalCost,\n averageDuration: 0, // Would need to calculate from test runs\n newFailures: 0, // Would need comparison\n newPasses: 0 // Would need comparison\n };\n });\n\n return metrics.sort((a, b) => b.runDate.getTime() - a.runDate.getTime());\n }\n\n private createTimeBuckets(start: Date, end: Date): Date[] {\n const buckets: Date[] = [];\n const bucketSize = this.getBucketSize(start, end);\n const current = new Date(start);\n\n while (current < end) {\n buckets.push(new Date(current));\n current.setTime(current.getTime() + bucketSize);\n }\n\n return buckets;\n }\n\n private getBucketSize(start: Date, end: Date): number {\n const duration = end.getTime() - start.getTime();\n const days = duration / (1000 * 60 * 60 * 24);\n\n if (days <= 1) {\n return 60 * 60 * 1000; // 1 hour\n } else if (days <= 7) {\n return 4 * 60 * 60 * 1000; // 4 hours\n } else if (days <= 30) {\n return 24 * 60 * 60 * 1000; // 1 day\n } else {\n return 7 * 24 * 60 * 60 * 1000; // 1 week\n }\n }\n\n /**\n * Load test runs with feedback data joined for evaluation display\n */\n private async loadTestRunsWithFeedback(): Promise<TestRunWithFeedbackSummary[]> {\n const { start, end } = this._dateRange$.value;\n const suiteFilter = this._suiteFilter$.value;\n const typeFilter = this._testTypeFilter$.value;\n\n let filter = `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`;\n\n if (suiteFilter) {\n filter += ` AND TestID IN (SELECT TestID FROM [__mj].[vwTestSuiteTests] WHERE TestSuiteID = '${suiteFilter}')`;\n }\n\n if (typeFilter) {\n filter += ` AND TestID IN (SELECT ID FROM [__mj].[vwTests] WHERE TypeID = '${typeFilter}')`;\n }\n\n const rv = new RunView();\n\n // Load test runs with additional fields for evaluation\n type MJTestRunExtended = {\n ID: string;\n TestID: string;\n Test: string;\n Status: string;\n Score: number;\n CostUSD: number;\n StartedAt: Date;\n CompletedAt: Date | null;\n TargetType: string;\n TargetLogID: string;\n PassedChecks: number | null;\n FailedChecks: number | null;\n TotalChecks: number | null;\n };\n\n const [testRunsResult, feedbackResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Test Runs',\n ExtraFilter: filter,\n OrderBy: 'StartedAt DESC',\n MaxRows: 1000,\n Fields: ['ID', 'TestID', 'Test', 'Status', 'Score', 'CostUSD', 'StartedAt', 'CompletedAt', 'TargetType', 'TargetLogID', 'PassedChecks', 'FailedChecks', 'TotalChecks'],\n ResultType: 'simple',\n CacheLocal: true\n },\n {\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `CreatedAt >= '${start.toISOString()}'`,\n Fields: ['ID', 'TestRunID', 'Rating', 'IsCorrect', 'Comments'],\n ResultType: 'simple',\n CacheLocal: true\n }\n ]);\n\n const testRuns = (testRunsResult.Results || []) as MJTestRunExtended[];\n const feedbacks = (feedbackResult.Results || []) as TestRunFeedbackSimple[];\n\n // Create feedback lookup map\n const feedbackMap = new Map<string, TestRunFeedbackSimple>();\n feedbacks.forEach(f => {\n feedbackMap.set(f.TestRunID, f);\n });\n\n // Map test runs with feedback\n return testRuns.map(run => {\n const startedAt = run.StartedAt instanceof Date ? run.StartedAt : new Date(run.StartedAt);\n const completedAt = run.CompletedAt\n ? (run.CompletedAt instanceof Date ? run.CompletedAt : new Date(run.CompletedAt))\n : null;\n\n const feedback = feedbackMap.get(run.ID);\n\n return {\n id: run.ID,\n testId: run.TestID || '',\n testName: run.Test || 'Unknown Test',\n suiteName: '',\n testType: run.Test || 'Unknown',\n status: run.Status as 'Passed' | 'Failed' | 'Skipped' | 'Error' | 'Running' | 'Timeout',\n score: run.Score || 0,\n duration: completedAt && startedAt\n ? completedAt.getTime() - startedAt.getTime()\n : (startedAt ? Date.now() - startedAt.getTime() : 0),\n cost: run.CostUSD || 0,\n runDateTime: startedAt,\n targetType: run.TargetType || '',\n targetLogID: run.TargetLogID || '',\n // Checks\n passedChecks: run.PassedChecks,\n failedChecks: run.FailedChecks,\n totalChecks: run.TotalChecks,\n // Human feedback\n humanRating: feedback?.Rating ?? null,\n humanIsCorrect: feedback?.IsCorrect ?? null,\n humanComments: feedback?.Comments ?? null,\n hasHumanFeedback: !!feedback,\n feedbackId: feedback?.ID ?? null\n };\n });\n }\n\n /**\n * Calculate aggregated evaluation metrics from test runs with feedback\n */\n private calculateEvaluationMetrics(runs: TestRunWithFeedbackSummary[]): EvaluationSummaryMetrics {\n const totalRuns = runs.length;\n\n if (totalRuns === 0) {\n return {\n totalRuns: 0,\n execCompletedCount: 0,\n execErrorCount: 0,\n execSuccessRate: 0,\n humanReviewedCount: 0,\n humanPendingCount: 0,\n humanAvgRating: 0,\n humanCorrectRate: 0,\n autoEvaluatedCount: 0,\n autoAvgScore: 0,\n autoPassRate: 0,\n agreementRate: 0\n };\n }\n\n // Execution metrics\n const execCompleted = runs.filter(r =>\n r.status === 'Passed' || r.status === 'Failed'\n );\n const execErrors = runs.filter(r =>\n r.status === 'Error' || r.status === 'Timeout'\n );\n const execSuccessRate = totalRuns > 0 ? (execCompleted.length / totalRuns) * 100 : 0;\n\n // Human feedback metrics\n const reviewed = runs.filter(r => r.hasHumanFeedback);\n const pending = runs.filter(r => !r.hasHumanFeedback);\n const withRating = reviewed.filter(r => r.humanRating != null);\n const humanAvgRating = withRating.length > 0\n ? withRating.reduce((sum, r) => sum + (r.humanRating || 0), 0) / withRating.length\n : 0;\n const correct = reviewed.filter(r => r.humanIsCorrect === true);\n const humanCorrectRate = reviewed.length > 0 ? (correct.length / reviewed.length) * 100 : 0;\n\n // Auto score metrics\n const evaluated = runs.filter(r => r.score > 0);\n const autoAvgScore = evaluated.length > 0\n ? evaluated.reduce((sum, r) => sum + r.score, 0) / evaluated.length\n : 0;\n const autoPass = evaluated.filter(r => r.score >= 0.8);\n const autoPassRate = evaluated.length > 0 ? (autoPass.length / evaluated.length) * 100 : 0;\n\n // Agreement metrics\n const bothEvaluated = runs.filter(r =>\n r.hasHumanFeedback && r.score > 0 && r.humanIsCorrect != null\n );\n let agreementCount = 0;\n\n bothEvaluated.forEach(r => {\n const autoConsideredPass = r.score >= 0.5;\n const humanConsideredPass = r.humanIsCorrect === true;\n\n if (autoConsideredPass === humanConsideredPass) {\n agreementCount++;\n }\n });\n\n const agreementRate = bothEvaluated.length > 0\n ? (agreementCount / bothEvaluated.length) * 100\n : 0;\n\n return {\n totalRuns,\n execCompletedCount: execCompleted.length,\n execErrorCount: execErrors.length,\n execSuccessRate,\n humanReviewedCount: reviewed.length,\n humanPendingCount: pending.length,\n humanAvgRating,\n humanCorrectRate,\n autoEvaluatedCount: evaluated.length,\n autoAvgScore,\n autoPassRate,\n agreementRate\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"testing-instrumentation.service.js","sourceRoot":"","sources":["../../../src/Testing/services/testing-instrumentation.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { Observable, BehaviorSubject, from, combineLatest } from 'rxjs';\nimport { map, switchMap, shareReplay, tap } from 'rxjs/operators';\nimport { RunView, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { MJTestRunFeedbackEntity } from '@memberjunction/core-entities';\nimport { TestEngineBase } from '@memberjunction/testing-engine-base';\n\nexport interface TestingDashboardKPIs {\n totalTestsActive: number;\n passRateThisMonth: number;\n totalCostThisMonth: number;\n averageDuration: number;\n testsPendingReview: number;\n totalTestRuns: number;\n failedTests: number;\n skippedTests: number;\n passRateTrend: number; // Percentage change from previous period\n}\n\nexport interface TestRunSummary {\n id: string;\n testId: string;\n testName: string;\n suiteName: string;\n testType: string;\n status: 'Passed' | 'Failed' | 'Skipped' | 'Error' | 'Running' | 'Timeout';\n score: number; // 0-1.0000\n duration: number; // milliseconds\n cost: number; // USD\n runDateTime: Date;\n targetType: string;\n targetLogID: string;\n}\n\nexport interface SuiteHierarchyNode {\n id: string;\n name: string;\n parentID: string | null;\n level: number;\n children: SuiteHierarchyNode[];\n testCount: number;\n passRate: number;\n totalCost: number;\n averageScore: number;\n expanded?: boolean;\n}\n\nexport interface VersionMetrics {\n version: string; // GitCommit + AgentVersion combination\n gitCommit: string;\n agentVersion: string;\n runDate: Date;\n totalTests: number;\n passRate: number;\n averageScore: number;\n totalCost: number;\n averageDuration: number;\n newFailures: number;\n newPasses: number;\n}\n\nexport interface TestTrendData {\n timestamp: Date;\n totalRuns: number;\n passed: number;\n failed: number;\n skipped: number;\n errors: number;\n averageScore: number;\n totalCost: number;\n averageDuration: number;\n}\n\nexport interface FeedbackPending {\n testRunID: string;\n testName: string;\n automatedScore: number;\n automatedStatus: string;\n runDateTime: Date;\n reason: 'no-feedback' | 'high-score-failed' | 'low-score-passed';\n}\n\nexport interface TestAnalytics {\n topFailingTests: Array<{ testName: string; failureCount: number; failureRate: number }>;\n mostExpensiveTests: Array<{ testName: string; totalCost: number; avgCost: number }>;\n slowestTests: Array<{ testName: string; avgDuration: number; maxDuration: number }>;\n costByType: Array<{ testType: string; totalCost: number; testCount: number }>;\n costBySuite: Array<{ suiteName: string; totalCost: number; testCount: number }>;\n passingRateByType: Array<{ testType: string; passRate: number; totalTests: number }>;\n}\n\nexport interface FeedbackStats {\n totalFeedback: number;\n reviewedCount: number;\n avgRating: number;\n agreementRate: number;\n disagreementRate: number;\n accuracyRate: number;\n}\n\n/**\n * Extended test run summary with human feedback data included\n */\nexport interface TestRunWithFeedbackSummary extends TestRunSummary {\n // Human feedback\n humanRating: number | null;\n humanIsCorrect: boolean | null;\n humanComments: string | null;\n hasHumanFeedback: boolean;\n feedbackId: string | null;\n // Checks (from automated evaluation)\n passedChecks: number | null;\n failedChecks: number | null;\n totalChecks: number | null;\n}\n\n/**\n * Aggregated evaluation metrics\n */\nexport interface EvaluationSummaryMetrics {\n totalRuns: number;\n // Execution\n execCompletedCount: number;\n execErrorCount: number;\n execSuccessRate: number;\n // Human\n humanReviewedCount: number;\n humanPendingCount: number;\n humanAvgRating: number;\n humanCorrectRate: number;\n // Auto\n autoEvaluatedCount: number;\n autoAvgScore: number;\n autoPassRate: number;\n // Agreement\n agreementRate: number;\n}\n\n// Simple result types for optimized queries (only fields needed for display)\ninterface TestRunSimple {\n ID: string;\n TestID: string;\n Test: string;\n Status: string;\n Score: number;\n CostUSD: number;\n StartedAt: Date;\n CompletedAt: Date | null;\n TargetType: string;\n TargetLogID: string;\n}\n\ninterface TestSuiteRunSimple {\n ID: string;\n TestSuiteID: string;\n TotalTests: number;\n PassedTests: number;\n TotalCostUSD: number;\n StartedAt: Date;\n GitCommit: string;\n AgentVersion: string;\n}\n\ninterface TestRunFeedbackSimple {\n ID: string;\n TestRunID: string;\n Rating: number;\n IsCorrect: boolean;\n Comments: string;\n CreatedAt: Date;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TestingInstrumentationService {\n private readonly _dateRange$ = new BehaviorSubject<{ start: Date; end: Date }>({\n start: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000), // Last 30 days\n end: new Date()\n });\n\n private readonly _suiteFilter$ = new BehaviorSubject<string | null>(null);\n private readonly _testTypeFilter$ = new BehaviorSubject<string | null>(null);\n private readonly _refreshTrigger$ = new BehaviorSubject<number>(0);\n private readonly _isLoading$ = new BehaviorSubject<boolean>(false);\n private _provider: IMetadataProvider | null = null;\n\n /** Set the metadata provider this service should use. Components should call this after injection. */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n private get metadata(): IMetadataProvider {\n return this.Provider;\n }\n\n // Expose observables\n readonly isLoading$ = this._isLoading$.asObservable();\n readonly dateRange$ = this._dateRange$.asObservable();\n\n constructor() {}\n\n // Main data streams\n readonly kpis$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadKPIs())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n readonly testRuns$ = combineLatest([\n this._refreshTrigger$,\n this._dateRange$,\n this._suiteFilter$,\n this._testTypeFilter$\n ]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadTestRuns())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n readonly suiteHierarchy$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadSuiteHierarchy())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n readonly trends$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadTrends())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n readonly analytics$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadAnalytics())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n readonly pendingFeedback$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadPendingFeedback())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n readonly feedbackStats$ = combineLatest([this._refreshTrigger$, this._dateRange$]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadFeedbackStats())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n /**\n * Test runs with feedback data joined - for evaluation display\n */\n readonly testRunsWithFeedback$ = combineLatest([\n this._refreshTrigger$,\n this._dateRange$,\n this._suiteFilter$,\n this._testTypeFilter$\n ]).pipe(\n tap(() => this._isLoading$.next(true)),\n switchMap(() => from(this.loadTestRunsWithFeedback())),\n tap(() => this.checkLoadingComplete()),\n shareReplay(1)\n );\n\n /**\n * Aggregated evaluation metrics from test runs with feedback\n */\n readonly evaluationMetrics$ = this.testRunsWithFeedback$.pipe(\n map(runs => this.calculateEvaluationMetrics(runs)),\n shareReplay(1)\n );\n\n private checkLoadingComplete(): void {\n setTimeout(() => {\n this._isLoading$.next(false);\n }, 100);\n }\n\n setDateRange(start: Date, end: Date): void {\n this._dateRange$.next({ start, end });\n }\n\n setSuiteFilter(suiteId: string | null): void {\n this._suiteFilter$.next(suiteId);\n }\n\n setTestTypeFilter(typeId: string | null): void {\n this._testTypeFilter$.next(typeId);\n }\n\n refresh(): void {\n this._refreshTrigger$.next(this._refreshTrigger$.value + 1);\n }\n\n private async loadKPIs(): Promise<TestingDashboardKPIs> {\n const { start, end } = this._dateRange$.value;\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Get Tests from TestEngineBase cache instead of querying DB\n const engine = TestEngineBase.Instance;\n const activeTests = engine.Tests.filter(t => t.Status === 'Active');\n\n // Only load runs via RunView (not cached in engine) - use simple result type with only needed fields\n const [testRunsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,\n Fields: ['ID', 'Status', 'Score', 'CostUSD', 'StartedAt', 'CompletedAt'],\n ResultType: 'simple',\n CacheLocal: true\n }\n ]);\n\n const testRuns = testRunsResult.Results as TestRunSimple[];\n\n // Calculate KPIs\n const totalTestsActive = activeTests.length;\n const totalTestRuns = testRuns.length;\n\n const passedRuns = testRuns.filter(r => r.Status === 'Passed');\n const failedRuns = testRuns.filter(r => r.Status === 'Failed');\n const skippedRuns = testRuns.filter(r => r.Status === 'Skipped');\n\n const passRateThisMonth = totalTestRuns > 0 ? (passedRuns.length / totalTestRuns) * 100 : 0;\n\n const totalCostThisMonth = testRuns.reduce((sum, r) => sum + (r.CostUSD || 0), 0);\n\n const completedRuns = testRuns.filter(r => r.CompletedAt != null && r.StartedAt != null);\n const averageDuration = completedRuns.length > 0\n ? completedRuns.reduce((sum, r) => {\n const startTime = r.StartedAt instanceof Date ? r.StartedAt.getTime() : new Date(r.StartedAt).getTime();\n const endTime = r.CompletedAt instanceof Date ? r.CompletedAt.getTime() : new Date(r.CompletedAt!).getTime();\n return sum + (endTime - startTime);\n }, 0) / completedRuns.length\n : 0;\n\n // Count tests pending review (no feedback)\n const testRunIDs = testRuns.map(r => r.ID);\n const testsPendingReview = await this.countTestsPendingReview(testRunIDs);\n\n // Calculate trend (compare to previous period)\n const periodDuration = end.getTime() - start.getTime();\n const previousStart = new Date(start.getTime() - periodDuration);\n const previousEnd = new Date(start.getTime());\n\n const previousRunsResult = await rv.RunView<TestRunSimple>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `StartedAt >= '${previousStart.toISOString()}' AND StartedAt < '${previousEnd.toISOString()}'`,\n Fields: ['ID', 'Status'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const previousRuns = previousRunsResult.Results || [];\n const previousPassRate = previousRuns.length > 0\n ? (previousRuns.filter(r => r.Status === 'Passed').length / previousRuns.length) * 100\n : 0;\n\n const passRateTrend = previousPassRate > 0 ? passRateThisMonth - previousPassRate : 0;\n\n return {\n totalTestsActive,\n passRateThisMonth,\n totalCostThisMonth,\n averageDuration,\n testsPendingReview,\n totalTestRuns,\n failedTests: failedRuns.length,\n skippedTests: skippedRuns.length,\n passRateTrend\n };\n }\n\n private async countTestsPendingReview(testRunIDs: string[]): Promise<number> {\n if (testRunIDs.length === 0) return 0;\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const idList = testRunIDs.join(\"','\");\n\n const feedbackResult = await rv.RunView<{TestRunID: string}>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `TestRunID IN ('${idList}')`,\n Fields: ['TestRunID'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const feedbackTestRunIDs = new Set((feedbackResult.Results || []).map(f => f.TestRunID));\n\n return testRunIDs.filter(id => !feedbackTestRunIDs.has(id)).length;\n }\n\n private async loadTestRuns(): Promise<TestRunSummary[]> {\n const { start, end } = this._dateRange$.value;\n const suiteFilter = this._suiteFilter$.value;\n const typeFilter = this._testTypeFilter$.value;\n\n let filter = `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`;\n\n if (suiteFilter) {\n // Need to join through TestSuiteTest\n filter += ` AND TestID IN (SELECT TestID FROM [__mj].[vwTestSuiteTests] WHERE TestSuiteID = '${suiteFilter}')`;\n }\n\n if (typeFilter) {\n filter += ` AND TestID IN (SELECT ID FROM [__mj].[vwTests] WHERE TypeID = '${typeFilter}')`;\n }\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<TestRunSimple>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: filter,\n OrderBy: 'StartedAt DESC',\n MaxRows: 1000,\n Fields: ['ID', 'TestID', 'Test', 'Status', 'Score', 'CostUSD', 'StartedAt', 'CompletedAt', 'TargetType', 'TargetLogID'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const testRuns = result.Results || [];\n\n return testRuns.map(run => {\n const startedAt = run.StartedAt instanceof Date ? run.StartedAt : new Date(run.StartedAt);\n const completedAt = run.CompletedAt\n ? (run.CompletedAt instanceof Date ? run.CompletedAt : new Date(run.CompletedAt))\n : null;\n\n return {\n id: run.ID,\n testId: run.TestID || '',\n testName: run.Test || 'Unknown Test',\n suiteName: '', // Will be populated from join\n testType: run.Test || 'Unknown',\n status: run.Status as 'Passed' | 'Failed' | 'Skipped' | 'Error' | 'Running',\n score: run.Score || 0,\n duration: completedAt && startedAt\n ? completedAt.getTime() - startedAt.getTime()\n : (startedAt ? Date.now() - startedAt.getTime() : 0),\n cost: run.CostUSD || 0,\n runDateTime: startedAt,\n targetType: run.TargetType || '',\n targetLogID: run.TargetLogID || ''\n };\n });\n }\n\n private async loadSuiteHierarchy(): Promise<SuiteHierarchyNode[]> {\n const { start, end } = this._dateRange$.value;\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Get Test Suites from TestEngineBase cache instead of querying DB\n const engine = TestEngineBase.Instance;\n const suites = engine.TestSuites.filter(s => s.Status === 'Active');\n\n // Only load test runs via RunView (not cached in engine) - use simple result type\n const testRunsResult = await rv.RunView<{ID: string; TestID: string; Status: string; Score: number; CostUSD: number}>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,\n Fields: ['ID', 'TestID', 'Status', 'Score', 'CostUSD'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const testRuns = testRunsResult.Results || [];\n\n // Build hierarchy\n const nodes: SuiteHierarchyNode[] = suites.map(suite => ({\n id: suite.ID,\n name: suite.Name,\n parentID: suite.ParentID || null,\n level: 0,\n children: [],\n testCount: 0,\n passRate: 0,\n totalCost: 0,\n averageScore: 0,\n expanded: false\n }));\n\n // Calculate metrics for each suite (simplified - would need TestSuiteTest join for accuracy)\n type SimpleTestRun = {ID: string; TestID: string; Status: string; Score: number; CostUSD: number};\n const suiteTestRuns = new Map<string, SimpleTestRun[]>();\n\n testRuns.forEach(run => {\n // This is simplified - would need to query TestSuiteTest to get actual suite membership\n const suiteID = run.TestID; // Placeholder\n if (!suiteTestRuns.has(suiteID)) {\n suiteTestRuns.set(suiteID, []);\n }\n suiteTestRuns.get(suiteID)!.push(run);\n });\n\n nodes.forEach(node => {\n const runs = suiteTestRuns.get(node.id) || [];\n node.testCount = runs.length;\n node.passRate = runs.length > 0\n ? (runs.filter(r => r.Status === 'Passed').length / runs.length) * 100\n : 0;\n node.totalCost = runs.reduce((sum, r) => sum + (r.CostUSD || 0), 0);\n node.averageScore = runs.length > 0\n ? runs.reduce((sum, r) => sum + (r.Score || 0), 0) / runs.length\n : 0;\n });\n\n // Build tree structure\n const rootNodes: SuiteHierarchyNode[] = [];\n const nodeMap = new Map<string, SuiteHierarchyNode>();\n\n nodes.forEach(node => nodeMap.set(node.id, node));\n\n nodes.forEach(node => {\n if (node.parentID) {\n const parent = nodeMap.get(node.parentID);\n if (parent) {\n parent.children.push(node);\n node.level = parent.level + 1;\n } else {\n rootNodes.push(node);\n }\n } else {\n rootNodes.push(node);\n }\n });\n\n return rootNodes;\n }\n\n private async loadTrends(): Promise<TestTrendData[]> {\n const { start, end } = this._dateRange$.value;\n\n // Create time buckets\n const buckets = this.createTimeBuckets(start, end);\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Load all test runs for the period - use simple result type with only needed fields\n type TrendRun = {Status: string; Score: number; CostUSD: number; StartedAt: string | Date; CompletedAt: string | Date | null};\n const result = await rv.RunView<TrendRun>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,\n OrderBy: 'StartedAt',\n Fields: ['Status', 'Score', 'CostUSD', 'StartedAt', 'CompletedAt'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const allRuns = result.Results || [];\n\n // Aggregate into buckets\n const trends: TestTrendData[] = buckets.map(bucketStart => {\n const bucketEnd = new Date(bucketStart.getTime() + this.getBucketSize(start, end));\n\n const bucketRuns = allRuns.filter(r => {\n if (!r.StartedAt) return false;\n const runTime = r.StartedAt instanceof Date ? r.StartedAt : new Date(r.StartedAt);\n return runTime >= bucketStart && runTime < bucketEnd;\n });\n\n const passed = bucketRuns.filter(r => r.Status === 'Passed').length;\n const failed = bucketRuns.filter(r => r.Status === 'Failed').length;\n const skipped = bucketRuns.filter(r => r.Status === 'Skipped').length;\n const errors = bucketRuns.filter(r => r.Status === 'Error').length;\n\n const averageScore = bucketRuns.length > 0\n ? bucketRuns.reduce((sum, r) => sum + (r.Score || 0), 0) / bucketRuns.length\n : 0;\n\n const totalCost = bucketRuns.reduce((sum, r) => sum + (r.CostUSD || 0), 0);\n\n const completedRuns = bucketRuns.filter(r => r.CompletedAt != null && r.StartedAt != null);\n const averageDuration = completedRuns.length > 0\n ? completedRuns.reduce((sum, r) => {\n const startTime = r.StartedAt instanceof Date ? r.StartedAt.getTime() : new Date(r.StartedAt).getTime();\n const endTime = r.CompletedAt instanceof Date ? r.CompletedAt.getTime() : new Date(r.CompletedAt!).getTime();\n return sum + (endTime - startTime);\n }, 0) / completedRuns.length\n : 0;\n\n return {\n timestamp: bucketStart,\n totalRuns: bucketRuns.length,\n passed,\n failed,\n skipped,\n errors,\n averageScore,\n totalCost,\n averageDuration\n };\n });\n\n return trends;\n }\n\n private async loadAnalytics(): Promise<TestAnalytics> {\n const { start, end } = this._dateRange$.value;\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Use simple result type with only needed fields\n type AnalyticsRun = {Test: string; Status: string; Score: number; CostUSD: number; StartedAt: string | Date; CompletedAt: string | Date | null};\n const result = await rv.RunView<AnalyticsRun>({\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,\n Fields: ['Test', 'Status', 'Score', 'CostUSD', 'StartedAt', 'CompletedAt'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const testRuns = result.Results || [];\n\n // Group by test name\n const testMetrics = new Map<string, { runs: AnalyticsRun[], failures: number }>();\n\n testRuns.forEach(run => {\n const testName = run.Test || 'Unknown';\n if (!testMetrics.has(testName)) {\n testMetrics.set(testName, { runs: [], failures: 0 });\n }\n const metrics = testMetrics.get(testName)!;\n metrics.runs.push(run);\n if (run.Status === 'Failed' || run.Status === 'Error') {\n metrics.failures++;\n }\n });\n\n // Top failing tests\n const topFailingTests = Array.from(testMetrics.entries())\n .map(([testName, metrics]) => ({\n testName,\n failureCount: metrics.failures,\n failureRate: metrics.runs.length > 0 ? (metrics.failures / metrics.runs.length) * 100 : 0\n }))\n .sort((a, b) => b.failureCount - a.failureCount)\n .slice(0, 10);\n\n // Most expensive tests\n const mostExpensiveTests = Array.from(testMetrics.entries())\n .map(([testName, metrics]) => {\n const totalCost = metrics.runs.reduce((sum, r) => sum + (r.CostUSD || 0), 0);\n const avgCost = metrics.runs.length > 0 ? totalCost / metrics.runs.length : 0;\n return { testName, totalCost, avgCost };\n })\n .sort((a, b) => b.totalCost - a.totalCost)\n .slice(0, 10);\n\n // Slowest tests\n const slowestTests = Array.from(testMetrics.entries())\n .map(([testName, metrics]) => {\n const durations = metrics.runs\n .filter(r => r.CompletedAt != null && r.StartedAt != null)\n .map(r => {\n const startTime = r.StartedAt instanceof Date ? r.StartedAt.getTime() : new Date(r.StartedAt).getTime();\n const endTime = r.CompletedAt instanceof Date ? r.CompletedAt.getTime() : new Date(r.CompletedAt!).getTime();\n return endTime - startTime;\n });\n\n const avgDuration = durations.length > 0\n ? durations.reduce((sum, d) => sum + d, 0) / durations.length\n : 0;\n const maxDuration = durations.length > 0 ? Math.max(...durations) : 0;\n\n return { testName, avgDuration, maxDuration };\n })\n .sort((a, b) => b.avgDuration - a.avgDuration)\n .slice(0, 10);\n\n // Cost by type (simplified - would need actual type data)\n const typeMetrics = new Map<string, { cost: number, count: number }>();\n testRuns.forEach(run => {\n const type = run.Test || 'Unknown';\n if (!typeMetrics.has(type)) {\n typeMetrics.set(type, { cost: 0, count: 0 });\n }\n const metrics = typeMetrics.get(type)!;\n metrics.cost += run.CostUSD || 0;\n metrics.count++;\n });\n\n const costByType = Array.from(typeMetrics.entries())\n .map(([testType, metrics]) => ({\n testType,\n totalCost: metrics.cost,\n testCount: metrics.count\n }))\n .sort((a, b) => b.totalCost - a.totalCost);\n\n // Passing rate by type\n const typePassingMetrics = new Map<string, { total: number, passed: number }>();\n testRuns.forEach(run => {\n const type = run.Test || 'Unknown';\n if (!typePassingMetrics.has(type)) {\n typePassingMetrics.set(type, { total: 0, passed: 0 });\n }\n const metrics = typePassingMetrics.get(type)!;\n metrics.total++;\n if (run.Status === 'Passed') {\n metrics.passed++;\n }\n });\n\n const passingRateByType = Array.from(typePassingMetrics.entries())\n .map(([testType, metrics]) => ({\n testType,\n passRate: metrics.total > 0 ? (metrics.passed / metrics.total) * 100 : 0,\n totalTests: metrics.total\n }))\n .sort((a, b) => a.passRate - b.passRate);\n\n return {\n topFailingTests,\n mostExpensiveTests,\n slowestTests,\n costByType,\n costBySuite: [], // Would need suite data\n passingRateByType\n };\n }\n\n private async loadPendingFeedback(): Promise<FeedbackPending[]> {\n const { start, end } = this._dateRange$.value;\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Use simple result types with only needed fields\n type FeedbackTestRun = {ID: string; Test: string; Score: number; Status: string; StartedAt: string | Date};\n type FeedbackItem = {TestRunID: string};\n\n const [testRunsResult, feedbackResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Test Runs',\n ExtraFilter: `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`,\n Fields: ['ID', 'Test', 'Score', 'Status', 'StartedAt'],\n ResultType: 'simple',\n CacheLocal: true\n },\n {\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `CreatedAt >= '${start.toISOString()}'`,\n Fields: ['TestRunID'],\n ResultType: 'simple',\n CacheLocal: true\n }\n ]);\n\n const testRuns = testRunsResult.Results as FeedbackTestRun[];\n const feedbacks = feedbackResult.Results as FeedbackItem[];\n\n const feedbackTestRunIDs = new Set(feedbacks.map(f => f.TestRunID));\n\n const pending: FeedbackPending[] = [];\n\n testRuns.forEach(run => {\n const hasFeedback = feedbackTestRunIDs.has(run.ID);\n const runDateTime = run.StartedAt instanceof Date ? run.StartedAt : new Date(run.StartedAt);\n\n if (!hasFeedback) {\n pending.push({\n testRunID: run.ID,\n testName: run.Test || 'Unknown',\n automatedScore: run.Score || 0,\n automatedStatus: run.Status,\n runDateTime,\n reason: 'no-feedback'\n });\n } else {\n // Check for discrepancies\n if (run.Status === 'Failed' && run.Score != null && run.Score >= 0.8) {\n pending.push({\n testRunID: run.ID,\n testName: run.Test || 'Unknown',\n automatedScore: run.Score,\n automatedStatus: run.Status,\n runDateTime,\n reason: 'high-score-failed'\n });\n } else if (run.Status === 'Passed' && run.Score != null && run.Score < 0.5) {\n pending.push({\n testRunID: run.ID,\n testName: run.Test || 'Unknown',\n automatedScore: run.Score,\n automatedStatus: run.Status,\n runDateTime,\n reason: 'low-score-passed'\n });\n }\n }\n });\n\n return pending.sort((a, b) => b.runDateTime.getTime() - a.runDateTime.getTime());\n }\n\n private async loadFeedbackStats(): Promise<FeedbackStats> {\n const { start, end } = this._dateRange$.value;\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Load all feedback for the period - use simple result type with only needed fields\n type FeedbackStatItem = {Rating: number; IsCorrect: boolean};\n const feedbackResult = await rv.RunView<FeedbackStatItem>({\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `CreatedAt >= '${start.toISOString()}' AND CreatedAt <= '${end.toISOString()}'`,\n Fields: ['Rating', 'IsCorrect'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const feedbacks = feedbackResult.Results || [];\n const totalFeedback = feedbacks.length;\n\n if (totalFeedback === 0) {\n return {\n totalFeedback: 0,\n reviewedCount: 0,\n avgRating: 0,\n agreementRate: 0,\n disagreementRate: 0,\n accuracyRate: 0\n };\n }\n\n // Calculate average rating\n const avgRating = feedbacks.reduce((sum, f) => sum + (f.Rating || 0), 0) / totalFeedback;\n\n // Calculate agreement/disagreement rates based on IsCorrect field\n const correctCount = feedbacks.filter(f => f.IsCorrect === true).length;\n const incorrectCount = feedbacks.filter(f => f.IsCorrect === false).length;\n\n const agreementRate = (correctCount / totalFeedback) * 100;\n const disagreementRate = (incorrectCount / totalFeedback) * 100;\n\n // Accuracy rate is the same as agreement rate (% of times human agreed with automated result)\n const accuracyRate = agreementRate;\n\n return {\n totalFeedback,\n reviewedCount: totalFeedback, // All feedbacks in this query are reviewed\n avgRating,\n agreementRate,\n disagreementRate,\n accuracyRate\n };\n }\n\n async submitFeedback(testRunID: string, rating: number, isCorrect: boolean, comments: string): Promise<boolean> {\n try {\n const feedback = await this.metadata.GetEntityObject<MJTestRunFeedbackEntity>('MJ: Test Run Feedbacks');\n feedback.TestRunID = testRunID;\n feedback.Rating = rating;\n feedback.IsCorrect = isCorrect;\n feedback.Comments = comments;\n\n const result = await feedback.Save();\n if (result) {\n this.refresh(); // Refresh data after submission\n return true;\n }\n return false;\n } catch (error) {\n console.error('Error submitting feedback:', error);\n return false;\n }\n }\n\n async getVersionMetrics(): Promise<VersionMetrics[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Use simple result type with only needed fields\n type VersionRun = {TotalTests: number; PassedTests: number; TotalCostUSD: number; StartedAt: string | Date; GitCommit: string; AgentVersion: string};\n const result = await rv.RunView<VersionRun>({\n EntityName: 'MJ: Test Suite Runs',\n ExtraFilter: '',\n OrderBy: 'StartedAt DESC',\n MaxRows: 100,\n Fields: ['TotalTests', 'PassedTests', 'TotalCostUSD', 'StartedAt', 'GitCommit', 'AgentVersion'],\n ResultType: 'simple',\n CacheLocal: true\n });\n\n const suiteRuns = result.Results || [];\n\n // Group by version combination\n const versionMap = new Map<string, VersionRun[]>();\n\n suiteRuns.forEach(run => {\n const key = `${run.GitCommit || 'unknown'}_${run.AgentVersion || 'unknown'}`;\n if (!versionMap.has(key)) {\n versionMap.set(key, []);\n }\n versionMap.get(key)!.push(run);\n });\n\n const metrics: VersionMetrics[] = Array.from(versionMap.entries()).map(([key, runs]) => {\n const [gitCommit, agentVersion] = key.split('_');\n const latest = runs[0];\n\n const totalTests = runs.reduce((sum, r) => sum + (r.TotalTests || 0), 0);\n const totalPassed = runs.reduce((sum, r) => sum + (r.PassedTests || 0), 0);\n const totalCost = runs.reduce((sum, r) => sum + (r.TotalCostUSD || 0), 0);\n\n const runDate = latest.StartedAt instanceof Date ? latest.StartedAt : new Date(latest.StartedAt);\n\n return {\n version: `${gitCommit.substring(0, 7)} / ${agentVersion}`,\n gitCommit,\n agentVersion,\n runDate,\n totalTests,\n passRate: totalTests > 0 ? (totalPassed / totalTests) * 100 : 0,\n averageScore: 0, // Would need to calculate from test runs\n totalCost,\n averageDuration: 0, // Would need to calculate from test runs\n newFailures: 0, // Would need comparison\n newPasses: 0 // Would need comparison\n };\n });\n\n return metrics.sort((a, b) => b.runDate.getTime() - a.runDate.getTime());\n }\n\n private createTimeBuckets(start: Date, end: Date): Date[] {\n const buckets: Date[] = [];\n const bucketSize = this.getBucketSize(start, end);\n const current = new Date(start);\n\n while (current < end) {\n buckets.push(new Date(current));\n current.setTime(current.getTime() + bucketSize);\n }\n\n return buckets;\n }\n\n private getBucketSize(start: Date, end: Date): number {\n const duration = end.getTime() - start.getTime();\n const days = duration / (1000 * 60 * 60 * 24);\n\n if (days <= 1) {\n return 60 * 60 * 1000; // 1 hour\n } else if (days <= 7) {\n return 4 * 60 * 60 * 1000; // 4 hours\n } else if (days <= 30) {\n return 24 * 60 * 60 * 1000; // 1 day\n } else {\n return 7 * 24 * 60 * 60 * 1000; // 1 week\n }\n }\n\n /**\n * Load test runs with feedback data joined for evaluation display\n */\n private async loadTestRunsWithFeedback(): Promise<TestRunWithFeedbackSummary[]> {\n const { start, end } = this._dateRange$.value;\n const suiteFilter = this._suiteFilter$.value;\n const typeFilter = this._testTypeFilter$.value;\n\n let filter = `StartedAt >= '${start.toISOString()}' AND StartedAt <= '${end.toISOString()}'`;\n\n if (suiteFilter) {\n filter += ` AND TestID IN (SELECT TestID FROM [__mj].[vwTestSuiteTests] WHERE TestSuiteID = '${suiteFilter}')`;\n }\n\n if (typeFilter) {\n filter += ` AND TestID IN (SELECT ID FROM [__mj].[vwTests] WHERE TypeID = '${typeFilter}')`;\n }\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Load test runs with additional fields for evaluation\n type MJTestRunExtended = {\n ID: string;\n TestID: string;\n Test: string;\n Status: string;\n Score: number;\n CostUSD: number;\n StartedAt: Date;\n CompletedAt: Date | null;\n TargetType: string;\n TargetLogID: string;\n PassedChecks: number | null;\n FailedChecks: number | null;\n TotalChecks: number | null;\n };\n\n const [testRunsResult, feedbackResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Test Runs',\n ExtraFilter: filter,\n OrderBy: 'StartedAt DESC',\n MaxRows: 1000,\n Fields: ['ID', 'TestID', 'Test', 'Status', 'Score', 'CostUSD', 'StartedAt', 'CompletedAt', 'TargetType', 'TargetLogID', 'PassedChecks', 'FailedChecks', 'TotalChecks'],\n ResultType: 'simple',\n CacheLocal: true\n },\n {\n EntityName: 'MJ: Test Run Feedbacks',\n ExtraFilter: `CreatedAt >= '${start.toISOString()}'`,\n Fields: ['ID', 'TestRunID', 'Rating', 'IsCorrect', 'Comments'],\n ResultType: 'simple',\n CacheLocal: true\n }\n ]);\n\n const testRuns = (testRunsResult.Results || []) as MJTestRunExtended[];\n const feedbacks = (feedbackResult.Results || []) as TestRunFeedbackSimple[];\n\n // Create feedback lookup map\n const feedbackMap = new Map<string, TestRunFeedbackSimple>();\n feedbacks.forEach(f => {\n feedbackMap.set(f.TestRunID, f);\n });\n\n // Map test runs with feedback\n return testRuns.map(run => {\n const startedAt = run.StartedAt instanceof Date ? run.StartedAt : new Date(run.StartedAt);\n const completedAt = run.CompletedAt\n ? (run.CompletedAt instanceof Date ? run.CompletedAt : new Date(run.CompletedAt))\n : null;\n\n const feedback = feedbackMap.get(run.ID);\n\n return {\n id: run.ID,\n testId: run.TestID || '',\n testName: run.Test || 'Unknown Test',\n suiteName: '',\n testType: run.Test || 'Unknown',\n status: run.Status as 'Passed' | 'Failed' | 'Skipped' | 'Error' | 'Running' | 'Timeout',\n score: run.Score || 0,\n duration: completedAt && startedAt\n ? completedAt.getTime() - startedAt.getTime()\n : (startedAt ? Date.now() - startedAt.getTime() : 0),\n cost: run.CostUSD || 0,\n runDateTime: startedAt,\n targetType: run.TargetType || '',\n targetLogID: run.TargetLogID || '',\n // Checks\n passedChecks: run.PassedChecks,\n failedChecks: run.FailedChecks,\n totalChecks: run.TotalChecks,\n // Human feedback\n humanRating: feedback?.Rating ?? null,\n humanIsCorrect: feedback?.IsCorrect ?? null,\n humanComments: feedback?.Comments ?? null,\n hasHumanFeedback: !!feedback,\n feedbackId: feedback?.ID ?? null\n };\n });\n }\n\n /**\n * Calculate aggregated evaluation metrics from test runs with feedback\n */\n private calculateEvaluationMetrics(runs: TestRunWithFeedbackSummary[]): EvaluationSummaryMetrics {\n const totalRuns = runs.length;\n\n if (totalRuns === 0) {\n return {\n totalRuns: 0,\n execCompletedCount: 0,\n execErrorCount: 0,\n execSuccessRate: 0,\n humanReviewedCount: 0,\n humanPendingCount: 0,\n humanAvgRating: 0,\n humanCorrectRate: 0,\n autoEvaluatedCount: 0,\n autoAvgScore: 0,\n autoPassRate: 0,\n agreementRate: 0\n };\n }\n\n // Execution metrics\n const execCompleted = runs.filter(r =>\n r.status === 'Passed' || r.status === 'Failed'\n );\n const execErrors = runs.filter(r =>\n r.status === 'Error' || r.status === 'Timeout'\n );\n const execSuccessRate = totalRuns > 0 ? (execCompleted.length / totalRuns) * 100 : 0;\n\n // Human feedback metrics\n const reviewed = runs.filter(r => r.hasHumanFeedback);\n const pending = runs.filter(r => !r.hasHumanFeedback);\n const withRating = reviewed.filter(r => r.humanRating != null);\n const humanAvgRating = withRating.length > 0\n ? withRating.reduce((sum, r) => sum + (r.humanRating || 0), 0) / withRating.length\n : 0;\n const correct = reviewed.filter(r => r.humanIsCorrect === true);\n const humanCorrectRate = reviewed.length > 0 ? (correct.length / reviewed.length) * 100 : 0;\n\n // Auto score metrics\n const evaluated = runs.filter(r => r.score > 0);\n const autoAvgScore = evaluated.length > 0\n ? evaluated.reduce((sum, r) => sum + r.score, 0) / evaluated.length\n : 0;\n const autoPass = evaluated.filter(r => r.score >= 0.8);\n const autoPassRate = evaluated.length > 0 ? (autoPass.length / evaluated.length) * 100 : 0;\n\n // Agreement metrics\n const bothEvaluated = runs.filter(r =>\n r.hasHumanFeedback && r.score > 0 && r.humanIsCorrect != null\n );\n let agreementCount = 0;\n\n bothEvaluated.forEach(r => {\n const autoConsideredPass = r.score >= 0.5;\n const humanConsideredPass = r.humanIsCorrect === true;\n\n if (autoConsideredPass === humanConsideredPass) {\n agreementCount++;\n }\n });\n\n const agreementRate = bothEvaluated.length > 0\n ? (agreementCount / bothEvaluated.length) * 100\n : 0;\n\n return {\n totalRuns,\n execCompletedCount: execCompleted.length,\n execErrorCount: execErrors.length,\n execSuccessRate,\n humanReviewedCount: reviewed.length,\n humanPendingCount: pending.length,\n humanAvgRating,\n humanCorrectRate,\n autoEvaluatedCount: evaluated.length,\n autoAvgScore,\n autoPassRate,\n agreementRate\n };\n }\n}\n"]}
|
|
@@ -3,6 +3,7 @@ import { BaseDashboard } from '@memberjunction/ng-shared';
|
|
|
3
3
|
import { Subject } from 'rxjs';
|
|
4
4
|
import { ResourceData } from '@memberjunction/core-entities';
|
|
5
5
|
import { TestingDialogService, TestingExecutionService, ActiveRun } from '@memberjunction/ng-testing';
|
|
6
|
+
import { TestingInstrumentationService } from './services/testing-instrumentation.service';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
interface TestingDashboardState {
|
|
8
9
|
activeTab: string;
|
|
@@ -15,6 +16,7 @@ export declare class TestingDashboardComponent extends BaseDashboard implements
|
|
|
15
16
|
private cdr;
|
|
16
17
|
testingDialogService: TestingDialogService;
|
|
17
18
|
private executionService;
|
|
19
|
+
private instrumentationService;
|
|
18
20
|
isLoading: boolean;
|
|
19
21
|
activeTab: string;
|
|
20
22
|
selectedIndex: number;
|
|
@@ -32,7 +34,7 @@ export declare class TestingDashboardComponent extends BaseDashboard implements
|
|
|
32
34
|
}[];
|
|
33
35
|
private stateChangeSubject;
|
|
34
36
|
protected destroy$: Subject<void>;
|
|
35
|
-
constructor(cdr: ChangeDetectorRef, testingDialogService: TestingDialogService, executionService: TestingExecutionService);
|
|
37
|
+
constructor(cdr: ChangeDetectorRef, testingDialogService: TestingDialogService, executionService: TestingExecutionService, instrumentationService: TestingInstrumentationService);
|
|
36
38
|
GetResourceDisplayName(data: ResourceData): Promise<string>;
|
|
37
39
|
ngAfterViewInit(): void;
|
|
38
40
|
ngOnDestroy(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/Testing/testing-dashboard.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAA2B,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;;
|
|
1
|
+
{"version":3,"file":"testing-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/Testing/testing-dashboard.component.ts"],"names":[],"mappings":"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"}
|