@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-production.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-production.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit, ViewEncapsulation, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { RunView } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJMLModelEntity, MJMLModelScoringBindingEntity, MJProcessRunDetailEntity } from '@memberjunction/core-entities';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { PredictiveStudioEngine } from '../engine/predictive-studio.engine';\nimport { PSProcessRunRow, primaryAuc } from '../predictive-studio.view-models';\nimport { humanizeCron, StatusVariant } from '../production-distribution';\nimport { PSOperateDialogComponent } from './ps-operate-dialog.component';\n\n/** A model's deployment state, derived purely from cached bindings + Record Processes. */\ntype DeployState = 'bound' | 'scheduled' | 'idle';\n\n/** One scoring binding shown in a model's deployment detail. */\ninterface BindingVM {\n id: string;\n targetEntity: string;\n targetColumn: string;\n mode: string;\n schedulePhrase: string | null;\n}\n\n/** One published model in the production control tower (DB-light — all fields from engine caches). */\ninterface ProductionModelVM {\n modelId: string;\n label: string;\n algorithm: string;\n problemType: string;\n version: number;\n holdoutMetric: string;\n deployState: DeployState;\n bindingCount: number;\n processCount: number;\n scheduledCount: number;\n /** Most recent scored-at across the model's bindings (cached lineage — no DB hit). */\n lastScoredAt: Date | null;\n lastRowCount: number | null;\n}\n\n/** One per-record prediction in a run's drill-in (parsed from `MJ: Process Run Details` `ResultPayload`). */\ninterface RunDetailVM {\n recordId: string;\n status: string;\n /** Formatted numeric prediction, or '—'. */\n score: string;\n /** Predicted class label (classification), or null. */\n class: string | null;\n /** ISO timestamp the prediction was produced (`$.scoredAt`), or the detail's completion time. */\n scoredAt: string | null;\n}\n\n/**\n * Models in Production — the **model-centric** control tower. Every approved (Published) model appears\n * here whether it's idle, scheduled, or bound — a scoring binding is a *deployment marker*, not a\n * prerequisite to appear or to run. Reactive + DB-light: the published-model list and each model's\n * deployment state come straight from the `PredictiveStudioEngine` caches (a `BaseEngine` subclass) via\n * `ObserveProperty`, so it re-renders on any model/binding change with no polling; a model's **past runs**\n * are loaded on demand when selected (`MJ: Process Runs` grow unbounded — never bulk-cached).\n *\n * Entity-agnostic: model labels derive from the producing pipeline; binding targets come from the binding\n * rows. **Operate** (the rocket button) opens the {@link PSOperateDialogComponent} to run/schedule/bind the\n * model; clicking a run drills into its per-record predictions (`MJ: Process Run Details`).\n */\n@Component({\n standalone: true,\n selector: 'ps-production',\n imports: [CommonModule, SharedGenericModule, MJButtonDirective, PSOperateDialogComponent],\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['../predictive-studio.shared.css', './ps-production.component.css'],\n template: `\n <div class=\"ps-panel ps-production\" data-testid=\"ps-production-panel\">\n @if (models.length === 0) {\n <div class=\"ps-empty\" data-testid=\"ps-production-empty\">\n <span class=\"ps-empty-ico\"><i class=\"fa-solid fa-satellite-dish\"></i></span>\n <h3>No models in production yet</h3>\n <p>\n When you publish a trained model in the Model Registry it shows up here — ready to schedule,\n bind to a column, and run. Train a pipeline and promote the model to Published to get started.\n </p>\n </div>\n } @else {\n <!-- KPI strip -->\n <div class=\"prod-kpis\" data-testid=\"ps-production-kpis\">\n <div class=\"ps-kpi\"><div class=\"label\">Published</div><div class=\"val\">{{ models.length }}</div></div>\n <div class=\"ps-kpi\"><div class=\"label\">Scheduled</div><div class=\"val\">{{ scheduledModelCount }}</div></div>\n <div class=\"ps-kpi\"><div class=\"label\">Bound (write-back)</div><div class=\"val\">{{ boundModelCount }}</div></div>\n <div class=\"ps-kpi\"><div class=\"label\">Idle</div><div class=\"val\">{{ idleModelCount }}</div></div>\n </div>\n\n <div class=\"prod-layout\">\n <!-- master list -->\n <div class=\"ps-card mlist\" data-testid=\"ps-production-list\">\n <div class=\"ps-card-head\"><h3>Published 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.modelId) {\n <div class=\"mrow\" data-testid=\"ps-production-row\" [class.sel]=\"m.modelId === selectedModelId\" (click)=\"select(m.modelId)\">\n <div class=\"ico\" [class]=\"'st-' + m.deployState\"><i [class]=\"deployIcon(m.deployState)\"></i></div>\n <div style=\"flex:1;min-width:0\">\n <div class=\"nm\">{{ m.label }}</div>\n <div class=\"ln2 ps-muted ps-small\">v{{ m.version }} · {{ m.algorithm }}</div>\n </div>\n <div class=\"meta\">\n <span class=\"ps-badge\" [class]=\"deployBadge(m.deployState)\">{{ deployLabel(m.deployState) }}</span>\n <div class=\"ps-mono ps-small ps-muted\">{{ m.holdoutMetric }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- detail -->\n <div class=\"ps-col detail\" data-testid=\"ps-production-detail\">\n <div class=\"ps-card\">\n <div class=\"ps-card-body dh\">\n <div class=\"big-ico\" [class]=\"'st-' + selected.deployState\"><i [class]=\"deployIcon(selected.deployState)\"></i></div>\n <div style=\"flex:1\">\n <h2 data-testid=\"ps-production-detail-name\">{{ selected.label }} <span class=\"ps-tag ps-mono\">v{{ selected.version }}</span></h2>\n <div class=\"ps-muted ps-small sub\">{{ selected.algorithm }} · {{ selected.problemType }} · holdout {{ selected.holdoutMetric }}</div>\n </div>\n <span class=\"ps-badge\" [class]=\"deployBadge(selected.deployState)\">{{ deployLabel(selected.deployState) }}</span>\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-production-operate\" (click)=\"operateOpen = true\">\n <i class=\"fa-solid fa-rocket\"></i> Operate\n </button>\n </div>\n </div>\n\n <!-- deployment status -->\n <div class=\"ps-card\">\n <div class=\"ps-card-head\"><h3>Deployment</h3>\n <span class=\"ps-muted ps-small\">{{ selected.processCount }} process{{ selected.processCount === 1 ? '' : 'es' }} · {{ selected.bindingCount }} binding{{ selected.bindingCount === 1 ? '' : 's' }}</span>\n </div>\n <div class=\"ps-card-body\">\n @if (selected.deployState === 'idle') {\n <div class=\"ps-callout info\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <div class=\"ps-small\">This model is published but <strong>not operating</strong> yet — nothing scores with it. Click <strong>Operate</strong> above to run it now, schedule it to run regularly, or write predictions back to a column.</div>\n </div>\n } @else {\n @if (selectedBindings.length > 0) {\n <div class=\"ps-section-title\">Scoring bindings</div>\n @for (b of selectedBindings; track b.id) {\n <div class=\"bind-row\">\n <i class=\"fa-solid fa-arrow-right-to-bracket ps-muted\"></i>\n <div style=\"flex:1\">\n <div class=\"ps-small\"><strong>{{ b.targetEntity }}</strong>.{{ b.targetColumn }}</div>\n <div class=\"ps-muted ps-small\">{{ b.mode }}{{ b.schedulePhrase ? ' · ' + b.schedulePhrase : '' }}</div>\n </div>\n <span class=\"ps-badge\" [class]=\"modeBadge(b.mode)\">{{ b.mode }}</span>\n </div>\n }\n } @else {\n <div class=\"ps-small ps-muted\">Scheduled to run, writing generic output to the process run history (no write-back column).</div>\n }\n @if (selected.lastScoredAt) {\n <div class=\"ps-divider\"></div>\n <div class=\"ps-row\" style=\"justify-content:space-between\"><span class=\"ps-muted ps-small\">Last scored</span><span class=\"ps-small\">{{ selected.lastScoredAt | date:'medium' }}{{ selected.lastRowCount != null ? ' · ' + selected.lastRowCount + ' rows' : '' }}</span></div>\n }\n }\n </div>\n </div>\n\n <!-- past runs (on demand) -->\n <div class=\"ps-card\">\n <div class=\"ps-card-head\"><h3>Run history</h3><span class=\"ps-muted ps-small\">last 90 days · newest first</span></div>\n <div class=\"ps-card-body\">\n @if (selectedRunId) {\n <!-- run drill-in: per-record predictions from Process Run Details -->\n <button class=\"run-back\" data-testid=\"ps-production-run-back\" (click)=\"closeRun()\">\n <i class=\"fa-solid fa-arrow-left\"></i> All runs\n </button>\n @if (loadingDetails) {\n <mj-loading text=\"Loading predictions...\" size=\"small\"></mj-loading>\n } @else if (runDetails.length === 0) {\n <div class=\"ps-small ps-muted\">No per-record predictions recorded for this run.</div>\n } @else {\n <table class=\"runs-table\" data-testid=\"ps-production-run-detail\">\n <thead><tr><th>Record</th><th>Status</th><th>Prediction</th><th>Scored</th></tr></thead>\n <tbody>\n @for (d of runDetails; track d.recordId) {\n <tr>\n <td class=\"ps-mono ps-small\">{{ d.recordId }}</td>\n <td><span class=\"ps-badge\" [class]=\"runBadge(d.status)\">{{ d.status }}</span></td>\n <td class=\"ps-mono\">{{ d.score }}@if (d.class) { <span class=\"ps-muted\"> · {{ d.class }}</span> }</td>\n <td class=\"ps-small ps-muted\">{{ d.scoredAt ? (d.scoredAt | date:'short') : '—' }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n } @else if (loadingRuns) {\n <mj-loading text=\"Loading runs...\" size=\"small\"></mj-loading>\n } @else if (runs.length === 0) {\n <div class=\"ps-small ps-muted\">No runs recorded yet. Each time this model runs as a Record Process, its predictions are saved to the process run history — even without a scoring binding.</div>\n } @else {\n <table class=\"runs-table\">\n <thead><tr><th>When</th><th>Status</th><th>Scored</th><th>Process</th><th></th></tr></thead>\n <tbody>\n @for (r of runs; track r.ID) {\n <tr data-testid=\"ps-production-run\" class=\"run-row\" (click)=\"openRun(r.ID)\">\n <td>{{ (r.StartTime || r.CreatedAt) | date:'short' }}</td>\n <td><span class=\"ps-badge\" [class]=\"runBadge(r.Status)\">{{ r.Status }}</span></td>\n <td class=\"ps-mono\">{{ r.SuccessCount }}<span class=\"ps-muted\">/{{ r.TotalItemCount ?? 0 }}</span></td>\n <td class=\"ps-small ps-muted\">{{ r.ProcessName || '—' }}</td>\n <td class=\"run-right\">@if (r.DryRun) { <span class=\"ps-tag amber\">dry run</span> }<i class=\"fa-solid fa-chevron-right ps-muted\"></i></td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n </div>\n </div>\n\n <ps-operate-dialog\n [Visible]=\"operateOpen\"\n [modelId]=\"selected.modelId\"\n [modelLabel]=\"selected.label\"\n [engine]=\"engine\"\n [provider]=\"ProviderToUse\"\n [currentUser]=\"ProviderToUse.CurrentUser\"\n (Close)=\"onOperateClose($event)\">\n </ps-operate-dialog>\n }\n </div>\n `,\n})\nexport class PSProductionComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() engine!: PredictiveStudioEngine;\n\n private cdr = inject(ChangeDetectorRef);\n private modelsSub?: Subscription;\n\n public models: ProductionModelVM[] = [];\n public selectedModelId = '';\n public selectedBindings: BindingVM[] = [];\n public runs: PSProcessRunRow[] = [];\n public loadingRuns = false;\n /** Whether the \"Operate this model\" dialog is open for the selected model. */\n public operateOpen = false;\n /** The run whose per-record predictions are drilled into (null = the run list). */\n public selectedRunId: string | null = null;\n public runDetails: RunDetailVM[] = [];\n public loadingDetails = false;\n\n ngOnInit(): void {\n // Reactive: rebuild the published-model list on any MJ: ML Models change (save/delete/remote-invalidate).\n this.modelsSub = this.engine\n .ObserveProperty<MJMLModelEntity>('_Models')\n .subscribe(() => {\n this.rebuildModels();\n this.cdr.detectChanges();\n });\n }\n\n ngOnDestroy(): void {\n this.modelsSub?.unsubscribe();\n }\n\n // ---- KPIs ----\n\n public get scheduledModelCount(): number {\n return this.models.filter((m) => m.deployState === 'scheduled' || m.scheduledCount > 0).length;\n }\n public get boundModelCount(): number {\n return this.models.filter((m) => m.bindingCount > 0).length;\n }\n public get idleModelCount(): number {\n return this.models.filter((m) => m.deployState === 'idle').length;\n }\n\n // ---- reactive list build (DB-light, from caches) ----\n\n private rebuildModels(): void {\n this.models = (this.engine?.PublishedModels ?? []).map((m) => this.toVM(m));\n if (!this.models.some((m) => UUIDsEqual(m.modelId, this.selectedModelId))) {\n const first = this.models[0]?.modelId ?? '';\n if (first) {\n this.select(first);\n } else {\n this.selectedModelId = '';\n this.selectedBindings = [];\n this.runs = [];\n }\n } else {\n this.selectedBindings = this.bindingsForModel(this.selectedModelId);\n }\n }\n\n private toVM(m: MJMLModelEntity): ProductionModelVM {\n const bindings = this.engine.ScoringBindings.filter((b) => UUIDsEqual(b.MLModelID, m.ID));\n const processes = this.engine.RecordProcessesForModel(m.ID);\n const scheduledCount = processes.filter((p) => !!p.ScheduleEnabled).length\n + bindings.filter((b) => b.Mode === 'Scheduled').length;\n const lastScoredAt = bindings.reduce<Date | null>(\n (acc, b) => (b.LastScoredAt && (!acc || b.LastScoredAt.getTime() > acc.getTime()) ? b.LastScoredAt : acc),\n null,\n );\n const lastRowCount = bindings.find((b) => b.LastRowCount != null)?.LastRowCount ?? null;\n const auc = primaryAuc(m);\n return {\n modelId: m.ID,\n label: this.engine.ModelDisplayName(m),\n algorithm: this.engine.AlgorithmName(m.AlgorithmID),\n problemType: m.ProblemType ?? '—',\n version: m.Version,\n holdoutMetric: auc != null ? auc.toFixed(3) : '—',\n deployState: bindings.length > 0 ? 'bound' : scheduledCount > 0 ? 'scheduled' : 'idle',\n bindingCount: bindings.length,\n processCount: processes.length,\n scheduledCount,\n lastScoredAt,\n lastRowCount,\n };\n }\n\n private bindingsForModel(modelId: string): BindingVM[] {\n return this.engine.ScoringBindings\n .filter((b) => UUIDsEqual(b.MLModelID, modelId))\n .map((b) => this.toBindingVM(b));\n }\n\n private toBindingVM(b: MJMLModelScoringBindingEntity): BindingVM {\n const process = this.engine.RecordProcessByID(b.RecordProcessID);\n return {\n id: b.ID,\n targetEntity: this.resolveEntityName(b),\n targetColumn: b.TargetColumn ?? '(generic output)',\n mode: b.Mode,\n schedulePhrase: b.Mode === 'Scheduled' ? humanizeCron(process?.CronExpression ?? null) : null,\n };\n }\n\n private resolveEntityName(b: MJMLModelScoringBindingEntity): string {\n if (b.TargetEntity) return b.TargetEntity;\n if (b.TargetEntityID) {\n const entity = this.ProviderToUse.Entities.find((e) => UUIDsEqual(e.ID, b.TargetEntityID));\n if (entity) return entity.Name;\n }\n return '—';\n }\n\n // ---- selection + on-demand run history ----\n\n public get selected(): ProductionModelVM {\n return (\n this.models.find((m) => UUIDsEqual(m.modelId, this.selectedModelId)) ??\n this.models[0] ?? {\n modelId: '', label: '—', algorithm: '—', problemType: '—', version: 0, holdoutMetric: '—',\n deployState: 'idle', bindingCount: 0, processCount: 0, scheduledCount: 0, lastScoredAt: null, lastRowCount: null,\n }\n );\n }\n\n /**\n * Close the Operate dialog. On a successful change the dialog already refreshed the engine\n * (Config(true)) — the reactive `_Models` subscription re-renders the deploy state — but the\n * on-demand run history + bindings of the SELECTED model are not part of that stream, so reload them\n * here so a just-created run / binding shows immediately.\n */\n public onOperateClose(result: { changed: boolean }): void {\n this.operateOpen = false;\n if (result.changed && this.selectedModelId) {\n this.selectedBindings = this.bindingsForModel(this.selectedModelId);\n void this.loadRuns(this.selectedModelId);\n }\n }\n\n public select(id: string): void {\n this.selectedModelId = id;\n this.selectedBindings = this.bindingsForModel(id);\n this.closeRun();\n void this.loadRuns(id);\n }\n\n // ---- run drill-in: per-record predictions (on demand) ----\n\n /** Drill into a run's per-record predictions (`MJ: Process Run Details` `ResultPayload`). */\n public openRun(runId: string): void {\n this.selectedRunId = runId;\n void this.loadRunDetails(runId);\n }\n\n public closeRun(): void {\n this.selectedRunId = null;\n this.runDetails = [];\n }\n\n private async loadRunDetails(runId: string): Promise<void> {\n this.loadingDetails = true;\n this.runDetails = [];\n this.cdr.detectChanges();\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const r = await rv.RunView<MJProcessRunDetailEntity>(\n {\n EntityName: 'MJ: Process Run Details',\n ExtraFilter: `ProcessRunID='${runId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n MaxRows: 200,\n ResultType: 'entity_object',\n },\n this.ProviderToUse.CurrentUser,\n );\n this.runDetails = r.Success ? (r.Results ?? []).map((d) => this.toDetailVM(d)) : [];\n } finally {\n this.loadingDetails = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Project a Process Run Detail into a per-record prediction row, parsing the ML `ResultPayload`. */\n private toDetailVM(d: MJProcessRunDetailEntity): RunDetailVM {\n let score = '—';\n let cls: string | null = null;\n let scoredAt: string | null = d.CompletedAt ? d.CompletedAt.toISOString() : null;\n if (d.ResultPayload) {\n try {\n const p = JSON.parse(d.ResultPayload) as { score?: number; class?: string; scoredAt?: string };\n if (typeof p.score === 'number') {\n score = p.score.toFixed(4);\n }\n cls = p.class ?? null;\n scoredAt = p.scoredAt ?? scoredAt;\n } catch {\n /* leave defaults — a non-ML payload (or malformed) just shows '—' */\n }\n }\n return { recordId: d.RecordID ?? '—', status: d.Status, score, class: cls, scoredAt };\n }\n\n /** On-demand run history for the selected model (DB-light — only the selected model, capped). */\n private async loadRuns(modelId: string): Promise<void> {\n this.loadingRuns = true;\n this.runs = [];\n this.cdr.detectChanges();\n try {\n this.runs = await this.engine.LoadRecentRunsForModel(\n modelId,\n this.ProviderToUse,\n this.ProviderToUse.CurrentUser,\n { sinceDays: 90, maxRows: 50 },\n );\n } finally {\n this.loadingRuns = false;\n this.cdr.detectChanges();\n }\n }\n\n // ---- display helpers ----\n\n public deployIcon(state: DeployState): string {\n switch (state) {\n case 'bound': return 'fa-solid fa-arrow-right-to-bracket';\n case 'scheduled': return 'fa-solid fa-clock';\n case 'idle': return 'fa-solid fa-circle-pause';\n }\n }\n public deployLabel(state: DeployState): string {\n switch (state) {\n case 'bound': return 'Bound';\n case 'scheduled': return 'Scheduled';\n case 'idle': return 'Idle';\n }\n }\n public deployBadge(state: DeployState): StatusVariant {\n switch (state) {\n case 'bound': return 'green';\n case 'scheduled': return 'blue';\n case 'idle': return 'gray';\n }\n }\n public modeBadge(mode: string): StatusVariant {\n return mode === 'Scheduled' ? 'blue' : mode === 'Materialized' ? 'green' : 'gray';\n }\n public runBadge(status: string): StatusVariant {\n const s = (status || '').toLowerCase();\n if (s.includes('complete') || s.includes('success')) return 'green';\n if (s.includes('fail') || s.includes('error')) return 'red';\n if (s.includes('run') || s.includes('progress')) return 'blue';\n return 'gray';\n }\n}\n"]}
1
+ {"version":3,"file":"ps-production.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-production.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit, ViewEncapsulation, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { AngularSplitModule } from 'angular-split';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { RunView } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJMLModelEntity, MJMLModelScoringBindingEntity, MJProcessRunDetailEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { PredictiveStudioEngine } from '../engine/predictive-studio.engine';\nimport { PSProcessRunRow, primaryAuc, primaryModelScore, formatMetricValue } from '../predictive-studio.view-models';\nimport { humanizeCron, StatusVariant } from '../production-distribution';\nimport { PSOperateDialogComponent } from './ps-operate-dialog.component';\nimport { PSPredictionsGridComponent } from './ps-predictions-grid.component';\n\n/** A model's deployment state, derived purely from cached bindings + Record Processes. */\ntype DeployState = 'bound' | 'scheduled' | 'idle';\n\n/** One scoring binding shown in a model's deployment detail. */\ninterface BindingVM {\n id: string;\n targetEntity: string;\n targetColumn: string;\n mode: string;\n schedulePhrase: string | null;\n}\n\n/** One published model in the production control tower (DB-light — all fields from engine caches). */\ninterface ProductionModelVM {\n modelId: string;\n label: string;\n algorithm: string;\n problemType: string;\n version: number;\n holdoutMetric: string;\n deployState: DeployState;\n bindingCount: number;\n processCount: number;\n scheduledCount: number;\n /** Most recent scored-at across the model's bindings (cached lineage — no DB hit). */\n lastScoredAt: Date | null;\n lastRowCount: number | null;\n}\n\n/** One per-record prediction in a run's drill-in (parsed from `MJ: Process Run Details` `ResultPayload`). */\ninterface RunDetailVM {\n recordId: string;\n status: string;\n /** Formatted numeric prediction, or '—'. */\n score: string;\n /** Predicted class label (classification), or null. */\n class: string | null;\n /** ISO timestamp the prediction was produced (`$.scoredAt`), or the detail's completion time. */\n scoredAt: string | null;\n}\n\n/**\n * Models in Production — the **model-centric** control tower. Every approved (Published) model appears\n * here whether it's idle, scheduled, or bound — a scoring binding is a *deployment marker*, not a\n * prerequisite to appear or to run. Reactive + DB-light: the published-model list and each model's\n * deployment state come straight from the `PredictiveStudioEngine` caches (a `BaseEngine` subclass) via\n * `ObserveProperty`, so it re-renders on any model/binding change with no polling; a model's **past runs**\n * are loaded on demand when selected (`MJ: Process Runs` grow unbounded — never bulk-cached).\n *\n * Entity-agnostic: model labels derive from the producing pipeline; binding targets come from the binding\n * rows. **Operate** (the rocket button) opens the {@link PSOperateDialogComponent} to run/schedule/bind the\n * model; clicking a run drills into its per-record predictions (`MJ: Process Run Details`).\n */\n@Component({\n standalone: true,\n selector: 'ps-production',\n imports: [CommonModule, AngularSplitModule, SharedGenericModule, MJButtonDirective, PSOperateDialogComponent, PSPredictionsGridComponent],\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['../predictive-studio.shared.css', './ps-production.component.css'],\n template: `\n <div class=\"ps-panel ps-production\" data-testid=\"ps-production-panel\">\n @if (models.length === 0) {\n <div class=\"ps-empty\" data-testid=\"ps-production-empty\">\n <span class=\"ps-empty-ico\"><i class=\"fa-solid fa-satellite-dish\"></i></span>\n <h3>No models in production yet</h3>\n <p>\n When you publish a trained model in the Model Registry it shows up here — ready to schedule,\n bind to a column, and run. Train a pipeline and promote the model to Published to get started.\n </p>\n </div>\n } @else {\n <!-- KPI strip -->\n @if (!isRunFocused) {\n <div class=\"prod-kpis\" data-testid=\"ps-production-kpis\">\n <div class=\"ps-kpi\"><div class=\"label\">Published</div><div class=\"val\">{{ models.length }}</div></div>\n <div class=\"ps-kpi\"><div class=\"label\">Scheduled</div><div class=\"val\">{{ scheduledModelCount }}</div></div>\n <div class=\"ps-kpi\"><div class=\"label\">Bound (write-back)</div><div class=\"val\">{{ boundModelCount }}</div></div>\n <div class=\"ps-kpi\"><div class=\"label\">Idle</div><div class=\"val\">{{ idleModelCount }}</div></div>\n </div>\n }\n\n <div class=\"prod-layout\" [class.list-collapsed]=\"isListCollapsed\">\n @if (isListCollapsed) {\n <div class=\"prod-collapsed-strip\" data-testid=\"ps-production-collapsed-rail\">\n <button class=\"prod-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=\"prod-collapsed-strip-label\"><i class=\"fa-solid fa-satellite-dish\"></i></div>\n </div>\n }\n\n <as-split direction=\"horizontal\" class=\"prod-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-production-list\">\n <div class=\"ps-card-head\">\n <h3>Published models</h3>\n <div style=\"display:flex;gap:6px;align-items:center\">\n <span class=\"ps-badge gray\">{{ models.length }}</span>\n <button class=\"prod-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.modelId) {\n <div class=\"mrow\" data-testid=\"ps-production-row\" [class.sel]=\"m.modelId === selectedModelId\" (click)=\"select(m.modelId)\">\n <div class=\"ico\" [class]=\"'st-' + m.deployState\"><i [class]=\"deployIcon(m.deployState)\"></i></div>\n <div style=\"flex:1;min-width:0\">\n <div class=\"nm\">{{ m.label }}</div>\n <div class=\"ln2 ps-muted ps-small\">v{{ m.version }} · {{ m.algorithm }}</div>\n </div>\n <div class=\"meta\">\n <span class=\"ps-badge\" [class]=\"deployBadge(m.deployState)\">{{ deployLabel(m.deployState) }}</span>\n <div class=\"ps-mono ps-small ps-muted\">{{ m.holdoutMetric }}</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 -->\n <div class=\"ps-col detail\" [class.focused-run]=\"selectedRunId && isRunFocused\" data-testid=\"ps-production-detail\">\n <!-- 1. MODEL HEADER CARD -->\n <div class=\"ps-card prod-header-card\" [class.collapsed]=\"isHeaderCollapsed\">\n @if (!isHeaderCollapsed) {\n <div class=\"ps-card-body dh\">\n <div class=\"big-ico\" [class]=\"'st-' + selected.deployState\"><i [class]=\"deployIcon(selected.deployState)\"></i></div>\n <div style=\"flex:1;min-width:0\">\n <h2 data-testid=\"ps-production-detail-name\">{{ selected.label }} <span class=\"ps-tag ps-mono\">v{{ selected.version }}</span></h2>\n <div class=\"ps-muted ps-small sub\">{{ selected.algorithm }} · {{ selected.problemType }} · holdout {{ selected.holdoutMetric }}</div>\n </div>\n <span class=\"ps-badge\" [class]=\"deployBadge(selected.deployState)\">{{ deployLabel(selected.deployState) }}</span>\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-production-operate\" (click)=\"operateOpen = true\">\n <i class=\"fa-solid fa-rocket\"></i> Operate\n </button>\n <button class=\"ps-card-collapse-btn\" type=\"button\" (click)=\"toggleHeaderCollapse()\" title=\"Collapse model header\" aria-label=\"Collapse model header\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n </div>\n } @else {\n <div class=\"ps-card-body dh-compact\" (click)=\"toggleHeaderCollapse()\">\n <div class=\"mini-ico\" [class]=\"'st-' + selected.deployState\"><i [class]=\"deployIcon(selected.deployState)\"></i></div>\n <div class=\"compact-info\">\n <strong>{{ selected.label }}</strong>\n <span class=\"ps-tag ps-mono ps-small\">v{{ selected.version }}</span>\n <span class=\"ps-muted ps-small\">· {{ selected.algorithm }}</span>\n </div>\n <span class=\"ps-badge\" [class]=\"deployBadge(selected.deployState)\">{{ deployLabel(selected.deployState) }}</span>\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-production-operate-compact\" (click)=\"$event.stopPropagation(); operateOpen = true\">\n <i class=\"fa-solid fa-rocket\"></i> Operate\n </button>\n <button class=\"ps-card-collapse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); toggleHeaderCollapse()\" title=\"Expand model header\" aria-label=\"Expand model header\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n }\n </div>\n\n <!-- 2. DEPLOYMENT STATUS CARD -->\n <div class=\"ps-card prod-deployment-card\" [class.collapsed]=\"isDeploymentCollapsed\">\n <div class=\"ps-card-head clickable\" (click)=\"toggleDeploymentCollapse()\">\n <div style=\"display:flex;align-items:center;gap:8px\">\n <i class=\"fa-solid fa-network-wired\" style=\"color:var(--mj-brand-primary)\"></i>\n <h3>Deployment</h3>\n <span class=\"ps-muted ps-small\">{{ selected.processCount }} process{{ selected.processCount === 1 ? '' : 'es' }} · {{ selected.bindingCount }} binding{{ selected.bindingCount === 1 ? '' : 's' }}</span>\n @if (isDeploymentCollapsed && selectedBindings.length > 0) {\n <span class=\"ps-badge gray ps-small\">{{ selectedBindings[0].targetEntity }}.{{ selectedBindings[0].targetColumn }}</span>\n }\n </div>\n <div style=\"display:flex;align-items:center;gap:6px\">\n <button class=\"ps-card-collapse-btn\" type=\"button\" (click)=\"$event.stopPropagation(); toggleDeploymentCollapse()\" [title]=\"isDeploymentCollapsed ? 'Expand deployment' : 'Collapse deployment'\" [attr.aria-label]=\"isDeploymentCollapsed ? 'Expand deployment' : 'Collapse deployment'\">\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"!isDeploymentCollapsed\" [class.fa-chevron-down]=\"isDeploymentCollapsed\"></i>\n </button>\n </div>\n </div>\n @if (!isDeploymentCollapsed) {\n <div class=\"ps-card-body\">\n @if (selected.deployState === 'idle') {\n <div class=\"ps-callout info\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <div class=\"ps-small\">This model is published but <strong>not operating</strong> yet — nothing scores with it. Click <strong>Operate</strong> above to run it now, schedule it to run regularly, or write predictions back to a column.</div>\n </div>\n } @else {\n @if (selectedBindings.length > 0) {\n <div class=\"ps-section-title\">Scoring bindings</div>\n @for (b of selectedBindings; track b.id) {\n <div class=\"bind-row\">\n <i class=\"fa-solid fa-arrow-right-to-bracket ps-muted\"></i>\n <div style=\"flex:1\">\n <div class=\"ps-small\"><strong>{{ b.targetEntity }}</strong>.{{ b.targetColumn }}</div>\n <div class=\"ps-muted ps-small\">{{ b.mode }}{{ b.schedulePhrase ? ' · ' + b.schedulePhrase : '' }}</div>\n </div>\n <span class=\"ps-badge\" [class]=\"modeBadge(b.mode)\">{{ b.mode }}</span>\n </div>\n }\n } @else {\n <div class=\"ps-small ps-muted\">Scheduled to run, writing generic output to the process run history (no write-back column).</div>\n }\n @if (selected.lastScoredAt) {\n <div class=\"ps-divider\"></div>\n <div class=\"ps-row\" style=\"justify-content:space-between\"><span class=\"ps-muted ps-small\">Last scored</span><span class=\"ps-small\">{{ selected.lastScoredAt | date:'medium' }}{{ selected.lastRowCount != null ? ' · ' + selected.lastRowCount + ' rows' : '' }}</span></div>\n }\n }\n </div>\n }\n </div>\n\n <!-- 3. RUN HISTORY CARD -->\n <div class=\"ps-card run-card\" [class.drilldown-active]=\"selectedRunId\" [class.focus-fill]=\"selectedRunId && isRunFocused\">\n <div class=\"ps-card-head\">\n <div style=\"display:flex;align-items:center;gap:8px\">\n <i class=\"fa-solid fa-clock-rotate-left\" style=\"color:var(--mj-status-info)\"></i>\n <h3>Run history</h3>\n <span class=\"ps-muted ps-small\">last 90 days · newest first</span>\n </div>\n @if (selectedRunId) {\n <div style=\"display:flex;align-items:center;gap:8px\">\n <button class=\"ps-focus-toggle-btn\" type=\"button\" (click)=\"toggleRunFocus()\" [class.active]=\"isRunFocused\" [title]=\"isRunFocused ? 'Exit focus (expand header & deployment)' : 'Focus mode (collapse header & deployment)'\">\n <i class=\"fa-solid\" [class.fa-compress]=\"isRunFocused\" [class.fa-expand]=\"!isRunFocused\"></i>\n <span>{{ isRunFocused ? 'Exit Focus' : 'Focus' }}</span>\n </button>\n </div>\n }\n </div>\n <div class=\"ps-card-body run-card-body\">\n @if (selectedRunId) {\n <!-- run drill-in: unified predictions grid with virtual scrolling, name resolution, charts & history -->\n <div class=\"run-drill-nav\">\n <button class=\"run-back\" data-testid=\"ps-production-run-back\" (click)=\"closeRun()\">\n <i class=\"fa-solid fa-arrow-left\"></i> All runs\n </button>\n <span class=\"ps-tag ps-mono ps-small\">Run: {{ selectedRunId }}</span>\n </div>\n <ps-predictions-grid\n data-testid=\"ps-production-run-grid\"\n [modelId]=\"selected.modelId\"\n [runId]=\"selectedRunId\"\n [entityName]=\"selectedTargetEntityName\"\n [problemType]=\"selected.problemType\"\n [title]=\"selected.label + ' — Run Predictions'\"\n [height]=\"runGridHeight\">\n </ps-predictions-grid>\n } @else if (loadingRuns) {\n <mj-loading text=\"Loading runs...\" size=\"small\"></mj-loading>\n } @else if (runs.length === 0) {\n <div class=\"ps-small ps-muted\">No runs recorded yet. Each time this model runs as a Record Process, its predictions are saved to the process run history — even without a scoring binding.</div>\n } @else {\n <table class=\"runs-table\">\n <thead><tr><th>When</th><th>Status</th><th>Scored</th><th>Process</th><th></th></tr></thead>\n <tbody>\n @for (r of runs; track r.ID) {\n <tr data-testid=\"ps-production-run\" class=\"run-row\" (click)=\"openRun(r.ID)\">\n <td>{{ (r.StartTime || r.CreatedAt) | date:'short' }}</td>\n <td><span class=\"ps-badge\" [class]=\"runBadge(r.Status)\">{{ r.Status }}</span></td>\n <td class=\"ps-mono\">{{ r.SuccessCount }}<span class=\"ps-muted\">/{{ r.TotalItemCount ?? 0 }}</span></td>\n <td class=\"ps-small ps-muted\">{{ r.ProcessName || '—' }}</td>\n <td class=\"run-right\">@if (r.DryRun) { <span class=\"ps-tag amber\">dry run</span> }<i class=\"fa-solid fa-chevron-right ps-muted\"></i></td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n </div>\n </as-split-area>\n </as-split>\n </div>\n\n <ps-operate-dialog\n [Visible]=\"operateOpen\"\n [modelId]=\"selected.modelId\"\n [modelLabel]=\"selected.label\"\n [engine]=\"engine\"\n [provider]=\"ProviderToUse\"\n [currentUser]=\"ProviderToUse.CurrentUser\"\n (Close)=\"onOperateClose($event)\">\n </ps-operate-dialog>\n }\n </div>\n `,\n})\nexport class PSProductionComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() engine!: PredictiveStudioEngine;\n\n private cdr = inject(ChangeDetectorRef);\n private modelsSub?: Subscription;\n\n public models: ProductionModelVM[] = [];\n public selectedModelId = '';\n public selectedBindings: BindingVM[] = [];\n public runs: PSProcessRunRow[] = [];\n public loadingRuns = false;\n public loadingDetails = false;\n /** Whether the \"Operate this model\" dialog is open for the selected model. */\n public operateOpen = false;\n /** The run whose per-record predictions are drilled into (null = the run list). */\n public selectedRunId: string | null = null;\n public runDetails: RunDetailVM[] = [];\n public listSizePct = 30;\n public detailSizePct = 70;\n public isListCollapsed = false;\n public isHeaderCollapsed = false;\n public isDeploymentCollapsed = false;\n public isRunFocused = false;\n\n public get runGridHeight(): string {\n if (this.isRunFocused || (this.isHeaderCollapsed && this.isDeploymentCollapsed)) {\n return '740px';\n }\n return '520px';\n }\n\n ngOnInit(): void {\n this.loadLayoutPrefs();\n // Reactive: rebuild the published-model list on any MJ: ML Models change (save/delete/remote-invalidate).\n this.modelsSub = this.engine\n .ObserveProperty<MJMLModelEntity>('_Models')\n .subscribe(() => {\n this.rebuildModels();\n this.cdr.detectChanges();\n });\n }\n\n ngOnDestroy(): void {\n this.modelsSub?.unsubscribe();\n }\n\n // ---- layout splitter resizing & persistence ----\n\n public toggleHeaderCollapse(): void {\n this.isHeaderCollapsed = !this.isHeaderCollapsed;\n this.updateFocusState();\n this.saveLayoutPrefs();\n this.cdr.detectChanges();\n }\n\n public toggleDeploymentCollapse(): void {\n this.isDeploymentCollapsed = !this.isDeploymentCollapsed;\n this.updateFocusState();\n this.saveLayoutPrefs();\n this.cdr.detectChanges();\n }\n\n public toggleRunFocus(): void {\n this.isRunFocused = !this.isRunFocused;\n if (this.isRunFocused) {\n this.isHeaderCollapsed = true;\n this.isDeploymentCollapsed = true;\n } else {\n this.isHeaderCollapsed = false;\n this.isDeploymentCollapsed = false;\n }\n this.saveLayoutPrefs();\n this.cdr.detectChanges();\n }\n\n private updateFocusState(): void {\n this.isRunFocused = this.isHeaderCollapsed && this.isDeploymentCollapsed;\n }\n\n private loadLayoutPrefs(): void {\n const raw = UserInfoEngine.Instance.GetSetting('mj.predictiveStudio.production.layout');\n if (raw) {\n try {\n const parsed = JSON.parse(raw);\n if (typeof parsed.listSizePct === 'number' && parsed.listSizePct >= 15 && parsed.listSizePct <= 60) {\n this.listSizePct = parsed.listSizePct;\n this.detailSizePct = 100 - parsed.listSizePct;\n }\n if (typeof parsed.isListCollapsed === 'boolean') {\n this.isListCollapsed = parsed.isListCollapsed;\n }\n if (typeof parsed.isHeaderCollapsed === 'boolean') {\n this.isHeaderCollapsed = parsed.isHeaderCollapsed;\n }\n if (typeof parsed.isDeploymentCollapsed === 'boolean') {\n this.isDeploymentCollapsed = parsed.isDeploymentCollapsed;\n }\n if (typeof parsed.isRunFocused === 'boolean') {\n this.isRunFocused = parsed.isRunFocused;\n }\n } catch {}\n }\n }\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.detectChanges();\n }\n\n private saveLayoutPrefs(): void {\n const prefs = {\n listSizePct: this.listSizePct,\n detailSizePct: this.detailSizePct,\n isListCollapsed: this.isListCollapsed,\n isHeaderCollapsed: this.isHeaderCollapsed,\n isDeploymentCollapsed: this.isDeploymentCollapsed,\n isRunFocused: this.isRunFocused,\n };\n UserInfoEngine.Instance.SetSettingDebounced('mj.predictiveStudio.production.layout', JSON.stringify(prefs));\n }\n\n // ---- KPIs ----\n\n public get scheduledModelCount(): number {\n return this.models.filter((m) => m.deployState === 'scheduled' || m.scheduledCount > 0).length;\n }\n public get boundModelCount(): number {\n return this.models.filter((m) => m.bindingCount > 0).length;\n }\n public get idleModelCount(): number {\n return this.models.filter((m) => m.deployState === 'idle').length;\n }\n\n // ---- reactive list build (DB-light, from caches) ----\n\n private rebuildModels(): void {\n this.models = (this.engine?.PublishedModels ?? []).map((m) => this.toVM(m));\n if (!this.models.some((m) => UUIDsEqual(m.modelId, this.selectedModelId))) {\n const first = this.models[0]?.modelId ?? '';\n if (first) {\n this.select(first);\n } else {\n this.selectedModelId = '';\n this.selectedBindings = [];\n this.runs = [];\n }\n } else {\n this.selectedBindings = this.bindingsForModel(this.selectedModelId);\n }\n }\n\n private toVM(m: MJMLModelEntity): ProductionModelVM {\n const bindings = this.engine.ScoringBindings.filter((b) => UUIDsEqual(b.MLModelID, m.ID));\n const processes = this.engine.RecordProcessesForModel(m.ID);\n const scheduledCount = processes.filter((p) => !!p.ScheduleEnabled).length\n + bindings.filter((b) => b.Mode === 'Scheduled').length;\n const lastScoredAt = bindings.reduce<Date | null>(\n (acc, b) => (b.LastScoredAt && (!acc || b.LastScoredAt.getTime() > acc.getTime()) ? b.LastScoredAt : acc),\n null,\n );\n const lastRowCount = bindings.find((b) => b.LastRowCount != null)?.LastRowCount ?? null;\n const score = primaryModelScore(m);\n const holdoutMetric = score != null ? formatMetricValue(score.key, score.value) : '—';\n return {\n modelId: m.ID,\n label: this.engine.ModelDisplayName(m),\n algorithm: this.engine.AlgorithmName(m.AlgorithmID),\n problemType: m.ProblemType ?? '—',\n version: m.Version,\n holdoutMetric,\n deployState: bindings.length > 0 ? 'bound' : scheduledCount > 0 ? 'scheduled' : 'idle',\n bindingCount: bindings.length,\n processCount: processes.length,\n scheduledCount,\n lastScoredAt,\n lastRowCount,\n };\n }\n\n private bindingsForModel(modelId: string): BindingVM[] {\n return this.engine.ScoringBindings\n .filter((b) => UUIDsEqual(b.MLModelID, modelId))\n .map((b) => this.toBindingVM(b));\n }\n\n private toBindingVM(b: MJMLModelScoringBindingEntity): BindingVM {\n const process = this.engine.RecordProcessByID(b.RecordProcessID);\n return {\n id: b.ID,\n targetEntity: this.resolveEntityName(b),\n targetColumn: b.TargetColumn ?? '(generic output)',\n mode: b.Mode,\n schedulePhrase: b.Mode === 'Scheduled' ? humanizeCron(process?.CronExpression ?? null) : null,\n };\n }\n\n private resolveEntityName(b: MJMLModelScoringBindingEntity): string {\n if (b.TargetEntity) return b.TargetEntity;\n if (b.TargetEntityID) {\n const entity = this.ProviderToUse.Entities.find((e) => UUIDsEqual(e.ID, b.TargetEntityID));\n if (entity) return entity.Name;\n }\n return '—';\n }\n\n public get selectedTargetEntityName(): string | null {\n if (this.selectedBindings.length > 0 && this.selectedBindings[0].targetEntity !== '—') {\n return this.selectedBindings[0].targetEntity;\n }\n const model = this.engine?.PublishedModels?.find((m) => UUIDsEqual(m.ID, this.selected.modelId));\n if (model?.PipelineID) {\n const pipeline = this.engine?.Pipelines?.find((p) => UUIDsEqual(p.ID, model.PipelineID));\n if (pipeline?.TargetEntityID) {\n const ent = this.ProviderToUse.Entities.find((e) => UUIDsEqual(e.ID, pipeline.TargetEntityID));\n if (ent) return ent.Name;\n }\n }\n return null;\n }\n\n // ---- selection + on-demand run history ----\n\n public get selected(): ProductionModelVM {\n return (\n this.models.find((m) => UUIDsEqual(m.modelId, this.selectedModelId)) ??\n this.models[0] ?? {\n modelId: '', label: '—', algorithm: '—', problemType: '—', version: 0, holdoutMetric: '—',\n deployState: 'idle', bindingCount: 0, processCount: 0, scheduledCount: 0, lastScoredAt: null, lastRowCount: null,\n }\n );\n }\n\n /**\n * Close the Operate dialog. On a successful change the dialog already refreshed the engine\n * (Config(true)) — the reactive `_Models` subscription re-renders the deploy state — but the\n * on-demand run history + bindings of the SELECTED model are not part of that stream, so reload them\n * here so a just-created run / binding shows immediately.\n */\n public onOperateClose(result: { changed: boolean }): void {\n this.operateOpen = false;\n if (result.changed && this.selectedModelId) {\n this.selectedBindings = this.bindingsForModel(this.selectedModelId);\n void this.loadRuns(this.selectedModelId);\n }\n }\n\n public select(id: string): void {\n this.selectedModelId = id;\n this.selectedBindings = this.bindingsForModel(id);\n this.closeRun();\n void this.loadRuns(id);\n }\n\n // ---- run drill-in: per-record predictions (on demand) ----\n\n /** Drill into a run's per-record predictions (`MJ: Process Run Details` `ResultPayload`). */\n public openRun(runId: string): void {\n this.selectedRunId = runId;\n void this.loadRunDetails(runId);\n }\n\n public closeRun(): void {\n this.selectedRunId = null;\n this.runDetails = [];\n }\n\n private async loadRunDetails(runId: string): Promise<void> {\n this.loadingDetails = true;\n this.runDetails = [];\n this.cdr.detectChanges();\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const r = await rv.RunView<MJProcessRunDetailEntity>(\n {\n EntityName: 'MJ: Process Run Details',\n ExtraFilter: `ProcessRunID='${runId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n MaxRows: 200,\n ResultType: 'entity_object',\n },\n this.ProviderToUse.CurrentUser,\n );\n this.runDetails = r.Success ? (r.Results ?? []).map((d) => this.toDetailVM(d)) : [];\n } finally {\n this.loadingDetails = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Project a Process Run Detail into a per-record prediction row, parsing the ML `ResultPayload`. */\n private toDetailVM(d: MJProcessRunDetailEntity): RunDetailVM {\n let score = '—';\n let cls: string | null = null;\n let scoredAt: string | null = d.CompletedAt ? d.CompletedAt.toISOString() : null;\n if (d.ResultPayload) {\n try {\n const p = JSON.parse(d.ResultPayload) as { score?: number; class?: string; scoredAt?: string };\n if (typeof p.score === 'number') {\n score = p.score.toFixed(4);\n }\n cls = p.class ?? null;\n scoredAt = p.scoredAt ?? scoredAt;\n } catch {\n /* leave defaults — a non-ML payload (or malformed) just shows '—' */\n }\n }\n return { recordId: d.RecordID ?? '—', status: d.Status, score, class: cls, scoredAt };\n }\n\n /** On-demand run history for the selected model (DB-light — only the selected model, capped). */\n private async loadRuns(modelId: string): Promise<void> {\n this.loadingRuns = true;\n this.runs = [];\n this.cdr.detectChanges();\n try {\n this.runs = await this.engine.LoadRecentRunsForModel(\n modelId,\n this.ProviderToUse,\n this.ProviderToUse.CurrentUser,\n { sinceDays: 90, maxRows: 50 },\n );\n } finally {\n this.loadingRuns = false;\n this.cdr.detectChanges();\n }\n }\n\n // ---- display helpers ----\n\n public deployIcon(state: DeployState): string {\n switch (state) {\n case 'bound': return 'fa-solid fa-arrow-right-to-bracket';\n case 'scheduled': return 'fa-solid fa-clock';\n case 'idle': return 'fa-solid fa-circle-pause';\n }\n }\n public deployLabel(state: DeployState): string {\n switch (state) {\n case 'bound': return 'Bound';\n case 'scheduled': return 'Scheduled';\n case 'idle': return 'Idle';\n }\n }\n public deployBadge(state: DeployState): StatusVariant {\n switch (state) {\n case 'bound': return 'green';\n case 'scheduled': return 'blue';\n case 'idle': return 'gray';\n }\n }\n public modeBadge(mode: string): StatusVariant {\n return mode === 'Scheduled' ? 'blue' : mode === 'Materialized' ? 'green' : 'gray';\n }\n public runBadge(status: string): StatusVariant {\n const s = (status || '').toLowerCase();\n if (s.includes('complete') || s.includes('success')) return 'green';\n if (s.includes('fail') || s.includes('error')) return 'red';\n if (s.includes('run') || s.includes('progress')) return 'blue';\n return 'gray';\n }\n}\n"]}
@@ -1,9 +1,7 @@
1
1
  import { OnInit } from '@angular/core';
