@memberjunction/ng-artifacts 6.2.0-edge.0 → 6.2.0-edge.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/lib/components/artifact-message-card.component.d.ts +60 -8
  2. package/dist/lib/components/artifact-message-card.component.d.ts.map +1 -1
  3. package/dist/lib/components/artifact-message-card.component.js +135 -39
  4. package/dist/lib/components/artifact-message-card.component.js.map +1 -1
  5. package/dist/lib/components/artifact-type-plugin-viewer.component.d.ts +58 -6
  6. package/dist/lib/components/artifact-type-plugin-viewer.component.d.ts.map +1 -1
  7. package/dist/lib/components/artifact-type-plugin-viewer.component.js +107 -29
  8. package/dist/lib/components/artifact-type-plugin-viewer.component.js.map +1 -1
  9. package/dist/lib/components/artifact-version-download.d.ts +5 -3
  10. package/dist/lib/components/artifact-version-download.d.ts.map +1 -1
  11. package/dist/lib/components/artifact-version-download.js +11 -7
  12. package/dist/lib/components/artifact-version-download.js.map +1 -1
  13. package/dist/lib/components/artifact-version-history.component.d.ts +74 -8
  14. package/dist/lib/components/artifact-version-history.component.d.ts.map +1 -1
  15. package/dist/lib/components/artifact-version-history.component.js +152 -34
  16. package/dist/lib/components/artifact-version-history.component.js.map +1 -1
  17. package/dist/lib/components/artifact-viewer-panel.component.d.ts +328 -35
  18. package/dist/lib/components/artifact-viewer-panel.component.d.ts.map +1 -1
  19. package/dist/lib/components/artifact-viewer-panel.component.js +701 -213
  20. package/dist/lib/components/artifact-viewer-panel.component.js.map +1 -1
  21. package/dist/lib/components/file-artifact-toolbar.component.d.ts +112 -10
  22. package/dist/lib/components/file-artifact-toolbar.component.d.ts.map +1 -1
  23. package/dist/lib/components/file-artifact-toolbar.component.js +197 -23
  24. package/dist/lib/components/file-artifact-toolbar.component.js.map +1 -1
  25. package/dist/lib/components/plugins/audio-artifact-viewer.component.d.ts +9 -1
  26. package/dist/lib/components/plugins/audio-artifact-viewer.component.d.ts.map +1 -1
  27. package/dist/lib/components/plugins/audio-artifact-viewer.component.js +20 -4
  28. package/dist/lib/components/plugins/audio-artifact-viewer.component.js.map +1 -1
  29. package/dist/lib/components/plugins/code-artifact-viewer.component.d.ts +23 -5
  30. package/dist/lib/components/plugins/code-artifact-viewer.component.d.ts.map +1 -1
  31. package/dist/lib/components/plugins/code-artifact-viewer.component.js +69 -31
  32. package/dist/lib/components/plugins/code-artifact-viewer.component.js.map +1 -1
  33. package/dist/lib/components/plugins/component-artifact-viewer.component.d.ts +136 -18
  34. package/dist/lib/components/plugins/component-artifact-viewer.component.d.ts.map +1 -1
  35. package/dist/lib/components/plugins/component-artifact-viewer.component.js +285 -97
  36. package/dist/lib/components/plugins/component-artifact-viewer.component.js.map +1 -1
  37. package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.d.ts +2 -2
  38. package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.js +7 -7
  39. package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.js.map +1 -1
  40. package/dist/lib/components/plugins/component-permission-evaluation.d.ts +2 -0
  41. package/dist/lib/components/plugins/component-permission-evaluation.d.ts.map +1 -1
  42. package/dist/lib/components/plugins/component-permission-evaluation.js +6 -2
  43. package/dist/lib/components/plugins/component-permission-evaluation.js.map +1 -1
  44. package/dist/lib/components/plugins/data-artifact-viewer.component.d.ts +17 -6
  45. package/dist/lib/components/plugins/data-artifact-viewer.component.d.ts.map +1 -1
  46. package/dist/lib/components/plugins/data-artifact-viewer.component.js +32 -22
  47. package/dist/lib/components/plugins/data-artifact-viewer.component.js.map +1 -1
  48. package/dist/lib/components/plugins/data-requirements-viewer/data-requirements-viewer.component.d.ts +56 -4
  49. package/dist/lib/components/plugins/data-requirements-viewer/data-requirements-viewer.component.d.ts.map +1 -1
  50. package/dist/lib/components/plugins/data-requirements-viewer/data-requirements-viewer.component.js +142 -36
  51. package/dist/lib/components/plugins/data-requirements-viewer/data-requirements-viewer.component.js.map +1 -1
  52. package/dist/lib/components/plugins/docx-artifact-viewer.component.d.ts +14 -2
  53. package/dist/lib/components/plugins/docx-artifact-viewer.component.d.ts.map +1 -1
  54. package/dist/lib/components/plugins/docx-artifact-viewer.component.js +32 -8
  55. package/dist/lib/components/plugins/docx-artifact-viewer.component.js.map +1 -1
  56. package/dist/lib/components/plugins/html-artifact-viewer.component.d.ts +17 -3
  57. package/dist/lib/components/plugins/html-artifact-viewer.component.d.ts.map +1 -1
  58. package/dist/lib/components/plugins/html-artifact-viewer.component.js +36 -8
  59. package/dist/lib/components/plugins/html-artifact-viewer.component.js.map +1 -1
  60. package/dist/lib/components/plugins/image-artifact-viewer.component.d.ts +41 -5
  61. package/dist/lib/components/plugins/image-artifact-viewer.component.d.ts.map +1 -1
  62. package/dist/lib/components/plugins/image-artifact-viewer.component.js +102 -30
  63. package/dist/lib/components/plugins/image-artifact-viewer.component.js.map +1 -1
  64. package/dist/lib/components/plugins/json-artifact-viewer.component.d.ts +33 -5
  65. package/dist/lib/components/plugins/json-artifact-viewer.component.d.ts.map +1 -1
  66. package/dist/lib/components/plugins/json-artifact-viewer.component.js +89 -33
  67. package/dist/lib/components/plugins/json-artifact-viewer.component.js.map +1 -1
  68. package/dist/lib/components/plugins/markdown-artifact-viewer.component.d.ts +12 -2
  69. package/dist/lib/components/plugins/markdown-artifact-viewer.component.d.ts.map +1 -1
  70. package/dist/lib/components/plugins/markdown-artifact-viewer.component.js +28 -8
  71. package/dist/lib/components/plugins/markdown-artifact-viewer.component.js.map +1 -1
  72. package/dist/lib/components/plugins/ml-experiment-results-viewer.component.d.ts +4 -0
  73. package/dist/lib/components/plugins/ml-experiment-results-viewer.component.d.ts.map +1 -1
  74. package/dist/lib/components/plugins/ml-experiment-results-viewer.component.js +14 -6
  75. package/dist/lib/components/plugins/ml-experiment-results-viewer.component.js.map +1 -1
  76. package/dist/lib/components/plugins/pdf-artifact-viewer.component.d.ts +47 -5
  77. package/dist/lib/components/plugins/pdf-artifact-viewer.component.d.ts.map +1 -1
  78. package/dist/lib/components/plugins/pdf-artifact-viewer.component.js +129 -45
  79. package/dist/lib/components/plugins/pdf-artifact-viewer.component.js.map +1 -1
  80. package/dist/lib/components/plugins/save-query-dialog.component.d.ts +5 -1
  81. package/dist/lib/components/plugins/save-query-dialog.component.d.ts.map +1 -1
  82. package/dist/lib/components/plugins/save-query-dialog.component.js +12 -4
  83. package/dist/lib/components/plugins/save-query-dialog.component.js.map +1 -1
  84. package/dist/lib/components/plugins/svg-artifact-viewer.component.d.ts +17 -3
  85. package/dist/lib/components/plugins/svg-artifact-viewer.component.d.ts.map +1 -1
  86. package/dist/lib/components/plugins/svg-artifact-viewer.component.js +36 -8
  87. package/dist/lib/components/plugins/svg-artifact-viewer.component.js.map +1 -1
  88. package/dist/lib/components/plugins/video-artifact-viewer.component.d.ts +9 -1
  89. package/dist/lib/components/plugins/video-artifact-viewer.component.d.ts.map +1 -1
  90. package/dist/lib/components/plugins/video-artifact-viewer.component.js +20 -4
  91. package/dist/lib/components/plugins/video-artifact-viewer.component.js.map +1 -1
  92. package/dist/lib/components/plugins/xlsx-artifact-viewer.component.d.ts +28 -4
  93. package/dist/lib/components/plugins/xlsx-artifact-viewer.component.d.ts.map +1 -1
  94. package/dist/lib/components/plugins/xlsx-artifact-viewer.component.js +64 -16
  95. package/dist/lib/components/plugins/xlsx-artifact-viewer.component.js.map +1 -1
  96. package/dist/lib/components/previews/audio-artifact-preview.component.d.ts +9 -1
  97. package/dist/lib/components/previews/audio-artifact-preview.component.d.ts.map +1 -1
  98. package/dist/lib/components/previews/audio-artifact-preview.component.js +20 -4
  99. package/dist/lib/components/previews/audio-artifact-preview.component.js.map +1 -1
  100. package/dist/lib/components/previews/image-artifact-preview.component.d.ts +16 -2
  101. package/dist/lib/components/previews/image-artifact-preview.component.d.ts.map +1 -1
  102. package/dist/lib/components/previews/image-artifact-preview.component.js +35 -7
  103. package/dist/lib/components/previews/image-artifact-preview.component.js.map +1 -1
  104. package/dist/lib/components/previews/video-artifact-preview.component.d.ts +9 -1
  105. package/dist/lib/components/previews/video-artifact-preview.component.d.ts.map +1 -1
  106. package/dist/lib/components/previews/video-artifact-preview.component.js +20 -4
  107. package/dist/lib/components/previews/video-artifact-preview.component.js.map +1 -1
  108. package/dist/lib/interfaces/artifact-viewer-plugin.interface.js.map +1 -1
  109. package/dist/lib/services/artifact-file.service.d.ts +8 -0
  110. package/dist/lib/services/artifact-file.service.d.ts.map +1 -1
  111. package/dist/lib/services/artifact-file.service.js +22 -6
  112. package/dist/lib/services/artifact-file.service.js.map +1 -1
  113. package/dist/lib/services/artifact-icon.service.d.ts +2 -0
  114. package/dist/lib/services/artifact-icon.service.d.ts.map +1 -1
  115. package/dist/lib/services/artifact-icon.service.js +5 -1
  116. package/dist/lib/services/artifact-icon.service.js.map +1 -1
  117. package/dist/lib/services/artifact-preview-resolver.service.d.ts +2 -0
  118. package/dist/lib/services/artifact-preview-resolver.service.d.ts.map +1 -1
  119. package/dist/lib/services/artifact-preview-resolver.service.js +5 -1
  120. package/dist/lib/services/artifact-preview-resolver.service.js.map +1 -1
  121. package/dist/lib/snapshot-helpers.d.ts +10 -0
  122. package/dist/lib/snapshot-helpers.d.ts.map +1 -1
  123. package/dist/lib/snapshot-helpers.js +25 -5
  124. package/dist/lib/snapshot-helpers.js.map +1 -1
  125. package/package.json +21 -21
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import { Component, ChangeDetectorRef, Output, EventEmitter, inject } from '@angular/core';
8
8
  import { RegisterClass } from '@memberjunction/global';
