@memberjunction/ng-dashboards 6.1.0-edge.0 → 6.1.0-edge.2
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/analytics/prompt-runs/prompt-run-analysis.component.d.ts +3 -3
- 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 +8 -2
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +7 -7
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +21 -21
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js +3 -3
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -1
- package/dist/AI/components/autotagging/shared/classify.format.d.ts +1 -1
- package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -1
- package/dist/AI/components/autotagging/shared/classify.format.js +1 -1
- package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -1
- package/dist/AI/components/autotagging/shared/classify.types.d.ts +6 -6
- package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -1
- package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +14 -19
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +53 -77
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +15 -20
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +51 -77
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -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 +22 -43
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +6 -6
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-list-item.component.js +3 -3
- package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
- package/dist/Actions/index.d.ts +0 -1
- package/dist/Actions/index.d.ts.map +1 -1
- package/dist/Actions/index.js +0 -1
- package/dist/Actions/index.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.d.ts.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +14 -0
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/DevTools/grid-width-lab.component.d.ts +78 -0
- package/dist/DevTools/grid-width-lab.component.d.ts.map +1 -0
- package/dist/DevTools/grid-width-lab.component.js +248 -0
- package/dist/DevTools/grid-width-lab.component.js.map +1 -0
- package/dist/DevTools/index.d.ts +2 -0
- package/dist/DevTools/index.d.ts.map +1 -1
- package/dist/DevTools/index.js +2 -0
- package/dist/DevTools/index.js.map +1 -1
- package/dist/DevTools/tab-strip-lab.component.d.ts +76 -0
- package/dist/DevTools/tab-strip-lab.component.d.ts.map +1 -0
- package/dist/DevTools/tab-strip-lab.component.js +247 -0
- package/dist/DevTools/tab-strip-lab.component.js.map +1 -0
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +0 -6
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +4 -4
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts +2 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +7 -3
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +3 -3
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/visual-editor/visual-editor.component.d.ts +3 -3
- package/dist/Integration/components/visual-editor/visual-editor.component.d.ts.map +1 -1
- package/dist/Integration/components/visual-editor/visual-editor.component.js.map +1 -1
- package/dist/Integration/components/widgets/run-history-panel.component.d.ts +1 -1
- package/dist/Integration/components/widgets/run-history-panel.component.d.ts.map +1 -1
- package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +8 -8
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +2 -1
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +5 -15
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +9 -0
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +28 -5
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +7 -4
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/Workflows/components/create-workflow.component.d.ts +91 -0
- package/dist/Workflows/components/create-workflow.component.d.ts.map +1 -0
- package/dist/Workflows/components/create-workflow.component.js +414 -0
- package/dist/Workflows/components/create-workflow.component.js.map +1 -0
- package/dist/Workflows/components/workflow-run-sorting.d.ts +29 -0
- package/dist/Workflows/components/workflow-run-sorting.d.ts.map +1 -0
- package/dist/Workflows/components/workflow-run-sorting.js +59 -0
- package/dist/Workflows/components/workflow-run-sorting.js.map +1 -0
- package/dist/Workflows/components/workflow-runs-resource.component.d.ts +143 -0
- package/dist/Workflows/components/workflow-runs-resource.component.d.ts.map +1 -0
- package/dist/Workflows/components/workflow-runs-resource.component.js +676 -0
- package/dist/Workflows/components/workflow-runs-resource.component.js.map +1 -0
- package/dist/Workflows/components/workflows-resource.component.d.ts +16 -0
- package/dist/Workflows/components/workflows-resource.component.d.ts.map +1 -0
- package/dist/Workflows/components/workflows-resource.component.js +45 -0
- package/dist/Workflows/components/workflows-resource.component.js.map +1 -0
- package/dist/Workflows/workflows-dashboard.component.d.ts +70 -0
- package/dist/Workflows/workflows-dashboard.component.d.ts.map +1 -0
- package/dist/Workflows/workflows-dashboard.component.js +354 -0
- package/dist/Workflows/workflows-dashboard.component.js.map +1 -0
- package/dist/Workflows/workflows.types.d.ts +95 -0
- package/dist/Workflows/workflows.types.d.ts.map +1 -0
- package/dist/Workflows/workflows.types.js +41 -0
- package/dist/Workflows/workflows.types.js.map +1 -0
- package/dist/actions-dashboards.module.d.ts +23 -24
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +0 -5
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +46 -42
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +22 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +18 -17
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +7 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +8 -1
- package/dist/public-api.js.map +1 -1
- package/dist/shared/action-scheduled-job.d.ts +58 -0
- package/dist/shared/action-scheduled-job.d.ts.map +1 -0
- package/dist/shared/action-scheduled-job.js +77 -0
- package/dist/shared/action-scheduled-job.js.map +1 -0
- package/dist/shared/date-cell.d.ts +34 -0
- package/dist/shared/date-cell.d.ts.map +1 -0
- package/dist/shared/date-cell.js +57 -0
- package/dist/shared/date-cell.js.map +1 -0
- package/dist/workflows-dashboards.module.d.ts +40 -0
- package/dist/workflows-dashboards.module.d.ts.map +1 -0
- package/dist/workflows-dashboards.module.js +118 -0
- package/dist/workflows-dashboards.module.js.map +1 -0
- package/package.json +70 -64
- package/dist/Actions/components/scheduled-actions.component.d.ts +0 -16
- package/dist/Actions/components/scheduled-actions.component.d.ts.map +0 -1
- package/dist/Actions/components/scheduled-actions.component.js +0 -57
- package/dist/Actions/components/scheduled-actions.component.js.map +0 -1
|
@@ -11,8 +11,8 @@ import { GlobalFilterState } from '../../../interfaces/analytics-preferences.int
|
|
|
11
11
|
import * as i0 from "@angular/core";
|
|
12
12
|
interface PromptRunRecord {
|
|
13
13
|
ID: string;
|
|
14
|
-
RunAt: string;
|
|
15
|
-
CompletedAt: string | null;
|
|
14
|
+
RunAt: Date | string;
|
|
15
|
+
CompletedAt: Date | string | null;
|
|
16
16
|
Status: string;
|
|
17
17
|
Success: boolean;
|
|
18
18
|
Cost: number | null;
|
|
@@ -108,7 +108,7 @@ export declare class AnalyticsPromptRunsComponent extends BaseAngularComponent i
|
|
|
108
108
|
ApplyStatusFilter(status: string): void;
|
|
109
109
|
ExportCSV(): void;
|
|
110
110
|
FormatCurrency(value: number | null, decimals: number): string;
|
|
111
|
-
FormatTimestamp(dateStr: string): string;
|
|
111
|
+
FormatTimestamp(dateStr: Date | string): string;
|
|
112
112
|
FormatDuration(ms: number | null): string;
|
|
113
113
|
FormatChartValue(value: number): string;
|
|
114
114
|
GetStatusClass(status: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-run-analysis.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/prompt-runs/prompt-run-analysis.component.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACuB,YAAY,EACtC,MAAM,EAAE,SAAS,EACpB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-run-analysis.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/prompt-runs/prompt-run-analysis.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { Component, Input, Output, EventEmitter, ChangeDetectorRef, inject } fro
|
|
|
9
9
|
import { Subject } from 'rxjs';
|
|
10
10
|
import { RunView } from '@memberjunction/core';
|
|
11
11
|
import { cacheHitRate } from '../../../services/cache-metrics';
|
|
12
|
+
import { CompareDateCells, DateCellIso } from '../../../../shared/date-cell';
|
|
12
13
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
13
14
|
import * as i0 from "@angular/core";
|
|
14
15
|
import * as i1 from "@memberjunction/ng-shared-generic";
|
|
@@ -525,7 +526,7 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
|
|
|
525
526
|
ExportCSV() {
|
|
526
527
|
const headers = ['Timestamp', 'Prompt', 'Model', 'Status', 'Duration(ms)', 'Tokens', 'Cost'];
|
|
527
528
|
const rows = this.FilteredRuns.map(r => [
|
|
528
|
-
r.RunAt,
|
|
529
|
+
DateCellIso(r.RunAt),
|
|
529
530
|
r.Prompt ?? '',
|
|
530
531
|
r.Model ?? '',
|
|
531
532
|
r.Status,
|
|
@@ -763,6 +764,11 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
|
|
|
763
764
|
return 1;
|
|
764
765
|
if (bVal == null)
|
|
765
766
|
return -1;
|
|
767
|
+
// Date cells (RunAt/CompletedAt arrive as real Dates from simple reads) must sort
|
|
768
|
+
// chronologically — String(Date).localeCompare orders by weekday name.
|
|
769
|
+
if (aVal instanceof Date || bVal instanceof Date) {
|
|
770
|
+
return CompareDateCells(aVal, bVal) * dir;
|
|
771
|
+
}
|
|
766
772
|
if (typeof aVal === 'string' && typeof bVal === 'string') {
|
|
767
773
|
return aVal.localeCompare(bVal) * dir;
|
|
768
774
|
}
|
|
@@ -1043,7 +1049,7 @@ export class AnalyticsPromptRunsComponent extends BaseAngularComponent {
|
|
|
1043
1049
|
}], FiltersChange: [{
|
|
1044
1050
|
type: Output
|
|
1045
1051
|
}] }); })();
|
|
1046
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsPromptRunsComponent, { className: "AnalyticsPromptRunsComponent", filePath: "src/AI/components/analytics/prompt-runs/prompt-run-analysis.component.ts", lineNumber:
|
|
1052
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AnalyticsPromptRunsComponent, { className: "AnalyticsPromptRunsComponent", filePath: "src/AI/components/analytics/prompt-runs/prompt-run-analysis.component.ts", lineNumber: 764 }); })();
|
|
1047
1053
|
export function LoadAnalyticsPromptRuns() {
|
|
1048
1054
|
// Prevents tree-shaking of the component
|
|
1049
1055
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-run-analysis.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/prompt-runs/prompt-run-analysis.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Prompt Run Analysis — Charts-first analytics with a detail table.\n *\n * Displays stats summary, runs-over-time chart, model/prompt/status breakdowns,\n * and a sortable, paginated detail table. All data is loaded via RunView from\n * the \"MJ: AI Prompt Runs\" entity.\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 { cacheHitRate } from '../../../services/cache-metrics';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface PromptRunRecord {\n ID: string;\n RunAt: string;\n CompletedAt: string | null;\n Status: string;\n Success: boolean;\n Cost: number | null;\n TotalCost: number | null;\n TokensUsed: number | null;\n TokensPrompt: number | null;\n TokensCompletion: number | null;\n TokensCacheRead: number | null;\n TokensCacheWrite: number | null;\n ExecutionTimeMS: number | null;\n ModelID: string | null;\n Model: string | null;\n AgentID: string | null;\n Agent: string | null;\n PromptID: string | null;\n Prompt: string | null;\n ErrorMessage: string | null;\n}\n\ninterface PromptRunStats {\n TotalRuns: number;\n AvgCost: number;\n AvgTokens: number;\n AvgLatencySeconds: number;\n SuccessRate: number;\n P95LatencySeconds: number;\n TotalCost: number;\n CacheHitRate: number;\n}\n\ninterface ChartBucket {\n label: string;\n value: number;\n heightPercent: number;\n startTime: Date;\n endTime: Date;\n}\n\ninterface BreakdownItem {\n name: string;\n id: string;\n count: number;\n percentage: number;\n}\n\ninterface StatusBreakdownItem extends BreakdownItem {\n cssClass: string;\n}\n\ntype ChartMetric = 'volume' | 'cost' | 'tokens' | 'cacheHit';\ntype SortField = 'RunAt' | 'Prompt' | 'Model' | 'Status' | 'ExecutionTimeMS' | 'TokensUsed' | 'Cost';\ntype SortDirection = 'asc' | 'desc';\n\nconst FIELDS = [\n 'ID', 'RunAt', 'CompletedAt', 'Status', 'Success', 'Cost', 'TotalCost',\n 'TokensUsed', 'TokensPrompt', 'TokensCompletion', 'TokensCacheRead', 'TokensCacheWrite', 'ExecutionTimeMS',\n 'ModelID', 'Model', 'AgentID', 'Agent', 'PromptID', 'Prompt', 'ErrorMessage'\n];\n\nconst PAGE_SIZE = 25;\n\n@Component({\n standalone: false,\n selector: 'app-analytics-prompt-runs',\n template: `\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading prompt runs...\"></mj-loading>\n </div>\n } @else {\n <!-- Stats Summary 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\">\n <div class=\"stat-label\">Avg Cost</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.AvgCost, 4) }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Tokens</div>\n <div class=\"stat-value\">{{ Stats.AvgTokens | number:'1.0-0' }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Latency</div>\n <div class=\"stat-value\">{{ Stats.AvgLatencySeconds | number:'1.2-2' }}s</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 accent-warning\">\n <div class=\"stat-label\">P95 Latency</div>\n <div class=\"stat-value\">{{ Stats.P95LatencySeconds | number:'1.2-2' }}s</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Total Cost</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.TotalCost, 2) }}</div>\n </div>\n <div class=\"stat-card\" title=\"Share of input tokens served from the provider's prompt cache\">\n <div class=\"stat-label\">Cache Hit Rate</div>\n <div class=\"stat-value\">{{ Stats.CacheHitRate * 100 | number:'1.1-1' }}%</div>\n </div>\n </div>\n\n <!-- Chart Panel -->\n <div class=\"chart-panel\">\n <div class=\"chart-header\">\n <h3 class=\"chart-title\">Runs Over Time</h3>\n <div class=\"chart-toggles\">\n @for (metric of ChartMetricOptions; track metric.key) {\n <button\n class=\"toggle-chip\"\n [class.active]=\"ActiveChartMetric === metric.key\"\n (click)=\"OnChartMetricChange(metric.key)\">\n {{ metric.label }}\n </button>\n }\n </div>\n </div>\n <div class=\"chart-area\">\n @if (ChartBuckets.length === 0) {\n <mj-empty-state Size=\"compact\" Variant=\"empty\" Icon=\"fa-solid fa-chart-column\"\n Title=\"No data for selected time range\" />\n } @else {\n <div class=\"chart-bars\">\n @for (bucket of ChartBuckets; track bucket.label) {\n <div\n class=\"chart-bar-wrapper\"\n [title]=\"bucket.label + ': ' + bucket.value\"\n (click)=\"OnChartBucketClick(bucket)\">\n <div class=\"chart-bar-value\">{{ FormatChartValue(bucket.value) }}</div>\n <div class=\"chart-bar\" [style.height.%]=\"bucket.heightPercent\"></div>\n <div class=\"chart-bar-label\">{{ bucket.label }}</div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Breakdown Cards -->\n <div class=\"breakdown-grid\">\n <!-- By Model -->\n <div class=\"breakdown-card\">\n <h4 class=\"breakdown-title\">By Model</h4>\n @for (item of ModelBreakdown; track item.id) {\n <div class=\"breakdown-row\" (click)=\"ApplyModelFilter(item.id)\">\n <span class=\"breakdown-name\">{{ item.name }}</span>\n <span class=\"breakdown-count\">{{ item.count }}</span>\n <div class=\"breakdown-bar-track\">\n <div class=\"breakdown-bar-fill\" [style.width.%]=\"item.percentage\"></div>\n </div>\n </div>\n }\n @if (ModelBreakdown.length === 0) {\n <mj-empty-state Size=\"compact\" Variant=\"empty\" Icon=\"fa-solid fa-cube\" Title=\"No data\" />\n }\n </div>\n\n <!-- By Prompt -->\n <div class=\"breakdown-card\">\n <h4 class=\"breakdown-title\">By Prompt</h4>\n @for (item of PromptBreakdown; track item.id) {\n <div class=\"breakdown-row\" (click)=\"ApplyPromptFilter(item.id)\">\n <span class=\"breakdown-name\">{{ item.name }}</span>\n <span class=\"breakdown-count\">{{ item.count }}</span>\n <div class=\"breakdown-bar-track\">\n <div class=\"breakdown-bar-fill\" [style.width.%]=\"item.percentage\"></div>\n </div>\n </div>\n }\n @if (PromptBreakdown.length === 0) {\n <mj-empty-state Size=\"compact\" Variant=\"empty\" Icon=\"fa-solid fa-message\" Title=\"No data\" />\n }\n </div>\n\n <!-- By Status -->\n <div class=\"breakdown-card\">\n <h4 class=\"breakdown-title\">By Status</h4>\n @for (item of StatusBreakdown; track item.name) {\n <div class=\"breakdown-row\" (click)=\"ApplyStatusFilter(item.name)\">\n <span class=\"status-dot\" [class]=\"item.cssClass\"></span>\n <span class=\"breakdown-name\">{{ item.name }}</span>\n <span class=\"breakdown-count\">{{ item.count }} ({{ item.percentage | number:'1.1-1' }}%)</span>\n </div>\n }\n @if (StatusBreakdown.length === 0) {\n <mj-empty-state Size=\"compact\" Variant=\"empty\" Icon=\"fa-solid fa-circle-dot\" Title=\"No data\" />\n }\n </div>\n </div>\n\n <!-- Run Details Table -->\n <div class=\"table-panel\">\n <div class=\"table-header\">\n <h3 class=\"table-title\">Run Details</h3>\n <span class=\"table-count\">{{ FilteredRuns.length | number }} runs</span>\n </div>\n <div class=\"table-scroll\">\n <table class=\"runs-table\">\n <thead>\n <tr>\n @for (col of TableColumns; track col.field) {\n <th\n [class.sortable]=\"col.sortable\"\n [class.sorted]=\"SortField === col.field\"\n (click)=\"col.sortable ? OnSortChange(col.field) : null\">\n {{ col.label }}\n @if (col.sortable && SortField === col.field) {\n <i [class]=\"SortDirection === 'asc' ? 'fa-solid fa-caret-up' : 'fa-solid fa-caret-down'\"></i>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (run of PagedRuns; track run.ID; let i = $index) {\n <tr [class.row-even]=\"i % 2 === 0\">\n <td class=\"cell-timestamp\">{{ FormatTimestamp(run.RunAt) }}</td>\n <td class=\"cell-prompt\">{{ run.Prompt ?? '(unnamed)' }}</td>\n <td><span class=\"model-tag\">{{ run.Model ?? 'N/A' }}</span></td>\n <td><span class=\"status-pill\" [class]=\"GetStatusClass(run.Status)\">{{ run.Status }}</span></td>\n <td class=\"cell-number\">{{ FormatDuration(run.ExecutionTimeMS) }}</td>\n <td class=\"cell-number\" title=\"Total tokens processed, including cached input\">{{ run.TokensUsed != null ? (TrueTotalTokens(run) | number) : '-' }}</td>\n <td class=\"cell-number\">{{ FormatCurrency(run.Cost, 4) }}</td>\n </tr>\n }\n @if (PagedRuns.length === 0) {\n <tr>\n <td colspan=\"7\" class=\"empty-row\">No prompt runs found for the selected filters.</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n @if (TotalPages > 1) {\n <div class=\"pagination\">\n <button\n class=\"page-btn\"\n [disabled]=\"CurrentPage === 1\"\n (click)=\"OnPageChange(CurrentPage - 1)\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n <span class=\"page-info\">Page {{ CurrentPage }} of {{ TotalPages }}</span>\n <button\n class=\"page-btn\"\n [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"OnPageChange(CurrentPage + 1)\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n }\n </div>\n }\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 80px 0;\n }\n\n /* ── Stats Grid ── */\n\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-top: 16px;\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 display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .stat-card.accent-brand {\n border-left: 3px solid var(--mj-brand-primary);\n }\n\n .stat-card.accent-success {\n border-left: 3px solid var(--mj-status-success);\n }\n\n .stat-card.accent-warning {\n border-left: 3px solid var(--mj-status-warning);\n }\n\n .stat-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n }\n\n .stat-value {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n /* ── Chart Panel ── */\n\n .chart-panel {\n margin-top: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n }\n\n .chart-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n }\n\n .chart-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n }\n\n .chart-toggles {\n display: flex;\n gap: 4px;\n }\n\n .toggle-chip {\n padding: 4px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n }\n\n .toggle-chip:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .toggle-chip.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n font-weight: 600;\n }\n\n .chart-area {\n height: 220px;\n display: flex;\n align-items: flex-end;\n }\n\n .chart-area mj-empty-state {\n width: 100%;\n height: 100%;\n }\n\n .chart-bars {\n display: flex;\n align-items: flex-end;\n gap: 4px;\n width: 100%;\n height: 100%;\n padding-bottom: 24px;\n }\n\n .chart-bar-wrapper {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n position: relative;\n height: 100%;\n justify-content: flex-end;\n }\n\n .chart-bar-value {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n\n .chart-bar {\n width: 80%;\n min-height: 2px;\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n border-radius: 4px 4px 0 0;\n transition: background 0.15s, height 0.3s;\n }\n\n .chart-bar-wrapper:hover .chart-bar {\n background: color-mix(in srgb, var(--mj-brand-primary) 50%, var(--mj-bg-surface));\n }\n\n .chart-bar-label {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-top: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n text-align: center;\n position: absolute;\n bottom: 0;\n }\n\n /* ── Breakdown Cards ── */\n\n .breakdown-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n margin-top: 16px;\n }\n\n .breakdown-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n }\n\n .breakdown-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 12px;\n }\n\n .breakdown-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 0;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.1s;\n }\n\n .breakdown-row:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .breakdown-name {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n }\n\n .breakdown-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 600;\n white-space: nowrap;\n }\n\n .breakdown-bar-track {\n width: 60px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n flex-shrink: 0;\n }\n\n .breakdown-bar-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.3s;\n }\n\n .status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .status-dot.dot-completed { background: var(--mj-status-success); }\n .status-dot.dot-failed { background: var(--mj-status-error); }\n .status-dot.dot-running { background: var(--mj-brand-primary); }\n .status-dot.dot-pending { background: var(--mj-status-warning); }\n .status-dot.dot-cancelled { background: var(--mj-text-muted); }\n\n /* ── Table Panel ── */\n\n .table-panel {\n margin-top: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n\n .table-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .table-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n }\n\n .table-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .table-scroll {\n overflow-x: auto;\n }\n\n .runs-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .runs-table th {\n padding: 10px 14px;\n text-align: left;\n font-weight: 600;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n white-space: nowrap;\n user-select: none;\n }\n\n .runs-table th.sortable {\n cursor: pointer;\n }\n\n .runs-table th.sortable:hover {\n color: var(--mj-text-primary);\n }\n\n .runs-table th.sorted {\n color: var(--mj-brand-primary);\n }\n\n .runs-table th i {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .runs-table td {\n padding: 10px 14px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .runs-table tr.row-even {\n background: var(--mj-bg-surface-card);\n }\n\n .runs-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-timestamp {\n white-space: nowrap;\n color: var(--mj-text-secondary);\n font-size: 12px;\n }\n\n .cell-prompt {\n font-weight: 600;\n max-width: 220px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .cell-number {\n text-align: right;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n }\n\n .model-tag {\n display: inline-flex;\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n }\n\n .status-pill {\n display: inline-block;\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n white-space: nowrap;\n }\n\n .pill-completed {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n }\n\n .pill-failed {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n }\n\n .pill-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 .pill-pending {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n }\n\n .pill-cancelled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .empty-row {\n text-align: center;\n color: var(--mj-text-muted);\n padding: 24px 14px;\n }\n\n /* ── Pagination ── */\n\n .pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n\n .page-btn {\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 13px;\n transition: background 0.15s, color 0.15s;\n }\n\n .page-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .page-btn:disabled {\n opacity: 0.4;\n cursor: default;\n }\n\n .page-info {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* ── Responsive ── */\n\n @media (max-width: 1200px) {\n .breakdown-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .breakdown-grid {\n grid-template-columns: 1fr;\n }\n\n .chart-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n }\n `]\n})\nexport class AnalyticsPromptRunsComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n private isInitialized = false;\n\n // ── Inputs with setter pattern ──\n\n private _timeRange = '24h';\n @Input()\n set TimeRange(value: string) {\n if (value !== this._timeRange) {\n this._timeRange = value;\n if (this.isInitialized) {\n this.LoadData();\n }\n }\n }\n get TimeRange(): string {\n return this._timeRange;\n }\n\n private _filters: GlobalFilterState = { Models: [], Agents: [], Prompts: [], Statuses: [] };\n @Input()\n set Filters(value: GlobalFilterState) {\n this._filters = value;\n if (this.isInitialized) {\n this.resetPagination();\n this.cdr.detectChanges();\n }\n }\n get Filters(): GlobalFilterState {\n return this._filters;\n }\n\n @Output() TimeRangeChange = new EventEmitter<string>();\n @Output() FiltersChange = new EventEmitter<GlobalFilterState>();\n\n // ── State ──\n\n public IsLoading = false;\n public ActiveChartMetric: ChartMetric = 'volume';\n public SortField: SortField = 'RunAt';\n public SortDirection: SortDirection = 'desc';\n public CurrentPage = 1;\n\n private allRuns: PromptRunRecord[] = [];\n\n readonly ChartMetricOptions: { key: ChartMetric; label: string }[] = [\n { key: 'volume', label: 'By Volume' },\n { key: 'cost', label: 'By Cost' },\n { key: 'tokens', label: 'By Tokens' },\n { key: 'cacheHit', label: 'By Cache Hit %' },\n ];\n\n readonly TableColumns: { field: SortField; label: string; sortable: boolean }[] = [\n { field: 'RunAt', label: 'Timestamp', sortable: true },\n { field: 'Prompt', label: 'Prompt', sortable: true },\n { field: 'Model', label: 'Model', sortable: true },\n { field: 'Status', label: 'Status', sortable: true },\n { field: 'ExecutionTimeMS', label: 'Duration', sortable: true },\n { field: 'TokensUsed', label: 'Tokens', sortable: true },\n { field: 'Cost', label: 'Cost', sortable: true },\n ];\n\n // ── Lifecycle ──\n\n async ngOnInit(): Promise<void> {\n this.isInitialized = true;\n await this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Computed Properties ──\n\n get FilteredRuns(): PromptRunRecord[] {\n return this.applyFilters(this.allRuns);\n }\n\n get Stats(): PromptRunStats {\n return this.computeStats(this.FilteredRuns);\n }\n\n get ChartBuckets(): ChartBucket[] {\n return this.computeChartBuckets(this.FilteredRuns);\n }\n\n get ModelBreakdown(): BreakdownItem[] {\n return this.computeBreakdown(this.FilteredRuns, 'Model', 'ModelID');\n }\n\n get PromptBreakdown(): BreakdownItem[] {\n return this.computeBreakdown(this.FilteredRuns, 'Prompt', 'PromptID');\n }\n\n get StatusBreakdown(): StatusBreakdownItem[] {\n return this.computeStatusBreakdown(this.FilteredRuns);\n }\n\n get PagedRuns(): PromptRunRecord[] {\n const sorted = this.sortRuns(this.FilteredRuns);\n const start = (this.CurrentPage - 1) * PAGE_SIZE;\n return sorted.slice(start, start + PAGE_SIZE);\n }\n\n get TotalPages(): number {\n return Math.max(1, Math.ceil(this.FilteredRuns.length / PAGE_SIZE));\n }\n\n // ── Event Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.TimeRangeChange.emit(range);\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = filters;\n this.FiltersChange.emit(filters);\n }\n\n public OnChartMetricChange(metric: ChartMetric): void {\n this.ActiveChartMetric = metric;\n this.cdr.detectChanges();\n }\n\n public OnChartBucketClick(_bucket: ChartBucket): void {\n // Future: drill into time range\n }\n\n public OnSortChange(field: SortField): void {\n if (this.SortField === field) {\n this.SortDirection = this.SortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortField = field;\n this.SortDirection = 'desc';\n }\n this.resetPagination();\n this.cdr.detectChanges();\n }\n\n public OnPageChange(page: number): void {\n if (page >= 1 && page <= this.TotalPages) {\n this.CurrentPage = page;\n this.cdr.detectChanges();\n }\n }\n\n public ApplyModelFilter(modelId: string): void {\n this.Filters = { ...this.Filters, Models: [modelId] };\n this.FiltersChange.emit(this.Filters);\n }\n\n public ApplyPromptFilter(promptId: string): void {\n this.Filters = { ...this.Filters, Prompts: [promptId] };\n this.FiltersChange.emit(this.Filters);\n }\n\n public ApplyStatusFilter(status: string): void {\n this.Filters = { ...this.Filters, Statuses: [status] };\n this.FiltersChange.emit(this.Filters);\n }\n\n public ExportCSV(): void {\n const headers = ['Timestamp', 'Prompt', 'Model', 'Status', 'Duration(ms)', 'Tokens', 'Cost'];\n const rows = this.FilteredRuns.map(r => [\n r.RunAt,\n r.Prompt ?? '',\n r.Model ?? '',\n r.Status,\n r.ExecutionTimeMS?.toString() ?? '',\n this.TrueTotalTokens(r).toString(),\n r.Cost?.toString() ?? ''\n ]);\n const csv = [headers, ...rows].map(r => r.join(',')).join('\\n');\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = `prompt-runs-${new Date().toISOString().slice(0, 10)}.csv`;\n anchor.click();\n URL.revokeObjectURL(url);\n }\n\n // ── Formatting Helpers ──\n\n public FormatCurrency(value: number | null, decimals: number): string {\n if (value == null || isNaN(value)) return '$0.00';\n return '$' + value.toFixed(decimals);\n }\n\n public FormatTimestamp(dateStr: string): string {\n const d = new Date(dateStr);\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' }) +\n ' ' + d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n }\n\n public FormatDuration(ms: number | null): string {\n if (ms == null) return '-';\n if (ms < 1000) return ms + 'ms';\n return (ms / 1000).toFixed(2) + 's';\n }\n\n public FormatChartValue(value: number): string {\n if (this.ActiveChartMetric === 'cost') {\n return '$' + value.toFixed(2);\n }\n if (this.ActiveChartMetric === 'cacheHit') {\n return value.toFixed(0) + '%';\n }\n if (value >= 1000) {\n return (value / 1000).toFixed(1) + 'k';\n }\n return value.toFixed(0);\n }\n\n public GetStatusClass(status: string): string {\n const key = status.toLowerCase();\n return 'pill-' + key;\n }\n\n // ── Data Loading ──\n\n public async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const cutoff = this.getTimeRangeCutoff(this._timeRange);\n const filter = cutoff ? `RunAt >= '${cutoff.toISOString()}'` : '';\n\n const result = await rv.RunView<PromptRunRecord>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: filter,\n OrderBy: 'RunAt DESC',\n Fields: FIELDS,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.allRuns = result.Results;\n } else {\n this.allRuns = [];\n }\n } catch {\n this.allRuns = [];\n }\n\n this.resetPagination();\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n\n // ── Private Helpers ──\n\n private applyFilters(runs: PromptRunRecord[]): PromptRunRecord[] {\n let filtered = runs;\n\n if (this._filters.Models.length > 0) {\n filtered = filtered.filter(r => r.ModelID != null && this._filters.Models.includes(r.ModelID));\n }\n if (this._filters.Agents.length > 0) {\n filtered = filtered.filter(r => r.AgentID != null && this._filters.Agents.includes(r.AgentID));\n }\n if (this._filters.Prompts.length > 0) {\n filtered = filtered.filter(r => r.PromptID != null && this._filters.Prompts.includes(r.PromptID));\n }\n if (this._filters.Statuses.length > 0) {\n filtered = filtered.filter(r => this._filters.Statuses.includes(r.Status));\n }\n\n return filtered;\n }\n\n /**\n * Total tokens the model processed for a run, INCLUDING cached input. TokensUsed excludes the\n * cache buckets by design, so a heavily-cached run looks tiny; this is the true throughput.\n */\n public TrueTotalTokens(run: PromptRunRecord): number {\n return (run.TokensUsed ?? 0) + (run.TokensCacheRead ?? 0) + (run.TokensCacheWrite ?? 0);\n }\n\n private computeStats(runs: PromptRunRecord[]): PromptRunStats {\n const total = runs.length;\n if (total === 0) {\n return { TotalRuns: 0, AvgCost: 0, AvgTokens: 0, AvgLatencySeconds: 0, SuccessRate: 0, P95LatencySeconds: 0, TotalCost: 0, CacheHitRate: 0 };\n }\n\n const totalCost = this.sumNullable(runs, r => r.Cost);\n const totalTokens = runs.reduce((sum, r) => sum + this.TrueTotalTokens(r), 0);\n const latencies = this.collectNonNull(runs, r => r.ExecutionTimeMS);\n const avgLatencyMs = latencies.length > 0 ? latencies.reduce((a, b) => a + b, 0) / latencies.length : 0;\n const successCount = runs.filter(r => r.Status === 'Completed').length;\n const p95 = this.percentile(latencies, 95);\n const cacheHit = cacheHitRate({\n uncachedInputTokens: this.sumNullable(runs, r => r.TokensPrompt),\n cacheReadTokens: this.sumNullable(runs, r => r.TokensCacheRead),\n cacheWriteTokens: this.sumNullable(runs, r => r.TokensCacheWrite)\n });\n\n return {\n TotalRuns: total,\n AvgCost: totalCost / total,\n AvgTokens: totalTokens / total,\n AvgLatencySeconds: avgLatencyMs / 1000,\n SuccessRate: (successCount / total) * 100,\n P95LatencySeconds: p95 / 1000,\n TotalCost: totalCost,\n CacheHitRate: cacheHit,\n };\n }\n\n private computeChartBuckets(runs: PromptRunRecord[]): ChartBucket[] {\n if (runs.length === 0) return [];\n\n const bucketCount = this.getBucketCount();\n const cutoff = this.getTimeRangeCutoff(this._timeRange) ?? new Date(runs[runs.length - 1].RunAt);\n const now = new Date();\n const rangeMs = now.getTime() - cutoff.getTime();\n const bucketMs = rangeMs / bucketCount;\n\n const buckets: { label: string; total: number; cacheRead: number; inputForHit: number; start: Date; end: Date }[] = [];\n for (let i = 0; i < bucketCount; i++) {\n const start = new Date(cutoff.getTime() + i * bucketMs);\n const end = new Date(cutoff.getTime() + (i + 1) * bucketMs);\n buckets.push({\n label: this.formatBucketLabel(start),\n total: 0,\n cacheRead: 0,\n inputForHit: 0,\n start,\n end,\n });\n }\n\n for (const run of runs) {\n const runTime = new Date(run.RunAt).getTime();\n const idx = Math.min(Math.floor((runTime - cutoff.getTime()) / bucketMs), bucketCount - 1);\n if (idx >= 0 && idx < bucketCount) {\n buckets[idx].total += this.getChartMetricValue(run);\n // Cache hit-rate is a ratio, not a sum — accumulate the components and divide below.\n buckets[idx].cacheRead += run.TokensCacheRead ?? 0;\n buckets[idx].inputForHit += (run.TokensPrompt ?? 0) + (run.TokensCacheRead ?? 0) + (run.TokensCacheWrite ?? 0);\n }\n }\n\n if (this.ActiveChartMetric === 'cacheHit') {\n for (const b of buckets) {\n b.total = b.inputForHit > 0 ? (b.cacheRead / b.inputForHit) * 100 : 0;\n }\n }\n\n const max = Math.max(...buckets.map(b => b.total), 1);\n\n return buckets.map(b => ({\n label: b.label,\n value: Math.round(b.total * 100) / 100,\n heightPercent: Math.max((b.total / max) * 100, 1),\n startTime: b.start,\n endTime: b.end,\n }));\n }\n\n private getChartMetricValue(run: PromptRunRecord): number {\n switch (this.ActiveChartMetric) {\n case 'cost': return run.Cost ?? 0;\n case 'tokens': return this.TrueTotalTokens(run);\n default: return 1; // volume = count\n }\n }\n\n private computeBreakdown(runs: PromptRunRecord[], nameKey: 'Model' | 'Prompt', idKey: 'ModelID' | 'PromptID'): BreakdownItem[] {\n const counts = new Map<string, { name: string; count: number }>();\n for (const run of runs) {\n const id = run[idKey];\n const name = run[nameKey];\n if (id != null && name != null) {\n const existing = counts.get(id);\n if (existing) {\n existing.count++;\n } else {\n counts.set(id, { name, count: 1 });\n }\n }\n }\n\n const sorted = Array.from(counts.entries())\n .sort((a, b) => b[1].count - a[1].count)\n .slice(0, 4);\n\n const maxCount = sorted.length > 0 ? sorted[0][1].count : 1;\n\n return sorted.map(([id, data]) => ({\n id,\n name: data.name,\n count: data.count,\n percentage: (data.count / maxCount) * 100,\n }));\n }\n\n private computeStatusBreakdown(runs: PromptRunRecord[]): StatusBreakdownItem[] {\n const total = runs.length;\n if (total === 0) return [];\n\n const counts = new Map<string, number>();\n for (const run of runs) {\n counts.set(run.Status, (counts.get(run.Status) ?? 0) + 1);\n }\n\n return Array.from(counts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([status, count]) => ({\n id: status,\n name: status,\n count,\n percentage: (count / total) * 100,\n cssClass: 'dot-' + status.toLowerCase(),\n }));\n }\n\n private sortRuns(runs: PromptRunRecord[]): PromptRunRecord[] {\n const dir = this.SortDirection === 'asc' ? 1 : -1;\n return [...runs].sort((a, b) => {\n const aVal = a[this.SortField];\n const bVal = b[this.SortField];\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return 1;\n if (bVal == null) return -1;\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n return aVal.localeCompare(bVal) * dir;\n }\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return (aVal - bVal) * dir;\n }\n return String(aVal).localeCompare(String(bVal)) * dir;\n });\n }\n\n private getTimeRangeCutoff(range: string): Date | null {\n const now = new Date();\n switch (range) {\n case '1h': return new Date(now.getTime() - 60 * 60 * 1000);\n case '6h': return new Date(now.getTime() - 6 * 60 * 60 * 1000);\n case '24h': return new Date(now.getTime() - 24 * 60 * 60 * 1000);\n case '7d': return new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n case '30d': return new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n default: return null;\n }\n }\n\n private getBucketCount(): number {\n switch (this._timeRange) {\n case '1h': return 12; // 5-min buckets\n case '6h': return 12; // 30-min buckets\n case '24h': return 24; // 1-hour buckets\n case '7d': return 14; // 12-hour buckets\n case '30d': return 30; // 1-day buckets\n default: return 24;\n }\n }\n\n private formatBucketLabel(date: Date): string {\n switch (this._timeRange) {\n case '1h':\n case '6h':\n return date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n case '24h':\n return date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n case '7d':\n case '30d':\n return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n default:\n return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n }\n }\n\n private sumNullable(runs: PromptRunRecord[], getter: (r: PromptRunRecord) => number | null): number {\n return runs.reduce((sum, r) => sum + (getter(r) ?? 0), 0);\n }\n\n private collectNonNull(runs: PromptRunRecord[], getter: (r: PromptRunRecord) => number | null): number[] {\n const result: number[] = [];\n for (const r of runs) {\n const val = getter(r);\n if (val != null) {\n result.push(val);\n }\n }\n return result;\n }\n\n private percentile(values: number[], pct: number): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.ceil((pct / 100) * sorted.length) - 1;\n return sorted[Math.max(0, index)];\n }\n\n private resetPagination(): void {\n this.CurrentPage = 1;\n }\n}\n\nexport function LoadAnalyticsPromptRuns(): void {\n // Prevents tree-shaking of the component\n}\n"]}
|
|
1
|
+
{"version":3,"file":"prompt-run-analysis.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/prompt-runs/prompt-run-analysis.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Prompt Run Analysis — Charts-first analytics with a detail table.\n *\n * Displays stats summary, runs-over-time chart, model/prompt/status breakdowns,\n * and a sortable, paginated detail table. All data is loaded via RunView from\n * the \"MJ: AI Prompt Runs\" entity.\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 { cacheHitRate } from '../../../services/cache-metrics';\nimport { CompareDateCells, DateCellIso } from '../../../../shared/date-cell';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface PromptRunRecord {\n ID: string;\n RunAt: Date | string;\n CompletedAt: Date | string | null;\n Status: string;\n Success: boolean;\n Cost: number | null;\n TotalCost: number | null;\n TokensUsed: number | null;\n TokensPrompt: number | null;\n TokensCompletion: number | null;\n TokensCacheRead: number | null;\n TokensCacheWrite: number | null;\n ExecutionTimeMS: number | null;\n ModelID: string | null;\n Model: string | null;\n AgentID: string | null;\n Agent: string | null;\n PromptID: string | null;\n Prompt: string | null;\n ErrorMessage: string | null;\n}\n\ninterface PromptRunStats {\n TotalRuns: number;\n AvgCost: number;\n AvgTokens: number;\n AvgLatencySeconds: number;\n SuccessRate: number;\n P95LatencySeconds: number;\n TotalCost: number;\n CacheHitRate: number;\n}\n\ninterface ChartBucket {\n label: string;\n value: number;\n heightPercent: number;\n startTime: Date;\n endTime: Date;\n}\n\ninterface BreakdownItem {\n name: string;\n id: string;\n count: number;\n percentage: number;\n}\n\ninterface StatusBreakdownItem extends BreakdownItem {\n cssClass: string;\n}\n\ntype ChartMetric = 'volume' | 'cost' | 'tokens' | 'cacheHit';\ntype SortField = 'RunAt' | 'Prompt' | 'Model' | 'Status' | 'ExecutionTimeMS' | 'TokensUsed' | 'Cost';\ntype SortDirection = 'asc' | 'desc';\n\nconst FIELDS = [\n 'ID', 'RunAt', 'CompletedAt', 'Status', 'Success', 'Cost', 'TotalCost',\n 'TokensUsed', 'TokensPrompt', 'TokensCompletion', 'TokensCacheRead', 'TokensCacheWrite', 'ExecutionTimeMS',\n 'ModelID', 'Model', 'AgentID', 'Agent', 'PromptID', 'Prompt', 'ErrorMessage'\n];\n\nconst PAGE_SIZE = 25;\n\n@Component({\n standalone: false,\n selector: 'app-analytics-prompt-runs',\n template: `\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading prompt runs...\"></mj-loading>\n </div>\n } @else {\n <!-- Stats Summary 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\">\n <div class=\"stat-label\">Avg Cost</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.AvgCost, 4) }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Tokens</div>\n <div class=\"stat-value\">{{ Stats.AvgTokens | number:'1.0-0' }}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Latency</div>\n <div class=\"stat-value\">{{ Stats.AvgLatencySeconds | number:'1.2-2' }}s</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 accent-warning\">\n <div class=\"stat-label\">P95 Latency</div>\n <div class=\"stat-value\">{{ Stats.P95LatencySeconds | number:'1.2-2' }}s</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Total Cost</div>\n <div class=\"stat-value\">{{ FormatCurrency(Stats.TotalCost, 2) }}</div>\n </div>\n <div class=\"stat-card\" title=\"Share of input tokens served from the provider's prompt cache\">\n <div class=\"stat-label\">Cache Hit Rate</div>\n <div class=\"stat-value\">{{ Stats.CacheHitRate * 100 | number:'1.1-1' }}%</div>\n </div>\n </div>\n\n <!-- Chart Panel -->\n <div class=\"chart-panel\">\n <div class=\"chart-header\">\n <h3 class=\"chart-title\">Runs Over Time</h3>\n <div class=\"chart-toggles\">\n @for (metric of ChartMetricOptions; track metric.key) {\n <button\n class=\"toggle-chip\"\n [class.active]=\"ActiveChartMetric === metric.key\"\n (click)=\"OnChartMetricChange(metric.key)\">\n {{ metric.label }}\n </button>\n }\n </div>\n </div>\n <div class=\"chart-area\">\n @if (ChartBuckets.length === 0) {\n <mj-empty-state Size=\"compact\" Variant=\"empty\" Icon=\"fa-solid fa-chart-column\"\n Title=\"No data for selected time range\" />\n } @else {\n <div class=\"chart-bars\">\n @for (bucket of ChartBuckets; track bucket.label) {\n <div\n class=\"chart-bar-wrapper\"\n [title]=\"bucket.label + ': ' + bucket.value\"\n (click)=\"OnChartBucketClick(bucket)\">\n <div class=\"chart-bar-value\">{{ FormatChartValue(bucket.value) }}</div>\n <div class=\"chart-bar\" [style.height.%]=\"bucket.heightPercent\"></div>\n <div class=\"chart-bar-label\">{{ bucket.label }}</div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Breakdown Cards -->\n <div class=\"breakdown-grid\">\n <!-- By Model -->\n <div class=\"breakdown-card\">\n <h4 class=\"breakdown-title\">By Model</h4>\n @for (item of ModelBreakdown; track item.id) {\n <div class=\"breakdown-row\" (click)=\"ApplyModelFilter(item.id)\">\n <span class=\"breakdown-name\">{{ item.name }}</span>\n <span class=\"breakdown-count\">{{ item.count }}</span>\n <div class=\"breakdown-bar-track\">\n <div class=\"breakdown-bar-fill\" [style.width.%]=\"item.percentage\"></div>\n </div>\n </div>\n }\n @if (ModelBreakdown.length === 0) {\n <mj-empty-state Size=\"compact\" Variant=\"empty\" Icon=\"fa-solid fa-cube\" Title=\"No data\" />\n }\n </div>\n\n <!-- By Prompt -->\n <div class=\"breakdown-card\">\n <h4 class=\"breakdown-title\">By Prompt</h4>\n @for (item of PromptBreakdown; track item.id) {\n <div class=\"breakdown-row\" (click)=\"ApplyPromptFilter(item.id)\">\n <span class=\"breakdown-name\">{{ item.name }}</span>\n <span class=\"breakdown-count\">{{ item.count }}</span>\n <div class=\"breakdown-bar-track\">\n <div class=\"breakdown-bar-fill\" [style.width.%]=\"item.percentage\"></div>\n </div>\n </div>\n }\n @if (PromptBreakdown.length === 0) {\n <mj-empty-state Size=\"compact\" Variant=\"empty\" Icon=\"fa-solid fa-message\" Title=\"No data\" />\n }\n </div>\n\n <!-- By Status -->\n <div class=\"breakdown-card\">\n <h4 class=\"breakdown-title\">By Status</h4>\n @for (item of StatusBreakdown; track item.name) {\n <div class=\"breakdown-row\" (click)=\"ApplyStatusFilter(item.name)\">\n <span class=\"status-dot\" [class]=\"item.cssClass\"></span>\n <span class=\"breakdown-name\">{{ item.name }}</span>\n <span class=\"breakdown-count\">{{ item.count }} ({{ item.percentage | number:'1.1-1' }}%)</span>\n </div>\n }\n @if (StatusBreakdown.length === 0) {\n <mj-empty-state Size=\"compact\" Variant=\"empty\" Icon=\"fa-solid fa-circle-dot\" Title=\"No data\" />\n }\n </div>\n </div>\n\n <!-- Run Details Table -->\n <div class=\"table-panel\">\n <div class=\"table-header\">\n <h3 class=\"table-title\">Run Details</h3>\n <span class=\"table-count\">{{ FilteredRuns.length | number }} runs</span>\n </div>\n <div class=\"table-scroll\">\n <table class=\"runs-table\">\n <thead>\n <tr>\n @for (col of TableColumns; track col.field) {\n <th\n [class.sortable]=\"col.sortable\"\n [class.sorted]=\"SortField === col.field\"\n (click)=\"col.sortable ? OnSortChange(col.field) : null\">\n {{ col.label }}\n @if (col.sortable && SortField === col.field) {\n <i [class]=\"SortDirection === 'asc' ? 'fa-solid fa-caret-up' : 'fa-solid fa-caret-down'\"></i>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (run of PagedRuns; track run.ID; let i = $index) {\n <tr [class.row-even]=\"i % 2 === 0\">\n <td class=\"cell-timestamp\">{{ FormatTimestamp(run.RunAt) }}</td>\n <td class=\"cell-prompt\">{{ run.Prompt ?? '(unnamed)' }}</td>\n <td><span class=\"model-tag\">{{ run.Model ?? 'N/A' }}</span></td>\n <td><span class=\"status-pill\" [class]=\"GetStatusClass(run.Status)\">{{ run.Status }}</span></td>\n <td class=\"cell-number\">{{ FormatDuration(run.ExecutionTimeMS) }}</td>\n <td class=\"cell-number\" title=\"Total tokens processed, including cached input\">{{ run.TokensUsed != null ? (TrueTotalTokens(run) | number) : '-' }}</td>\n <td class=\"cell-number\">{{ FormatCurrency(run.Cost, 4) }}</td>\n </tr>\n }\n @if (PagedRuns.length === 0) {\n <tr>\n <td colspan=\"7\" class=\"empty-row\">No prompt runs found for the selected filters.</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n @if (TotalPages > 1) {\n <div class=\"pagination\">\n <button\n class=\"page-btn\"\n [disabled]=\"CurrentPage === 1\"\n (click)=\"OnPageChange(CurrentPage - 1)\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n <span class=\"page-info\">Page {{ CurrentPage }} of {{ TotalPages }}</span>\n <button\n class=\"page-btn\"\n [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"OnPageChange(CurrentPage + 1)\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n }\n </div>\n }\n `,\n styles: [`\n :host {\n display: block;\n }\n\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 80px 0;\n }\n\n /* ── Stats Grid ── */\n\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-top: 16px;\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 display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .stat-card.accent-brand {\n border-left: 3px solid var(--mj-brand-primary);\n }\n\n .stat-card.accent-success {\n border-left: 3px solid var(--mj-status-success);\n }\n\n .stat-card.accent-warning {\n border-left: 3px solid var(--mj-status-warning);\n }\n\n .stat-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n }\n\n .stat-value {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n /* ── Chart Panel ── */\n\n .chart-panel {\n margin-top: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n }\n\n .chart-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n }\n\n .chart-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n }\n\n .chart-toggles {\n display: flex;\n gap: 4px;\n }\n\n .toggle-chip {\n padding: 4px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n }\n\n .toggle-chip:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .toggle-chip.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n font-weight: 600;\n }\n\n .chart-area {\n height: 220px;\n display: flex;\n align-items: flex-end;\n }\n\n .chart-area mj-empty-state {\n width: 100%;\n height: 100%;\n }\n\n .chart-bars {\n display: flex;\n align-items: flex-end;\n gap: 4px;\n width: 100%;\n height: 100%;\n padding-bottom: 24px;\n }\n\n .chart-bar-wrapper {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n position: relative;\n height: 100%;\n justify-content: flex-end;\n }\n\n .chart-bar-value {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n\n .chart-bar {\n width: 80%;\n min-height: 2px;\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n border-radius: 4px 4px 0 0;\n transition: background 0.15s, height 0.3s;\n }\n\n .chart-bar-wrapper:hover .chart-bar {\n background: color-mix(in srgb, var(--mj-brand-primary) 50%, var(--mj-bg-surface));\n }\n\n .chart-bar-label {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-top: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n text-align: center;\n position: absolute;\n bottom: 0;\n }\n\n /* ── Breakdown Cards ── */\n\n .breakdown-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n margin-top: 16px;\n }\n\n .breakdown-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n }\n\n .breakdown-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 12px;\n }\n\n .breakdown-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 0;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.1s;\n }\n\n .breakdown-row:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .breakdown-name {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n }\n\n .breakdown-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 600;\n white-space: nowrap;\n }\n\n .breakdown-bar-track {\n width: 60px;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n overflow: hidden;\n flex-shrink: 0;\n }\n\n .breakdown-bar-fill {\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 3px;\n transition: width 0.3s;\n }\n\n .status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .status-dot.dot-completed { background: var(--mj-status-success); }\n .status-dot.dot-failed { background: var(--mj-status-error); }\n .status-dot.dot-running { background: var(--mj-brand-primary); }\n .status-dot.dot-pending { background: var(--mj-status-warning); }\n .status-dot.dot-cancelled { background: var(--mj-text-muted); }\n\n /* ── Table Panel ── */\n\n .table-panel {\n margin-top: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n\n .table-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .table-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n }\n\n .table-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .table-scroll {\n overflow-x: auto;\n }\n\n .runs-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .runs-table th {\n padding: 10px 14px;\n text-align: left;\n font-weight: 600;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n white-space: nowrap;\n user-select: none;\n }\n\n .runs-table th.sortable {\n cursor: pointer;\n }\n\n .runs-table th.sortable:hover {\n color: var(--mj-text-primary);\n }\n\n .runs-table th.sorted {\n color: var(--mj-brand-primary);\n }\n\n .runs-table th i {\n margin-left: 4px;\n font-size: 10px;\n }\n\n .runs-table td {\n padding: 10px 14px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .runs-table tr.row-even {\n background: var(--mj-bg-surface-card);\n }\n\n .runs-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-timestamp {\n white-space: nowrap;\n color: var(--mj-text-secondary);\n font-size: 12px;\n }\n\n .cell-prompt {\n font-weight: 600;\n max-width: 220px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .cell-number {\n text-align: right;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n }\n\n .model-tag {\n display: inline-flex;\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n }\n\n .status-pill {\n display: inline-block;\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n white-space: nowrap;\n }\n\n .pill-completed {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n }\n\n .pill-failed {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n }\n\n .pill-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 .pill-pending {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n }\n\n .pill-cancelled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .empty-row {\n text-align: center;\n color: var(--mj-text-muted);\n padding: 24px 14px;\n }\n\n /* ── Pagination ── */\n\n .pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n\n .page-btn {\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 13px;\n transition: background 0.15s, color 0.15s;\n }\n\n .page-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .page-btn:disabled {\n opacity: 0.4;\n cursor: default;\n }\n\n .page-info {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* ── Responsive ── */\n\n @media (max-width: 1200px) {\n .breakdown-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .breakdown-grid {\n grid-template-columns: 1fr;\n }\n\n .chart-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n }\n `]\n})\nexport class AnalyticsPromptRunsComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n private isInitialized = false;\n\n // ── Inputs with setter pattern ──\n\n private _timeRange = '24h';\n @Input()\n set TimeRange(value: string) {\n if (value !== this._timeRange) {\n this._timeRange = value;\n if (this.isInitialized) {\n this.LoadData();\n }\n }\n }\n get TimeRange(): string {\n return this._timeRange;\n }\n\n private _filters: GlobalFilterState = { Models: [], Agents: [], Prompts: [], Statuses: [] };\n @Input()\n set Filters(value: GlobalFilterState) {\n this._filters = value;\n if (this.isInitialized) {\n this.resetPagination();\n this.cdr.detectChanges();\n }\n }\n get Filters(): GlobalFilterState {\n return this._filters;\n }\n\n @Output() TimeRangeChange = new EventEmitter<string>();\n @Output() FiltersChange = new EventEmitter<GlobalFilterState>();\n\n // ── State ──\n\n public IsLoading = false;\n public ActiveChartMetric: ChartMetric = 'volume';\n public SortField: SortField = 'RunAt';\n public SortDirection: SortDirection = 'desc';\n public CurrentPage = 1;\n\n private allRuns: PromptRunRecord[] = [];\n\n readonly ChartMetricOptions: { key: ChartMetric; label: string }[] = [\n { key: 'volume', label: 'By Volume' },\n { key: 'cost', label: 'By Cost' },\n { key: 'tokens', label: 'By Tokens' },\n { key: 'cacheHit', label: 'By Cache Hit %' },\n ];\n\n readonly TableColumns: { field: SortField; label: string; sortable: boolean }[] = [\n { field: 'RunAt', label: 'Timestamp', sortable: true },\n { field: 'Prompt', label: 'Prompt', sortable: true },\n { field: 'Model', label: 'Model', sortable: true },\n { field: 'Status', label: 'Status', sortable: true },\n { field: 'ExecutionTimeMS', label: 'Duration', sortable: true },\n { field: 'TokensUsed', label: 'Tokens', sortable: true },\n { field: 'Cost', label: 'Cost', sortable: true },\n ];\n\n // ── Lifecycle ──\n\n async ngOnInit(): Promise<void> {\n this.isInitialized = true;\n await this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Computed Properties ──\n\n get FilteredRuns(): PromptRunRecord[] {\n return this.applyFilters(this.allRuns);\n }\n\n get Stats(): PromptRunStats {\n return this.computeStats(this.FilteredRuns);\n }\n\n get ChartBuckets(): ChartBucket[] {\n return this.computeChartBuckets(this.FilteredRuns);\n }\n\n get ModelBreakdown(): BreakdownItem[] {\n return this.computeBreakdown(this.FilteredRuns, 'Model', 'ModelID');\n }\n\n get PromptBreakdown(): BreakdownItem[] {\n return this.computeBreakdown(this.FilteredRuns, 'Prompt', 'PromptID');\n }\n\n get StatusBreakdown(): StatusBreakdownItem[] {\n return this.computeStatusBreakdown(this.FilteredRuns);\n }\n\n get PagedRuns(): PromptRunRecord[] {\n const sorted = this.sortRuns(this.FilteredRuns);\n const start = (this.CurrentPage - 1) * PAGE_SIZE;\n return sorted.slice(start, start + PAGE_SIZE);\n }\n\n get TotalPages(): number {\n return Math.max(1, Math.ceil(this.FilteredRuns.length / PAGE_SIZE));\n }\n\n // ── Event Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.TimeRangeChange.emit(range);\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = filters;\n this.FiltersChange.emit(filters);\n }\n\n public OnChartMetricChange(metric: ChartMetric): void {\n this.ActiveChartMetric = metric;\n this.cdr.detectChanges();\n }\n\n public OnChartBucketClick(_bucket: ChartBucket): void {\n // Future: drill into time range\n }\n\n public OnSortChange(field: SortField): void {\n if (this.SortField === field) {\n this.SortDirection = this.SortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortField = field;\n this.SortDirection = 'desc';\n }\n this.resetPagination();\n this.cdr.detectChanges();\n }\n\n public OnPageChange(page: number): void {\n if (page >= 1 && page <= this.TotalPages) {\n this.CurrentPage = page;\n this.cdr.detectChanges();\n }\n }\n\n public ApplyModelFilter(modelId: string): void {\n this.Filters = { ...this.Filters, Models: [modelId] };\n this.FiltersChange.emit(this.Filters);\n }\n\n public ApplyPromptFilter(promptId: string): void {\n this.Filters = { ...this.Filters, Prompts: [promptId] };\n this.FiltersChange.emit(this.Filters);\n }\n\n public ApplyStatusFilter(status: string): void {\n this.Filters = { ...this.Filters, Statuses: [status] };\n this.FiltersChange.emit(this.Filters);\n }\n\n public ExportCSV(): void {\n const headers = ['Timestamp', 'Prompt', 'Model', 'Status', 'Duration(ms)', 'Tokens', 'Cost'];\n const rows = this.FilteredRuns.map(r => [\n DateCellIso(r.RunAt),\n r.Prompt ?? '',\n r.Model ?? '',\n r.Status,\n r.ExecutionTimeMS?.toString() ?? '',\n this.TrueTotalTokens(r).toString(),\n r.Cost?.toString() ?? ''\n ]);\n const csv = [headers, ...rows].map(r => r.join(',')).join('\\n');\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = `prompt-runs-${new Date().toISOString().slice(0, 10)}.csv`;\n anchor.click();\n URL.revokeObjectURL(url);\n }\n\n // ── Formatting Helpers ──\n\n public FormatCurrency(value: number | null, decimals: number): string {\n if (value == null || isNaN(value)) return '$0.00';\n return '$' + value.toFixed(decimals);\n }\n\n public FormatTimestamp(dateStr: Date | string): string {\n const d = new Date(dateStr);\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' }) +\n ' ' + d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n }\n\n public FormatDuration(ms: number | null): string {\n if (ms == null) return '-';\n if (ms < 1000) return ms + 'ms';\n return (ms / 1000).toFixed(2) + 's';\n }\n\n public FormatChartValue(value: number): string {\n if (this.ActiveChartMetric === 'cost') {\n return '$' + value.toFixed(2);\n }\n if (this.ActiveChartMetric === 'cacheHit') {\n return value.toFixed(0) + '%';\n }\n if (value >= 1000) {\n return (value / 1000).toFixed(1) + 'k';\n }\n return value.toFixed(0);\n }\n\n public GetStatusClass(status: string): string {\n const key = status.toLowerCase();\n return 'pill-' + key;\n }\n\n // ── Data Loading ──\n\n public async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const cutoff = this.getTimeRangeCutoff(this._timeRange);\n const filter = cutoff ? `RunAt >= '${cutoff.toISOString()}'` : '';\n\n const result = await rv.RunView<PromptRunRecord>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: filter,\n OrderBy: 'RunAt DESC',\n Fields: FIELDS,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.allRuns = result.Results;\n } else {\n this.allRuns = [];\n }\n } catch {\n this.allRuns = [];\n }\n\n this.resetPagination();\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n\n // ── Private Helpers ──\n\n private applyFilters(runs: PromptRunRecord[]): PromptRunRecord[] {\n let filtered = runs;\n\n if (this._filters.Models.length > 0) {\n filtered = filtered.filter(r => r.ModelID != null && this._filters.Models.includes(r.ModelID));\n }\n if (this._filters.Agents.length > 0) {\n filtered = filtered.filter(r => r.AgentID != null && this._filters.Agents.includes(r.AgentID));\n }\n if (this._filters.Prompts.length > 0) {\n filtered = filtered.filter(r => r.PromptID != null && this._filters.Prompts.includes(r.PromptID));\n }\n if (this._filters.Statuses.length > 0) {\n filtered = filtered.filter(r => this._filters.Statuses.includes(r.Status));\n }\n\n return filtered;\n }\n\n /**\n * Total tokens the model processed for a run, INCLUDING cached input. TokensUsed excludes the\n * cache buckets by design, so a heavily-cached run looks tiny; this is the true throughput.\n */\n public TrueTotalTokens(run: PromptRunRecord): number {\n return (run.TokensUsed ?? 0) + (run.TokensCacheRead ?? 0) + (run.TokensCacheWrite ?? 0);\n }\n\n private computeStats(runs: PromptRunRecord[]): PromptRunStats {\n const total = runs.length;\n if (total === 0) {\n return { TotalRuns: 0, AvgCost: 0, AvgTokens: 0, AvgLatencySeconds: 0, SuccessRate: 0, P95LatencySeconds: 0, TotalCost: 0, CacheHitRate: 0 };\n }\n\n const totalCost = this.sumNullable(runs, r => r.Cost);\n const totalTokens = runs.reduce((sum, r) => sum + this.TrueTotalTokens(r), 0);\n const latencies = this.collectNonNull(runs, r => r.ExecutionTimeMS);\n const avgLatencyMs = latencies.length > 0 ? latencies.reduce((a, b) => a + b, 0) / latencies.length : 0;\n const successCount = runs.filter(r => r.Status === 'Completed').length;\n const p95 = this.percentile(latencies, 95);\n const cacheHit = cacheHitRate({\n uncachedInputTokens: this.sumNullable(runs, r => r.TokensPrompt),\n cacheReadTokens: this.sumNullable(runs, r => r.TokensCacheRead),\n cacheWriteTokens: this.sumNullable(runs, r => r.TokensCacheWrite)\n });\n\n return {\n TotalRuns: total,\n AvgCost: totalCost / total,\n AvgTokens: totalTokens / total,\n AvgLatencySeconds: avgLatencyMs / 1000,\n SuccessRate: (successCount / total) * 100,\n P95LatencySeconds: p95 / 1000,\n TotalCost: totalCost,\n CacheHitRate: cacheHit,\n };\n }\n\n private computeChartBuckets(runs: PromptRunRecord[]): ChartBucket[] {\n if (runs.length === 0) return [];\n\n const bucketCount = this.getBucketCount();\n const cutoff = this.getTimeRangeCutoff(this._timeRange) ?? new Date(runs[runs.length - 1].RunAt);\n const now = new Date();\n const rangeMs = now.getTime() - cutoff.getTime();\n const bucketMs = rangeMs / bucketCount;\n\n const buckets: { label: string; total: number; cacheRead: number; inputForHit: number; start: Date; end: Date }[] = [];\n for (let i = 0; i < bucketCount; i++) {\n const start = new Date(cutoff.getTime() + i * bucketMs);\n const end = new Date(cutoff.getTime() + (i + 1) * bucketMs);\n buckets.push({\n label: this.formatBucketLabel(start),\n total: 0,\n cacheRead: 0,\n inputForHit: 0,\n start,\n end,\n });\n }\n\n for (const run of runs) {\n const runTime = new Date(run.RunAt).getTime();\n const idx = Math.min(Math.floor((runTime - cutoff.getTime()) / bucketMs), bucketCount - 1);\n if (idx >= 0 && idx < bucketCount) {\n buckets[idx].total += this.getChartMetricValue(run);\n // Cache hit-rate is a ratio, not a sum — accumulate the components and divide below.\n buckets[idx].cacheRead += run.TokensCacheRead ?? 0;\n buckets[idx].inputForHit += (run.TokensPrompt ?? 0) + (run.TokensCacheRead ?? 0) + (run.TokensCacheWrite ?? 0);\n }\n }\n\n if (this.ActiveChartMetric === 'cacheHit') {\n for (const b of buckets) {\n b.total = b.inputForHit > 0 ? (b.cacheRead / b.inputForHit) * 100 : 0;\n }\n }\n\n const max = Math.max(...buckets.map(b => b.total), 1);\n\n return buckets.map(b => ({\n label: b.label,\n value: Math.round(b.total * 100) / 100,\n heightPercent: Math.max((b.total / max) * 100, 1),\n startTime: b.start,\n endTime: b.end,\n }));\n }\n\n private getChartMetricValue(run: PromptRunRecord): number {\n switch (this.ActiveChartMetric) {\n case 'cost': return run.Cost ?? 0;\n case 'tokens': return this.TrueTotalTokens(run);\n default: return 1; // volume = count\n }\n }\n\n private computeBreakdown(runs: PromptRunRecord[], nameKey: 'Model' | 'Prompt', idKey: 'ModelID' | 'PromptID'): BreakdownItem[] {\n const counts = new Map<string, { name: string; count: number }>();\n for (const run of runs) {\n const id = run[idKey];\n const name = run[nameKey];\n if (id != null && name != null) {\n const existing = counts.get(id);\n if (existing) {\n existing.count++;\n } else {\n counts.set(id, { name, count: 1 });\n }\n }\n }\n\n const sorted = Array.from(counts.entries())\n .sort((a, b) => b[1].count - a[1].count)\n .slice(0, 4);\n\n const maxCount = sorted.length > 0 ? sorted[0][1].count : 1;\n\n return sorted.map(([id, data]) => ({\n id,\n name: data.name,\n count: data.count,\n percentage: (data.count / maxCount) * 100,\n }));\n }\n\n private computeStatusBreakdown(runs: PromptRunRecord[]): StatusBreakdownItem[] {\n const total = runs.length;\n if (total === 0) return [];\n\n const counts = new Map<string, number>();\n for (const run of runs) {\n counts.set(run.Status, (counts.get(run.Status) ?? 0) + 1);\n }\n\n return Array.from(counts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([status, count]) => ({\n id: status,\n name: status,\n count,\n percentage: (count / total) * 100,\n cssClass: 'dot-' + status.toLowerCase(),\n }));\n }\n\n private sortRuns(runs: PromptRunRecord[]): PromptRunRecord[] {\n const dir = this.SortDirection === 'asc' ? 1 : -1;\n return [...runs].sort((a, b) => {\n const aVal = a[this.SortField];\n const bVal = b[this.SortField];\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return 1;\n if (bVal == null) return -1;\n // Date cells (RunAt/CompletedAt arrive as real Dates from simple reads) must sort\n // chronologically — String(Date).localeCompare orders by weekday name.\n if (aVal instanceof Date || bVal instanceof Date) {\n return CompareDateCells(aVal as Date | string, bVal as Date | string) * dir;\n }\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n return aVal.localeCompare(bVal) * dir;\n }\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return (aVal - bVal) * dir;\n }\n return String(aVal).localeCompare(String(bVal)) * dir;\n });\n }\n\n private getTimeRangeCutoff(range: string): Date | null {\n const now = new Date();\n switch (range) {\n case '1h': return new Date(now.getTime() - 60 * 60 * 1000);\n case '6h': return new Date(now.getTime() - 6 * 60 * 60 * 1000);\n case '24h': return new Date(now.getTime() - 24 * 60 * 60 * 1000);\n case '7d': return new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n case '30d': return new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n default: return null;\n }\n }\n\n private getBucketCount(): number {\n switch (this._timeRange) {\n case '1h': return 12; // 5-min buckets\n case '6h': return 12; // 30-min buckets\n case '24h': return 24; // 1-hour buckets\n case '7d': return 14; // 12-hour buckets\n case '30d': return 30; // 1-day buckets\n default: return 24;\n }\n }\n\n private formatBucketLabel(date: Date): string {\n switch (this._timeRange) {\n case '1h':\n case '6h':\n return date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n case '24h':\n return date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n case '7d':\n case '30d':\n return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n default:\n return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n }\n }\n\n private sumNullable(runs: PromptRunRecord[], getter: (r: PromptRunRecord) => number | null): number {\n return runs.reduce((sum, r) => sum + (getter(r) ?? 0), 0);\n }\n\n private collectNonNull(runs: PromptRunRecord[], getter: (r: PromptRunRecord) => number | null): number[] {\n const result: number[] = [];\n for (const r of runs) {\n const val = getter(r);\n if (val != null) {\n result.push(val);\n }\n }\n return result;\n }\n\n private percentile(values: number[], pct: number): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.ceil((pct / 100) * sorted.length) - 1;\n return sorted[Math.max(0, index)];\n }\n\n private resetPagination(): void {\n this.CurrentPage = 1;\n }\n}\n\nexport function LoadAnalyticsPromptRuns(): void {\n // Prevents tree-shaking of the component\n}\n"]}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { OnDestroy, AfterViewInit } from '@angular/core';
|
|
10
10
|
import { Subject } from 'rxjs';
|
|
11
11
|
import { CompositeKey } from '@memberjunction/core';
|
|
12
|
-
import { ResourceData,
|
|
12
|
+
import { ResourceData, MJScheduledJobEntity } from '@memberjunction/core-entities';
|
|
13
13
|
import { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';
|
|
14
14
|
import { MJLeftNavItem, MJLeftNavSection } from '@memberjunction/ng-ui-components';
|
|
15
15
|
import { TabName, NavItem, KPIMetric, PipelineStageInfo, FeedItem, SourceMini, SourceCard, ContentTypeCard, TagCloudItem, ContentDuplicateRow, RunDetailRow, ContentItemDetail } from './shared/classify.types';
|
|
@@ -111,8 +111,8 @@ export declare class AutotaggingPipelineResourceComponent extends BaseResourceCo
|
|
|
111
111
|
/** Live reference to the slide-in CRUD form dialog (driven from tab events). */
|
|
112
112
|
private formDialog?;
|
|
113
113
|
private setupWizard?;
|
|
114
|
-
/** Cached
|
|
115
|
-
private
|
|
114
|
+
/** Cached Scheduled Job entities, keyed by normalized ID */
|
|
115
|
+
private scheduledJobsCache;
|
|
116
116
|
SelectedFeedItem: ContentItemDetail | null;
|
|
117
117
|
ShowItemDetail: boolean;
|
|
118
118
|
/** ID of the content item shown in the drilldown slide-in, or null when closed. */
|
|
@@ -142,8 +142,8 @@ export declare class AutotaggingPipelineResourceComponent extends BaseResourceCo
|
|
|
142
142
|
get TotalContentTagCount(): number;
|
|
143
143
|
/** Exposes the accurate total run-history count to the Run History tab via `[TotalRunCount]`. */
|
|
144
144
|
get TotalRunHistoryCount(): number;
|
|
145
|
-
/** Exposes the cached
|
|
146
|
-
get
|
|
145
|
+
/** Exposes the cached Scheduled Job entities to the Sources tab via `[ScheduledJobs]`. */
|
|
146
|
+
get ScheduledJobsCache(): Map<string, MJScheduledJobEntity>;
|
|
147
147
|
/** Exposes the EntityRecordDocument ID→RecordID cache to the Sources tab via `[EntityRecordDocCache]`. */
|
|
148
148
|
get EntityRecordDocCacheMap(): Map<string, string>;
|
|
149
149
|
/**
|
|
@@ -363,10 +363,10 @@ export declare class AutotaggingPipelineResourceComponent extends BaseResourceCo
|
|
|
363
363
|
key: CompositeKey;
|
|
364
364
|
}): Promise<void>;
|
|
365
365
|
/**
|
|
366
|
-
* Loads
|
|
366
|
+
* Loads Scheduled Job entities referenced by content sources into the local cache.
|
|
367
367
|
* Called during initial data load so cron descriptions are available for card rendering.
|
|
368
368
|
*/
|
|
369
|
-
private
|
|
369
|
+
private loadScheduledJobsForSources;
|
|
370
370
|
/**
|
|
371
371
|
* Run the pipeline for a specific content source only.
|
|
372
372
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autotagging-pipeline-resource.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/autotagging/autotagging-pipeline-resource.component.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAgC,SAAS,EAAE,aAAa,EAAwC,MAAM,eAAe,CAAC;AAC7H,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAA+B,YAAY,EAAW,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,YAAY,EAA8B,
|
|
1
|
+
{"version":3,"file":"autotagging-pipeline-resource.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/autotagging/autotagging-pipeline-resource.component.ts"],"names":[],"mappings":"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"}
|