@memberjunction/ng-dashboards 6.1.2 → 6.2.0-edge.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +6 -1
  2. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  3. package/dist/AI/components/vectors/vector-management-resource.component.js +99 -45
  4. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  5. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +4 -0
  6. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
  7. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +16 -6
  8. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  9. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +4 -0
  10. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  11. package/dist/DataExplorer/data-explorer-dashboard.component.js +14 -4
  12. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  13. package/dist/DataExplorer/services/explorer-state.service.js +2 -2
  14. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  15. package/dist/DevTools/graphql-console.component.d.ts.map +1 -1
  16. package/dist/DevTools/graphql-console.component.js +2 -0
  17. package/dist/DevTools/graphql-console.component.js.map +1 -1
  18. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  19. package/dist/Integration/components/connections/connections.component.js +2 -0
  20. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  21. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts +4 -12
  22. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts.map +1 -1
  23. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +39 -78
  24. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
  25. package/dist/Lists/components/lists-browse-resource.component.d.ts +3 -0
  26. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  27. package/dist/Lists/components/lists-browse-resource.component.js +7 -6
  28. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  29. package/dist/Lists/components/lists-my-lists-resource.component.d.ts +3 -0
  30. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  31. package/dist/Lists/components/lists-my-lists-resource.component.js +7 -6
  32. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  33. package/dist/PredictiveStudio/at-risk.view-models.d.ts +41 -3
  34. package/dist/PredictiveStudio/at-risk.view-models.d.ts.map +1 -1
  35. package/dist/PredictiveStudio/at-risk.view-models.js +99 -6
  36. package/dist/PredictiveStudio/at-risk.view-models.js.map +1 -1
  37. package/dist/PredictiveStudio/components/ps-catalog.component.d.ts +4 -1
  38. package/dist/PredictiveStudio/components/ps-catalog.component.d.ts.map +1 -1
  39. package/dist/PredictiveStudio/components/ps-catalog.component.js +61 -37
  40. package/dist/PredictiveStudio/components/ps-catalog.component.js.map +1 -1
  41. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts +12 -0
  42. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
  43. package/dist/PredictiveStudio/components/ps-experiments.component.js +426 -184
  44. package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
  45. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts +84 -0
  46. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts.map +1 -0
  47. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +1397 -0
  48. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js.map +1 -0
  49. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +66 -34
  50. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
  51. package/dist/PredictiveStudio/components/ps-pipelines.component.js +2456 -743
  52. package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
  53. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts +194 -0
  54. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -0
  55. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +1902 -0
  56. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -0
  57. package/dist/PredictiveStudio/components/ps-production.component.d.ts +17 -1
  58. package/dist/PredictiveStudio/components/ps-production.component.d.ts.map +1 -1
  59. package/dist/PredictiveStudio/components/ps-production.component.js +653 -372
  60. package/dist/PredictiveStudio/components/ps-production.component.js.map +1 -1
  61. package/dist/PredictiveStudio/components/ps-registry.component.d.ts +21 -61
  62. package/dist/PredictiveStudio/components/ps-registry.component.d.ts.map +1 -1
  63. package/dist/PredictiveStudio/components/ps-registry.component.js +214 -681
  64. package/dist/PredictiveStudio/components/ps-registry.component.js.map +1 -1
  65. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts +49 -0
  66. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts.map +1 -0
  67. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js +658 -0
  68. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js.map +1 -0
  69. package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts +42 -0
  70. package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts.map +1 -0
  71. package/dist/PredictiveStudio/predictive-studio-score-history.service.js +90 -0
  72. package/dist/PredictiveStudio/predictive-studio-score-history.service.js.map +1 -0
  73. package/dist/PredictiveStudio/predictive-studio.view-models.d.ts +14 -2
  74. package/dist/PredictiveStudio/predictive-studio.view-models.d.ts.map +1 -1
  75. package/dist/PredictiveStudio/predictive-studio.view-models.js +41 -5
  76. package/dist/PredictiveStudio/predictive-studio.view-models.js.map +1 -1
  77. package/dist/PredictiveStudio/resources/ps-models-resource.component.d.ts +9 -1
  78. package/dist/PredictiveStudio/resources/ps-models-resource.component.d.ts.map +1 -1
  79. package/dist/PredictiveStudio/resources/ps-models-resource.component.js +178 -65
  80. package/dist/PredictiveStudio/resources/ps-models-resource.component.js.map +1 -1
  81. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts +9 -1
  82. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
  83. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +307 -369
  84. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
  85. package/dist/PredictiveStudio/resources/ps-resource-base.js +1 -1
  86. package/dist/PredictiveStudio/resources/ps-resource-base.js.map +1 -1
  87. package/dist/PredictiveStudio/resources/ps-studio-resource.component.d.ts +17 -1
  88. package/dist/PredictiveStudio/resources/ps-studio-resource.component.d.ts.map +1 -1
  89. package/dist/PredictiveStudio/resources/ps-studio-resource.component.js +309 -138
  90. package/dist/PredictiveStudio/resources/ps-studio-resource.component.js.map +1 -1
  91. package/dist/VersionHistory/components/graph-resource.component.d.ts +1 -0
  92. package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
  93. package/dist/VersionHistory/components/graph-resource.component.js +6 -5
  94. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  95. package/dist/predictive-studio-dashboards.module.d.ts +10 -8
  96. package/dist/predictive-studio-dashboards.module.d.ts.map +1 -1
  97. package/dist/predictive-studio-dashboards.module.js +13 -3
  98. package/dist/predictive-studio-dashboards.module.js.map +1 -1
  99. package/package.json +64 -63