9
9
  import { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';
10
- import { createMarkdownSnapshot } from '../../snapshot-helpers';
10
+ import { CreateMarkdownSnapshot } from '../../snapshot-helpers';
11
11
  import * as i0 from "@angular/core";
12
12
  import * as i1 from "@angular/common";
13
13
  import * as i2 from "@memberjunction/ng-shared-generic";
@@ -419,7 +419,7 @@ let MLExperimentResultsViewerComponent = class MLExperimentResultsViewerComponen
419
419
  }
420
420
  GetCurrentStateSnapshot() {
421
421
  // The richest portable representation is the agent-authored markdown report.
422
- return createMarkdownSnapshot(this.WinningMarkdown ?? this.getRawContent(), this.getDisplayTitle());
422
+ return CreateMarkdownSnapshot(this.WinningMarkdown ?? this.getRawContent(), this.getDisplayTitle());
423
423
  }
424
424
  /**
425
425
  * Expose the agent-authored markdown report as an additional "Report" tab
@@ -456,7 +456,7 @@ let MLExperimentResultsViewerComponent = class MLExperimentResultsViewerComponen
456
456
  /** Headline best score (the winning row's primary score), formatted. */
457
457
  get HeadlineScore() {
458
458
  const score = this.WinningRow?.score;
459
- return score != null ? this.formatScore(score) : null;
459
+ return score != null ? this.FormatScore(score) : null;
460
460
  }
461
461
  get WinningAlgorithm() {
462
462
  return this.Spec?.BestModel?.Name ?? this.Spec?.report?.bestModelName ?? this.WinningRow?.algorithm ?? 'Winning model';
@@ -481,7 +481,7 @@ let MLExperimentResultsViewerComponent = class MLExperimentResultsViewerComponen
481
481
  // Synthesize a single metric from the headline score when nothing explicit was provided.
482
482
  const row = this.WinningRow;
483
483
  if (row?.score != null) {
484
- return [{ label: this.firstMetricName() ?? 'Score', value: this.formatScore(row.score) }];
484
+ return [{ label: this.firstMetricName() ?? 'Score', value: this.FormatScore(row.score) }];
485
485
  }
486
486
  return [];
487
487
  }
@@ -589,7 +589,7 @@ let MLExperimentResultsViewerComponent = class MLExperimentResultsViewerComponen
589
589
  return typeof value === 'number' && Number.isFinite(value) ? value : null;
590
590
  }
591
591
  /** Format a numeric score for display (3 decimals, trimmed). */