2
2
  import { IMetadataProvider, UserInfo } from '@memberjunction/core';
3
- import { PredictiveStudioModelTargetStatus } from '@memberjunction/core-entities';
3
+ import { MJMLModelEntity } from '@memberjunction/core-entities';
4
4
  import { PredictiveStudioEngine } from '../engine/predictive-studio.engine';
5
- import { PSFeatureBar, PSLifecycleStep } from '../predictive-studio.types';
6
- import { PSMetricDisplay } from '../predictive-studio.view-models';
7
5
  import * as i0 from "@angular/core";
8
6
  interface ModelRowVM {
9
7
  id: string;
@@ -11,28 +9,15 @@ interface ModelRowVM {
11
9
  version: number;
12
10
  algorithm: string;
13
11
  holdoutAuc: string;
12
+ holdoutScore: string;
13
+ scoreLabel: string;
14
14
  status: string;
15
15
  iconClass: string;
16
16
  }
17
- /** A pending promote/archive action awaiting user confirmation. */
18
- interface PendingPromotion {
19
- modelId: string;
20
- modelName: string;
21
- targetStatus: PredictiveStudioModelTargetStatus;
22
- /** When true, the selected model trips the single-feature dominance leakage flag → sign-off required. */
23
- leakageFlagged: boolean;
24
- }
25
17
  /**
26
- * Model Registry panel: master list of trained ML Models + a rich detail pane with a lifecycle stepper
27
- * (Draft → Validated → Published → Archived), train-vs-holdout metric comparison, feature-importance
28
- * bars, a leakage sign-off gate, and lifecycle actions. Fully live against `MJ: ML Models`:
29
- *
30
- * - **Feature importance** is parsed from `model.FeatureImportance` (sorted by |value|, top 6, bars).
31
- * - **Performance metrics** come from `model.Metrics` (train) + `model.HoldoutMetrics` (holdout) —
32
- * only the metrics actually recorded are shown.
33
- * - **Promote / Archive** call the {@link PredictiveStudioPromoteModelOperation} Remote Op behind a
34
- * confirmation modal. On a leakage-flagged model, the modal surfaces the sign-off requirement and
35
- * captures a required reason; on success the engine refreshes and the list re-renders reactively.
18
+ * Model Registry panel: master list of trained ML Models + a rich detail pane rendered via the unified
19
+ * {@link PSModelDetailComponent}. Includes resizable split layout with user preference persistence via
20
+ * UserInfoEngine and collapse/expand support.
36
21
  *
37
22
  * 100% entity-agnostic — model names derive from the producing pipeline, never any business entity.
38
23
  */
@@ -46,56 +31,31 @@ export declare class PSRegistryComponent implements OnInit {
46
31
  private notifications;
47
32
  models: ModelRowVM[];
48
33
  selectedId: string;
49
- lifecycleSteps: readonly ["Draft", "Validated", "Published", "Archived"];
50
- readonly dominanceThreshold: string;
51
- /** Pending confirmation (null when no modal is open). */
52
- pending: PendingPromotion | null;
53
- /** Remote Op in flight — drives the modal spinner + disables the buttons. */
54
- busy: boolean;
34
+ listSizePct: number;
35
+ detailSizePct: number;
36
+ isListCollapsed: boolean;
37
+ private _initialModelId?;
38
+ set initialModelId(id: string | undefined);
39
+ get initialModelId(): string | undefined;
55
40
  ngOnInit(): void;
41
+ onSplitDragEnd(sizes: readonly (number | '*')[]): void;
42
+ toggleList(): void;
43
+ private saveLayoutPrefs;
56
44
  select(id: string): void;
57
45
  get selected(): ModelRowVM;
58
- private get selectedEntity();
59
- /** Top-6 feature importance bars parsed live from the selected model's `FeatureImportance` JSON, with humanized display names. */
60
- get importance(): PSFeatureBar[];
61
- get importanceCaption(): string;
62
- get topFeatureName(): string;
63
- get topFeatureValue(): string;
64
- /** True when a single feature's |importance| meets/exceeds the dominance threshold. */
65
- get leakageFlagged(): boolean;
66
- /** Holdout AUC hero number, formatted, or '—'. */
67
- get trainAuc(): string;
68
- /** Secondary metric tiles (precision/recall/F1/log-loss/…) — only those actually recorded. */
69
- get secondaryMetrics(): PSMetricDisplay[];
70
- /** The formatted train–holdout overfit gap, or '' when not computable. */
71
- get gapText(): string;
72
- get gapVerdict(): string;
73
- get targetSuffix(): string;
46
+ get selectedEntity(): MJMLModelEntity | undefined;
74
47
  statusClass(status: string): string;
75
- statusBadgeClass(status: string): string;
76
- /** Stepper state for a lifecycle step relative to the selected model's status. */
77
- stepState(step: PSLifecycleStep): 'done' | 'curr' | 'todo';
78
- get canValidate(): boolean;
79
- get canPublish(): boolean;
80
- get canArchive(): boolean;
81
- get actionHint(): string;
82
- /** Open the confirmation modal for a lifecycle transition. */
83
- requestPromote(targetStatus: PredictiveStudioModelTargetStatus): void;
84
- cancelPromote(): void;
85
- get pendingTitle(): string;
86
- get pendingIcon(): string;
87
- get pendingConfirmLabel(): string;
88
- get pendingVariant(): 'info' | 'warn' | 'danger';
89
- get pendingMessage(): string;
90
- /** Run the promote Remote Op, then refresh the engine + close on success. */
91
- confirmPromote(reason: string): Promise<void>;
48
+ onModelStatusChanged(evt: {
49
+ modelId: string;
50
+ newStatus: string;
51
+ }): Promise<void>;
92
52
  /** Force-refresh the engine's cached models, then rebuild the master list. */
93
53
  private refreshAfterMutation;
94
54
  private buildModels;
95
55
  private toVM;
96
56
  private placeholder;
97
57
  static ɵfac: i0.ɵɵFactoryDeclaration<PSRegistryComponent, never>;
98
- static ɵcmp: i0.ɵɵComponentDeclaration<PSRegistryComponent, "ps-registry", never, { "engine": { "alias": "engine"; "required": false; }; "provider": { "alias": "provider"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; }, {}, never, never, true, never>;
58
+ static ɵcmp: i0.ɵɵComponentDeclaration<PSRegistryComponent, "ps-registry", never, { "engine": { "alias": "engine"; "required": false; }; "provider": { "alias": "provider"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "initialModelId": { "alias": "initialModelId"; "required": false; }; }, {}, never, never, true, never>;
99
59
  }
100
60
  export {};
101
61
  //# sourceMappingURL=ps-registry.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ps-registry.component.d.ts","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-registry.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ps-registry.component.d.ts","sourceRoot":"","sources":["../../../src/PredictiveStudio/components/ps-registry.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,MAAM,EAA6B,MAAM,eAAe,CAAC;AAMvG,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAkB,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;;AAG5E,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAkFa,mBAAoB,YAAW,MAAM;IACvC,MAAM,EAAG,sBAAsB,CAAC;IACzC,qGAAqG;IAC5F,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IACnD,2DAA2D;IAClD,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAE7C,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,aAAa,CAAiC;IAE/C,MAAM,EAAE,UAAU,EAAE,CAAM;IAC1B,UAAU,SAAM;IAGhB,WAAW,SAAM;IACjB,aAAa,SAAM;IACnB,eAAe,UAAS;IAE/B,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,IACW,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAW/C;IACD,IAAW,cAAc,IAAI,MAAM,GAAG,SAAS,CAE9C;IAED,QAAQ,IAAI,IAAI;IAuBT,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI;IAQtD,UAAU,IAAI,IAAI;IAMzB,OAAO,CAAC,eAAe;IAWhB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI/B,IAAW,QAAQ,IAAI,UAAU,CAEhC;IAED,IAAW,cAAc,IAAI,eAAe,GAAG,SAAS,CAEvD;IAEM,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAY7B,oBAAoB,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7F,8EAA8E;YAChE,oBAAoB;IAYlC,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,IAAI;IAiBZ,OAAO,CAAC,WAAW;yCAlJR,mBAAmB;2CAAnB,mBAAmB;CAqJ/B"}