@@ -1 +1 @@
1
- {"version":3,"file":"ps-registry.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-registry.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, Input, OnInit, ViewEncapsulation, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { IMetadataProvider, UserInfo } from '@memberjunction/core';\nimport {\n MJMLModelEntity,\n PredictiveStudioPromoteModelOperation,\n PredictiveStudioModelTargetStatus,\n} from '@memberjunction/core-entities';\nimport { PredictiveStudioEngine } from '../engine/predictive-studio.engine';\nimport { PSFeatureBar, PS_LIFECYCLE_STEPS, PSLifecycleStep } from '../predictive-studio.types';\nimport {\n PS_FEATURE_DOMINANCE_THRESHOLD,\n PSMetricDisplay,\n maxFeatureImportance,\n metricsToDisplay,\n overfitGap,\n parseFeatureImportance,\n parseMetrics,\n primaryAuc,\n} from '../predictive-studio.view-models';\nimport { PSConfirmModalComponent } from './ps-confirm-modal.component';\nimport { humanizeFeatureName } from '../at-risk.view-models';\n\ninterface ModelRowVM {\n id: string;\n name: string;\n version: number;\n algorithm: string;\n holdoutAuc: string;\n status: string;\n iconClass: string;\n}\n\n/** A pending promote/archive action awaiting user confirmation. */\ninterface PendingPromotion {\n modelId: string;\n modelName: string;\n targetStatus: PredictiveStudioModelTargetStatus;\n /** When true, the selected model trips the single-feature dominance leakage flag → sign-off required. */\n leakageFlagged: boolean;\n}\n\n/**\n * Model Registry panel: master list of trained ML Models + a rich detail pane with a lifecycle stepper\n * (Draft → Validated → Published → Archived), train-vs-holdout metric comparison, feature-importance\n * bars, a leakage sign-off gate, and lifecycle actions. Fully live against `MJ: ML Models`:\n *\n * - **Feature importance** is parsed from `model.FeatureImportance` (sorted by |value|, top 6, bars).\n * - **Performance metrics** come from `model.Metrics` (train) + `model.HoldoutMetrics` (holdout) —\n * only the metrics actually recorded are shown.\n * - **Promote / Archive** call the {@link PredictiveStudioPromoteModelOperation} Remote Op behind a\n * confirmation modal. On a leakage-flagged model, the modal surfaces the sign-off requirement and\n * captures a required reason; on success the engine refreshes and the list re-renders reactively.\n *\n * 100% entity-agnostic — model names derive from the producing pipeline, never any business entity.\n */\n@Component({\n standalone: true,\n selector: 'ps-registry',\n imports: [CommonModule, MJButtonDirective, PSConfirmModalComponent],\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['../predictive-studio.shared.css', './ps-registry.component.css'],\n template: `\n <div class=\"ps-panel ps-registry\" data-testid=\"ps-registry-panel\">\n @if (models.length === 0) {\n <div class=\"ps-empty\" data-testid=\"ps-registry-empty\">\n <span class=\"ps-empty-ico\"><i class=\"fa-solid fa-cubes\"></i></span>\n <h3>No trained models yet</h3>\n <p>Train a pipeline to register your first immutable model. Each successful training run produces a versioned model you can validate, publish, and score with here.</p>\n </div>\n } @else {\n <div class=\"md-layout\">\n <!-- master list -->\n <div class=\"ps-card mlist\" data-testid=\"ps-registry-list\">\n <div class=\"ps-card-head\"><h3>ML Models</h3><span class=\"ps-badge gray\">{{ models.length }}</span></div>\n <div class=\"ps-card-body\" style=\"padding:8px\">\n @for (m of models; track m.id) {\n <div class=\"mrow\" data-testid=\"ps-registry-row\" [class.sel]=\"m.id === selectedId\" [class.arc]=\"m.status === 'Archived'\" (click)=\"select(m.id)\">\n <div class=\"ico\" [class]=\"m.iconClass\"><i class=\"fa-solid fa-cube\"></i></div>\n <div style=\"flex:1;min-width:0\">\n <div class=\"nm\">{{ m.name }}</div>\n <div class=\"ln2 ps-muted ps-small\">v{{ m.version }} · {{ m.algorithm }}</div>\n </div>\n <div class=\"auc\">\n <div class=\"v\">{{ m.holdoutAuc }}</div>\n <div class=\"st\" [class]=\"statusClass(m.status)\">{{ m.status }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- detail -->\n <div class=\"ps-col detail\" data-testid=\"ps-registry-detail\">\n <div class=\"ps-card\">\n <div class=\"ps-card-body dh\">\n <div class=\"big-ico\"><i class=\"fa-solid fa-cube\"></i></div>\n <div style=\"flex:1\">\n <h2 data-testid=\"ps-registry-detail-name\">{{ selected.name }} <span class=\"ps-tag ps-mono\">v{{ selected.version }}</span></h2>\n <div class=\"ps-muted ps-small sub\">{{ selected.algorithm }}{{ targetSuffix }} · immutable snapshot</div>\n </div>\n <span class=\"ps-badge\" [class]=\"statusBadgeClass(selected.status)\">{{ selected.status }}</span>\n </div>\n </div>\n\n <!-- lifecycle -->\n <div class=\"ps-card\">\n <div class=\"ps-card-body\">\n <div class=\"ps-section-title\">Lifecycle</div>\n <div class=\"ps-stepper\">\n @for (step of lifecycleSteps; track step; let last = $last) {\n <div class=\"ps-step\" [class.done]=\"stepState(step) === 'done'\" [class.curr]=\"stepState(step) === 'curr'\">\n <span class=\"pip\">@if (stepState(step) === 'done') { <i class=\"fa-solid fa-check\"></i> } @else { {{ $index + 1 }} }</span>\n {{ step }}\n </div>\n @if (!last) { <span class=\"ln\"></span> }\n }\n </div>\n <div class=\"ps-small ps-muted\" style=\"margin-top:10px\">\n Models are immutable once registered; promotion only changes lifecycle state, never weights.\n </div>\n </div>\n </div>\n\n <!-- performance -->\n <div class=\"ps-card\">\n <div class=\"ps-card-head\"><h3>Performance</h3><span class=\"ps-muted ps-small\">Holdout = held-out test fold, never seen in training</span></div>\n <div class=\"ps-card-body\">\n <div class=\"metric-pair\">\n <div class=\"mtile\"><div class=\"ps-section-title\">Train AUC</div><div class=\"v\">{{ trainAuc }}</div><div class=\"ps-muted ps-small\">in-sample · optimistic</div></div>\n <div class=\"mtile honest\"><div class=\"ps-section-title\">Holdout AUC</div><div class=\"v\">{{ selected.holdoutAuc }}</div><div class=\"ps-muted ps-small\">out-of-sample · the honest number</div></div>\n </div>\n @if (secondaryMetrics.length > 0) {\n <div class=\"stat-bar\">\n @for (s of secondaryMetrics; track s.key) {\n <div class=\"b\"><span class=\"ps-muted ps-small\">{{ s.label }}</span><strong>{{ s.value }}</strong></div>\n }\n </div>\n } @else {\n <div class=\"ps-small ps-muted\" style=\"margin-top:6px\">No secondary metrics recorded for this model.</div>\n }\n @if (gapText) {\n <div class=\"ps-small ps-muted\" style=\"margin-top:10px\">\n Train–holdout gap of <strong>{{ gapText }}</strong> {{ gapVerdict }}.\n </div>\n }\n </div>\n </div>\n\n <!-- feature importance -->\n <div class=\"ps-card\">\n <div class=\"ps-card-head\"><h3>Feature Importance</h3><span class=\"ps-muted ps-small\">{{ importanceCaption }}</span></div>\n <div class=\"ps-card-body\">\n @if (importance.length > 0) {\n @for (f of importance; track f.name) {\n <div class=\"ps-fbar\">\n <span class=\"name ps-small\" [title]=\"f.name\">{{ f.name }}</span>\n <div class=\"track\"><span [class.warn]=\"f.warning\" [style.width.%]=\"f.pct\"></span></div>\n <span class=\"ps-mono\">{{ f.value }}</span>\n </div>\n }\n } @else {\n <div class=\"ps-small ps-muted\">No feature-importance data was recorded for this model.</div>\n }\n </div>\n </div>\n\n <!-- leakage sign-off gate -->\n @if (importance.length > 0) {\n <div class=\"ps-callout gate\" [class.success]=\"!leakageFlagged\" [class.warn]=\"leakageFlagged\">\n <i [class]=\"leakageFlagged ? 'fa-solid fa-triangle-exclamation' : 'fa-solid fa-shield-halved'\"></i>\n <div>\n @if (leakageFlagged) {\n <strong>Leakage flag raised.</strong> A single feature dominates — top importance is\n <strong>{{ topFeatureName }} at {{ topFeatureValue }}</strong>, at/above the\n <strong>{{ dominanceThreshold }}</strong> dominance threshold.\n <div class=\"ps-small\" style=\"margin-top:6px\"><i class=\"fa-solid fa-pen\"></i> Sign-off with a reason is required to publish this model.</div>\n } @else {\n <strong>Leakage gate clear.</strong> No single feature dominates — top importance is\n <strong>{{ topFeatureName }} at {{ topFeatureValue }}</strong>, below the\n <strong>{{ dominanceThreshold }}</strong> dominance threshold.\n <div class=\"ps-small\" style=\"margin-top:6px\"><i class=\"fa-solid fa-check\"></i> Sign-off required before any Validated → Published promotion.</div>\n }\n </div>\n </div>\n }\n\n <!-- actions -->\n <div class=\"ps-card\">\n <div class=\"ps-card-body ps-row\" style=\"align-items:center\">\n <span class=\"ps-muted ps-small\" style=\"flex:1\">{{ actionHint }}</span>\n @if (canValidate) {\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-registry-validate\" (click)=\"requestPromote('Validated')\"><i class=\"fa-solid fa-circle-check\"></i> Mark Validated</button>\n }\n @if (canPublish) {\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-registry-promote\" (click)=\"requestPromote('Published')\"><i class=\"fa-solid fa-arrow-up\"></i> Promote to Published</button>\n }\n @if (canArchive) {\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-registry-archive\" (click)=\"requestPromote('Archived')\"><i class=\"fa-solid fa-box-archive\"></i> Archive</button>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if (pending) {\n <ps-confirm-modal\n [title]=\"pendingTitle\"\n [icon]=\"pendingIcon\"\n [confirmIcon]=\"pendingIcon\"\n [confirmLabel]=\"pendingConfirmLabel\"\n [variant]=\"pendingVariant\"\n [showReason]=\"pending.leakageFlagged || pending.targetStatus === 'Archived'\"\n [reasonRequired]=\"pending.leakageFlagged\"\n [reasonLabel]=\"pending.leakageFlagged ? 'Leakage sign-off reason' : 'Reason (optional)'\"\n [reasonPlaceholder]=\"pending.leakageFlagged ? 'Explain why this model is safe to publish despite the leakage flag…' : 'Add an optional note for the record…'\"\n [busy]=\"busy\"\n (confirmed)=\"confirmPromote($event)\"\n (cancelled)=\"cancelPromote()\">\n <div [innerHTML]=\"pendingMessage\"></div>\n </ps-confirm-modal>\n }\n </div>\n `,\n})\nexport class PSRegistryComponent implements OnInit {\n @Input() engine!: PredictiveStudioEngine;\n /** Provider to route the promote Remote Op + engine refresh through (multi-provider correctness). */\n @Input() provider: IMetadataProvider | null = null;\n /** Acting user for the engine refresh after a mutation. */\n @Input() currentUser: UserInfo | null = null;\n\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n\n public models: ModelRowVM[] = [];\n public selectedId = '';\n public lifecycleSteps = PS_LIFECYCLE_STEPS;\n public readonly dominanceThreshold = PS_FEATURE_DOMINANCE_THRESHOLD.toFixed(2);\n\n /** Pending confirmation (null when no modal is open). */\n public pending: PendingPromotion | null = null;\n /** Remote Op in flight — drives the modal spinner + disables the buttons. */\n public busy = false;\n\n ngOnInit(): void {\n this.buildModels();\n this.selectedId = this.models[0]?.id ?? '';\n }\n\n // ---- selection + master list ----\n\n public select(id: string): void {\n this.selectedId = id;\n }\n\n public get selected(): ModelRowVM {\n return this.models.find((m) => m.id === this.selectedId) ?? this.models[0] ?? this.placeholder();\n }\n\n private get selectedEntity(): MJMLModelEntity | undefined {\n return this.engine?.Models.find((m) => UUIDsEqual(m.ID, this.selectedId));\n }\n\n // ---- live detail: feature importance + metrics ----\n\n /** Top-6 feature importance bars parsed live from the selected model's `FeatureImportance` JSON, with humanized display names. */\n public get importance(): PSFeatureBar[] {\n return parseFeatureImportance(this.selectedEntity?.FeatureImportance, 6).map((b) => ({\n ...b,\n name: humanizeFeatureName(b.name),\n }));\n }\n\n public get importanceCaption(): string {\n const n = this.importance.length;\n return n === 0 ? 'no data' : `normalized · top ${n}`;\n }\n\n public get topFeatureName(): string {\n return this.importance[0]?.name ?? '—';\n }\n public get topFeatureValue(): string {\n return this.importance[0]?.value ?? '—';\n }\n\n /** True when a single feature's |importance| meets/exceeds the dominance threshold. */\n public get leakageFlagged(): boolean {\n const max = maxFeatureImportance(this.selectedEntity?.FeatureImportance);\n return max != null && max >= PS_FEATURE_DOMINANCE_THRESHOLD;\n }\n\n /** Holdout AUC hero number, formatted, or '—'. */\n public get trainAuc(): string {\n const train = parseMetrics(this.selectedEntity?.Metrics).AUC;\n return train != null ? train.toFixed(3) : '—';\n }\n\n /** Secondary metric tiles (precision/recall/F1/log-loss/…) — only those actually recorded. */\n public get secondaryMetrics(): PSMetricDisplay[] {\n const e = this.selectedEntity;\n if (!e) return [];\n // Prefer holdout metrics for the honest secondary numbers; fall back to training metrics.\n const holdout = metricsToDisplay(parseMetrics(e.HoldoutMetrics));\n return holdout.length > 0 ? holdout : metricsToDisplay(parseMetrics(e.Metrics));\n }\n\n /** The formatted train–holdout overfit gap, or '' when not computable. */\n public get gapText(): string {\n const gap = overfitGap(this.selectedEntity ?? { Metrics: null, HoldoutMetrics: null });\n return gap == null ? '' : Math.abs(gap).toFixed(3);\n }\n\n public get gapVerdict(): string {\n const gap = overfitGap(this.selectedEntity ?? { Metrics: null, HoldoutMetrics: null });\n if (gap == null) return '';\n return gap > 0.1 ? 'is wide — watch for overfitting' : 'is within tolerance — no overfitting flag';\n }\n\n public get targetSuffix(): string {\n const target = this.selectedEntity?.TargetVariable;\n return target ? ` · predicts ${target}` : '';\n }\n\n // ---- lifecycle stepper ----\n\n public statusClass(status: string): string {\n switch (status) {\n case 'Published': return 'pub';\n case 'Validated': return 'val';\n case 'Draft': return 'dr';\n case 'Archived': return 'arc';\n default: return 'dr';\n }\n }\n\n public statusBadgeClass(status: string): string {\n switch (status) {\n case 'Published': return 'green';\n case 'Validated': return 'blue';\n case 'Archived': return 'gray';\n default: return 'amber';\n }\n }\n\n /** Stepper state for a lifecycle step relative to the selected model's status. */\n public stepState(step: PSLifecycleStep): 'done' | 'curr' | 'todo' {\n const order = PS_LIFECYCLE_STEPS.indexOf(this.selected.status as PSLifecycleStep);\n const idx = PS_LIFECYCLE_STEPS.indexOf(step);\n if (order < 0) return 'todo';\n if (idx < order) return 'done';\n if (idx === order) return 'curr';\n return 'todo';\n }\n\n // ---- promote/archive availability ----\n\n public get canValidate(): boolean {\n return this.selected.status === 'Draft';\n }\n public get canPublish(): boolean {\n return this.selected.status === 'Validated' || this.selected.status === 'Draft';\n }\n public get canArchive(): boolean {\n return this.selected.status === 'Published' || this.selected.status === 'Validated';\n }\n\n public get actionHint(): string {\n switch (this.selected.status) {\n case 'Published': return 'This model is live. Archiving detaches its scoring bindings.';\n case 'Validated': return 'Validated and ready to publish — publishing makes it available for scoring.';\n case 'Draft': return 'Newly registered. Validate it before publishing to production.';\n case 'Archived': return 'Archived — superseded by a newer model.';\n default: return '';\n }\n }\n\n // ---- promote/archive flow (Remote Op) ----\n\n /** Open the confirmation modal for a lifecycle transition. */\n public requestPromote(targetStatus: PredictiveStudioModelTargetStatus): void {\n const entity = this.selectedEntity;\n if (!entity) return;\n this.pending = {\n modelId: entity.ID,\n modelName: this.selected.name,\n targetStatus,\n leakageFlagged: targetStatus === 'Published' && this.leakageFlagged,\n };\n }\n\n public cancelPromote(): void {\n if (this.busy) return;\n this.pending = null;\n }\n\n public get pendingTitle(): string {\n if (!this.pending) return '';\n return this.pending.targetStatus === 'Archived' ? 'Archive model' : `Promote to ${this.pending.targetStatus}`;\n }\n public get pendingIcon(): string {\n if (!this.pending) return 'fa-solid fa-check';\n return this.pending.targetStatus === 'Archived' ? 'fa-solid fa-box-archive' : 'fa-solid fa-arrow-up';\n }\n public get pendingConfirmLabel(): string {\n if (!this.pending) return 'Confirm';\n return this.pending.targetStatus === 'Archived' ? 'Archive' : `Promote to ${this.pending.targetStatus}`;\n }\n public get pendingVariant(): 'info' | 'warn' | 'danger' {\n if (!this.pending) return 'info';\n if (this.pending.targetStatus === 'Archived') return 'warn';\n return this.pending.leakageFlagged ? 'warn' : 'info';\n }\n public get pendingMessage(): string {\n if (!this.pending) return '';\n const name = escapeHtml(this.pending.modelName);\n if (this.pending.targetStatus === 'Archived') {\n return `Archive <strong>${name}</strong>? This detaches any active scoring bindings and removes it from production scoring. The model artifact remains immutable and recoverable.`;\n }\n if (this.pending.leakageFlagged) {\n return `<strong>${name}</strong> is flagged for possible target leakage. Publishing requires an explicit sign-off — confirm you understand the risk and provide a reason below.`;\n }\n return `Promote <strong>${name}</strong> to <strong>${this.pending.targetStatus}</strong>? This changes only the lifecycle state — the trained weights never change.`;\n }\n\n /** Run the promote Remote Op, then refresh the engine + close on success. */\n public async confirmPromote(reason: string): Promise<void> {\n if (!this.pending || this.busy) return;\n this.busy = true;\n const { modelId, modelName, targetStatus, leakageFlagged } = this.pending;\n try {\n const op = new PredictiveStudioPromoteModelOperation();\n const result = await op.Execute(\n { modelId, targetStatus, signOff: leakageFlagged ? true : undefined, reason: reason || undefined },\n { provider: this.provider ?? undefined, user: this.currentUser ?? undefined },\n );\n if (result.Success && result.Output?.promoted) {\n this.notifications.CreateSimpleNotification(\n `${modelName} → ${result.Output.status}`,\n 'success',\n 3500,\n );\n await this.refreshAfterMutation();\n this.pending = null;\n } else {\n this.notifications.CreateSimpleNotification(\n result.ErrorMessage || `Could not promote ${modelName} (status: ${result.Output?.status ?? 'unchanged'}).`,\n 'error',\n 5000,\n );\n }\n } catch (e) {\n this.notifications.CreateSimpleNotification(\n `Promotion failed: ${e instanceof Error ? e.message : String(e)}`,\n 'error',\n 5000,\n );\n } finally {\n this.busy = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Force-refresh the engine's cached models, then rebuild the master list. */\n private async refreshAfterMutation(): Promise<void> {\n const provider = this.provider ?? undefined;\n await this.engine.Config(true, this.currentUser ?? undefined, provider);\n this.buildModels();\n if (!this.models.some((m) => m.id === this.selectedId)) {\n this.selectedId = this.models[0]?.id ?? '';\n }\n this.cdr.detectChanges();\n }\n\n // ---- master-list view-models ----\n\n private buildModels(): void {\n this.models = (this.engine?.Models ?? []).map((m) => this.toVM(m));\n }\n\n private toVM(m: MJMLModelEntity): ModelRowVM {\n const holdout = primaryAuc(m);\n return {\n id: m.ID,\n name: this.engine.ModelDisplayName(m),\n version: m.Version,\n algorithm: this.engine.AlgorithmName(m.AlgorithmID),\n holdoutAuc: holdout != null ? holdout.toFixed(3) : '—',\n status: m.Status,\n iconClass: 'xgb',\n };\n }\n\n private placeholder(): ModelRowVM {\n return { id: '', name: 'No model', version: 0, algorithm: '—', holdoutAuc: '—', status: 'Draft', iconClass: 'xgb' };\n }\n}\n\n/** Minimal HTML-escape for interpolating model names into the modal's innerHTML message. */\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n"]}
1
+ {"version":3,"file":"ps-registry.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-registry.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, Input, OnInit, ViewEncapsulation, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AngularSplitModule } from 'angular-split';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { IMetadataProvider, UserInfo } from '@memberjunction/core';\nimport { MJMLModelEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { PSModelDetailComponent } from '@memberjunction/ng-core-entity-forms';\nimport { PredictiveStudioEngine } from '../engine/predictive-studio.engine';\nimport { primaryAuc, primaryModelScore, formatMetricValue } from '../predictive-studio.view-models';\n\ninterface ModelRowVM {\n id: string;\n name: string;\n version: number;\n algorithm: string;\n holdoutAuc: string;\n holdoutScore: string;\n scoreLabel: string;\n status: string;\n iconClass: string;\n}\n\n/**\n * Model Registry panel: master list of trained ML Models + a rich detail pane rendered via the unified\n * {@link PSModelDetailComponent}. Includes resizable split layout with user preference persistence via\n * UserInfoEngine and collapse/expand support.\n *\n * 100% entity-agnostic — model names derive from the producing pipeline, never any business entity.\n */\n@Component({\n standalone: true,\n selector: 'ps-registry',\n imports: [CommonModule, AngularSplitModule, PSModelDetailComponent],\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['../predictive-studio.shared.css', './ps-registry.component.css'],\n template: `\n <div class=\"ps-panel ps-registry\" data-testid=\"ps-registry-panel\">\n @if (models.length === 0) {\n <div class=\"ps-empty\" data-testid=\"ps-registry-empty\">\n <span class=\"ps-empty-ico\"><i class=\"fa-solid fa-cubes\"></i></span>\n <h3>No trained models yet</h3>\n <p>Train a pipeline to register your first immutable model. Each successful training run produces a versioned model you can validate, publish, and score with here.</p>\n </div>\n } @else {\n <div class=\"reg-layout\" [class.list-collapsed]=\"isListCollapsed\">\n @if (isListCollapsed) {\n <div class=\"reg-collapsed-strip\" role=\"region\" aria-label=\"Model registry list (collapsed)\">\n <button class=\"reg-rail-collapse\" type=\"button\" (click)=\"toggleList()\" aria-label=\"Expand models list\" title=\"Expand list\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n <div class=\"reg-collapsed-strip-label\"><i class=\"fa-solid fa-cubes\"></i></div>\n </div>\n }\n\n <as-split direction=\"horizontal\" class=\"reg-splitter\" unit=\"percent\" [gutterSize]=\"6\" (dragEnd)=\"onSplitDragEnd($event.sizes)\">\n @if (!isListCollapsed) {\n <as-split-area [size]=\"listSizePct\" [minSize]=\"18\" [maxSize]=\"50\">\n <!-- master list -->\n <div class=\"ps-card mlist\" data-testid=\"ps-registry-list\">\n <div class=\"ps-card-head\">\n <h3>ML Models</h3>\n <div style=\"display:flex;gap:6px;align-items:center\">\n <span class=\"ps-badge gray\">{{ models.length }}</span>\n <button class=\"reg-collapse-btn\" type=\"button\" (click)=\"toggleList()\" title=\"Collapse list\" aria-label=\"Collapse list\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n </div>\n </div>\n <div class=\"ps-card-body\" style=\"padding:8px\">\n @for (m of models; track m.id) {\n <div class=\"mrow\" data-testid=\"ps-registry-row\" [class.sel]=\"m.id === selectedId\" [class.arc]=\"m.status === 'Archived'\" (click)=\"select(m.id)\">\n <div class=\"ico\" [class]=\"m.iconClass\"><i class=\"fa-solid fa-cube\"></i></div>\n <div style=\"flex:1;min-width:0\">\n <div class=\"nm\">{{ m.name }}</div>\n <div class=\"ln2 ps-muted ps-small\">v{{ m.version }} &bull; {{ m.algorithm }}</div>\n </div>\n <div class=\"auc\">\n <div class=\"v\">{{ m.holdoutScore }}</div>\n <div class=\"st\" [class]=\"statusClass(m.status)\">{{ m.status }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n </as-split-area>\n }\n\n <as-split-area [size]=\"isListCollapsed ? 100 : detailSizePct\" [minSize]=\"50\">\n <!-- detail via unified PSModelDetailComponent -->\n <div class=\"ps-col detail\" data-testid=\"ps-registry-detail\">\n @if (selectedEntity) {\n <ps-model-detail\n [model]=\"selectedEntity\"\n [displayName]=\"engine ? engine.ModelDisplayName(selectedEntity) : undefined\"\n [provider]=\"provider\"\n [currentUser]=\"currentUser\"\n (statusChanged)=\"onModelStatusChanged($event)\">\n </ps-model-detail>\n } @else {\n <div class=\"ps-empty\" style=\"padding: 40px 20px;\">\n <p class=\"ps-muted\">Select a model to view details.</p>\n </div>\n }\n </div>\n </as-split-area>\n </as-split>\n </div>\n }\n </div>\n `,\n})\nexport class PSRegistryComponent implements OnInit {\n @Input() engine!: PredictiveStudioEngine;\n /** Provider to route the promote Remote Op + engine refresh through (multi-provider correctness). */\n @Input() provider: IMetadataProvider | null = null;\n /** Acting user for the engine refresh after a mutation. */\n @Input() currentUser: UserInfo | null = null;\n\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n\n public models: ModelRowVM[] = [];\n public selectedId = '';\n\n // Resizable split state\n public listSizePct = 28;\n public detailSizePct = 72;\n public isListCollapsed = false;\n\n private _initialModelId?: string;\n @Input()\n public set initialModelId(id: string | undefined) {\n this._initialModelId = id;\n if (id) {\n if (this.models.length === 0 || !this.models.some((m) => UUIDsEqual(m.id, id))) {\n this.buildModels();\n }\n if (this.models.some((m) => UUIDsEqual(m.id, id))) {\n this.selectedId = id;\n }\n this.cdr.detectChanges();\n }\n }\n public get initialModelId(): string | undefined {\n return this._initialModelId;\n }\n\n ngOnInit(): void {\n const saved = UserInfoEngine.Instance.GetSetting('mj.predictiveStudio.registry.layout');\n if (saved) {\n try {\n const prefs = JSON.parse(saved);\n if (typeof prefs.listSizePct === 'number') this.listSizePct = prefs.listSizePct;\n if (typeof prefs.detailSizePct === 'number') this.detailSizePct = prefs.detailSizePct;\n if (typeof prefs.isListCollapsed === 'boolean') this.isListCollapsed = prefs.isListCollapsed;\n } catch {\n // ignore malformed pref\n }\n }\n\n this.buildModels();\n if (this._initialModelId && this.models.some((m) => UUIDsEqual(m.id, this._initialModelId))) {\n this.selectedId = this._initialModelId;\n } else {\n this.selectedId = this.models[0]?.id ?? '';\n }\n }\n\n // ---- splitter resizing & persistence ----\n\n public onSplitDragEnd(sizes: readonly (number | '*')[]): void {\n if (Array.isArray(sizes) && sizes.length === 2 && typeof sizes[0] === 'number' && typeof sizes[1] === 'number') {\n this.listSizePct = Math.round(sizes[0]);\n this.detailSizePct = Math.round(sizes[1]);\n this.saveLayoutPrefs();\n }\n }\n\n public toggleList(): void {\n this.isListCollapsed = !this.isListCollapsed;\n this.saveLayoutPrefs();\n this.cdr.markForCheck();\n }\n\n private saveLayoutPrefs(): void {\n const prefs = {\n listSizePct: this.listSizePct,\n detailSizePct: this.detailSizePct,\n isListCollapsed: this.isListCollapsed,\n };\n UserInfoEngine.Instance.SetSettingDebounced('mj.predictiveStudio.registry.layout', JSON.stringify(prefs));\n }\n\n // ---- selection + master list ----\n\n public select(id: string): void {\n this.selectedId = id;\n }\n\n public get selected(): ModelRowVM {\n return this.models.find((m) => m.id === this.selectedId) ?? this.models[0] ?? this.placeholder();\n }\n\n public get selectedEntity(): MJMLModelEntity | undefined {\n return this.engine?.Models?.find((m) => UUIDsEqual(m.ID, this.selectedId));\n }\n\n public statusClass(status: string): string {\n switch (status) {\n case 'Published': return 'pub';\n case 'Validated': return 'val';\n case 'Draft': return 'dr';\n case 'Archived': return 'arc';\n default: return 'dr';\n }\n }\n\n // ---- lifecycle change handling ----\n\n public async onModelStatusChanged(evt: { modelId: string; newStatus: string }): Promise<void> {\n await this.refreshAfterMutation();\n }\n\n /** Force-refresh the engine's cached models, then rebuild the master list. */\n private async refreshAfterMutation(): Promise<void> {\n const provider = this.provider ?? undefined;\n await this.engine.Config(true, this.currentUser ?? undefined, provider);\n this.buildModels();\n if (!this.models.some((m) => m.id === this.selectedId)) {\n this.selectedId = this.models[0]?.id ?? '';\n }\n this.cdr.detectChanges();\n }\n\n // ---- master-list view-models ----\n\n private buildModels(): void {\n this.models = (this.engine?.Models ?? []).map((m) => this.toVM(m));\n }\n\n private toVM(m: MJMLModelEntity): ModelRowVM {\n const holdout = primaryAuc(m);\n const score = primaryModelScore(m);\n const formattedScore = score != null ? formatMetricValue(score.key, score.value) : (holdout != null ? holdout.toFixed(3) : '—');\n return {\n id: m.ID,\n name: this.engine?.ModelDisplayName ? this.engine.ModelDisplayName(m) : (m.Pipeline || `Model v${m.Version}`),\n version: m.Version,\n algorithm: this.engine?.AlgorithmName ? this.engine.AlgorithmName(m.AlgorithmID) : (m.Algorithm || 'Algorithm'),\n holdoutAuc: holdout != null ? holdout.toFixed(3) : formattedScore,\n holdoutScore: formattedScore,\n scoreLabel: score?.label ?? 'AUC',\n status: m.Status,\n iconClass: 'xgb',\n };\n }\n\n private placeholder(): ModelRowVM {\n return { id: '', name: 'No model', version: 0, algorithm: '—', holdoutAuc: '—', holdoutScore: '—', scoreLabel: 'AUC', status: 'Draft', iconClass: 'xgb' };\n }\n}\n"]}
@@ -0,0 +1,49 @@
1
+ import { EventEmitter, OnInit } from '@angular/core';
2
+ import { IMetadataProvider, UserInfo } from '@memberjunction/core';
3
+ import { MJMLAlgorithmEntity, MJMLTrainingPipelineEntity } from '@memberjunction/core-entities';
4
+ import { PredictiveStudioEngine } from '../engine/predictive-studio.engine';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Manual Experiment Runner modal — lets data scientists configure and launch a
8
+ * multi-algorithm tournament session on an existing training pipeline.
9
+ */
10
+ export declare class PSRunExperimentModalComponent implements OnInit {
11
+ engine: PredictiveStudioEngine;
12
+ provider: IMetadataProvider | null;
13
+ currentUser: UserInfo | null;
14
+ preselectedPipelineId?: string;
15
+ closed: EventEmitter<void>;
16
+ started: EventEmitter<string>;
17
+ private cdr;
18
+ private notifications;
19
+ selectedPipelineId: string;
20
+ sessionName: string;
21
+ goal: string;
22
+ successMetric: 'AUC' | 'F1' | 'Accuracy' | 'RMSE' | 'MAE' | 'R2';
23
+ problemType: 'classification' | 'regression';
24
+ selectedAlgoIds: Set<string>;
25
+ budgetRuns: number;
26
+ budgetCost: number;
27
+ budgetMinutes: number;
28
+ holdoutPercent: number;
29
+ busy: boolean;
30
+ ngOnInit(): void;
31
+ get availableAlgorithms(): MJMLAlgorithmEntity[];
32
+ get selectedPipeline(): MJMLTrainingPipelineEntity | undefined;
33
+ onPipelineChange(newId: string): void;
34
+ private syncFromSelectedPipeline;
35
+ selectRecommendedAlgos(): void;
36
+ selectAllAlgos(): void;
37
+ clearAlgos(): void;
38
+ isAlgoSelected(id: string): boolean;
39
+ toggleAlgo(id: string): void;
40
+ getAlgoIcon(driverClass: string): string;
41
+ get isValid(): boolean;
42
+ cancel(): void;
43
+ onBackdropClick(event: MouseEvent): void;
44
+ launch(): Promise<void>;
45
+ private parseJson;
46
+ static ɵfac: i0.ɵɵFactoryDeclaration<PSRunExperimentModalComponent, never>;
47
+ static ɵcmp: i0.ɵɵComponentDeclaration<PSRunExperimentModalComponent, "ps-run-experiment-modal", never, { "engine": { "alias": "engine"; "required": false; }; "provider": { "alias": "provider"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "preselectedPipelineId": { "alias": "preselectedPipelineId"; "required": false; }; }, { "closed": "closed"; "started": "started"; }, never, never, true, never>;
48
+ }
49
+ //# sourceMappingURL=ps-run-experiment-modal.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ps-run-experiment-modal.component.d.ts","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-run-experiment-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EAEZ,MAAM,EAIP,MAAM,eAAe,CAAC;AAMvB,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAE3B,MAAM,+BAA+B,CAAC;AAWvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;;AAY5E;;;GAGG;AACH,qBA6Ja,6BAA8B,YAAW,MAAM;IACjD,MAAM,EAAG,sBAAsB,CAAC;IAChC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAC1C,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE9B,MAAM,qBAA4B;IAClC,OAAO,uBAA8B;IAE/C,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,aAAa,CAAiC;IAE/C,kBAAkB,SAAM;IACxB,WAAW,SAAM;IACjB,IAAI,SAAM;IACV,aAAa,EAAE,KAAK,GAAG,IAAI,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,CAAS;IACzE,WAAW,EAAE,gBAAgB,GAAG,YAAY,CAAoB;IAEhE,eAAe,cAAqB;IAEpC,UAAU,SAAM;IAChB,UAAU,SAAM;IAChB,aAAa,SAAM;IACnB,cAAc,SAAM;IAEpB,IAAI,UAAS;IAEpB,QAAQ,IAAI,IAAI;IAUhB,IAAW,mBAAmB,IAAI,mBAAmB,EAAE,CAEtD;IAED,IAAW,gBAAgB,IAAI,0BAA0B,GAAG,SAAS,CAEpE;IAEM,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5C,OAAO,CAAC,wBAAwB;IAUzB,sBAAsB,IAAI,IAAI;IAmB9B,cAAc,IAAI,IAAI;IAItB,UAAU,IAAI,IAAI;IAIlB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAInC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ5B,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAQ/C,IAAW,OAAO,IAAI,OAAO,CAQ5B;IAEM,MAAM,IAAI,IAAI;IAKd,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAMlC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAqHpC,OAAO,CAAC,SAAS;yCArPN,6BAA6B;2CAA7B,6BAA6B;CA8PzC"}