@memberjunction/ng-dashboards 5.34.1 → 5.35.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 +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +399 -292
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
- 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 +87 -85
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +75 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +400 -89
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
- 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 +104 -103
- 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 +8 -2
- 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 +76 -74
- 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.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
- 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 +12 -19
- 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 +96 -203
- 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.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
- 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.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +990 -992
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +17 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +370 -425
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +317 -357
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +403 -362
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +781 -783
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +6 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +79 -30
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +196 -142
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/index.d.ts +0 -1
- package/dist/Actions/components/explorer/index.d.ts.map +1 -1
- package/dist/Actions/components/explorer/index.js +0 -1
- package/dist/Actions/components/explorer/index.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +32 -40
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +32 -40
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +32 -40
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.js +24 -5
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +80 -99
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +127 -106
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +44 -45
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +60 -58
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +139 -162
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +6 -0
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +521 -485
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +8 -0
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +309 -318
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +866 -847
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +182 -163
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +241 -241
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +1 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +28 -1
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +486 -532
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +152 -160
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
- 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 +234 -246
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +1248 -1338
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +1 -1
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +34 -1
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.js +76 -85
- package/dist/Permissions/audit-log-resource.component.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +64 -69
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +63 -74
- package/dist/Permissions/user-access-resource.component.js.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/components/scheduling-activity-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +773 -783
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +420 -393
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +587 -608
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +9 -12
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +3 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +310 -274
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +16 -19
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts +3 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +307 -273
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +107 -93
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +185 -188
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +154 -184
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +350 -354
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +163 -169
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/actions-dashboards.module.d.ts +15 -16
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +34 -11
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +45 -48
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +36 -10
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +2 -1
- package/dist/archiving-dashboards.module.d.ts.map +1 -1
- package/dist/archiving-dashboards.module.js +12 -2
- package/dist/archiving-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +2 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +24 -3
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +31 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +1 -1
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +28 -1
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +1 -1
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +28 -1
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -3
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +1 -1
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +31 -1
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +8 -7
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +30 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +52 -52
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
|
@@ -12,38 +12,37 @@ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
|
12
12
|
import { UUIDsEqual } from '@memberjunction/global';
|
|
13
13
|
import * as i0 from "@angular/core";
|
|
14
14
|
import * as i1 from "@memberjunction/ng-shared-generic";
|
|
15
|
-
import * as i2 from "
|
|
16
|
-
import * as i3 from "@angular/common";
|
|
15
|
+
import * as i2 from "@angular/common";
|
|
17
16
|
const _forTrack0 = ($index, $item) => $item.AgentID;
|
|
18
17
|
const _forTrack1 = ($index, $item) => $item.field;
|
|
19
18
|
const _forTrack2 = ($index, $item) => $item.ID;
|
|
20
19
|
const _forTrack3 = ($index, $item) => $item.Label;
|
|
21
|
-
function
|
|
22
|
-
i0.ɵɵelementStart(0, "div",
|
|
23
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
20
|
+
function AnalyticsAgentRunsComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
21
|
+
i0.ɵɵelementStart(0, "div", 0);
|
|
22
|
+
i0.ɵɵelement(1, "mj-loading", 1);
|
|
24
23
|
i0.ɵɵelementEnd();
|
|
25
24
|
} }
|
|
26
|
-
function
|
|
27
|
-
i0.ɵɵelementStart(0, "div",
|
|
25
|
+
function AnalyticsAgentRunsComponent_Conditional_1_Conditional_41_Template(rf, ctx) { if (rf & 1) {
|
|
26
|
+
i0.ɵɵelementStart(0, "div", 13);
|
|
28
27
|
i0.ɵɵtext(1, "No agent cost data for selected period");
|
|
29
28
|
i0.ɵɵelementEnd();
|
|
30
29
|
} }
|
|
31
|
-
function
|
|
32
|
-
i0.ɵɵelement(0, "div",
|
|
30
|
+
function AnalyticsAgentRunsComponent_Conditional_1_For_43_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
31
|
+
i0.ɵɵelement(0, "div", 25);
|
|
33
32
|
} if (rf & 2) {
|
|
34
33
|
const seg_r1 = ctx.$implicit;
|
|
35
34
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
36
35
|
i0.ɵɵstyleProp("width", seg_r1.Percent, "%")("background", seg_r1.Color);
|
|
37
36
|
i0.ɵɵproperty("title", seg_r1.Label + ": " + ctx_r1.FormatCurrency(seg_r1.Value, 4));
|
|
38
37
|
} }
|
|
39
|
-
function
|
|
40
|
-
i0.ɵɵelementStart(0, "div",
|
|
38
|
+
function AnalyticsAgentRunsComponent_Conditional_1_For_43_Template(rf, ctx) { if (rf & 1) {
|
|
39
|
+
i0.ɵɵelementStart(0, "div", 14)(1, "div", 21);
|
|
41
40
|
i0.ɵɵtext(2);
|
|
42
41
|
i0.ɵɵelementEnd();
|
|
43
|
-
i0.ɵɵelementStart(3, "div",
|
|
44
|
-
i0.ɵɵrepeaterCreate(4,
|
|
42
|
+
i0.ɵɵelementStart(3, "div", 22);
|
|
43
|
+
i0.ɵɵrepeaterCreate(4, AnalyticsAgentRunsComponent_Conditional_1_For_43_For_5_Template, 1, 5, "div", 23, _forTrack3);
|
|
45
44
|
i0.ɵɵelementEnd();
|
|
46
|
-
i0.ɵɵelementStart(6, "div",
|
|
45
|
+
i0.ɵɵelementStart(6, "div", 24);
|
|
47
46
|
i0.ɵɵtext(7);
|
|
48
47
|
i0.ɵɵelementEnd()();
|
|
49
48
|
} if (rf & 2) {
|
|
@@ -58,9 +57,9 @@ function AnalyticsAgentRunsComponent_Conditional_2_For_43_Template(rf, ctx) { if
|
|
|
58
57
|
i0.ɵɵadvance(3);
|
|
59
58
|
i0.ɵɵtextInterpolate(ctx_r1.FormatCurrency(row_r3.TotalCost));
|
|
60
59
|
} }
|
|
61
|
-
function
|
|
62
|
-
i0.ɵɵelementStart(0, "div",
|
|
63
|
-
i0.ɵɵelement(1, "span",
|
|
60
|
+
function AnalyticsAgentRunsComponent_Conditional_1_Conditional_44_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
61
|
+
i0.ɵɵelementStart(0, "div", 26);
|
|
62
|
+
i0.ɵɵelement(1, "span", 27);
|
|
64
63
|
i0.ɵɵtext(2);
|
|
65
64
|
i0.ɵɵelementEnd();
|
|
66
65
|
} if (rf & 2) {
|
|
@@ -70,27 +69,27 @@ function AnalyticsAgentRunsComponent_Conditional_2_Conditional_44_For_2_Template
|
|
|
70
69
|
i0.ɵɵadvance();
|
|
71
70
|
i0.ɵɵtextInterpolate1(" ", item_r4.Label, " ");
|
|
72
71
|
} }
|
|
73
|
-
function
|
|
74
|
-
i0.ɵɵelementStart(0, "div",
|
|
75
|
-
i0.ɵɵrepeaterCreate(1,
|
|
72
|
+
function AnalyticsAgentRunsComponent_Conditional_1_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
73
|
+
i0.ɵɵelementStart(0, "div", 15);
|
|
74
|
+
i0.ɵɵrepeaterCreate(1, AnalyticsAgentRunsComponent_Conditional_1_Conditional_44_For_2_Template, 3, 3, "div", 26, _forTrack3);
|
|
76
75
|
i0.ɵɵelementEnd();
|
|
77
76
|
} if (rf & 2) {
|
|
78
77
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
79
78
|
i0.ɵɵadvance();
|
|
80
79
|
i0.ɵɵrepeater(ctx_r1.LegendItems);
|
|
81
80
|
} }
|
|
82
|
-
function
|
|
81
|
+
function AnalyticsAgentRunsComponent_Conditional_1_For_57_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
83
82
|
i0.ɵɵelement(0, "i");
|
|
84
83
|
} if (rf & 2) {
|
|
85
84
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
86
85
|
i0.ɵɵclassMap(ctx_r1.SortDir === "asc" ? "fa-solid fa-caret-up" : "fa-solid fa-caret-down");
|
|
87
86
|
} }
|
|
88
|
-
function
|
|
87
|
+
function AnalyticsAgentRunsComponent_Conditional_1_For_57_Template(rf, ctx) { if (rf & 1) {
|
|
89
88
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
90
|
-
i0.ɵɵelementStart(0, "th",
|
|
91
|
-
i0.ɵɵlistener("click", function
|
|
89
|
+
i0.ɵɵelementStart(0, "th", 28);
|
|
90
|
+
i0.ɵɵlistener("click", function AnalyticsAgentRunsComponent_Conditional_1_For_57_Template_th_click_0_listener() { const col_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSort(col_r6.field)); });
|
|
92
91
|
i0.ɵɵtext(1);
|
|
93
|
-
i0.ɵɵconditionalCreate(2,
|
|
92
|
+
i0.ɵɵconditionalCreate(2, AnalyticsAgentRunsComponent_Conditional_1_For_57_Conditional_2_Template, 1, 2, "i", 29);
|
|
94
93
|
i0.ɵɵelementEnd();
|
|
95
94
|
} if (rf & 2) {
|
|
96
95
|
const col_r6 = ctx.$implicit;
|
|
@@ -101,8 +100,8 @@ function AnalyticsAgentRunsComponent_Conditional_2_For_57_Template(rf, ctx) { if
|
|
|
101
100
|
i0.ɵɵadvance();
|
|
102
101
|
i0.ɵɵconditional(ctx_r1.SortField === col_r6.field ? 2 : -1);
|
|
103
102
|
} }
|
|
104
|
-
function
|
|
105
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
103
|
+
function AnalyticsAgentRunsComponent_Conditional_1_Conditional_59_Template(rf, ctx) { if (rf & 1) {
|
|
104
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 30);
|
|
106
105
|
i0.ɵɵtext(2, "No runs found");
|
|
107
106
|
i0.ɵɵelementEnd()();
|
|
108
107
|
} if (rf & 2) {
|
|
@@ -110,23 +109,23 @@ function AnalyticsAgentRunsComponent_Conditional_2_Conditional_59_Template(rf, c
|
|
|
110
109
|
i0.ɵɵadvance();
|
|
111
110
|
i0.ɵɵattribute("colspan", ctx_r1.TableColumns.length);
|
|
112
111
|
} }
|
|
113
|
-
function
|
|
114
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
112
|
+
function AnalyticsAgentRunsComponent_Conditional_1_For_61_Template(rf, ctx) { if (rf & 1) {
|
|
113
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 31);
|
|
115
114
|
i0.ɵɵtext(2);
|
|
116
115
|
i0.ɵɵelementEnd();
|
|
117
|
-
i0.ɵɵelementStart(3, "td")(4, "span",
|
|
116
|
+
i0.ɵɵelementStart(3, "td")(4, "span", 32);
|
|
118
117
|
i0.ɵɵtext(5);
|
|
119
118
|
i0.ɵɵelementEnd()();
|
|
120
|
-
i0.ɵɵelementStart(6, "td",
|
|
119
|
+
i0.ɵɵelementStart(6, "td", 33);
|
|
121
120
|
i0.ɵɵtext(7);
|
|
122
121
|
i0.ɵɵelementEnd();
|
|
123
|
-
i0.ɵɵelementStart(8, "td",
|
|
122
|
+
i0.ɵɵelementStart(8, "td", 33);
|
|
124
123
|
i0.ɵɵtext(9);
|
|
125
124
|
i0.ɵɵelementEnd();
|
|
126
|
-
i0.ɵɵelementStart(10, "td",
|
|
125
|
+
i0.ɵɵelementStart(10, "td", 33);
|
|
127
126
|
i0.ɵɵtext(11);
|
|
128
127
|
i0.ɵɵelementEnd();
|
|
129
|
-
i0.ɵɵelementStart(12, "td",
|
|
128
|
+
i0.ɵɵelementStart(12, "td", 34);
|
|
130
129
|
i0.ɵɵtext(13);
|
|
131
130
|
i0.ɵɵelementEnd()();
|
|
132
131
|
} if (rf & 2) {
|
|
@@ -146,69 +145,69 @@ function AnalyticsAgentRunsComponent_Conditional_2_For_61_Template(rf, ctx) { if
|
|
|
146
145
|
i0.ɵɵadvance(2);
|
|
147
146
|
i0.ɵɵtextInterpolate(run_r7.Time);
|
|
148
147
|
} }
|
|
149
|
-
function
|
|
150
|
-
i0.ɵɵelementStart(0, "div",
|
|
148
|
+
function AnalyticsAgentRunsComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
149
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "div", 4);
|
|
151
150
|
i0.ɵɵtext(3, "Total Runs");
|
|
152
151
|
i0.ɵɵelementEnd();
|
|
153
|
-
i0.ɵɵelementStart(4, "div",
|
|
152
|
+
i0.ɵɵelementStart(4, "div", 5);
|
|
154
153
|
i0.ɵɵtext(5);
|
|
155
154
|
i0.ɵɵpipe(6, "number");
|
|
156
155
|
i0.ɵɵelementEnd()();
|
|
157
|
-
i0.ɵɵelementStart(7, "div",
|
|
156
|
+
i0.ɵɵelementStart(7, "div", 3)(8, "div", 4);
|
|
158
157
|
i0.ɵɵtext(9, "Total Cost");
|
|
159
158
|
i0.ɵɵelementEnd();
|
|
160
|
-
i0.ɵɵelementStart(10, "div",
|
|
159
|
+
i0.ɵɵelementStart(10, "div", 5);
|
|
161
160
|
i0.ɵɵtext(11);
|
|
162
161
|
i0.ɵɵelementEnd()();
|
|
163
|
-
i0.ɵɵelementStart(12, "div",
|
|
162
|
+
i0.ɵɵelementStart(12, "div", 6)(13, "div", 4);
|
|
164
163
|
i0.ɵɵtext(14, "Prompt Runs");
|
|
165
164
|
i0.ɵɵelementEnd();
|
|
166
|
-
i0.ɵɵelementStart(15, "div",
|
|
165
|
+
i0.ɵɵelementStart(15, "div", 5);
|
|
167
166
|
i0.ɵɵtext(16);
|
|
168
167
|
i0.ɵɵpipe(17, "number");
|
|
169
168
|
i0.ɵɵelementEnd()();
|
|
170
|
-
i0.ɵɵelementStart(18, "div",
|
|
169
|
+
i0.ɵɵelementStart(18, "div", 6)(19, "div", 4);
|
|
171
170
|
i0.ɵɵtext(20, "Avg Cost/Run");
|
|
172
171
|
i0.ɵɵelementEnd();
|
|
173
|
-
i0.ɵɵelementStart(21, "div",
|
|
172
|
+
i0.ɵɵelementStart(21, "div", 5);
|
|
174
173
|
i0.ɵɵtext(22);
|
|
175
174
|
i0.ɵɵelementEnd()();
|
|
176
|
-
i0.ɵɵelementStart(23, "div",
|
|
175
|
+
i0.ɵɵelementStart(23, "div", 7)(24, "div", 4);
|
|
177
176
|
i0.ɵɵtext(25, "Success Rate");
|
|
178
177
|
i0.ɵɵelementEnd();
|
|
179
|
-
i0.ɵɵelementStart(26, "div",
|
|
178
|
+
i0.ɵɵelementStart(26, "div", 5);
|
|
180
179
|
i0.ɵɵtext(27);
|
|
181
180
|
i0.ɵɵpipe(28, "number");
|
|
182
181
|
i0.ɵɵelementEnd()();
|
|
183
|
-
i0.ɵɵelementStart(29, "div",
|
|
182
|
+
i0.ɵɵelementStart(29, "div", 6)(30, "div", 4);
|
|
184
183
|
i0.ɵɵtext(31, "Avg Duration");
|
|
185
184
|
i0.ɵɵelementEnd();
|
|
186
|
-
i0.ɵɵelementStart(32, "div",
|
|
185
|
+
i0.ɵɵelementStart(32, "div", 5);
|
|
187
186
|
i0.ɵɵtext(33);
|
|
188
187
|
i0.ɵɵpipe(34, "number");
|
|
189
188
|
i0.ɵɵelementEnd()()();
|
|
190
|
-
i0.ɵɵelementStart(35, "div",
|
|
191
|
-
i0.ɵɵelement(38, "i",
|
|
189
|
+
i0.ɵɵelementStart(35, "div", 8)(36, "div", 9)(37, "div", 10);
|
|
190
|
+
i0.ɵɵelement(38, "i", 11);
|
|
192
191
|
i0.ɵɵtext(39, " Cost Attribution by Agent ");
|
|
193
192
|
i0.ɵɵelementEnd()();
|
|
194
|
-
i0.ɵɵelementStart(40, "div",
|
|
195
|
-
i0.ɵɵconditionalCreate(41,
|
|
196
|
-
i0.ɵɵrepeaterCreate(42,
|
|
197
|
-
i0.ɵɵconditionalCreate(44,
|
|
193
|
+
i0.ɵɵelementStart(40, "div", 12);
|
|
194
|
+
i0.ɵɵconditionalCreate(41, AnalyticsAgentRunsComponent_Conditional_1_Conditional_41_Template, 2, 0, "div", 13);
|
|
195
|
+
i0.ɵɵrepeaterCreate(42, AnalyticsAgentRunsComponent_Conditional_1_For_43_Template, 8, 3, "div", 14, _forTrack0);
|
|
196
|
+
i0.ɵɵconditionalCreate(44, AnalyticsAgentRunsComponent_Conditional_1_Conditional_44_Template, 3, 0, "div", 15);
|
|
198
197
|
i0.ɵɵelementEnd()();
|
|
199
|
-
i0.ɵɵelementStart(45, "div",
|
|
200
|
-
i0.ɵɵelement(48, "i",
|
|
198
|
+
i0.ɵɵelementStart(45, "div", 8)(46, "div", 9)(47, "div", 10);
|
|
199
|
+
i0.ɵɵelement(48, "i", 16);
|
|
201
200
|
i0.ɵɵtext(49, " Recent Agent Runs ");
|
|
202
201
|
i0.ɵɵelementEnd();
|
|
203
|
-
i0.ɵɵelementStart(50, "span",
|
|
202
|
+
i0.ɵɵelementStart(50, "span", 17);
|
|
204
203
|
i0.ɵɵtext(51);
|
|
205
204
|
i0.ɵɵelementEnd()();
|
|
206
|
-
i0.ɵɵelementStart(52, "div",
|
|
207
|
-
i0.ɵɵrepeaterCreate(56,
|
|
205
|
+
i0.ɵɵelementStart(52, "div", 18)(53, "table", 19)(54, "thead")(55, "tr");
|
|
206
|
+
i0.ɵɵrepeaterCreate(56, AnalyticsAgentRunsComponent_Conditional_1_For_57_Template, 3, 4, "th", 20, _forTrack1);
|
|
208
207
|
i0.ɵɵelementEnd()();
|
|
209
208
|
i0.ɵɵelementStart(58, "tbody");
|
|
210
|
-
i0.ɵɵconditionalCreate(59,
|
|
211
|
-
i0.ɵɵrepeaterCreate(60,
|
|
209
|
+
i0.ɵɵconditionalCreate(59, AnalyticsAgentRunsComponent_Conditional_1_Conditional_59_Template, 3, 1, "tr");
|
|
210
|
+
i0.ɵɵrepeaterCreate(60, AnalyticsAgentRunsComponent_Conditional_1_For_61_Template, 14, 8, "tr", null, _forTrack2);
|
|
212
211
|
i0.ɵɵelementEnd()()()();
|
|
213
212
|
} if (rf & 2) {
|
|
214
213
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -253,10 +252,30 @@ const COST_COLORS = [
|
|
|
253
252
|
'var(--mj-text-disabled)'
|
|
254
253
|
];
|
|
255
254
|
export class AnalyticsAgentRunsComponent extends BaseAngularComponent {
|
|
256
|
-
|
|
257
|
-
|
|
255
|
+
_timeRange = '7d';
|
|
256
|
+
set TimeRange(value) {
|
|
257
|
+
const prev = this._timeRange;
|
|
258
|
+
this._timeRange = value;
|
|
259
|
+
if (prev !== value && this.initialized)
|
|
260
|
+
this.LoadData();
|
|
261
|
+
}
|
|
262
|
+
get TimeRange() { return this._timeRange; }
|
|
263
|
+
_filters = { Agents: [], Statuses: [] };
|
|
264
|
+
set Filters(value) {
|
|
265
|
+
const next = value ?? { Agents: [], Statuses: [] };
|
|
266
|
+
const changed = !this.shallowFiltersEqual(this._filters, next);
|
|
267
|
+
this._filters = next;
|
|
268
|
+
if (changed && this.initialized)
|
|
269
|
+
this.LoadData();
|
|
270
|
+
}
|
|
271
|
+
get Filters() { return this._filters; }
|
|
272
|
+
shallowFiltersEqual(a, b) {
|
|
273
|
+
const sameArr = (x, y) => x.length === y.length && x.every((v, i) => v === y[i]);
|
|
274
|
+
return sameArr(a.Agents, b.Agents) && sameArr(a.Statuses, b.Statuses);
|
|
275
|
+
}
|
|
258
276
|
TimeRangeChange = new EventEmitter();
|
|
259
277
|
FiltersChange = new EventEmitter();
|
|
278
|
+
initialized = false;
|
|
260
279
|
cdr = inject(ChangeDetectorRef);
|
|
261
280
|
destroy$ = new Subject();
|
|
262
281
|
IsLoading = false;
|
|
@@ -293,6 +312,7 @@ export class AnalyticsAgentRunsComponent extends BaseAngularComponent {
|
|
|
293
312
|
agentRuns = [];
|
|
294
313
|
promptRuns = [];
|
|
295
314
|
ngOnInit() {
|
|
315
|
+
this.initialized = true;
|
|
296
316
|
this.LoadData();
|
|
297
317
|
}
|
|
298
318
|
ngOnDestroy() {
|
|
@@ -549,33 +569,15 @@ export class AnalyticsAgentRunsComponent extends BaseAngularComponent {
|
|
|
549
569
|
return diffDay + 'd ago';
|
|
550
570
|
}
|
|
551
571
|
static ɵfac = /*@__PURE__*/ (() => { let ɵAnalyticsAgentRunsComponent_BaseFactory; return function AnalyticsAgentRunsComponent_Factory(__ngFactoryType__) { return (ɵAnalyticsAgentRunsComponent_BaseFactory || (ɵAnalyticsAgentRunsComponent_BaseFactory = i0.ɵɵgetInheritedFactory(AnalyticsAgentRunsComponent)))(__ngFactoryType__ || AnalyticsAgentRunsComponent); }; })();
|
|
552
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AnalyticsAgentRunsComponent, selectors: [["app-analytics-agent-runs"]], inputs: { TimeRange: "TimeRange", Filters: "Filters" }, outputs: { TimeRangeChange: "TimeRangeChange", FiltersChange: "FiltersChange" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
553
|
-
i0.ɵɵ
|
|
554
|
-
i0.ɵɵlistener("TimeRangeChange", function AnalyticsAgentRunsComponent_Template_app_analytics_filter_bar_TimeRangeChange_0_listener($event) { return ctx.OnTimeRangeChange($event); })("FiltersChange", function AnalyticsAgentRunsComponent_Template_app_analytics_filter_bar_FiltersChange_0_listener($event) { return ctx.OnFiltersChange($event); });
|
|
555
|
-
i0.ɵɵelementEnd();
|
|
556
|
-
i0.ɵɵconditionalCreate(1, AnalyticsAgentRunsComponent_Conditional_1_Template, 2, 0, "div", 1)(2, AnalyticsAgentRunsComponent_Conditional_2_Template, 62, 20);
|
|
572
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AnalyticsAgentRunsComponent, selectors: [["app-analytics-agent-runs"]], inputs: { TimeRange: "TimeRange", Filters: "Filters" }, outputs: { TimeRangeChange: "TimeRangeChange", FiltersChange: "FiltersChange" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "loading-container"], ["text", "Loading agent runs..."], [1, "stats-grid"], [1, "stat-card", "accent-brand"], [1, "stat-label"], [1, "stat-value"], [1, "stat-card"], [1, "stat-card", "accent-success"], [1, "panel"], [1, "panel-header"], [1, "panel-header__title"], [1, "fa-solid", "fa-chart-bar", "panel-header__icon"], [1, "panel-body"], [1, "panel-empty"], [1, "attribution-row"], [1, "legend-row"], [1, "fa-solid", "fa-list", "panel-header__icon"], [1, "panel-header__subtitle"], [1, "table-wrapper"], [1, "data-table"], [1, "sortable-header", 3, "sorted"], [1, "attribution-name", 3, "title"], [1, "attribution-bar-container"], [1, "attribution-segment", 3, "width", "background", "title"], [1, "attribution-total"], [1, "attribution-segment", 3, "title"], [1, "legend-item"], [1, "legend-swatch"], [1, "sortable-header", 3, "click"], [3, "class"], [1, "empty-row"], [1, "cell-agent"], [1, "status-pill"], [1, "cell-numeric"], [1, "cell-time"]], template: function AnalyticsAgentRunsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
573
|
+
i0.ɵɵconditionalCreate(0, AnalyticsAgentRunsComponent_Conditional_0_Template, 2, 0, "div", 0)(1, AnalyticsAgentRunsComponent_Conditional_1_Template, 62, 20);
|
|
557
574
|
} if (rf & 2) {
|
|
558
|
-
i0.ɵɵ
|
|
559
|
-
|
|
560
|
-
i0.ɵɵconditional(ctx.IsLoading ? 1 : 2);
|
|
561
|
-
} }, dependencies: [i1.LoadingComponent, i2.AnalyticsFilterBarComponent, i3.DecimalPipe], styles: ["[_nghost-%COMP%] { display: block; }\n\n .loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n \n\n .stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .stat-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px 16px;\n text-align: center;\n border-top: 3px solid var(--mj-border-subtle);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .stat-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .stat-card.accent-brand[_ngcontent-%COMP%] { border-top-color: var(--mj-brand-primary); }\n .stat-card.accent-success[_ngcontent-%COMP%] { border-top-color: var(--mj-status-success); }\n .stat-card.accent-warning[_ngcontent-%COMP%] { border-top-color: var(--mj-status-warning); }\n\n .stat-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .stat-value[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n }\n\n \n\n .panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n margin-bottom: 16px;\n overflow: hidden;\n }\n\n .panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-header__subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .panel-body[_ngcontent-%COMP%] {\n padding: 16px 18px;\n }\n\n .panel-empty[_ngcontent-%COMP%] {\n text-align: center;\n padding: 24px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n \n\n .attribution-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .attribution-row[_ngcontent-%COMP%]:last-of-type {\n border-bottom: none;\n }\n\n .attribution-name[_ngcontent-%COMP%] {\n width: 140px;\n min-width: 140px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .attribution-bar-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n height: 24px;\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n }\n\n .attribution-segment[_ngcontent-%COMP%] {\n height: 100%;\n min-width: 2px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .attribution-total[_ngcontent-%COMP%] {\n width: 80px;\n min-width: 80px;\n text-align: right;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n }\n\n .legend-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n padding: 12px 0 4px;\n flex-wrap: wrap;\n }\n\n .legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .legend-swatch[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n \n\n .table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n }\n\n .data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n .data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n }\n\n .sortable-header[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n transition: color 0.15s;\n }\n\n .sortable-header[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header.sorted[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n transition: background 0.15s;\n }\n\n .data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-agent[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n max-width: 200px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cell-numeric[_ngcontent-%COMP%] {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-time[_ngcontent-%COMP%] {\n white-space: nowrap;\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n\n .empty-row[_ngcontent-%COMP%] {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n \n\n .status-pill[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.3px;\n }\n\n .status-completed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .status-running[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .status-cancelled[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .status-paused[_ngcontent-%COMP%], .status-awaitingfeedback[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-disabled) 12%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n }\n\n \n\n @media (max-width: 1200px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .attribution-name[_ngcontent-%COMP%] {\n width: 100px;\n min-width: 100px;\n }\n\n .attribution-total[_ngcontent-%COMP%] {\n width: 60px;\n min-width: 60px;\n }\n\n .stat-value[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n }"] });
|
|
575
|
+
i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
|
|
576
|
+
} }, dependencies: [i1.LoadingComponent, i2.DecimalPipe], styles: ["[_nghost-%COMP%] { display: block; }\n\n .loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n \n\n .stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .stat-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px 16px;\n text-align: center;\n border-top: 3px solid var(--mj-border-subtle);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .stat-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .stat-card.accent-brand[_ngcontent-%COMP%] { border-top-color: var(--mj-brand-primary); }\n .stat-card.accent-success[_ngcontent-%COMP%] { border-top-color: var(--mj-status-success); }\n .stat-card.accent-warning[_ngcontent-%COMP%] { border-top-color: var(--mj-status-warning); }\n\n .stat-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .stat-value[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n }\n\n \n\n .panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n margin-bottom: 16px;\n overflow: hidden;\n }\n\n .panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-header__subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .panel-body[_ngcontent-%COMP%] {\n padding: 16px 18px;\n }\n\n .panel-empty[_ngcontent-%COMP%] {\n text-align: center;\n padding: 24px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n \n\n .attribution-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .attribution-row[_ngcontent-%COMP%]:last-of-type {\n border-bottom: none;\n }\n\n .attribution-name[_ngcontent-%COMP%] {\n width: 140px;\n min-width: 140px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .attribution-bar-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n height: 24px;\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n }\n\n .attribution-segment[_ngcontent-%COMP%] {\n height: 100%;\n min-width: 2px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .attribution-total[_ngcontent-%COMP%] {\n width: 80px;\n min-width: 80px;\n text-align: right;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n }\n\n .legend-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n padding: 12px 0 4px;\n flex-wrap: wrap;\n }\n\n .legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .legend-swatch[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n \n\n .table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n }\n\n .data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n .data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n }\n\n .sortable-header[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n transition: color 0.15s;\n }\n\n .sortable-header[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header.sorted[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n transition: background 0.15s;\n }\n\n .data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-agent[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n max-width: 200px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cell-numeric[_ngcontent-%COMP%] {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-time[_ngcontent-%COMP%] {\n white-space: nowrap;\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n\n .empty-row[_ngcontent-%COMP%] {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n \n\n .status-pill[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.3px;\n }\n\n .status-completed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .status-running[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .status-cancelled[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .status-paused[_ngcontent-%COMP%], .status-awaitingfeedback[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-disabled) 12%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n }\n\n \n\n @media (max-width: 1200px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .attribution-name[_ngcontent-%COMP%] {\n width: 100px;\n min-width: 100px;\n }\n\n .attribution-total[_ngcontent-%COMP%] {\n width: 60px;\n min-width: 60px;\n }\n\n .stat-value[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n }"] });
|
|
562
577
|
}
|
|
563
578
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AnalyticsAgentRunsComponent, [{
|
|
564
579
|
type: Component,
|
|
565
580
|
args: [{ standalone: false, selector: 'app-analytics-agent-runs', template: `
|
|
566
|
-
<!-- Filter Bar -->
|
|
567
|
-
<app-analytics-filter-bar
|
|
568
|
-
[TimeRange]="TimeRange"
|
|
569
|
-
[Filters]="globalFilters"
|
|
570
|
-
[ShowModelFilter]="false"
|
|
571
|
-
[ShowPromptFilter]="false"
|
|
572
|
-
[ShowAgentFilter]="true"
|
|
573
|
-
[ShowStatusFilter]="true"
|
|
574
|
-
[ShowCompareToggle]="false"
|
|
575
|
-
[ShowExportButton]="false"
|
|
576
|
-
(TimeRangeChange)="OnTimeRangeChange($event)"
|
|
577
|
-
(FiltersChange)="OnFiltersChange($event)"
|
|
578
|
-
></app-analytics-filter-bar>
|
|
579
581
|
|
|
580
582
|
@if (IsLoading) {
|
|
581
583
|
<div class="loading-container">
|
|
@@ -706,6 +708,6 @@ export class AnalyticsAgentRunsComponent extends BaseAngularComponent {
|
|
|
706
708
|
}], FiltersChange: [{
|
|
707
709
|
type: Output
|
|
708
710
|
}] }); })();
|
|
709
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsAgentRunsComponent, { className: "AnalyticsAgentRunsComponent", filePath: "src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts", lineNumber:
|
|
711
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsAgentRunsComponent, { className: "AnalyticsAgentRunsComponent", filePath: "src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts", lineNumber: 544 }); })();
|
|
710
712
|
export function LoadAnalyticsAgentRuns() { }
|
|
711
713
|
//# sourceMappingURL=agent-run-analysis.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-run-analysis.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Agent Run Analysis -- Cost Attribution Focus.\n *\n * Displays agent run stats, cost attribution horizontal stacked bars per agent,\n * and a sortable recent agent runs table. All data loaded via RunView from\n * \"MJ: AI Agent Runs\" and \"MJ: AI Prompt Runs\" entities.\n */\n\nimport {\n Component, Input, Output, EventEmitter,\n OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface AgentRunFilters {\n Agents: string[];\n Statuses: string[];\n}\n\ninterface AgentRunRecord {\n ID: string;\n StartedAt: string;\n CompletedAt: string | null;\n Status: string;\n Success: boolean | null;\n TotalCost: number | null;\n TotalTokensUsed: number | null;\n AgentID: string;\n Agent: string | null;\n ErrorMessage: string | null;\n}\n\ninterface PromptRunRecord {\n ID: string;\n AgentRunID: string | null;\n Cost: number | null;\n TotalCost: number | null;\n Model: string | null;\n Vendor: string | null;\n}\n\ninterface AgentRunStats {\n TotalRuns: number;\n TotalCost: number;\n PromptRuns: number;\n AvgCostPerRun: number;\n SuccessRate: number;\n AvgDurationSeconds: number;\n}\n\ninterface CostAttributionRow {\n AgentName: string;\n AgentID: string;\n TotalCost: number;\n Segments: CostSegment[];\n}\n\ninterface CostSegment {\n Label: string;\n Value: number;\n Percent: number;\n Color: string;\n}\n\ninterface RecentRunRow {\n ID: string;\n Agent: string;\n Status: string;\n StatusClass: string;\n StepCount: number;\n Duration: string;\n Cost: string;\n Time: string;\n}\n\ntype SortField = 'Agent' | 'Status' | 'StepCount' | 'Duration' | 'Cost' | 'Time';\ntype SortDirection = 'asc' | 'desc';\n\nconst AGENT_RUN_FIELDS = [\n 'ID', 'StartedAt', 'CompletedAt', 'Status', 'Success',\n 'TotalCost', 'TotalTokensUsed', 'AgentID', 'Agent', 'ErrorMessage'\n];\n\nconst PROMPT_RUN_FIELDS = [\n 'ID', 'AgentRunID', 'Cost', 'TotalCost', 'Model', 'Vendor'\n];\n\nconst COST_COLORS = [\n 'var(--mj-brand-primary)',\n 'var(--mj-brand-accent, var(--mj-brand-primary-hover))',\n 'var(--mj-status-info)',\n 'var(--mj-text-disabled)'\n];\n\n@Component({\n standalone: false,\n selector: 'app-analytics-agent-runs',\n template: `\n <!-- Filter Bar -->\n <app-analytics-filter-bar\n [TimeRange]=\"TimeRange\"\n [Filters]=\"globalFilters\"\n [ShowModelFilter]=\"false\"\n [ShowPromptFilter]=\"false\"\n [ShowAgentFilter]=\"true\"\n [ShowStatusFilter]=\"true\"\n [ShowCompareToggle]=\"false\"\n [ShowExportButton]=\"false\"\n (TimeRangeChange)=\"OnTimeRangeChange($event)\"\n (FiltersChange)=\"OnFiltersChange($event)\"\n ></app-analytics-filter-bar>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading agent runs...\"></mj-loading>\n </div>\n } @else {\n <!-- Stats Bar -->\n <div class=\"stats-grid\">\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Runs</div>\n <div class=\"stat-value\">{{ Stats.TotalRuns | number }}</div>\n </div>\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Cost</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.TotalCost) }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Prompt Runs</div>\n <div class=\"stat-value\">{{ Stats.PromptRuns | number }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Cost/Run</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.AvgCostPerRun, 4) }}</div>\n </div>\n <div class=\"stat-card accent-success\">\n <div class=\"stat-label\">Success Rate</div>\n <div class=\"stat-value\">{{ Stats.SuccessRate | number:'1.1-1' }}%</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Duration</div>\n <div class=\"stat-value\">{{ Stats.AvgDurationSeconds | number:'1.1-1' }}s</div>\n </div>\n </div>\n\n <!-- Cost Attribution Panel -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-chart-bar panel-header__icon\"></i>\n Cost Attribution by Agent\n </div>\n </div>\n <div class=\"panel-body\">\n @if (CostAttributionRows.length === 0) {\n <div class=\"panel-empty\">No agent cost data for selected period</div>\n }\n @for (row of CostAttributionRows; track row.AgentID) {\n <div class=\"attribution-row\">\n <div class=\"attribution-name\" [title]=\"row.AgentName\">{{ row.AgentName }}</div>\n <div class=\"attribution-bar-container\">\n @for (seg of row.Segments; track seg.Label) {\n <div\n class=\"attribution-segment\"\n [style.width.%]=\"seg.Percent\"\n [style.background]=\"seg.Color\"\n [title]=\"seg.Label + ': ' + FormatCurrency(seg.Value, 4)\"\n ></div>\n }\n </div>\n <div class=\"attribution-total\">{{ FormatCurrency(row.TotalCost) }}</div>\n </div>\n }\n @if (CostAttributionRows.length > 0) {\n <div class=\"legend-row\">\n @for (item of LegendItems; track item.Label) {\n <div class=\"legend-item\">\n <span class=\"legend-swatch\" [style.background]=\"item.Color\"></span>\n {{ item.Label }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Recent Agent Runs Table -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-list panel-header__icon\"></i>\n Recent Agent Runs\n </div>\n <span class=\"panel-header__subtitle\">{{ RecentRuns.length }} runs</span>\n </div>\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n @for (col of TableColumns; track col.field) {\n <th\n class=\"sortable-header\"\n [class.sorted]=\"SortField === col.field\"\n (click)=\"OnSort(col.field)\">\n {{ col.label }}\n @if (SortField === col.field) {\n <i [class]=\"SortDir === 'asc' ? 'fa-solid fa-caret-up' : 'fa-solid fa-caret-down'\"></i>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (RecentRuns.length === 0) {\n <tr><td [attr.colspan]=\"TableColumns.length\" class=\"empty-row\">No runs found</td></tr>\n }\n @for (run of RecentRuns; track run.ID) {\n <tr>\n <td class=\"cell-agent\">{{ run.Agent }}</td>\n <td><span class=\"status-pill\" [class]=\"run.StatusClass\">{{ run.Status }}</span></td>\n <td class=\"cell-numeric\">{{ run.StepCount }}</td>\n <td class=\"cell-numeric\">{{ run.Duration }}</td>\n <td class=\"cell-numeric\">{{ run.Cost }}</td>\n <td class=\"cell-time\">{{ run.Time }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n\n .loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n /* ── Stats Grid ── */\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .stat-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px 16px;\n text-align: center;\n border-top: 3px solid var(--mj-border-subtle);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .stat-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .stat-card.accent-brand { border-top-color: var(--mj-brand-primary); }\n .stat-card.accent-success { border-top-color: var(--mj-status-success); }\n .stat-card.accent-warning { border-top-color: var(--mj-status-warning); }\n\n .stat-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .stat-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n }\n\n /* ── Panel ── */\n .panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n margin-bottom: 16px;\n overflow: hidden;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-header__subtitle {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .panel-body {\n padding: 16px 18px;\n }\n\n .panel-empty {\n text-align: center;\n padding: 24px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n /* ── Cost Attribution ── */\n .attribution-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .attribution-row:last-of-type {\n border-bottom: none;\n }\n\n .attribution-name {\n width: 140px;\n min-width: 140px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .attribution-bar-container {\n flex: 1;\n display: flex;\n height: 24px;\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n }\n\n .attribution-segment {\n height: 100%;\n min-width: 2px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .attribution-total {\n width: 80px;\n min-width: 80px;\n text-align: right;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n }\n\n .legend-row {\n display: flex;\n gap: 16px;\n padding: 12px 0 4px;\n flex-wrap: wrap;\n }\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .legend-swatch {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n /* ── Table ── */\n .table-wrapper {\n overflow-x: auto;\n }\n\n .data-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table th,\n .data-table td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table th {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n }\n\n .sortable-header {\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n transition: color 0.15s;\n }\n\n .sortable-header:hover {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header.sorted {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header i {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .data-table tbody tr {\n transition: background 0.15s;\n }\n\n .data-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-agent {\n font-weight: 500;\n color: var(--mj-text-primary);\n max-width: 200px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cell-numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-time {\n white-space: nowrap;\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n\n .empty-row {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n /* ── Status Pills ── */\n .status-pill {\n display: inline-block;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.3px;\n }\n\n .status-completed {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .status-running {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-failed {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .status-cancelled {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .status-paused, .status-awaitingfeedback {\n background: color-mix(in srgb, var(--mj-text-disabled) 12%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n }\n\n /* ── Responsive ── */\n @media (max-width: 1200px) {\n .stats-grid {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .attribution-name {\n width: 100px;\n min-width: 100px;\n }\n\n .attribution-total {\n width: 60px;\n min-width: 60px;\n }\n\n .stat-value {\n font-size: 18px;\n }\n }\n `]\n})\nexport class AnalyticsAgentRunsComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() TimeRange = '7d';\n @Input() Filters: AgentRunFilters = { Agents: [], Statuses: [] };\n\n @Output() TimeRangeChange = new EventEmitter<string>();\n @Output() FiltersChange = new EventEmitter<AgentRunFilters>();\n\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n\n public Stats: AgentRunStats = {\n TotalRuns: 0,\n TotalCost: 0,\n PromptRuns: 0,\n AvgCostPerRun: 0,\n SuccessRate: 0,\n AvgDurationSeconds: 0\n };\n\n public CostAttributionRows: CostAttributionRow[] = [];\n public LegendItems: { Label: string; Color: string }[] = [];\n public RecentRuns: RecentRunRow[] = [];\n public SortField: SortField = 'Time';\n public SortDir: SortDirection = 'desc';\n\n public TableColumns: { field: SortField; label: string }[] = [\n { field: 'Agent', label: 'Agent' },\n { field: 'Status', label: 'Status' },\n { field: 'StepCount', label: 'Steps' },\n { field: 'Duration', label: 'Duration' },\n { field: 'Cost', label: 'Cost' },\n { field: 'Time', label: 'Time' }\n ];\n\n /** Bridge the local filter shape to the global shape the filter bar expects */\n public get globalFilters(): GlobalFilterState {\n return {\n Models: [],\n Agents: this.Filters.Agents,\n Prompts: [],\n Statuses: this.Filters.Statuses\n };\n }\n\n private agentRuns: AgentRunRecord[] = [];\n private promptRuns: PromptRunRecord[] = [];\n\n ngOnInit(): void {\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Event Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.TimeRangeChange.emit(range);\n this.LoadData();\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = { Agents: filters.Agents, Statuses: filters.Statuses };\n this.FiltersChange.emit(this.Filters);\n this.LoadData();\n }\n\n public OnSort(field: SortField): void {\n if (this.SortField === field) {\n this.SortDir = this.SortDir === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortField = field;\n this.SortDir = field === 'Time' ? 'desc' : 'asc';\n }\n this.sortRecentRuns();\n this.cdr.detectChanges();\n }\n\n public FormatCurrency(value: number, decimals = 2): string {\n if (value === 0) return '$0.00';\n if (value < 0.01 && decimals < 4) decimals = 4;\n return '$' + value.toFixed(decimals);\n }\n\n // ── Data Loading ──\n\n private async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const dateFilter = this.buildDateFilter('StartedAt');\n const agentFilter = this.buildAgentFilter();\n const statusFilter = this.buildStatusFilter();\n const extraFilter = [dateFilter, agentFilter, statusFilter].filter(Boolean).join(' AND ');\n\n const promptDateFilter = this.buildDateFilter('RunAt');\n\n const [agentResult, promptResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: extraFilter,\n Fields: AGENT_RUN_FIELDS,\n OrderBy: 'StartedAt DESC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: promptDateFilter,\n Fields: PROMPT_RUN_FIELDS,\n OrderBy: 'RunAt DESC',\n ResultType: 'simple'\n }\n ]);\n\n this.agentRuns = (agentResult?.Results ?? []) as AgentRunRecord[];\n this.promptRuns = (promptResult?.Results ?? []) as PromptRunRecord[];\n\n this.computeStats();\n this.computeCostAttribution();\n this.buildRecentRuns();\n this.sortRecentRuns();\n } catch (e) {\n console.error('Agent Run Analysis load error:', e);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ── Computations ──\n\n private computeStats(): void {\n const runs = this.agentRuns;\n const total = runs.length;\n const totalCost = runs.reduce((s, r) => s + (r.TotalCost ?? 0), 0);\n const completed = runs.filter(r => r.Status === 'Completed');\n const successCount = runs.filter(r => r.Success === true).length;\n\n const durations = completed\n .filter(r => r.CompletedAt)\n .map(r => {\n const start = new Date(r.StartedAt).getTime();\n const end = new Date(r.CompletedAt!).getTime();\n return (end - start) / 1000;\n })\n .filter(d => d > 0);\n\n const avgDuration = durations.length > 0\n ? durations.reduce((s, d) => s + d, 0) / durations.length\n : 0;\n\n const linkedPromptRuns = this.promptRuns.filter(\n p => p.AgentRunID != null && this.agentRunIdSet.has(p.AgentRunID)\n );\n\n this.Stats = {\n TotalRuns: total,\n TotalCost: totalCost,\n PromptRuns: linkedPromptRuns.length,\n AvgCostPerRun: total > 0 ? totalCost / total : 0,\n SuccessRate: total > 0 ? (successCount / total) * 100 : 0,\n AvgDurationSeconds: avgDuration\n };\n }\n\n private get agentRunIdSet(): Set<string> {\n return new Set(this.agentRuns.map(r => r.ID));\n }\n\n private computeCostAttribution(): void {\n const agentCostMap = new Map<string, { name: string; vendorCosts: Map<string, number>; totalCost: number }>();\n\n // Group prompt runs by agent run, then by vendor\n for (const pr of this.promptRuns) {\n if (!pr.AgentRunID) continue;\n const agentRun = this.agentRuns.find(ar => UUIDsEqual(ar.ID, pr.AgentRunID));\n if (!agentRun) continue;\n\n const agentKey = agentRun.AgentID;\n if (!agentCostMap.has(agentKey)) {\n agentCostMap.set(agentKey, {\n name: agentRun.Agent ?? 'Unknown',\n vendorCosts: new Map<string, number>(),\n totalCost: 0\n });\n }\n\n const entry = agentCostMap.get(agentKey)!;\n const vendor = pr.Vendor ?? 'Other';\n const cost = pr.Cost ?? pr.TotalCost ?? 0;\n entry.vendorCosts.set(vendor, (entry.vendorCosts.get(vendor) ?? 0) + cost);\n entry.totalCost += cost;\n }\n\n // Collect all vendors for consistent coloring\n const allVendors = new Set<string>();\n for (const entry of agentCostMap.values()) {\n for (const v of entry.vendorCosts.keys()) {\n allVendors.add(v);\n }\n }\n const vendorList = Array.from(allVendors);\n\n // Build legend\n this.LegendItems = vendorList.map((v, i) => ({\n Label: v,\n Color: COST_COLORS[i % COST_COLORS.length]\n }));\n\n // Sort by total cost descending\n const sorted = Array.from(agentCostMap.entries())\n .sort((a, b) => b[1].totalCost - a[1].totalCost);\n\n this.CostAttributionRows = sorted.map(([agentId, entry]) => {\n const segments: CostSegment[] = vendorList.map((vendor, i) => {\n const val = entry.vendorCosts.get(vendor) ?? 0;\n return {\n Label: vendor,\n Value: val,\n Percent: entry.totalCost > 0 ? (val / entry.totalCost) * 100 : 0,\n Color: COST_COLORS[i % COST_COLORS.length]\n };\n }).filter(s => s.Value > 0);\n\n return {\n AgentName: entry.name,\n AgentID: agentId,\n TotalCost: entry.totalCost,\n Segments: segments\n };\n });\n }\n\n private buildRecentRuns(): void {\n // Count prompt runs per agent run\n const promptCountMap = new Map<string, number>();\n for (const pr of this.promptRuns) {\n if (pr.AgentRunID) {\n promptCountMap.set(pr.AgentRunID, (promptCountMap.get(pr.AgentRunID) ?? 0) + 1);\n }\n }\n\n this.RecentRuns = this.agentRuns.slice(0, 100).map(r => ({\n ID: r.ID,\n Agent: r.Agent ?? 'Unknown',\n Status: r.Status,\n StatusClass: this.getStatusClass(r.Status),\n StepCount: promptCountMap.get(r.ID) ?? 0,\n Duration: this.formatDuration(r.StartedAt, r.CompletedAt),\n Cost: this.FormatCurrency(r.TotalCost ?? 0),\n Time: this.formatRelativeTime(r.StartedAt)\n }));\n }\n\n private sortRecentRuns(): void {\n const dir = this.SortDir === 'asc' ? 1 : -1;\n this.RecentRuns.sort((a, b) => {\n switch (this.SortField) {\n case 'Agent': return dir * a.Agent.localeCompare(b.Agent);\n case 'Status': return dir * a.Status.localeCompare(b.Status);\n case 'StepCount': return dir * (a.StepCount - b.StepCount);\n case 'Duration': return dir * a.Duration.localeCompare(b.Duration);\n case 'Cost': return dir * a.Cost.localeCompare(b.Cost);\n case 'Time': return dir * a.Time.localeCompare(b.Time);\n default: return 0;\n }\n });\n }\n\n // ── Helpers ──\n\n private buildDateFilter(field: string): string {\n const now = new Date();\n const ms = this.timeRangeToMs(this.TimeRange);\n const start = new Date(now.getTime() - ms);\n return `${field} >= '${start.toISOString()}'`;\n }\n\n private buildAgentFilter(): string {\n if (this.Filters.Agents.length === 0) return '';\n const ids = this.Filters.Agents.map(id => `'${id}'`).join(',');\n return `AgentID IN (${ids})`;\n }\n\n private buildStatusFilter(): string {\n if (this.Filters.Statuses.length === 0) return '';\n const values = this.Filters.Statuses.map(s => `'${s}'`).join(',');\n return `Status IN (${values})`;\n }\n\n private timeRangeToMs(range: string): number {\n const map: Record<string, number> = {\n '1h': 3600000,\n '6h': 21600000,\n '24h': 86400000,\n '7d': 604800000,\n '30d': 2592000000\n };\n return map[range] ?? 604800000;\n }\n\n private getStatusClass(status: string): string {\n return 'status-pill status-' + status.toLowerCase().replace(/\\s+/g, '');\n }\n\n private formatDuration(startStr: string, endStr: string | null): string {\n if (!endStr) return '--';\n const ms = new Date(endStr).getTime() - new Date(startStr).getTime();\n if (ms < 1000) return ms + 'ms';\n if (ms < 60000) return (ms / 1000).toFixed(1) + 's';\n return (ms / 60000).toFixed(1) + 'm';\n }\n\n private formatRelativeTime(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return diffMin + 'm ago';\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return diffHr + 'h ago';\n const diffDay = Math.floor(diffHr / 24);\n return diffDay + 'd ago';\n }\n}\n\nexport function LoadAnalyticsAgentRuns() { /* tree-shaking prevention */ }\n"]}
|
|
1
|
+
{"version":3,"file":"agent-run-analysis.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/agent-runs/agent-run-analysis.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Agent Run Analysis -- Cost Attribution Focus.\n *\n * Displays agent run stats, cost attribution horizontal stacked bars per agent,\n * and a sortable recent agent runs table. All data loaded via RunView from\n * \"MJ: AI Agent Runs\" and \"MJ: AI Prompt Runs\" entities.\n */\n\nimport {\n Component, Input, Output, EventEmitter,\n OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface AgentRunFilters {\n Agents: string[];\n Statuses: string[];\n}\n\ninterface AgentRunRecord {\n ID: string;\n StartedAt: string;\n CompletedAt: string | null;\n Status: string;\n Success: boolean | null;\n TotalCost: number | null;\n TotalTokensUsed: number | null;\n AgentID: string;\n Agent: string | null;\n ErrorMessage: string | null;\n}\n\ninterface PromptRunRecord {\n ID: string;\n AgentRunID: string | null;\n Cost: number | null;\n TotalCost: number | null;\n Model: string | null;\n Vendor: string | null;\n}\n\ninterface AgentRunStats {\n TotalRuns: number;\n TotalCost: number;\n PromptRuns: number;\n AvgCostPerRun: number;\n SuccessRate: number;\n AvgDurationSeconds: number;\n}\n\ninterface CostAttributionRow {\n AgentName: string;\n AgentID: string;\n TotalCost: number;\n Segments: CostSegment[];\n}\n\ninterface CostSegment {\n Label: string;\n Value: number;\n Percent: number;\n Color: string;\n}\n\ninterface RecentRunRow {\n ID: string;\n Agent: string;\n Status: string;\n StatusClass: string;\n StepCount: number;\n Duration: string;\n Cost: string;\n Time: string;\n}\n\ntype SortField = 'Agent' | 'Status' | 'StepCount' | 'Duration' | 'Cost' | 'Time';\ntype SortDirection = 'asc' | 'desc';\n\nconst AGENT_RUN_FIELDS = [\n 'ID', 'StartedAt', 'CompletedAt', 'Status', 'Success',\n 'TotalCost', 'TotalTokensUsed', 'AgentID', 'Agent', 'ErrorMessage'\n];\n\nconst PROMPT_RUN_FIELDS = [\n 'ID', 'AgentRunID', 'Cost', 'TotalCost', 'Model', 'Vendor'\n];\n\nconst COST_COLORS = [\n 'var(--mj-brand-primary)',\n 'var(--mj-brand-accent, var(--mj-brand-primary-hover))',\n 'var(--mj-status-info)',\n 'var(--mj-text-disabled)'\n];\n\n@Component({\n standalone: false,\n selector: 'app-analytics-agent-runs',\n template: `\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading agent runs...\"></mj-loading>\n </div>\n } @else {\n <!-- Stats Bar -->\n <div class=\"stats-grid\">\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Runs</div>\n <div class=\"stat-value\">{{ Stats.TotalRuns | number }}</div>\n </div>\n <div class=\"stat-card accent-brand\">\n <div class=\"stat-label\">Total Cost</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.TotalCost) }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Prompt Runs</div>\n <div class=\"stat-value\">{{ Stats.PromptRuns | number }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Cost/Run</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.AvgCostPerRun, 4) }}</div>\n </div>\n <div class=\"stat-card accent-success\">\n <div class=\"stat-label\">Success Rate</div>\n <div class=\"stat-value\">{{ Stats.SuccessRate | number:'1.1-1' }}%</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Duration</div>\n <div class=\"stat-value\">{{ Stats.AvgDurationSeconds | number:'1.1-1' }}s</div>\n </div>\n </div>\n\n <!-- Cost Attribution Panel -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-chart-bar panel-header__icon\"></i>\n Cost Attribution by Agent\n </div>\n </div>\n <div class=\"panel-body\">\n @if (CostAttributionRows.length === 0) {\n <div class=\"panel-empty\">No agent cost data for selected period</div>\n }\n @for (row of CostAttributionRows; track row.AgentID) {\n <div class=\"attribution-row\">\n <div class=\"attribution-name\" [title]=\"row.AgentName\">{{ row.AgentName }}</div>\n <div class=\"attribution-bar-container\">\n @for (seg of row.Segments; track seg.Label) {\n <div\n class=\"attribution-segment\"\n [style.width.%]=\"seg.Percent\"\n [style.background]=\"seg.Color\"\n [title]=\"seg.Label + ': ' + FormatCurrency(seg.Value, 4)\"\n ></div>\n }\n </div>\n <div class=\"attribution-total\">{{ FormatCurrency(row.TotalCost) }}</div>\n </div>\n }\n @if (CostAttributionRows.length > 0) {\n <div class=\"legend-row\">\n @for (item of LegendItems; track item.Label) {\n <div class=\"legend-item\">\n <span class=\"legend-swatch\" [style.background]=\"item.Color\"></span>\n {{ item.Label }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Recent Agent Runs Table -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-list panel-header__icon\"></i>\n Recent Agent Runs\n </div>\n <span class=\"panel-header__subtitle\">{{ RecentRuns.length }} runs</span>\n </div>\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n @for (col of TableColumns; track col.field) {\n <th\n class=\"sortable-header\"\n [class.sorted]=\"SortField === col.field\"\n (click)=\"OnSort(col.field)\">\n {{ col.label }}\n @if (SortField === col.field) {\n <i [class]=\"SortDir === 'asc' ? 'fa-solid fa-caret-up' : 'fa-solid fa-caret-down'\"></i>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (RecentRuns.length === 0) {\n <tr><td [attr.colspan]=\"TableColumns.length\" class=\"empty-row\">No runs found</td></tr>\n }\n @for (run of RecentRuns; track run.ID) {\n <tr>\n <td class=\"cell-agent\">{{ run.Agent }}</td>\n <td><span class=\"status-pill\" [class]=\"run.StatusClass\">{{ run.Status }}</span></td>\n <td class=\"cell-numeric\">{{ run.StepCount }}</td>\n <td class=\"cell-numeric\">{{ run.Duration }}</td>\n <td class=\"cell-numeric\">{{ run.Cost }}</td>\n <td class=\"cell-time\">{{ run.Time }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n\n .loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n /* ── Stats Grid ── */\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .stat-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px 16px;\n text-align: center;\n border-top: 3px solid var(--mj-border-subtle);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .stat-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .stat-card.accent-brand { border-top-color: var(--mj-brand-primary); }\n .stat-card.accent-success { border-top-color: var(--mj-status-success); }\n .stat-card.accent-warning { border-top-color: var(--mj-status-warning); }\n\n .stat-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .stat-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n }\n\n /* ── Panel ── */\n .panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n margin-bottom: 16px;\n overflow: hidden;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-header__subtitle {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .panel-body {\n padding: 16px 18px;\n }\n\n .panel-empty {\n text-align: center;\n padding: 24px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n /* ── Cost Attribution ── */\n .attribution-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .attribution-row:last-of-type {\n border-bottom: none;\n }\n\n .attribution-name {\n width: 140px;\n min-width: 140px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .attribution-bar-container {\n flex: 1;\n display: flex;\n height: 24px;\n border-radius: 6px;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n }\n\n .attribution-segment {\n height: 100%;\n min-width: 2px;\n transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .attribution-total {\n width: 80px;\n min-width: 80px;\n text-align: right;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n }\n\n .legend-row {\n display: flex;\n gap: 16px;\n padding: 12px 0 4px;\n flex-wrap: wrap;\n }\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .legend-swatch {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n /* ── Table ── */\n .table-wrapper {\n overflow-x: auto;\n }\n\n .data-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table th,\n .data-table td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table th {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n }\n\n .sortable-header {\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n transition: color 0.15s;\n }\n\n .sortable-header:hover {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header.sorted {\n color: var(--mj-brand-primary);\n }\n\n .sortable-header i {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .data-table tbody tr {\n transition: background 0.15s;\n }\n\n .data-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-agent {\n font-weight: 500;\n color: var(--mj-text-primary);\n max-width: 200px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cell-numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-time {\n white-space: nowrap;\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n\n .empty-row {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n /* ── Status Pills ── */\n .status-pill {\n display: inline-block;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.3px;\n }\n\n .status-completed {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .status-running {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .status-failed {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .status-cancelled {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n .status-paused, .status-awaitingfeedback {\n background: color-mix(in srgb, var(--mj-text-disabled) 12%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n }\n\n /* ── Responsive ── */\n @media (max-width: 1200px) {\n .stats-grid {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .attribution-name {\n width: 100px;\n min-width: 100px;\n }\n\n .attribution-total {\n width: 60px;\n min-width: 60px;\n }\n\n .stat-value {\n font-size: 18px;\n }\n }\n `]\n})\nexport class AnalyticsAgentRunsComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private _timeRange = '7d';\n @Input()\n set TimeRange(value: string) {\n const prev = this._timeRange;\n this._timeRange = value;\n if (prev !== value && this.initialized) this.LoadData();\n }\n get TimeRange(): string { return this._timeRange; }\n\n private _filters: AgentRunFilters = { Agents: [], Statuses: [] };\n @Input()\n set Filters(value: AgentRunFilters) {\n const next = value ?? { Agents: [], Statuses: [] };\n const changed = !this.shallowFiltersEqual(this._filters, next);\n this._filters = next;\n if (changed && this.initialized) this.LoadData();\n }\n get Filters(): AgentRunFilters { return this._filters; }\n\n private shallowFiltersEqual(a: AgentRunFilters, b: AgentRunFilters): boolean {\n const sameArr = (x: string[], y: string[]) => x.length === y.length && x.every((v, i) => v === y[i]);\n return sameArr(a.Agents, b.Agents) && sameArr(a.Statuses, b.Statuses);\n }\n\n @Output() TimeRangeChange = new EventEmitter<string>();\n @Output() FiltersChange = new EventEmitter<AgentRunFilters>();\n\n private initialized = false;\n\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n\n public Stats: AgentRunStats = {\n TotalRuns: 0,\n TotalCost: 0,\n PromptRuns: 0,\n AvgCostPerRun: 0,\n SuccessRate: 0,\n AvgDurationSeconds: 0\n };\n\n public CostAttributionRows: CostAttributionRow[] = [];\n public LegendItems: { Label: string; Color: string }[] = [];\n public RecentRuns: RecentRunRow[] = [];\n public SortField: SortField = 'Time';\n public SortDir: SortDirection = 'desc';\n\n public TableColumns: { field: SortField; label: string }[] = [\n { field: 'Agent', label: 'Agent' },\n { field: 'Status', label: 'Status' },\n { field: 'StepCount', label: 'Steps' },\n { field: 'Duration', label: 'Duration' },\n { field: 'Cost', label: 'Cost' },\n { field: 'Time', label: 'Time' }\n ];\n\n /** Bridge the local filter shape to the global shape the filter bar expects */\n public get globalFilters(): GlobalFilterState {\n return {\n Models: [],\n Agents: this.Filters.Agents,\n Prompts: [],\n Statuses: this.Filters.Statuses\n };\n }\n\n private agentRuns: AgentRunRecord[] = [];\n private promptRuns: PromptRunRecord[] = [];\n\n ngOnInit(): void {\n this.initialized = true;\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Event Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.TimeRangeChange.emit(range);\n this.LoadData();\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = { Agents: filters.Agents, Statuses: filters.Statuses };\n this.FiltersChange.emit(this.Filters);\n this.LoadData();\n }\n\n public OnSort(field: SortField): void {\n if (this.SortField === field) {\n this.SortDir = this.SortDir === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortField = field;\n this.SortDir = field === 'Time' ? 'desc' : 'asc';\n }\n this.sortRecentRuns();\n this.cdr.detectChanges();\n }\n\n public FormatCurrency(value: number, decimals = 2): string {\n if (value === 0) return '$0.00';\n if (value < 0.01 && decimals < 4) decimals = 4;\n return '$' + value.toFixed(decimals);\n }\n\n // ── Data Loading ──\n\n private async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const dateFilter = this.buildDateFilter('StartedAt');\n const agentFilter = this.buildAgentFilter();\n const statusFilter = this.buildStatusFilter();\n const extraFilter = [dateFilter, agentFilter, statusFilter].filter(Boolean).join(' AND ');\n\n const promptDateFilter = this.buildDateFilter('RunAt');\n\n const [agentResult, promptResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: extraFilter,\n Fields: AGENT_RUN_FIELDS,\n OrderBy: 'StartedAt DESC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: promptDateFilter,\n Fields: PROMPT_RUN_FIELDS,\n OrderBy: 'RunAt DESC',\n ResultType: 'simple'\n }\n ]);\n\n this.agentRuns = (agentResult?.Results ?? []) as AgentRunRecord[];\n this.promptRuns = (promptResult?.Results ?? []) as PromptRunRecord[];\n\n this.computeStats();\n this.computeCostAttribution();\n this.buildRecentRuns();\n this.sortRecentRuns();\n } catch (e) {\n console.error('Agent Run Analysis load error:', e);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ── Computations ──\n\n private computeStats(): void {\n const runs = this.agentRuns;\n const total = runs.length;\n const totalCost = runs.reduce((s, r) => s + (r.TotalCost ?? 0), 0);\n const completed = runs.filter(r => r.Status === 'Completed');\n const successCount = runs.filter(r => r.Success === true).length;\n\n const durations = completed\n .filter(r => r.CompletedAt)\n .map(r => {\n const start = new Date(r.StartedAt).getTime();\n const end = new Date(r.CompletedAt!).getTime();\n return (end - start) / 1000;\n })\n .filter(d => d > 0);\n\n const avgDuration = durations.length > 0\n ? durations.reduce((s, d) => s + d, 0) / durations.length\n : 0;\n\n const linkedPromptRuns = this.promptRuns.filter(\n p => p.AgentRunID != null && this.agentRunIdSet.has(p.AgentRunID)\n );\n\n this.Stats = {\n TotalRuns: total,\n TotalCost: totalCost,\n PromptRuns: linkedPromptRuns.length,\n AvgCostPerRun: total > 0 ? totalCost / total : 0,\n SuccessRate: total > 0 ? (successCount / total) * 100 : 0,\n AvgDurationSeconds: avgDuration\n };\n }\n\n private get agentRunIdSet(): Set<string> {\n return new Set(this.agentRuns.map(r => r.ID));\n }\n\n private computeCostAttribution(): void {\n const agentCostMap = new Map<string, { name: string; vendorCosts: Map<string, number>; totalCost: number }>();\n\n // Group prompt runs by agent run, then by vendor\n for (const pr of this.promptRuns) {\n if (!pr.AgentRunID) continue;\n const agentRun = this.agentRuns.find(ar => UUIDsEqual(ar.ID, pr.AgentRunID));\n if (!agentRun) continue;\n\n const agentKey = agentRun.AgentID;\n if (!agentCostMap.has(agentKey)) {\n agentCostMap.set(agentKey, {\n name: agentRun.Agent ?? 'Unknown',\n vendorCosts: new Map<string, number>(),\n totalCost: 0\n });\n }\n\n const entry = agentCostMap.get(agentKey)!;\n const vendor = pr.Vendor ?? 'Other';\n const cost = pr.Cost ?? pr.TotalCost ?? 0;\n entry.vendorCosts.set(vendor, (entry.vendorCosts.get(vendor) ?? 0) + cost);\n entry.totalCost += cost;\n }\n\n // Collect all vendors for consistent coloring\n const allVendors = new Set<string>();\n for (const entry of agentCostMap.values()) {\n for (const v of entry.vendorCosts.keys()) {\n allVendors.add(v);\n }\n }\n const vendorList = Array.from(allVendors);\n\n // Build legend\n this.LegendItems = vendorList.map((v, i) => ({\n Label: v,\n Color: COST_COLORS[i % COST_COLORS.length]\n }));\n\n // Sort by total cost descending\n const sorted = Array.from(agentCostMap.entries())\n .sort((a, b) => b[1].totalCost - a[1].totalCost);\n\n this.CostAttributionRows = sorted.map(([agentId, entry]) => {\n const segments: CostSegment[] = vendorList.map((vendor, i) => {\n const val = entry.vendorCosts.get(vendor) ?? 0;\n return {\n Label: vendor,\n Value: val,\n Percent: entry.totalCost > 0 ? (val / entry.totalCost) * 100 : 0,\n Color: COST_COLORS[i % COST_COLORS.length]\n };\n }).filter(s => s.Value > 0);\n\n return {\n AgentName: entry.name,\n AgentID: agentId,\n TotalCost: entry.totalCost,\n Segments: segments\n };\n });\n }\n\n private buildRecentRuns(): void {\n // Count prompt runs per agent run\n const promptCountMap = new Map<string, number>();\n for (const pr of this.promptRuns) {\n if (pr.AgentRunID) {\n promptCountMap.set(pr.AgentRunID, (promptCountMap.get(pr.AgentRunID) ?? 0) + 1);\n }\n }\n\n this.RecentRuns = this.agentRuns.slice(0, 100).map(r => ({\n ID: r.ID,\n Agent: r.Agent ?? 'Unknown',\n Status: r.Status,\n StatusClass: this.getStatusClass(r.Status),\n StepCount: promptCountMap.get(r.ID) ?? 0,\n Duration: this.formatDuration(r.StartedAt, r.CompletedAt),\n Cost: this.FormatCurrency(r.TotalCost ?? 0),\n Time: this.formatRelativeTime(r.StartedAt)\n }));\n }\n\n private sortRecentRuns(): void {\n const dir = this.SortDir === 'asc' ? 1 : -1;\n this.RecentRuns.sort((a, b) => {\n switch (this.SortField) {\n case 'Agent': return dir * a.Agent.localeCompare(b.Agent);\n case 'Status': return dir * a.Status.localeCompare(b.Status);\n case 'StepCount': return dir * (a.StepCount - b.StepCount);\n case 'Duration': return dir * a.Duration.localeCompare(b.Duration);\n case 'Cost': return dir * a.Cost.localeCompare(b.Cost);\n case 'Time': return dir * a.Time.localeCompare(b.Time);\n default: return 0;\n }\n });\n }\n\n // ── Helpers ──\n\n private buildDateFilter(field: string): string {\n const now = new Date();\n const ms = this.timeRangeToMs(this.TimeRange);\n const start = new Date(now.getTime() - ms);\n return `${field} >= '${start.toISOString()}'`;\n }\n\n private buildAgentFilter(): string {\n if (this.Filters.Agents.length === 0) return '';\n const ids = this.Filters.Agents.map(id => `'${id}'`).join(',');\n return `AgentID IN (${ids})`;\n }\n\n private buildStatusFilter(): string {\n if (this.Filters.Statuses.length === 0) return '';\n const values = this.Filters.Statuses.map(s => `'${s}'`).join(',');\n return `Status IN (${values})`;\n }\n\n private timeRangeToMs(range: string): number {\n const map: Record<string, number> = {\n '1h': 3600000,\n '6h': 21600000,\n '24h': 86400000,\n '7d': 604800000,\n '30d': 2592000000\n };\n return map[range] ?? 604800000;\n }\n\n private getStatusClass(status: string): string {\n return 'status-pill status-' + status.toLowerCase().replace(/\\s+/g, '');\n }\n\n private formatDuration(startStr: string, endStr: string | null): string {\n if (!endStr) return '--';\n const ms = new Date(endStr).getTime() - new Date(startStr).getTime();\n if (ms < 1000) return ms + 'ms';\n if (ms < 60000) return (ms / 1000).toFixed(1) + 's';\n return (ms / 60000).toFixed(1) + 'm';\n }\n\n private formatRelativeTime(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return diffMin + 'm ago';\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return diffHr + 'h ago';\n const diffDay = Math.floor(diffHr / 24);\n return diffDay + 'd ago';\n }\n}\n\nexport function LoadAnalyticsAgentRuns() { /* tree-shaking prevention */ }\n"]}
|