592
- formatScore(value) {
592
+ FormatScore(value) {
593
593
  if (value == null) {
594
594
  return '—';
595
595
  }
@@ -597,14 +597,22 @@ let MLExperimentResultsViewerComponent = class MLExperimentResultsViewerComponen
597
597
  const decimals = Math.abs(value) < 1 ? 3 : 2;
598
598
  return value.toFixed(decimals);
599
599
  }
600
+ /** @deprecated Use {@link FormatScore}. */
601
+ formatScore(value) {
602
+ return this.FormatScore(value);
603
+ }
600
604
  /** Format an importance weight for the small bar label. */
601
- formatImportance(value) {
605
+ FormatImportance(value) {
602
606
  if (!Number.isFinite(value)) {
603
607
  return '';
604
608
  }
605
609
  // Show .31 style for sub-1 weights, otherwise 2 decimals.
606
610
  return Math.abs(value) < 1 ? value.toFixed(2).replace(/^0/, '') : value.toFixed(2);
607
611
  }
612
+ /** @deprecated Use {@link FormatImportance}. */
613
+ formatImportance(value) {
614
+ return this.FormatImportance(value);
615
+ }
608
616
  static ɵfac = /*@__PURE__*/ (() => { let ɵMLExperimentResultsViewerComponent_BaseFactory; return function MLExperimentResultsViewerComponent_Factory(__ngFactoryType__) { return (ɵMLExperimentResultsViewerComponent_BaseFactory || (ɵMLExperimentResultsViewerComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MLExperimentResultsViewerComponent)))(__ngFactoryType__ || MLExperimentResultsViewerComponent); }; })();
609
617
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MLExperimentResultsViewerComponent, selectors: [["mj-ml-experiment-results-viewer"]], outputs: { navigationRequest: "navigationRequest" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 2, consts: [[1, "ml-exp-viewer", 3, "ngClass"], [1, "ml-exp-loading"], [1, "ml-exp-empty"], ["text", "Loading experiment results\u2026", "size", "medium"], [1, "fa-solid", "fa-flask-vial"], [1, "ml-exp-hero"], [1, "hero-badge"], [1, "hero-titles"], [1, "hero-title"], [1, "hero-sub"], [1, "hero-metric"], [1, "ml-exp-body"], [1, "goalbar"], [1, "goal-item"], [1, "ml-exp-cols"], [1, "col-main"], [1, "section-title"], [1, "lb-card"], [1, "inline-empty"], [1, "col-side"], [1, "winner-card"], [1, "winner-top"], [1, "crown"], [1, "fa-solid", "fa-crown"], [1, "winner-head"], [1, "winner-name"], [1, "muted"], [1, "wmetrics"], ["mjButton", "", "variant", "primary", 1, "drill-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-arrow-up-right-from-square"], [1, "drill-hint", "muted"], [1, "hero-metric-value"], [1, "hero-metric-label"], [1, "goal-key"], [1, "goal-val"], [1, "lb-table"], [1, "lb-rank-col"], [1, "num"], [3, "is-winner", "has-model"], [3, "click"], [1, "rank"], [1, "algo"], ["title", "Open this model", 1, "fa-solid", "fa-arrow-up-right-from-square", "row-link-icon"], [1, "num", "muted"], [1, "fi-card"], [1, "fbar"], [1, "fbar-label", 3, "title"], [1, "fbar-track"], [1, "fbar-fill"], [1, "fbar-num"], [1, "wmetric"], [1, "wmetric-value"], [1, "wmetric-label"]], template: function MLExperimentResultsViewerComponent_Template(rf, ctx) { if (rf & 1) {
610
618
  i0.ɵɵelementStart(0, "div", 0);
@@ -1 +1 @@
1
- {"version":3,"file":"ml-experiment-results-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/ml-experiment-results-viewer.component.ts","../../../../src/lib/components/plugins/ml-experiment-results-viewer.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef, Output, EventEmitter, inject } from '@angular/core';\nimport { DataSnapshot } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseArtifactViewerPluginComponent, ArtifactViewerTab, NavigationRequest } from '../base-artifact-viewer.component';\nimport { createMarkdownSnapshot } from '../../snapshot-helpers';\n\n/**\n * A single feature-importance entry for the winning model.\n */\ninterface MLFeatureImportance {\n /** Display name of the feature */\n feature?: string;\n name?: string;\n /** Importance weight (0..1 or any positive scale — bars are normalized to the max) */\n importance?: number;\n weight?: number;\n value?: number;\n}\n\n/**\n * A single leaderboard iteration row.\n *\n * Accepts both the **canonical** Core `ModelingPlanSpec.Leaderboard` shape\n * (PascalCase: `Metric`/`ModelID`/`IterationID`, produced by the deterministic\n * `ExperimentOrchestrator`) and the older / LLM-authored lowercase shape. All\n * fields are optional so partial artifacts degrade gracefully.\n */\ninterface MLLeaderboardEntry {\n // ── Canonical (Core ModelingPlanSpec.Leaderboard entry) ──\n /** The iteration this entry scores (`MJ: Experiment Session Iterations` id). */\n IterationID?: string;\n /** The normalized leaderboard metric value (the Experiment's TargetMetric). */\n Metric?: number;\n /** The trained ML Model record ID for drill-through. */\n ModelID?: string;\n\n // ── Lowercase / LLM-authored fallbacks + display-only fields ──\n /** Rank (1 = best). If absent, derived from array order. */\n rank?: number;\n /** Algorithm name, e.g. \"XGBoost\" */\n algorithm?: string;\n algorithmName?: string;\n /** Feature set label, e.g. \"engagement\", \"full\", \"interpretable\" */\n featureSet?: string;\n /** Primary normalized leaderboard score (the Experiment's TargetMetric) */\n score?: number;\n /** Optional secondary metric (e.g. cross-validation score) */\n cvScore?: number;\n /** The trained ML Model record ID for drill-through (lowercase fallback) */\n modelId?: string;\n /** Named metric label for the primary score column header */\n metricName?: string;\n}\n\n/**\n * Headline / extra metrics for the winning model card.\n */\ninterface MLWinningMetric {\n label?: string;\n value?: number | string;\n}\n\n/**\n * The reporting-phase block authored by the Model Development Agent.\n */\ninterface MLExperimentReport {\n name?: string;\n summary?: string;\n markdown?: string;\n /** The winning ML Model record ID (drill-through target) */\n bestModelId?: string;\n bestModelName?: string;\n bestModelVersion?: string;\n}\n\n/**\n * The canonical best-model pointer on a `ModelingPlanSpec`-shaped artifact.\n */\ninterface MLBestModel {\n ID?: string;\n Name?: string;\n Version?: string | number;\n}\n\n/**\n * ML Experiment Results artifact content shape.\n *\n * The **canonical** shape is the Core `ModelingPlanSpec` (PascalCase: `Goal`,\n * `Leaderboard`, `BestModel`/`BestModelID`, `Markdown`, …) produced by the\n * deterministic `ExperimentOrchestrator` and the Model Development Agent's\n * reporting phase (content type `application/vnd.mj.ml-experiment-results`).\n *\n * Older / LLM-authored lowercase fields (`goal`, `leaderboard`, `report`, …)\n * are retained as graceful fallbacks. All fields are optional so partial/older\n * artifacts degrade gracefully.\n */\ninterface MLExperimentResultsSpec {\n // ── Canonical (Core ModelingPlanSpec) ──\n /** Display name / title of the session (PascalCase). */\n Name?: string;\n /** The modeling goal, plain language (PascalCase). */\n Goal?: string;\n /** Plain-language summary of the results (PascalCase). */\n Summary?: string;\n /** The full results narrative in markdown (PascalCase). */\n Markdown?: string;\n /** Ranked leaderboard of experiment iterations (PascalCase Core shape). */\n Leaderboard?: MLLeaderboardEntry[];\n /** Feature importance for the winning model (PascalCase). */\n FeatureImportance?: MLFeatureImportance[];\n /** The winning model pointer (PascalCase). */\n BestModel?: MLBestModel;\n /** Convenience scalar pointer to the winning model ID (PascalCase). */\n BestModelID?: string;\n /** The normalized target metric name (PascalCase). */\n TargetMetric?: string;\n\n // ── Lowercase / LLM-authored fallbacks ──\n /** The modeling goal, plain language */\n goal?: string;\n /** Prediction target (e.g. \"Renewed\") */\n target?: string;\n /** As-of cutoff description (leakage guard) */\n asOf?: string;\n /** Validation strategy description */\n validation?: string;\n /** Budget usage description (e.g. \"22 / 25 runs · 58 min\") */\n budgetUsed?: string;\n /** The normalized target metric name (column header / headline label) */\n targetMetric?: string;\n /** Ranked leaderboard of experiment iterations */\n leaderboard?: MLLeaderboardEntry[];\n /** Feature importance for the winning model */\n featureImportance?: MLFeatureImportance[];\n /** Convenience pointer to the winning model ID (also resolvable via report/leaderboard) */\n bestModelId?: string;\n /** Extra headline metrics for the winning-model card */\n winningMetrics?: MLWinningMetric[];\n /** The reporting-phase block (markdown, summary, best model) */\n report?: MLExperimentReport;\n}\n\n/**\n * Normalized leaderboard row for the template (resolves alias fields + derived rank).\n */\ninterface NormalizedLeaderboardRow {\n rank: number;\n algorithm: string;\n featureSet: string;\n score: number | null;\n cvScore: number | null;\n modelId: string | null;\n isWinner: boolean;\n}\n\n/**\n * Normalized feature-importance bar for the template (resolves alias + percent width).\n */\ninterface NormalizedFeatureBar {\n feature: string;\n importance: number;\n /** Width percentage relative to the most important feature (0..100) */\n widthPct: number;\n}\n\n/**\n * Viewer plugin for **ML Experiment Results** artifacts (Predictive Studio).\n *\n * Renders the experiment goal + headline best metric, a ranked leaderboard of\n * iterations, feature-importance bars for the winning model, and a winning-model\n * card with a drill-through button that issues a {@link NavigationRequest} to open\n * the winning `MJ: ML Models` record in Predictive Studio's \"Models\" nav item.\n *\n * Falls back to a friendly empty state when the JSON can't be parsed, and exposes\n * the agent-authored markdown report as an additional \"Report\" tab when present.\n */\n@Component({\n standalone: false,\n selector: 'mj-ml-experiment-results-viewer',\n templateUrl: './ml-experiment-results-viewer.component.html',\n styleUrls: ['./ml-experiment-results-viewer.component.css']\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'MLExperimentResultsViewerPlugin')\nexport class MLExperimentResultsViewerComponent extends BaseArtifactViewerPluginComponent implements OnInit {\n /** Emitted to request app-level navigation (drill-through to the ML Model record). */\n @Output() override navigationRequest = new EventEmitter<NavigationRequest>();\n\n private cdr = inject(ChangeDetectorRef);\n\n /** Parsed artifact content. */\n public Spec: MLExperimentResultsSpec | null = null;\n\n public IsLoading = true;\n public HasError = false;\n public ErrorMessage = '';\n\n /** Normalized, ranked leaderboard rows for rendering. */\n public LeaderboardRows: NormalizedLeaderboardRow[] = [];\n\n /** Normalized feature-importance bars for rendering. */\n public FeatureBars: NormalizedFeatureBar[] = [];\n\n // ─── Lifecycle ───────────────────────────────────────────────────\n\n ngOnInit(): void {\n try {\n this.Spec = this.parseJsonContent<MLExperimentResultsSpec>();\n if (!this.Spec) {\n this.HasError = true;\n this.ErrorMessage = 'Could not parse the ML Experiment Results content as JSON.';\n return;\n }\n\n this.LeaderboardRows = this.buildLeaderboardRows(this.Spec.Leaderboard ?? this.Spec.leaderboard ?? []);\n this.FeatureBars = this.buildFeatureBars(this.Spec.FeatureImportance ?? this.Spec.featureImportance ?? []);\n } catch (error) {\n this.HasError = true;\n this.ErrorMessage = error instanceof Error ? error.message : 'Failed to load experiment results.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ─── Base-class contract ─────────────────────────────────────────\n\n public override get hasDisplayContent(): boolean {\n return this.Spec != null;\n }\n\n public override GetCurrentStateSnapshot(): DataSnapshot | null {\n // The richest portable representation is the agent-authored markdown report.\n return createMarkdownSnapshot(this.WinningMarkdown ?? this.getRawContent(), this.getDisplayTitle());\n }\n\n /**\n * Expose the agent-authored markdown report as an additional \"Report\" tab\n * so users can read the full narrative alongside the rich visual display.\n */\n public GetAdditionalTabs(): ArtifactViewerTab[] {\n const markdown = this.Spec?.Markdown ?? this.Spec?.report?.markdown;\n if (!markdown) {\n return [];\n }\n return [\n {\n label: 'Report',\n icon: 'fa-file-lines',\n contentType: 'markdown',\n content: markdown\n }\n ];\n }\n\n // ─── Display getters ─────────────────────────────────────────────\n\n public get Goal(): string {\n return this.Spec?.Goal ?? this.Spec?.goal ?? this.Spec?.Summary ?? this.Spec?.report?.summary ?? '';\n }\n\n public get Summary(): string {\n return this.Spec?.Summary ?? this.Spec?.report?.summary ?? '';\n }\n\n public get TargetMetricLabel(): string {\n return this.Spec?.TargetMetric ?? this.Spec?.targetMetric ?? this.firstMetricName() ?? 'Score';\n }\n\n /** The winning row (rank 1) if any. */\n public get WinningRow(): NormalizedLeaderboardRow | null {\n return this.LeaderboardRows.find(r => r.isWinner) ?? this.LeaderboardRows[0] ?? null;\n }\n\n /** Headline best score (the winning row's primary score), formatted. */\n public get HeadlineScore(): string | null {\n const score = this.WinningRow?.score;\n return score != null ? this.formatScore(score) : null;\n }\n\n public get WinningAlgorithm(): string {\n return this.Spec?.BestModel?.Name ?? this.Spec?.report?.bestModelName ?? this.WinningRow?.algorithm ?? 'Winning model';\n }\n\n public get WinningModelSubtitle(): string {\n const parts: string[] = [];\n if (this.WinningRow?.featureSet) {\n parts.push(this.WinningRow.featureSet);\n }\n const version = this.Spec?.BestModel?.Version ?? this.Spec?.report?.bestModelVersion;\n if (version != null && `${version}`.trim()) {\n parts.push(`${version}`);\n }\n return parts.join(' · ');\n }\n\n /** Extra headline metrics for the winning-model card. */\n public get WinningMetrics(): MLWinningMetric[] {\n const provided = this.Spec?.winningMetrics ?? [];\n if (provided.length > 0) {\n return provided;\n }\n // Synthesize a single metric from the headline score when nothing explicit was provided.\n const row = this.WinningRow;\n if (row?.score != null) {\n return [{ label: this.firstMetricName() ?? 'Score', value: this.formatScore(row.score) }];\n }\n return [];\n }\n\n public get WinningMarkdown(): string | null {\n return this.Spec?.Markdown ?? this.Spec?.report?.markdown ?? null;\n }\n\n /** Whether we have a resolvable model ID to drill through to. */\n public get HasDrillThroughTarget(): boolean {\n return this.resolveBestModelId() != null;\n }\n\n public get LeaderboardSize(): number {\n return this.LeaderboardRows.length;\n }\n\n // ─── Actions ─────────────────────────────────────────────────────\n\n /**\n * Drill through to the winning ML Model record in Predictive Studio.\n * Matches the §9.4 contract: NavigationRequest to the 'Models' nav item.\n */\n public OnDrillThroughToModel(): void {\n const modelId = this.resolveBestModelId();\n if (!modelId) {\n return;\n }\n this.navigationRequest.emit({\n appName: 'Predictive Studio',\n navItemName: 'Models',\n queryParams: { modelId }\n });\n }\n\n /**\n * Drill through to a specific leaderboard row's model, when that row carries a modelId.\n */\n public OnOpenRowModel(row: NormalizedLeaderboardRow): void {\n if (!row.modelId) {\n return;\n }\n this.navigationRequest.emit({\n appName: 'Predictive Studio',\n navItemName: 'Models',\n queryParams: { modelId: row.modelId }\n });\n }\n\n // ─── Helpers ─────────────────────────────────────────────────────\n\n /**\n * Resolve the winning model ID. Priority (canonical PascalCase first):\n * BestModel.ID → BestModelID → report block → lowercase field → top leaderboard row.\n */\n private resolveBestModelId(): string | null {\n return this.Spec?.BestModel?.ID\n ?? this.Spec?.BestModelID\n ?? this.Spec?.report?.bestModelId\n ?? this.Spec?.bestModelId\n ?? this.WinningRow?.modelId\n ?? null;\n }\n\n /** Build normalized, ranked leaderboard rows from raw entries. */\n private buildLeaderboardRows(entries: MLLeaderboardEntry[]): NormalizedLeaderboardRow[] {\n if (!Array.isArray(entries) || entries.length === 0) {\n return [];\n }\n\n const rows = entries.map((e, index) => ({\n // Canonical `Leaderboard` is already best-first; derive rank from order.\n rank: e.rank ?? index + 1,\n algorithm: e.algorithm ?? e.algorithmName ?? 'Unknown',\n featureSet: e.featureSet ?? '',\n // Canonical: `Metric`; fallback: lowercase `score`.\n score: this.firstDefined(e.Metric ?? e.score),\n cvScore: this.firstDefined(e.cvScore),\n // Canonical: `ModelID`; fallback: lowercase `modelId`.\n modelId: e.ModelID ?? e.modelId ?? null,\n isWinner: false\n }));\n\n // Sort by explicit rank ascending (rank 1 is best).\n rows.sort((a, b) => a.rank - b.rank);\n if (rows.length > 0) {\n rows[0].isWinner = true;\n }\n return rows;\n }\n\n /** Build normalized feature-importance bars (widths relative to the max). */\n private buildFeatureBars(entries: MLFeatureImportance[]): NormalizedFeatureBar[] {\n if (!Array.isArray(entries) || entries.length === 0) {\n return [];\n }\n\n const resolved = entries.map(e => ({\n feature: e.feature ?? e.name ?? 'Feature',\n importance: this.firstDefined(e.importance ?? e.weight ?? e.value) ?? 0\n }));\n\n const max = resolved.reduce((m, r) => Math.max(m, r.importance), 0);\n // Sort descending by importance for a clean ranked bar chart.\n resolved.sort((a, b) => b.importance - a.importance);\n\n return resolved.map(r => ({\n feature: r.feature,\n importance: r.importance,\n widthPct: max > 0 ? Math.max(2, Math.round((r.importance / max) * 100)) : 0\n }));\n }\n\n /** First metric name found on the leaderboard, for column/label fallback. */\n private firstMetricName(): string | null {\n const entry = (this.Spec?.Leaderboard ?? this.Spec?.leaderboard)?.[0];\n return entry?.metricName ?? null;\n }\n\n /** Return the value if it's a finite number, else null. */\n private firstDefined(value: number | undefined | null): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n }\n\n /** Format a numeric score for display (3 decimals, trimmed). */\n public formatScore(value: number | null): string {\n if (value == null) {\n return '—';\n }\n // Scores in [0,1] (AUC/F1) look best at 3 decimals; larger metrics (RMSE) at 2.\n const decimals = Math.abs(value) < 1 ? 3 : 2;\n return value.toFixed(decimals);\n }\n\n /** Format an importance weight for the small bar label. */\n public formatImportance(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n // Show .31 style for sub-1 weights, otherwise 2 decimals.\n return Math.abs(value) < 1 ? value.toFixed(2).replace(/^0/, '') : value.toFixed(2);\n }\n}\n","<div class=\"ml-exp-viewer\" [ngClass]=\"cssClass\">\n\n @if (IsLoading) {\n <div class=\"ml-exp-loading\">\n <mj-loading text=\"Loading experiment results…\" size=\"medium\"></mj-loading>\n </div>\n } @else if (HasError || !Spec) {\n <div class=\"ml-exp-empty\">\n <i class=\"fa-solid fa-flask-vial\"></i>\n <h3>No experiment results to display</h3>\n <p>{{ ErrorMessage || 'This artifact does not contain readable ML experiment results.' }}</p>\n </div>\n } @else {\n\n <!-- HERO -->\n <div class=\"ml-exp-hero\">\n <div class=\"hero-badge\"><i class=\"fa-solid fa-flask-vial\"></i></div>\n <div class=\"hero-titles\">\n <h2 class=\"hero-title\">ML Experiment Results</h2>\n @if (Summary) {\n <div class=\"hero-sub\">{{ Summary }}</div>\n }\n </div>\n @if (HeadlineScore != null) {\n <div class=\"hero-metric\">\n <div class=\"hero-metric-value\">{{ HeadlineScore }}</div>\n <div class=\"hero-metric-label\">{{ TargetMetricLabel }} · winner</div>\n </div>\n }\n </div>\n\n <div class=\"ml-exp-body\">\n\n <!-- GOAL BAR -->\n <div class=\"goalbar\">\n @if (Goal) {\n <div class=\"goal-item\">\n <span class=\"goal-key\">Goal</span>\n <span class=\"goal-val\">{{ Goal }}</span>\n </div>\n }\n @if (Spec.target) {\n <div class=\"goal-item\">\n <span class=\"goal-key\">Target</span>\n <span class=\"goal-val\">{{ Spec.target }}</span>\n </div>\n }\n @if (Spec.asOf) {\n <div class=\"goal-item\">\n <span class=\"goal-key\">As-of</span>\n <span class=\"goal-val\">{{ Spec.asOf }}</span>\n </div>\n }\n @if (Spec.validation) {\n <div class=\"goal-item\">\n <span class=\"goal-key\">Validation</span>\n <span class=\"goal-val\">{{ Spec.validation }}</span>\n </div>\n }\n @if (Spec.budgetUsed) {\n <div class=\"goal-item\">\n <span class=\"goal-key\">Budget used</span>\n <span class=\"goal-val\">{{ Spec.budgetUsed }}</span>\n </div>\n }\n </div>\n\n <div class=\"ml-exp-cols\">\n\n <!-- LEFT COLUMN: leaderboard + feature importance -->\n <div class=\"col-main\">\n\n <div class=\"section-title\">Leaderboard</div>\n @if (LeaderboardRows.length > 0) {\n <div class=\"lb-card\">\n <table class=\"lb-table\">\n <thead>\n <tr>\n <th class=\"lb-rank-col\">#</th>\n <th>Algorithm</th>\n <th>Feature set</th>\n <th class=\"num\">{{ TargetMetricLabel }}</th>\n <th class=\"num\">CV</th>\n </tr>\n </thead>\n <tbody>\n @for (row of LeaderboardRows; track row.rank) {\n <tr [class.is-winner]=\"row.isWinner\"\n [class.has-model]=\"row.modelId\"\n (click)=\"OnOpenRowModel(row)\">\n <td>\n <span class=\"rank\" [class.gold]=\"row.isWinner\">{{ row.rank }}</span>\n </td>\n <td class=\"algo\">\n @if (row.isWinner) {\n <strong>{{ row.algorithm }}</strong>\n } @else {\n {{ row.algorithm }}\n }\n @if (row.modelId) {\n <i class=\"fa-solid fa-arrow-up-right-from-square row-link-icon\"\n title=\"Open this model\"></i>\n }\n </td>\n <td class=\"muted\">{{ row.featureSet || '—' }}</td>\n <td class=\"num\">\n @if (row.isWinner) {\n <strong>{{ formatScore(row.score) }}</strong>\n } @else {\n {{ formatScore(row.score) }}\n }\n </td>\n <td class=\"num muted\">{{ formatScore(row.cvScore) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"inline-empty\">No leaderboard iterations were recorded.</div>\n }\n\n @if (FeatureBars.length > 0) {\n <div class=\"section-title\">Feature Importance — winning model</div>\n <div class=\"fi-card\">\n @for (bar of FeatureBars; track bar.feature) {\n <div class=\"fbar\">\n <div class=\"fbar-label\" [title]=\"bar.feature\">{{ bar.feature }}</div>\n <div class=\"fbar-track\">\n <span class=\"fbar-fill\" [style.width.%]=\"bar.widthPct\"></span>\n </div>\n <div class=\"fbar-num\">{{ formatImportance(bar.importance) }}</div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- RIGHT COLUMN: winning model card + drill-through -->\n <div class=\"col-side\">\n <div class=\"section-title\">Winning Model</div>\n <div class=\"winner-card\">\n <div class=\"winner-top\">\n <div class=\"crown\"><i class=\"fa-solid fa-crown\"></i></div>\n <div class=\"winner-head\">\n <h3 class=\"winner-name\">{{ WinningAlgorithm }}</h3>\n @if (WinningModelSubtitle) {\n <div class=\"muted\">{{ WinningModelSubtitle }}</div>\n }\n </div>\n </div>\n\n @if (WinningMetrics.length > 0) {\n <div class=\"wmetrics\">\n @for (m of WinningMetrics; track m.label) {\n <div class=\"wmetric\">\n <div class=\"wmetric-value\">{{ m.value }}</div>\n <div class=\"wmetric-label\">{{ m.label }}</div>\n </div>\n }\n </div>\n }\n\n <button mjButton variant=\"primary\" class=\"drill-btn\"\n [disabled]=\"!HasDrillThroughTarget\"\n (click)=\"OnDrillThroughToModel()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n Drill through to ML Model\n </button>\n\n @if (!HasDrillThroughTarget) {\n <div class=\"drill-hint muted\">\n No linked ML Model record on this artifact yet.\n </div>\n }\n </div>\n </div>\n\n </div>\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"ml-experiment-results-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/ml-experiment-results-viewer.component.ts","../../../../src/lib/components/plugins/ml-experiment-results-viewer.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef, Output, EventEmitter, inject } from '@angular/core';\nimport { DataSnapshot } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseArtifactViewerPluginComponent, ArtifactViewerTab, NavigationRequest } from '../base-artifact-viewer.component';\nimport { CreateMarkdownSnapshot } from '../../snapshot-helpers';\n\n/**\n * A single feature-importance entry for the winning model.\n */\ninterface MLFeatureImportance {\n /** Display name of the feature */\n feature?: string;\n name?: string;\n /** Importance weight (0..1 or any positive scale — bars are normalized to the max) */\n importance?: number;\n weight?: number;\n value?: number;\n}\n\n/**\n * A single leaderboard iteration row.\n *\n * Accepts both the **canonical** Core `ModelingPlanSpec.Leaderboard` shape\n * (PascalCase: `Metric`/`ModelID`/`IterationID`, produced by the deterministic\n * `ExperimentOrchestrator`) and the older / LLM-authored lowercase shape. All\n * fields are optional so partial artifacts degrade gracefully.\n */\ninterface MLLeaderboardEntry {\n // ── Canonical (Core ModelingPlanSpec.Leaderboard entry) ──\n /** The iteration this entry scores (`MJ: Experiment Session Iterations` id). */\n IterationID?: string;\n /** The normalized leaderboard metric value (the Experiment's TargetMetric). */\n Metric?: number;\n /** The trained ML Model record ID for drill-through. */\n ModelID?: string;\n\n // ── Lowercase / LLM-authored fallbacks + display-only fields ──\n /** Rank (1 = best). If absent, derived from array order. */\n rank?: number;\n /** Algorithm name, e.g. \"XGBoost\" */\n algorithm?: string;\n algorithmName?: string;\n /** Feature set label, e.g. \"engagement\", \"full\", \"interpretable\" */\n featureSet?: string;\n /** Primary normalized leaderboard score (the Experiment's TargetMetric) */\n score?: number;\n /** Optional secondary metric (e.g. cross-validation score) */\n cvScore?: number;\n /** The trained ML Model record ID for drill-through (lowercase fallback) */\n modelId?: string;\n /** Named metric label for the primary score column header */\n metricName?: string;\n}\n\n/**\n * Headline / extra metrics for the winning model card.\n */\ninterface MLWinningMetric {\n label?: string;\n value?: number | string;\n}\n\n/**\n * The reporting-phase block authored by the Model Development Agent.\n */\ninterface MLExperimentReport {\n name?: string;\n summary?: string;\n markdown?: string;\n /** The winning ML Model record ID (drill-through target) */\n bestModelId?: string;\n bestModelName?: string;\n bestModelVersion?: string;\n}\n\n/**\n * The canonical best-model pointer on a `ModelingPlanSpec`-shaped artifact.\n */\ninterface MLBestModel {\n ID?: string;\n Name?: string;\n Version?: string | number;\n}\n\n/**\n * ML Experiment Results artifact content shape.\n *\n * The **canonical** shape is the Core `ModelingPlanSpec` (PascalCase: `Goal`,\n * `Leaderboard`, `BestModel`/`BestModelID`, `Markdown`, …) produced by the\n * deterministic `ExperimentOrchestrator` and the Model Development Agent's\n * reporting phase (content type `application/vnd.mj.ml-experiment-results`).\n *\n * Older / LLM-authored lowercase fields (`goal`, `leaderboard`, `report`, …)\n * are retained as graceful fallbacks. All fields are optional so partial/older\n * artifacts degrade gracefully.\n */\ninterface MLExperimentResultsSpec {\n // ── Canonical (Core ModelingPlanSpec) ──\n /** Display name / title of the session (PascalCase). */\n Name?: string;\n /** The modeling goal, plain language (PascalCase). */\n Goal?: string;\n /** Plain-language summary of the results (PascalCase). */\n Summary?: string;\n /** The full results narrative in markdown (PascalCase). */\n Markdown?: string;\n /** Ranked leaderboard of experiment iterations (PascalCase Core shape). */\n Leaderboard?: MLLeaderboardEntry[];\n /** Feature importance for the winning model (PascalCase). */\n FeatureImportance?: MLFeatureImportance[];\n /** The winning model pointer (PascalCase). */\n BestModel?: MLBestModel;\n /** Convenience scalar pointer to the winning model ID (PascalCase). */\n BestModelID?: string;\n /** The normalized target metric name (PascalCase). */\n TargetMetric?: string;\n\n // ── Lowercase / LLM-authored fallbacks ──\n /** The modeling goal, plain language */\n goal?: string;\n /** Prediction target (e.g. \"Renewed\") */\n target?: string;\n /** As-of cutoff description (leakage guard) */\n asOf?: string;\n /** Validation strategy description */\n validation?: string;\n /** Budget usage description (e.g. \"22 / 25 runs · 58 min\") */\n budgetUsed?: string;\n /** The normalized target metric name (column header / headline label) */\n targetMetric?: string;\n /** Ranked leaderboard of experiment iterations */\n leaderboard?: MLLeaderboardEntry[];\n /** Feature importance for the winning model */\n featureImportance?: MLFeatureImportance[];\n /** Convenience pointer to the winning model ID (also resolvable via report/leaderboard) */\n bestModelId?: string;\n /** Extra headline metrics for the winning-model card */\n winningMetrics?: MLWinningMetric[];\n /** The reporting-phase block (markdown, summary, best model) */\n report?: MLExperimentReport;\n}\n\n/**\n * Normalized leaderboard row for the template (resolves alias fields + derived rank).\n */\ninterface NormalizedLeaderboardRow {\n rank: number;\n algorithm: string;\n featureSet: string;\n score: number | null;\n cvScore: number | null;\n modelId: string | null;\n isWinner: boolean;\n}\n\n/**\n * Normalized feature-importance bar for the template (resolves alias + percent width).\n */\ninterface NormalizedFeatureBar {\n feature: string;\n importance: number;\n /** Width percentage relative to the most important feature (0..100) */\n widthPct: number;\n}\n\n/**\n * Viewer plugin for **ML Experiment Results** artifacts (Predictive Studio).\n *\n * Renders the experiment goal + headline best metric, a ranked leaderboard of\n * iterations, feature-importance bars for the winning model, and a winning-model\n * card with a drill-through button that issues a {@link NavigationRequest} to open\n * the winning `MJ: ML Models` record in Predictive Studio's \"Models\" nav item.\n *\n * Falls back to a friendly empty state when the JSON can't be parsed, and exposes\n * the agent-authored markdown report as an additional \"Report\" tab when present.\n */\n@Component({\n standalone: false,\n selector: 'mj-ml-experiment-results-viewer',\n templateUrl: './ml-experiment-results-viewer.component.html',\n styleUrls: ['./ml-experiment-results-viewer.component.css']\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'MLExperimentResultsViewerPlugin')\nexport class MLExperimentResultsViewerComponent extends BaseArtifactViewerPluginComponent implements OnInit {\n /** Emitted to request app-level navigation (drill-through to the ML Model record). */\n @Output() override navigationRequest = new EventEmitter<NavigationRequest>();\n\n private cdr = inject(ChangeDetectorRef);\n\n /** Parsed artifact content. */\n public Spec: MLExperimentResultsSpec | null = null;\n\n public IsLoading = true;\n public HasError = false;\n public ErrorMessage = '';\n\n /** Normalized, ranked leaderboard rows for rendering. */\n public LeaderboardRows: NormalizedLeaderboardRow[] = [];\n\n /** Normalized feature-importance bars for rendering. */\n public FeatureBars: NormalizedFeatureBar[] = [];\n\n // ─── Lifecycle ───────────────────────────────────────────────────\n\n ngOnInit(): void {\n try {\n this.Spec = this.parseJsonContent<MLExperimentResultsSpec>();\n if (!this.Spec) {\n this.HasError = true;\n this.ErrorMessage = 'Could not parse the ML Experiment Results content as JSON.';\n return;\n }\n\n this.LeaderboardRows = this.buildLeaderboardRows(this.Spec.Leaderboard ?? this.Spec.leaderboard ?? []);\n this.FeatureBars = this.buildFeatureBars(this.Spec.FeatureImportance ?? this.Spec.featureImportance ?? []);\n } catch (error) {\n this.HasError = true;\n this.ErrorMessage = error instanceof Error ? error.message : 'Failed to load experiment results.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ─── Base-class contract ─────────────────────────────────────────\n\n public override get hasDisplayContent(): boolean {\n return this.Spec != null;\n }\n\n public override GetCurrentStateSnapshot(): DataSnapshot | null {\n // The richest portable representation is the agent-authored markdown report.\n return CreateMarkdownSnapshot(this.WinningMarkdown ?? this.getRawContent(), this.getDisplayTitle());\n }\n\n /**\n * Expose the agent-authored markdown report as an additional \"Report\" tab\n * so users can read the full narrative alongside the rich visual display.\n */\n public GetAdditionalTabs(): ArtifactViewerTab[] {\n const markdown = this.Spec?.Markdown ?? this.Spec?.report?.markdown;\n if (!markdown) {\n return [];\n }\n return [\n {\n label: 'Report',\n icon: 'fa-file-lines',\n contentType: 'markdown',\n content: markdown\n }\n ];\n }\n\n // ─── Display getters ─────────────────────────────────────────────\n\n public get Goal(): string {\n return this.Spec?.Goal ?? this.Spec?.goal ?? this.Spec?.Summary ?? this.Spec?.report?.summary ?? '';\n }\n\n public get Summary(): string {\n return this.Spec?.Summary ?? this.Spec?.report?.summary ?? '';\n }\n\n public get TargetMetricLabel(): string {\n return this.Spec?.TargetMetric ?? this.Spec?.targetMetric ?? this.firstMetricName() ?? 'Score';\n }\n\n /** The winning row (rank 1) if any. */\n public get WinningRow(): NormalizedLeaderboardRow | null {\n return this.LeaderboardRows.find(r => r.isWinner) ?? this.LeaderboardRows[0] ?? null;\n }\n\n /** Headline best score (the winning row's primary score), formatted. */\n public get HeadlineScore(): string | null {\n const score = this.WinningRow?.score;\n return score != null ? this.FormatScore(score) : null;\n }\n\n public get WinningAlgorithm(): string {\n return this.Spec?.BestModel?.Name ?? this.Spec?.report?.bestModelName ?? this.WinningRow?.algorithm ?? 'Winning model';\n }\n\n public get WinningModelSubtitle(): string {\n const parts: string[] = [];\n if (this.WinningRow?.featureSet) {\n parts.push(this.WinningRow.featureSet);\n }\n const version = this.Spec?.BestModel?.Version ?? this.Spec?.report?.bestModelVersion;\n if (version != null && `${version}`.trim()) {\n parts.push(`${version}`);\n }\n return parts.join(' · ');\n }\n\n /** Extra headline metrics for the winning-model card. */\n public get WinningMetrics(): MLWinningMetric[] {\n const provided = this.Spec?.winningMetrics ?? [];\n if (provided.length > 0) {\n return provided;\n }\n // Synthesize a single metric from the headline score when nothing explicit was provided.\n const row = this.WinningRow;\n if (row?.score != null) {\n return [{ label: this.firstMetricName() ?? 'Score', value: this.FormatScore(row.score) }];\n }\n return [];\n }\n\n public get WinningMarkdown(): string | null {\n return this.Spec?.Markdown ?? this.Spec?.report?.markdown ?? null;\n }\n\n /** Whether we have a resolvable model ID to drill through to. */\n public get HasDrillThroughTarget(): boolean {\n return this.resolveBestModelId() != null;\n }\n\n public get LeaderboardSize(): number {\n return this.LeaderboardRows.length;\n }\n\n // ─── Actions ─────────────────────────────────────────────────────\n\n /**\n * Drill through to the winning ML Model record in Predictive Studio.\n * Matches the §9.4 contract: NavigationRequest to the 'Models' nav item.\n */\n public OnDrillThroughToModel(): void {\n const modelId = this.resolveBestModelId();\n if (!modelId) {\n return;\n }\n this.navigationRequest.emit({\n appName: 'Predictive Studio',\n navItemName: 'Models',\n queryParams: { modelId }\n });\n }\n\n /**\n * Drill through to a specific leaderboard row's model, when that row carries a modelId.\n */\n public OnOpenRowModel(row: NormalizedLeaderboardRow): void {\n if (!row.modelId) {\n return;\n }\n this.navigationRequest.emit({\n appName: 'Predictive Studio',\n navItemName: 'Models',\n queryParams: { modelId: row.modelId }\n });\n }\n\n // ─── Helpers ─────────────────────────────────────────────────────\n\n /**\n * Resolve the winning model ID. Priority (canonical PascalCase first):\n * BestModel.ID → BestModelID → report block → lowercase field → top leaderboard row.\n */\n private resolveBestModelId(): string | null {\n return this.Spec?.BestModel?.ID\n ?? this.Spec?.BestModelID\n ?? this.Spec?.report?.bestModelId\n ?? this.Spec?.bestModelId\n ?? this.WinningRow?.modelId\n ?? null;\n }\n\n /** Build normalized, ranked leaderboard rows from raw entries. */\n private buildLeaderboardRows(entries: MLLeaderboardEntry[]): NormalizedLeaderboardRow[] {\n if (!Array.isArray(entries) || entries.length === 0) {\n return [];\n }\n\n const rows = entries.map((e, index) => ({\n // Canonical `Leaderboard` is already best-first; derive rank from order.\n rank: e.rank ?? index + 1,\n algorithm: e.algorithm ?? e.algorithmName ?? 'Unknown',\n featureSet: e.featureSet ?? '',\n // Canonical: `Metric`; fallback: lowercase `score`.\n score: this.firstDefined(e.Metric ?? e.score),\n cvScore: this.firstDefined(e.cvScore),\n // Canonical: `ModelID`; fallback: lowercase `modelId`.\n modelId: e.ModelID ?? e.modelId ?? null,\n isWinner: false\n }));\n\n // Sort by explicit rank ascending (rank 1 is best).\n rows.sort((a, b) => a.rank - b.rank);\n if (rows.length > 0) {\n rows[0].isWinner = true;\n }\n return rows;\n }\n\n /** Build normalized feature-importance bars (widths relative to the max). */\n private buildFeatureBars(entries: MLFeatureImportance[]): NormalizedFeatureBar[] {\n if (!Array.isArray(entries) || entries.length === 0) {\n return [];\n }\n\n const resolved = entries.map(e => ({\n feature: e.feature ?? e.name ?? 'Feature',\n importance: this.firstDefined(e.importance ?? e.weight ?? e.value) ?? 0\n }));\n\n const max = resolved.reduce((m, r) => Math.max(m, r.importance), 0);\n // Sort descending by importance for a clean ranked bar chart.\n resolved.sort((a, b) => b.importance - a.importance);\n\n return resolved.map(r => ({\n feature: r.feature,\n importance: r.importance,\n widthPct: max > 0 ? Math.max(2, Math.round((r.importance / max) * 100)) : 0\n }));\n }\n\n /** First metric name found on the leaderboard, for column/label fallback. */\n private firstMetricName(): string | null {\n const entry = (this.Spec?.Leaderboard ?? this.Spec?.leaderboard)?.[0];\n return entry?.metricName ?? null;\n }\n\n /** Return the value if it's a finite number, else null. */\n private firstDefined(value: number | undefined | null): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n }\n\n /** Format a numeric score for display (3 decimals, trimmed). */\n public FormatScore(value: number | null): string {\n if (value == null) {\n return '—';\n }\n // Scores in [0,1] (AUC/F1) look best at 3 decimals; larger metrics (RMSE) at 2.\n const decimals = Math.abs(value) < 1 ? 3 : 2;\n return value.toFixed(decimals);\n }\n\n /** @deprecated Use {@link FormatScore}. */\n public formatScore(value: number | null): string {\n return this.FormatScore(value);\n }\n\n /** Format an importance weight for the small bar label. */\n public FormatImportance(value: number): string {\n if (!Number.isFinite(value)) {\n return '';\n }\n // Show .31 style for sub-1 weights, otherwise 2 decimals.\n return Math.abs(value) < 1 ? value.toFixed(2).replace(/^0/, '') : value.toFixed(2);\n }\n\n /** @deprecated Use {@link FormatImportance}. */\n public formatImportance(value: number): string {\n return this.FormatImportance(value);\n }\n}\n","<div class=\"ml-exp-viewer\" [ngClass]=\"cssClass\">\n\n @if (IsLoading) {\n <div class=\"ml-exp-loading\">\n <mj-loading text=\"Loading experiment results…\" size=\"medium\"></mj-loading>\n </div>\n } @else if (HasError || !Spec) {\n <div class=\"ml-exp-empty\">\n <i class=\"fa-solid fa-flask-vial\"></i>\n <h3>No experiment results to display</h3>\n <p>{{ ErrorMessage || 'This artifact does not contain readable ML experiment results.' }}</p>\n </div>\n } @else {\n\n <!-- HERO -->\n <div class=\"ml-exp-hero\">\n <div class=\"hero-badge\"><i class=\"fa-solid fa-flask-vial\"></i></div>\n <div class=\"hero-titles\">\n <h2 class=\"hero-title\">ML Experiment Results</h2>\n @if (Summary) {\n <div class=\"hero-sub\">{{ Summary }}</div>\n }\n </div>\n @if (HeadlineScore != null) {\n <div class=\"hero-metric\">\n <div class=\"hero-metric-value\">{{ HeadlineScore }}</div>\n <div class=\"hero-metric-label\">{{ TargetMetricLabel }} · winner</div>\n </div>\n }\n </div>\n\n <div class=\"ml-exp-body\">\n\n <!-- GOAL BAR -->\n <div class=\"goalbar\">\n @if (Goal) {\n <div class=\"goal-item\">\n <span class=\"goal-key\">Goal</span>\n <span class=\"goal-val\">{{ Goal }}</span>\n </div>\n }\n @if (Spec.target) {\n <div class=\"goal-item\">\n <span class=\"goal-key\">Target</span>\n <span class=\"goal-val\">{{ Spec.target }}</span>\n </div>\n }\n @if (Spec.asOf) {\n <div class=\"goal-item\">\n <span class=\"goal-key\">As-of</span>\n <span class=\"goal-val\">{{ Spec.asOf }}</span>\n </div>\n }\n @if (Spec.validation) {\n <div class=\"goal-item\">\n <span class=\"goal-key\">Validation</span>\n <span class=\"goal-val\">{{ Spec.validation }}</span>\n </div>\n }\n @if (Spec.budgetUsed) {\n <div class=\"goal-item\">\n <span class=\"goal-key\">Budget used</span>\n <span class=\"goal-val\">{{ Spec.budgetUsed }}</span>\n </div>\n }\n </div>\n\n <div class=\"ml-exp-cols\">\n\n <!-- LEFT COLUMN: leaderboard + feature importance -->\n <div class=\"col-main\">\n\n <div class=\"section-title\">Leaderboard</div>\n @if (LeaderboardRows.length > 0) {\n <div class=\"lb-card\">\n <table class=\"lb-table\">\n <thead>\n <tr>\n <th class=\"lb-rank-col\">#</th>\n <th>Algorithm</th>\n <th>Feature set</th>\n <th class=\"num\">{{ TargetMetricLabel }}</th>\n <th class=\"num\">CV</th>\n </tr>\n </thead>\n <tbody>\n @for (row of LeaderboardRows; track row.rank) {\n <tr [class.is-winner]=\"row.isWinner\"\n [class.has-model]=\"row.modelId\"\n (click)=\"OnOpenRowModel(row)\">\n <td>\n <span class=\"rank\" [class.gold]=\"row.isWinner\">{{ row.rank }}</span>\n </td>\n <td class=\"algo\">\n @if (row.isWinner) {\n <strong>{{ row.algorithm }}</strong>\n } @else {\n {{ row.algorithm }}\n }\n @if (row.modelId) {\n <i class=\"fa-solid fa-arrow-up-right-from-square row-link-icon\"\n title=\"Open this model\"></i>\n }\n </td>\n <td class=\"muted\">{{ row.featureSet || '—' }}</td>\n <td class=\"num\">\n @if (row.isWinner) {\n <strong>{{ formatScore(row.score) }}</strong>\n } @else {\n {{ formatScore(row.score) }}\n }\n </td>\n <td class=\"num muted\">{{ formatScore(row.cvScore) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"inline-empty\">No leaderboard iterations were recorded.</div>\n }\n\n @if (FeatureBars.length > 0) {\n <div class=\"section-title\">Feature Importance — winning model</div>\n <div class=\"fi-card\">\n @for (bar of FeatureBars; track bar.feature) {\n <div class=\"fbar\">\n <div class=\"fbar-label\" [title]=\"bar.feature\">{{ bar.feature }}</div>\n <div class=\"fbar-track\">\n <span class=\"fbar-fill\" [style.width.%]=\"bar.widthPct\"></span>\n </div>\n <div class=\"fbar-num\">{{ formatImportance(bar.importance) }}</div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- RIGHT COLUMN: winning model card + drill-through -->\n <div class=\"col-side\">\n <div class=\"section-title\">Winning Model</div>\n <div class=\"winner-card\">\n <div class=\"winner-top\">\n <div class=\"crown\"><i class=\"fa-solid fa-crown\"></i></div>\n <div class=\"winner-head\">\n <h3 class=\"winner-name\">{{ WinningAlgorithm }}</h3>\n @if (WinningModelSubtitle) {\n <div class=\"muted\">{{ WinningModelSubtitle }}</div>\n }\n </div>\n </div>\n\n @if (WinningMetrics.length > 0) {\n <div class=\"wmetrics\">\n @for (m of WinningMetrics; track m.label) {\n <div class=\"wmetric\">\n <div class=\"wmetric-value\">{{ m.value }}</div>\n <div class=\"wmetric-label\">{{ m.label }}</div>\n </div>\n }\n </div>\n }\n\n <button mjButton variant=\"primary\" class=\"drill-btn\"\n [disabled]=\"!HasDrillThroughTarget\"\n (click)=\"OnDrillThroughToModel()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n Drill through to ML Model\n </button>\n\n @if (!HasDrillThroughTarget) {\n <div class=\"drill-hint muted\">\n No linked ML Model record on this artifact yet.\n </div>\n }\n </div>\n </div>\n\n </div>\n </div>\n }\n</div>\n"]}
@@ -18,13 +18,33 @@ import * as i0 from "@angular/core";
18
18
  export declare class PdfArtifactViewerComponent extends BaseArtifactViewerPluginComponent implements OnInit, OnDestroy {
19
19
  private fileService;
20
20
  private cdr;
21
- canvasRef?: ElementRef<HTMLCanvasElement>;
21
+ CanvasRef?: ElementRef<HTMLCanvasElement>;
22
+ /** @deprecated Use {@link CanvasRef}. */
23
+ get canvasRef(): ElementRef<HTMLCanvasElement> | undefined;
24
+ /** @deprecated Use {@link CanvasRef}. */
25
+ set canvasRef(value: ElementRef<HTMLCanvasElement> | undefined);
22
26
  isLoading: boolean;
23
- isDownloading: boolean;
27
+ IsDownloading: boolean;
28
+ /** @deprecated Use {@link IsDownloading}. */
29
+ get isDownloading(): boolean;
30
+ /** @deprecated Use {@link IsDownloading}. */
31
+ set isDownloading(value: boolean);
24
32
  errorMessage: string;
25
- currentPage: number;
26
- totalPages: number;
27
- zoomLevel: number;
33
+ CurrentPage: number;
34
+ /** @deprecated Use {@link CurrentPage}. */
35
+ get currentPage(): number;
36
+ /** @deprecated Use {@link CurrentPage}. */
37
+ set currentPage(value: number);
38
+ TotalPages: number;
39
+ /** @deprecated Use {@link TotalPages}. */
40
+ get totalPages(): number;
41
+ /** @deprecated Use {@link TotalPages}. */
42
+ set totalPages(value: number);
43
+ ZoomLevel: number;
44
+ /** @deprecated Use {@link ZoomLevel}. */
45
+ get zoomLevel(): number;
46
+ /** @deprecated Use {@link ZoomLevel}. */
47
+ set zoomLevel(value: number);
28
48
  private pdfDoc;
29
49
  private renderTask;
30
50
  private downloadUrl;
@@ -36,18 +56,40 @@ export declare class PdfArtifactViewerComponent extends BaseArtifactViewerPlugin
36
56
  constructor(fileService: ArtifactFileService, cdr: ChangeDetectorRef);
37
57
  get hasDisplayContent(): boolean;
38
58
  /** Current zoom as an integer percentage for toolbar display. */
59
+ get ZoomPercent(): number;
60
+ /** @deprecated Use {@link ZoomPercent}. */
39
61
  get zoomPercent(): number;
62
+ get CanZoomIn(): boolean;
63
+ /** @deprecated Use {@link CanZoomIn}. */
40
64
  get canZoomIn(): boolean;
65
+ get CanZoomOut(): boolean;
66
+ /** @deprecated Use {@link CanZoomOut}. */
41
67
  get canZoomOut(): boolean;
42
68
  ngOnInit(): Promise<void>;
43
69
  ngOnDestroy(): void;
70
+ GoToNextPage(): Promise<void>;
71
+ /** @deprecated Use {@link GoToNextPage}. */
44
72
  goToNextPage(): Promise<void>;
73
+ GoToPrevPage(): Promise<void>;
74
+ /** @deprecated Use {@link GoToPrevPage}. */
45
75
  goToPrevPage(): Promise<void>;
76
+ OnPageChange(page: number): Promise<void>;
77
+ /** @deprecated Use {@link OnPageChange}. */
46
78
  onPageChange(page: number): Promise<void>;
79
+ OnZoomIn(): Promise<void>;
80
+ /** @deprecated Use {@link OnZoomIn}. */
47
81
  onZoomIn(): Promise<void>;
82
+ OnZoomOut(): Promise<void>;
83
+ /** @deprecated Use {@link OnZoomOut}. */
48
84
  onZoomOut(): Promise<void>;
85
+ OnZoomReset(): Promise<void>;
86
+ /** @deprecated Use {@link OnZoomReset}. */
49
87
  onZoomReset(): Promise<void>;
88
+ OnDownload(): Promise<void>;
89
+ /** @deprecated Use {@link OnDownload}. */
50
90
  onDownload(): Promise<void>;
91
+ OnPrint(): void;
92
+ /** @deprecated Use {@link OnPrint}. */
51
93
  onPrint(): void;
52
94
  private loadPdf;
53
95
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-artifact-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/pdf-artifact-viewer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAa,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvG,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;;AAE3E;;;;;;;;;;;GAWG;AACH,qBAiGa,0BAA2B,SAAQ,iCAAkC,YAAW,MAAM,EAAE,SAAS;IAqB1G,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,GAAG;IArBW,SAAS,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAE3D,SAAS,UAAQ;IACjB,aAAa,UAAS;IACtB,YAAY,SAAM;IAClB,WAAW,SAAK;IAChB,UAAU,SAAK;IACf,SAAS,SAAO;IAEvB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,SAAS,CAAyB;IAE1C,2CAA2C;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoD;IAC/E,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAO;gBAGxB,WAAW,EAAE,mBAAmB,EAChC,GAAG,EAAE,iBAAiB;IAKhC,IAAoB,iBAAiB,IAAI,OAAO,CAE/C;IAED,iEAAiE;IACjE,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,IAAW,UAAU,IAAI,OAAO,CAE/B;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,WAAW,IAAI,IAAI;IAQN,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAU1B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAcjC,OAAO,IAAI,IAAI;YAUR,OAAO;IAyCrB;;;;OAIG;YACW,eAAe;IAe7B,wEAAwE;YAC1D,SAAS;YAQT,eAAe;YAMf,eAAe;YAMf,UAAU;IAwCxB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,SAAS;IAMD,uBAAuB,IAAI,YAAY,GAAG,IAAI;yCApQnD,0BAA0B;2CAA1B,0BAA0B;CAiRtC"}
1
+ {"version":3,"file":"pdf-artifact-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/pdf-artifact-viewer.component.ts"],"names":[],"mappings":"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"}