@memberjunction/ng-dashboards 6.1.3 → 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
@@ -3,326 +3,378 @@ import { CommonModule } from '@angular/common';
3
3
  import { MJButtonDirective } from '@memberjunction/ng-ui-components';
4
4
  import { MJNotificationService } from '@memberjunction/ng-notifications';
5
5
  import { UUIDsEqual } from '@memberjunction/global';
6
+ import { Metadata, RunView } from '@memberjunction/core';
6
7
  import { PredictiveStudioControlExperimentSessionOperation, } from '@memberjunction/core-entities';
8
+ import { ArtifactsModule } from '@memberjunction/ng-artifacts';
7
9
  import { deriveLeaderboard, groupIterationsToKanban, } from '../predictive-studio.view-models';
8
10
  import { PSConfirmModalComponent } from './ps-confirm-modal.component';
11
+ import { PSRunExperimentModalComponent } from './ps-run-experiment-modal.component';
9
12
  import * as i0 from "@angular/core";
10
13
  import * as i1 from "@angular/common";
14
+ import * as i2 from "@memberjunction/ng-artifacts";
11
15
  const _c0 = a0 => ({ c: a0 });
12
16
  const _forTrack0 = ($index, $item) => $item.rank;
13
17
  const _forTrack1 = ($index, $item) => $item.iteration;
14
- const _forTrack2 = ($index, $item) => $item.label;
18
+ const _forTrack2 = ($index, $item) => $item.ID;
19
+ const _forTrack3 = ($index, $item) => $item.label;
15
20
  function PSExperimentsComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
16
- i0.ɵɵelementStart(0, "div", 2)(1, "span", 4);
17
- i0.ɵɵelement(2, "i", 5);
21
+ const _r1 = i0.ɵɵgetCurrentView();
22
+ i0.ɵɵelementStart(0, "div", 2)(1, "span", 6);
23
+ i0.ɵɵelement(2, "i", 7);
18
24
  i0.ɵɵelementEnd();
19
25
  i0.ɵɵelementStart(3, "h3");
20
26
  i0.ɵɵtext(4, "No experiment sessions yet");
21
27
  i0.ɵɵelementEnd();
22
28
  i0.ɵɵelementStart(5, "p");
23
- i0.ɵɵtext(6, "Launch an experiment to watch the Model Dev Agent search algorithms and feature sets in waves. Running and completed iterations will appear here with a live leaderboard.");
24
- i0.ɵɵelementEnd()();
29
+ i0.ɵɵtext(6, "Launch an experiment to watch the Model Dev Agent search algorithms and feature sets in waves, or configure a manual multi-algorithm tournament.");
30
+ i0.ɵɵelementEnd();
31
+ i0.ɵɵelementStart(7, "div", 8)(8, "button", 9);
32
+ i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_1_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openNewExperimentModal()); });
33
+ i0.ɵɵelement(9, "i", 7);
34
+ i0.ɵɵtext(10, " New Experiment ");
35
+ i0.ɵɵelementEnd()()();
25
36
  } }
26
- function PSExperimentsComponent_Conditional_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
27
- const _r1 = i0.ɵɵgetCurrentView();
28
- i0.ɵɵelementStart(0, "button", 32);
29
- i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_2_Conditional_12_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.requestControl("pause")); });
30
- i0.ɵɵelement(1, "i", 33);
37
+ function PSExperimentsComponent_Conditional_2_Conditional_5_For_4_Template(rf, ctx) { if (rf & 1) {
38
+ i0.ɵɵelementStart(0, "option", 43);
39
+ i0.ɵɵtext(1);
40
+ i0.ɵɵelementEnd();
41
+ } if (rf & 2) {
42
+ const s_r5 = ctx.$implicit;
43
+ i0.ɵɵproperty("value", s_r5.ID);
44
+ i0.ɵɵadvance();
45
+ i0.ɵɵtextInterpolate2("", s_r5.Name, " (", s_r5.Status, ")");
46
+ } }
47
+ function PSExperimentsComponent_Conditional_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
48
+ const _r4 = i0.ɵɵgetCurrentView();
49
+ i0.ɵɵelementStart(0, "span", 41);
50
+ i0.ɵɵtext(1, "\u00B7 Switch:");
51
+ i0.ɵɵelementEnd();
52
+ i0.ɵɵelementStart(2, "select", 42);
53
+ i0.ɵɵlistener("change", function PSExperimentsComponent_Conditional_2_Conditional_5_Template_select_change_2_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.selectSession($event.target.value)); });
54
+ i0.ɵɵrepeaterCreate(3, PSExperimentsComponent_Conditional_2_Conditional_5_For_4_Template, 2, 3, "option", 43, _forTrack2);
55
+ i0.ɵɵelementEnd();
56
+ } if (rf & 2) {
57
+ const ctx_r1 = i0.ɵɵnextContext(2);
58
+ i0.ɵɵadvance(2);
59
+ i0.ɵɵproperty("value", ctx_r1.sessionId);
60
+ i0.ɵɵadvance();
61
+ i0.ɵɵrepeater(ctx_r1.sessions);
62
+ } }
63
+ function PSExperimentsComponent_Conditional_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
64
+ const _r6 = i0.ɵɵgetCurrentView();
65
+ i0.ɵɵelementStart(0, "button", 44);
66
+ i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_2_Conditional_20_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.requestControl("pause")); });
67
+ i0.ɵɵelement(1, "i", 45);
31
68
  i0.ɵɵtext(2, " Pause");
32
69
  i0.ɵɵelementEnd();
33
70
  } }
34
- function PSExperimentsComponent_Conditional_2_Conditional_13_Template(rf, ctx) { if (rf & 1) {
35
- const _r3 = i0.ɵɵgetCurrentView();
36
- i0.ɵɵelementStart(0, "button", 34);
37
- i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_2_Conditional_13_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.requestControl("resume")); });
38
- i0.ɵɵelement(1, "i", 35);
71
+ function PSExperimentsComponent_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
72
+ const _r7 = i0.ɵɵgetCurrentView();
73
+ i0.ɵɵelementStart(0, "button", 46);
74
+ i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_2_Conditional_21_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.requestControl("resume")); });
75
+ i0.ɵɵelement(1, "i", 47);
39
76
  i0.ɵɵtext(2, " Resume");
40
77
  i0.ɵɵelementEnd();
41
78
  } }
42
- function PSExperimentsComponent_Conditional_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
43
- const _r4 = i0.ɵɵgetCurrentView();
44
- i0.ɵɵelementStart(0, "button", 36);
45
- i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_2_Conditional_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.requestControl("cancel")); });
46
- i0.ɵɵelement(1, "i", 37);
79
+ function PSExperimentsComponent_Conditional_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
80
+ const _r8 = i0.ɵɵgetCurrentView();
81
+ i0.ɵɵelementStart(0, "button", 48);
82
+ i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_2_Conditional_22_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.requestControl("cancel")); });
83
+ i0.ɵɵelement(1, "i", 49);
47
84
  i0.ɵɵtext(2, " Cancel");
48
85
  i0.ɵɵelementEnd();
49
86
  } }
50
- function PSExperimentsComponent_Conditional_2_Conditional_23_Template(rf, ctx) { if (rf & 1) {
51
- i0.ɵɵelementStart(0, "span", 7);
87
+ function PSExperimentsComponent_Conditional_2_Conditional_31_Template(rf, ctx) { if (rf & 1) {
88
+ i0.ɵɵelementStart(0, "span", 15);
52
89
  i0.ɵɵtext(1, "No scored iterations yet.");
53
90
  i0.ɵɵelementEnd();
54
91
  } }
55
- function PSExperimentsComponent_Conditional_2_For_25_Template(rf, ctx) { if (rf & 1) {
56
- i0.ɵɵelementStart(0, "div", 38)(1, "span", 39);
92
+ function PSExperimentsComponent_Conditional_2_For_33_Template(rf, ctx) { if (rf & 1) {
93
+ i0.ɵɵelementStart(0, "div", 50)(1, "span", 51);
57
94
  i0.ɵɵtext(2);
58
95
  i0.ɵɵelementEnd();
59
- i0.ɵɵelementStart(3, "span", 40);
96
+ i0.ɵɵelementStart(3, "span", 52);
60
97
  i0.ɵɵelement(4, "i");
61
98
  i0.ɵɵelementEnd();
62
- i0.ɵɵelementStart(5, "div")(6, "div", 41);
99
+ i0.ɵɵelementStart(5, "div")(6, "div", 53);
63
100
  i0.ɵɵtext(7);
64
101
  i0.ɵɵelementEnd();
65
- i0.ɵɵelementStart(8, "div", 42);
102
+ i0.ɵɵelementStart(8, "div", 54);
66
103
  i0.ɵɵtext(9);
67
104
  i0.ɵɵelementEnd()();
68
- i0.ɵɵelementStart(10, "span", 43);
105
+ i0.ɵɵelementStart(10, "span", 55);
69
106
  i0.ɵɵtext(11);
70
107
  i0.ɵɵpipe(12, "number");
71
108
  i0.ɵɵelementEnd()();
72
109
  } if (rf & 2) {
73
- const lp_r5 = ctx.$implicit;
74
- i0.ɵɵclassProp("best", lp_r5.best)("pruned", lp_r5.pruned);
110
+ const lp_r9 = ctx.$implicit;
111
+ i0.ɵɵclassProp("best", lp_r9.best)("pruned", lp_r9.pruned);
75
112
  i0.ɵɵadvance();
76
- i0.ɵɵclassProp("gold", lp_r5.best);
113
+ i0.ɵɵclassProp("gold", lp_r9.best);
77
114
  i0.ɵɵadvance();
78
- i0.ɵɵtextInterpolate(lp_r5.rank);
115
+ i0.ɵɵtextInterpolate(lp_r9.rank);
79
116
  i0.ɵɵadvance();
80
- i0.ɵɵstyleProp("background", lp_r5.algorithmColor);
117
+ i0.ɵɵstyleProp("background", lp_r9.algorithmColor);
81
118
  i0.ɵɵadvance();
82
- i0.ɵɵclassMap(lp_r5.algorithmIcon);
119
+ i0.ɵɵclassMap(lp_r9.algorithmIcon);
83
120
  i0.ɵɵadvance(3);
84
- i0.ɵɵtextInterpolate(lp_r5.algorithm);
121
+ i0.ɵɵtextInterpolate(lp_r9.algorithm);
85
122
  i0.ɵɵadvance(2);
86
- i0.ɵɵtextInterpolate(lp_r5.features);
123
+ i0.ɵɵtextInterpolate(lp_r9.features);
87
124
  i0.ɵɵadvance();
88
- i0.ɵɵclassProp("win", lp_r5.best);
125
+ i0.ɵɵclassProp("win", lp_r9.best);
89
126
  i0.ɵɵadvance();
90
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(12, 16, lp_r5.auc, "1.3-3"));
127
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(12, 16, lp_r9.auc, "1.3-3"));
91
128
  } }
92
- function PSExperimentsComponent_Conditional_2_Conditional_26_For_3_Template(rf, ctx) { if (rf & 1) {
93
- i0.ɵɵelementStart(0, "div", 45)(1, "div", 46)(2, "span", 47);
129
+ function PSExperimentsComponent_Conditional_2_Conditional_34_For_3_Template(rf, ctx) { if (rf & 1) {
130
+ i0.ɵɵelementStart(0, "div", 57)(1, "div", 58)(2, "span", 59);
94
131
  i0.ɵɵtext(3);
95
132
  i0.ɵɵelementEnd()();
96
- i0.ɵɵelementStart(4, "div", 48)(5, "div", 49);
133
+ i0.ɵɵelementStart(4, "div", 60)(5, "div", 61);
97
134
  i0.ɵɵtext(6);
98
135
  i0.ɵɵelementEnd();
99
- i0.ɵɵelementStart(7, "div", 50)(8, "strong");
136
+ i0.ɵɵelementStart(7, "div", 62)(8, "strong");
100
137
  i0.ɵɵtext(9);
101
138
  i0.ɵɵelementEnd();
102
- i0.ɵɵelementStart(10, "span", 51);
139
+ i0.ɵɵelementStart(10, "span", 63);
103
140
  i0.ɵɵtext(11);
104
141
  i0.ɵɵelementEnd()();
105
- i0.ɵɵelementStart(12, "div", 52);
142
+ i0.ɵɵelementStart(12, "div", 64);
106
143
  i0.ɵɵelement(13, "span");
107
144
  i0.ɵɵelementEnd()()();
108
145
  } if (rf & 2) {
109
- const b_r6 = ctx.$implicit;
146
+ const b_r10 = ctx.$implicit;
110
147
  i0.ɵɵadvance();
111
- i0.ɵɵstyleProp("--ps-p", b_r6.fillPct)("--ps-gauge-color", b_r6.color);
148
+ i0.ɵɵstyleProp("--ps-p", b_r10.fillPct)("--ps-gauge-color", b_r10.color);
112
149
  i0.ɵɵadvance(2);
113
- i0.ɵɵtextInterpolate(b_r6.centerText);
150
+ i0.ɵɵtextInterpolate(b_r10.centerText);
114
151
  i0.ɵɵadvance(3);
115
- i0.ɵɵtextInterpolate(b_r6.label);
152
+ i0.ɵɵtextInterpolate(b_r10.label);
116
153
  i0.ɵɵadvance(3);
117
- i0.ɵɵtextInterpolate(b_r6.value);
154
+ i0.ɵɵtextInterpolate(b_r10.value);
118
155
  i0.ɵɵadvance(2);
119
- i0.ɵɵtextInterpolate1("/ ", b_r6.cap);
156
+ i0.ɵɵtextInterpolate1("/ ", b_r10.cap);
120
157
  i0.ɵɵadvance(2);
121
- i0.ɵɵstyleProp("width", b_r6.fillPct, "%")("background", b_r6.color);
158
+ i0.ɵɵstyleProp("width", b_r10.fillPct, "%")("background", b_r10.color);
122
159
  } }
123
- function PSExperimentsComponent_Conditional_2_Conditional_26_Template(rf, ctx) { if (rf & 1) {
124
- i0.ɵɵelementStart(0, "div", 20)(1, "div", 44);
125
- i0.ɵɵrepeaterCreate(2, PSExperimentsComponent_Conditional_2_Conditional_26_For_3_Template, 14, 12, "div", 45, _forTrack2);
160
+ function PSExperimentsComponent_Conditional_2_Conditional_34_Template(rf, ctx) { if (rf & 1) {
161
+ i0.ɵɵelementStart(0, "div", 29)(1, "div", 56);
162
+ i0.ɵɵrepeaterCreate(2, PSExperimentsComponent_Conditional_2_Conditional_34_For_3_Template, 14, 12, "div", 57, _forTrack3);
126
163
  i0.ɵɵelementEnd()();
127
164
  } if (rf & 2) {
128
165
  const ctx_r1 = i0.ɵɵnextContext(2);
129
166
  i0.ɵɵadvance(2);
130
167
  i0.ɵɵrepeater(ctx_r1.budget);
131
168
  } }
132
- function PSExperimentsComponent_Conditional_2_For_37_Template(rf, ctx) { if (rf & 1) {
133
- i0.ɵɵelementContainer(0, 27);
169
+ function PSExperimentsComponent_Conditional_2_For_45_Template(rf, ctx) { if (rf & 1) {
170
+ i0.ɵɵelementContainer(0, 36);
134
171
  } if (rf & 2) {
135
- const c_r7 = ctx.$implicit;
172
+ const c_r11 = ctx.$implicit;
136
173
  i0.ɵɵnextContext();
137
- const iterCard_r8 = i0.ɵɵreference(62);
138
- i0.ɵɵproperty("ngTemplateOutlet", iterCard_r8)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, c_r7));
174
+ const iterCard_r12 = i0.ɵɵreference(70);
175
+ i0.ɵɵproperty("ngTemplateOutlet", iterCard_r12)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, c_r11));
139
176
  } }
140
- function PSExperimentsComponent_Conditional_2_Conditional_38_Template(rf, ctx) { if (rf & 1) {
141
- i0.ɵɵelementStart(0, "span", 7);
177
+ function PSExperimentsComponent_Conditional_2_Conditional_46_Template(rf, ctx) { if (rf & 1) {
178
+ i0.ɵɵelementStart(0, "span", 15);
142
179
  i0.ɵɵtext(1, "No running iterations.");
143
180
  i0.ɵɵelementEnd();
144
181
  } }
145
- function PSExperimentsComponent_Conditional_2_For_48_Template(rf, ctx) { if (rf & 1) {
146
- i0.ɵɵelementContainer(0, 27);
182
+ function PSExperimentsComponent_Conditional_2_For_56_Template(rf, ctx) { if (rf & 1) {
183
+ i0.ɵɵelementContainer(0, 36);
147
184
  } if (rf & 2) {
148
- const c_r9 = ctx.$implicit;
185
+ const c_r13 = ctx.$implicit;
149
186
  i0.ɵɵnextContext();
150
- const iterCard_r8 = i0.ɵɵreference(62);
151
- i0.ɵɵproperty("ngTemplateOutlet", iterCard_r8)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, c_r9));
187
+ const iterCard_r12 = i0.ɵɵreference(70);
188
+ i0.ɵɵproperty("ngTemplateOutlet", iterCard_r12)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, c_r13));
152
189
  } }
153
- function PSExperimentsComponent_Conditional_2_Conditional_49_Template(rf, ctx) { if (rf & 1) {
154
- i0.ɵɵelementStart(0, "span", 7);
190
+ function PSExperimentsComponent_Conditional_2_Conditional_57_Template(rf, ctx) { if (rf & 1) {
191
+ i0.ɵɵelementStart(0, "span", 15);
155
192
  i0.ɵɵtext(1, "No completed iterations.");
156
193
  i0.ɵɵelementEnd();
157
194
  } }
158
- function PSExperimentsComponent_Conditional_2_For_59_Template(rf, ctx) { if (rf & 1) {
159
- i0.ɵɵelementContainer(0, 27);
195
+ function PSExperimentsComponent_Conditional_2_For_67_Template(rf, ctx) { if (rf & 1) {
196
+ i0.ɵɵelementContainer(0, 36);
160
197
  } if (rf & 2) {
161
- const c_r10 = ctx.$implicit;
198
+ const c_r14 = ctx.$implicit;
162
199
  i0.ɵɵnextContext();
163
- const iterCard_r8 = i0.ɵɵreference(62);
164
- i0.ɵɵproperty("ngTemplateOutlet", iterCard_r8)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, c_r10));
200
+ const iterCard_r12 = i0.ɵɵreference(70);
201
+ i0.ɵɵproperty("ngTemplateOutlet", iterCard_r12)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, c_r14));
165
202
  } }
166
- function PSExperimentsComponent_Conditional_2_Conditional_60_Template(rf, ctx) { if (rf & 1) {
167
- i0.ɵɵelementStart(0, "span", 7);
203
+ function PSExperimentsComponent_Conditional_2_Conditional_68_Template(rf, ctx) { if (rf & 1) {
204
+ i0.ɵɵelementStart(0, "span", 15);
168
205
  i0.ɵɵtext(1, "Nothing pruned.");
169
206
  i0.ɵɵelementEnd();
170
207
  } }
171
- function PSExperimentsComponent_Conditional_2_ng_template_61_For_14_Template(rf, ctx) { if (rf & 1) {
172
- i0.ɵɵelementStart(0, "span", 57);
208
+ function PSExperimentsComponent_Conditional_2_ng_template_69_For_14_Template(rf, ctx) { if (rf & 1) {
209
+ i0.ɵɵelementStart(0, "span", 69);
173
210
  i0.ɵɵtext(1);
174
211
  i0.ɵɵelementEnd();
175
212
  } if (rf & 2) {
176
- const f_r11 = ctx.$implicit;
213
+ const f_r15 = ctx.$implicit;
177
214
  i0.ɵɵadvance();
178
- i0.ɵɵtextInterpolate(f_r11);
215
+ i0.ɵɵtextInterpolate(f_r15);
179
216
  } }
180
- function PSExperimentsComponent_Conditional_2_ng_template_61_Conditional_15_Template(rf, ctx) { if (rf & 1) {
181
- i0.ɵɵelementStart(0, "div", 58)(1, "div", 63);
217
+ function PSExperimentsComponent_Conditional_2_ng_template_69_Conditional_15_Template(rf, ctx) { if (rf & 1) {
218
+ i0.ɵɵelementStart(0, "div", 70)(1, "div", 75);
182
219
  i0.ɵɵelement(2, "span");
183
220
  i0.ɵɵelementEnd();
184
- i0.ɵɵelementStart(3, "div", 64)(4, "span", 51);
221
+ i0.ɵɵelementStart(3, "div", 76)(4, "span", 63);
185
222
  i0.ɵɵtext(5);
186
223
  i0.ɵɵelementEnd()()();
187
224
  } if (rf & 2) {
188
- const c_r12 = i0.ɵɵnextContext().c;
225
+ const c_r16 = i0.ɵɵnextContext().c;
189
226
  i0.ɵɵadvance(2);
190
- i0.ɵɵstyleProp("width", c_r12.progress, "%");
227
+ i0.ɵɵstyleProp("width", c_r16.progress, "%");
191
228
  i0.ɵɵadvance(3);
192
- i0.ɵɵtextInterpolate(c_r12.progressDetail);
229
+ i0.ɵɵtextInterpolate(c_r16.progressDetail);
193
230
  } }
194
- function PSExperimentsComponent_Conditional_2_ng_template_61_Conditional_16_Template(rf, ctx) { if (rf & 1) {
195
- i0.ɵɵelementStart(0, "div", 59)(1, "span", 65);
231
+ function PSExperimentsComponent_Conditional_2_ng_template_69_Conditional_16_Template(rf, ctx) { if (rf & 1) {
232
+ i0.ɵɵelementStart(0, "div", 71)(1, "span", 77);
196
233
  i0.ɵɵtext(2);
197
234
  i0.ɵɵpipe(3, "number");
198
235
  i0.ɵɵelementEnd();
199
- i0.ɵɵelementStart(4, "span", 66);
236
+ i0.ɵɵelementStart(4, "span", 78);
200
237
  i0.ɵɵtext(5);
201
238
  i0.ɵɵelementEnd()();
202
239
  } if (rf & 2) {
203
- const c_r12 = i0.ɵɵnextContext().c;
240
+ const c_r16 = i0.ɵɵnextContext().c;
204
241
  i0.ɵɵadvance();
205
- i0.ɵɵclassProp("green", c_r12.status === "Best");
242
+ i0.ɵɵclassProp("green", c_r16.status === "Best");
206
243
  i0.ɵɵadvance();
207
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(3, 4, c_r12.score, "1.3-3"));
244
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(3, 4, c_r16.score, "1.3-3"));
208
245
  i0.ɵɵadvance(3);
209
- i0.ɵɵtextInterpolate1("score \u00B7 ", c_r12.scoreDelta);
246
+ i0.ɵɵtextInterpolate1("score \u00B7 ", c_r16.scoreDelta);
210
247
  } }
211
- function PSExperimentsComponent_Conditional_2_ng_template_61_Template(rf, ctx) { if (rf & 1) {
212
- i0.ɵɵelementStart(0, "div", 53)(1, "div", 54)(2, "span", 40);
248
+ function PSExperimentsComponent_Conditional_2_ng_template_69_Template(rf, ctx) { if (rf & 1) {
249
+ i0.ɵɵelementStart(0, "div", 65)(1, "div", 66)(2, "span", 52);
213
250
  i0.ɵɵelement(3, "i");
214
251
  i0.ɵɵelementEnd();
215
- i0.ɵɵelementStart(4, "div")(5, "div", 41);
252
+ i0.ɵɵelementStart(4, "div")(5, "div", 53);
216
253
  i0.ɵɵtext(6);
217
254
  i0.ɵɵelementEnd();
218
- i0.ɵɵelementStart(7, "div", 55);
255
+ i0.ɵɵelementStart(7, "div", 67);
219
256
  i0.ɵɵtext(8);
220
257
  i0.ɵɵelementEnd()();
221
- i0.ɵɵelement(9, "span", 10);
222
- i0.ɵɵelementStart(10, "span", 8);
258
+ i0.ɵɵelement(9, "span", 14);
259
+ i0.ɵɵelementStart(10, "span", 12);
223
260
  i0.ɵɵtext(11);
224
261
  i0.ɵɵelementEnd()();
225
- i0.ɵɵelementStart(12, "div", 56);
226
- i0.ɵɵrepeaterCreate(13, PSExperimentsComponent_Conditional_2_ng_template_61_For_14_Template, 2, 1, "span", 57, i0.ɵɵrepeaterTrackByIdentity);
262
+ i0.ɵɵelementStart(12, "div", 68);
263
+ i0.ɵɵrepeaterCreate(13, PSExperimentsComponent_Conditional_2_ng_template_69_For_14_Template, 2, 1, "span", 69, i0.ɵɵrepeaterTrackByIdentity);
227
264
  i0.ɵɵelementEnd();
228
- i0.ɵɵconditionalCreate(15, PSExperimentsComponent_Conditional_2_ng_template_61_Conditional_15_Template, 6, 3, "div", 58)(16, PSExperimentsComponent_Conditional_2_ng_template_61_Conditional_16_Template, 6, 7, "div", 59);
229
- i0.ɵɵelementStart(17, "div", 60);
230
- i0.ɵɵelement(18, "i", 61);
231
- i0.ɵɵelementStart(19, "span", 62);
265
+ i0.ɵɵconditionalCreate(15, PSExperimentsComponent_Conditional_2_ng_template_69_Conditional_15_Template, 6, 3, "div", 70)(16, PSExperimentsComponent_Conditional_2_ng_template_69_Conditional_16_Template, 6, 7, "div", 71);
266
+ i0.ɵɵelementStart(17, "div", 72);
267
+ i0.ɵɵelement(18, "i", 73);
268
+ i0.ɵɵelementStart(19, "span", 74);
232
269
  i0.ɵɵtext(20);
233
270
  i0.ɵɵelementEnd()()();
234
271
  } if (rf & 2) {
235
- const c_r12 = ctx.c;
272
+ const c_r16 = ctx.c;
236
273
  const ctx_r1 = i0.ɵɵnextContext(2);
237
- i0.ɵɵclassProp("best", c_r12.status === "Best")("running", c_r12.status === "Running")("pruned", c_r12.status === "Pruned");
274
+ i0.ɵɵclassProp("best", c_r16.status === "Best")("running", c_r16.status === "Running")("pruned", c_r16.status === "Pruned");
238
275
  i0.ɵɵadvance(2);
239
- i0.ɵɵstyleProp("background", c_r12.algorithmColor);
276
+ i0.ɵɵstyleProp("background", c_r16.algorithmColor);
240
277
  i0.ɵɵadvance();
241
- i0.ɵɵclassMap(c_r12.algorithmIcon);
278
+ i0.ɵɵclassMap(c_r16.algorithmIcon);
242
279
  i0.ɵɵadvance(3);
243
- i0.ɵɵtextInterpolate(c_r12.algorithm);
280
+ i0.ɵɵtextInterpolate(c_r16.algorithm);
244
281
  i0.ɵɵadvance(2);
245
- i0.ɵɵtextInterpolate(c_r12.iteration);
282
+ i0.ɵɵtextInterpolate(c_r16.iteration);
246
283
  i0.ɵɵadvance(2);
247
- i0.ɵɵclassMap(ctx_r1.statusBadgeClass(c_r12.status));
284
+ i0.ɵɵclassMap(ctx_r1.statusBadgeClass(c_r16.status));
248
285
  i0.ɵɵadvance();
249
- i0.ɵɵtextInterpolate(ctx_r1.statusLabel(c_r12.status));
286
+ i0.ɵɵtextInterpolate(ctx_r1.statusLabel(c_r16.status));
250
287
  i0.ɵɵadvance(2);
251
- i0.ɵɵrepeater(c_r12.features);
288
+ i0.ɵɵrepeater(c_r16.features);
252
289
  i0.ɵɵadvance(2);
253
- i0.ɵɵconditional(c_r12.status === "Running" ? 15 : 16);
290
+ i0.ɵɵconditional(c_r16.status === "Running" ? 15 : 16);
254
291
  i0.ɵɵadvance(5);
255
- i0.ɵɵtextInterpolate(c_r12.rationale);
292
+ i0.ɵɵtextInterpolate(c_r16.rationale);
256
293
  } }
257
294
  function PSExperimentsComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
258
- i0.ɵɵelementStart(0, "div", 6)(1, "div")(2, "div", 7);
259
- i0.ɵɵtext(3, "Experiment session");
295
+ const _r3 = i0.ɵɵgetCurrentView();
296
+ i0.ɵɵelementStart(0, "div", 10)(1, "div")(2, "div", 11)(3, "span");
297
+ i0.ɵɵtext(4, "Experiment session");
260
298
  i0.ɵɵelementEnd();
261
- i0.ɵɵelementStart(4, "h2");
262
- i0.ɵɵtext(5);
263
- i0.ɵɵelementStart(6, "span", 8);
264
- i0.ɵɵelement(7, "span", 9);
265
- i0.ɵɵtext(8);
299
+ i0.ɵɵconditionalCreate(5, PSExperimentsComponent_Conditional_2_Conditional_5_Template, 5, 1);
300
+ i0.ɵɵelementEnd();
301
+ i0.ɵɵelementStart(6, "h2");
302
+ i0.ɵɵtext(7);
303
+ i0.ɵɵelementStart(8, "span", 12);
304
+ i0.ɵɵelement(9, "span", 13);
305
+ i0.ɵɵtext(10);
266
306
  i0.ɵɵelementEnd()()();
267
- i0.ɵɵelement(9, "span", 10);
268
- i0.ɵɵelementStart(10, "span", 7);
269
- i0.ɵɵtext(11);
307
+ i0.ɵɵelement(11, "span", 14);
308
+ i0.ɵɵelementStart(12, "span", 15);
309
+ i0.ɵɵtext(13);
310
+ i0.ɵɵelementEnd();
311
+ i0.ɵɵelementStart(14, "button", 16);
312
+ i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_2_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.viewResultsArtifact()); });
313
+ i0.ɵɵelement(15, "i", 17);
314
+ i0.ɵɵtext(16);
315
+ i0.ɵɵelementEnd();
316
+ i0.ɵɵelementStart(17, "button", 18);
317
+ i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_2_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openNewExperimentModal()); });
318
+ i0.ɵɵelement(18, "i", 19);
319
+ i0.ɵɵtext(19, " New Experiment ");
270
320
  i0.ɵɵelementEnd();
271
- i0.ɵɵconditionalCreate(12, PSExperimentsComponent_Conditional_2_Conditional_12_Template, 3, 0, "button", 11);
272
- i0.ɵɵconditionalCreate(13, PSExperimentsComponent_Conditional_2_Conditional_13_Template, 3, 0, "button", 12);
273
- i0.ɵɵconditionalCreate(14, PSExperimentsComponent_Conditional_2_Conditional_14_Template, 3, 0, "button", 13);
321
+ i0.ɵɵconditionalCreate(20, PSExperimentsComponent_Conditional_2_Conditional_20_Template, 3, 0, "button", 20);
322
+ i0.ɵɵconditionalCreate(21, PSExperimentsComponent_Conditional_2_Conditional_21_Template, 3, 0, "button", 21);
323
+ i0.ɵɵconditionalCreate(22, PSExperimentsComponent_Conditional_2_Conditional_22_Template, 3, 0, "button", 22);
274
324
  i0.ɵɵelementEnd();
275
- i0.ɵɵelementStart(15, "div", 14)(16, "div", 15)(17, "div", 16)(18, "div", 17);
276
- i0.ɵɵelement(19, "i", 18);
277
- i0.ɵɵtext(20, " Leaderboard");
325
+ i0.ɵɵelementStart(23, "div", 23)(24, "div", 24)(25, "div", 25)(26, "div", 26);
326
+ i0.ɵɵelement(27, "i", 27);
327
+ i0.ɵɵtext(28, " Leaderboard");
278
328
  i0.ɵɵelementEnd();
279
- i0.ɵɵelementStart(21, "div", 7);
280
- i0.ɵɵtext(22);
329
+ i0.ɵɵelementStart(29, "div", 15);
330
+ i0.ɵɵtext(30);
281
331
  i0.ɵɵelementEnd()();
282
- i0.ɵɵconditionalCreate(23, PSExperimentsComponent_Conditional_2_Conditional_23_Template, 2, 0, "span", 7);
283
- i0.ɵɵrepeaterCreate(24, PSExperimentsComponent_Conditional_2_For_25_Template, 13, 19, "div", 19, _forTrack0);
332
+ i0.ɵɵconditionalCreate(31, PSExperimentsComponent_Conditional_2_Conditional_31_Template, 2, 0, "span", 15);
333
+ i0.ɵɵrepeaterCreate(32, PSExperimentsComponent_Conditional_2_For_33_Template, 13, 19, "div", 28, _forTrack0);
284
334
  i0.ɵɵelementEnd()();
285
- i0.ɵɵconditionalCreate(26, PSExperimentsComponent_Conditional_2_Conditional_26_Template, 4, 0, "div", 20);
286
- i0.ɵɵelementStart(27, "div", 21)(28, "div", 22)(29, "div", 23);
287
- i0.ɵɵelement(30, "i", 24);
288
- i0.ɵɵelementStart(31, "h3");
289
- i0.ɵɵtext(32, "Running");
290
- i0.ɵɵelementEnd();
291
- i0.ɵɵelementStart(33, "span", 25);
292
- i0.ɵɵtext(34);
335
+ i0.ɵɵconditionalCreate(34, PSExperimentsComponent_Conditional_2_Conditional_34_Template, 4, 0, "div", 29);
336
+ i0.ɵɵelementStart(35, "div", 30)(36, "div", 31)(37, "div", 32);
337
+ i0.ɵɵelement(38, "i", 33);
338
+ i0.ɵɵelementStart(39, "h3");
339
+ i0.ɵɵtext(40, "Running");
340
+ i0.ɵɵelementEnd();
341
+ i0.ɵɵelementStart(41, "span", 34);
342
+ i0.ɵɵtext(42);
293
343
  i0.ɵɵelementEnd()();
294
- i0.ɵɵelementStart(35, "div", 26);
295
- i0.ɵɵrepeaterCreate(36, PSExperimentsComponent_Conditional_2_For_37_Template, 1, 4, "ng-container", 27, _forTrack1);
296
- i0.ɵɵconditionalCreate(38, PSExperimentsComponent_Conditional_2_Conditional_38_Template, 2, 0, "span", 7);
344
+ i0.ɵɵelementStart(43, "div", 35);
345
+ i0.ɵɵrepeaterCreate(44, PSExperimentsComponent_Conditional_2_For_45_Template, 1, 4, "ng-container", 36, _forTrack1);
346
+ i0.ɵɵconditionalCreate(46, PSExperimentsComponent_Conditional_2_Conditional_46_Template, 2, 0, "span", 15);
297
347
  i0.ɵɵelementEnd()();
298
- i0.ɵɵelementStart(39, "div", 28)(40, "div", 23);
299
- i0.ɵɵelement(41, "i", 29);
300
- i0.ɵɵelementStart(42, "h3");
301
- i0.ɵɵtext(43, "Completed");
348
+ i0.ɵɵelementStart(47, "div", 37)(48, "div", 32);
349
+ i0.ɵɵelement(49, "i", 38);
350
+ i0.ɵɵelementStart(50, "h3");
351
+ i0.ɵɵtext(51, "Completed");
302
352
  i0.ɵɵelementEnd();
303
- i0.ɵɵelementStart(44, "span", 25);
304
- i0.ɵɵtext(45);
353
+ i0.ɵɵelementStart(52, "span", 34);
354
+ i0.ɵɵtext(53);
305
355
  i0.ɵɵelementEnd()();
306
- i0.ɵɵelementStart(46, "div", 26);
307
- i0.ɵɵrepeaterCreate(47, PSExperimentsComponent_Conditional_2_For_48_Template, 1, 4, "ng-container", 27, _forTrack1);
308
- i0.ɵɵconditionalCreate(49, PSExperimentsComponent_Conditional_2_Conditional_49_Template, 2, 0, "span", 7);
356
+ i0.ɵɵelementStart(54, "div", 35);
357
+ i0.ɵɵrepeaterCreate(55, PSExperimentsComponent_Conditional_2_For_56_Template, 1, 4, "ng-container", 36, _forTrack1);
358
+ i0.ɵɵconditionalCreate(57, PSExperimentsComponent_Conditional_2_Conditional_57_Template, 2, 0, "span", 15);
309
359
  i0.ɵɵelementEnd()();
310
- i0.ɵɵelementStart(50, "div", 30)(51, "div", 23);
311
- i0.ɵɵelement(52, "i", 31);
312
- i0.ɵɵelementStart(53, "h3");
313
- i0.ɵɵtext(54, "Pruned");
360
+ i0.ɵɵelementStart(58, "div", 39)(59, "div", 32);
361
+ i0.ɵɵelement(60, "i", 40);
362
+ i0.ɵɵelementStart(61, "h3");
363
+ i0.ɵɵtext(62, "Pruned");
314
364
  i0.ɵɵelementEnd();
315
- i0.ɵɵelementStart(55, "span", 25);
316
- i0.ɵɵtext(56);
365
+ i0.ɵɵelementStart(63, "span", 34);
366
+ i0.ɵɵtext(64);
317
367
  i0.ɵɵelementEnd()();
318
- i0.ɵɵelementStart(57, "div", 26);
319
- i0.ɵɵrepeaterCreate(58, PSExperimentsComponent_Conditional_2_For_59_Template, 1, 4, "ng-container", 27, _forTrack1);
320
- i0.ɵɵconditionalCreate(60, PSExperimentsComponent_Conditional_2_Conditional_60_Template, 2, 0, "span", 7);
368
+ i0.ɵɵelementStart(65, "div", 35);
369
+ i0.ɵɵrepeaterCreate(66, PSExperimentsComponent_Conditional_2_For_67_Template, 1, 4, "ng-container", 36, _forTrack1);
370
+ i0.ɵɵconditionalCreate(68, PSExperimentsComponent_Conditional_2_Conditional_68_Template, 2, 0, "span", 15);
321
371
  i0.ɵɵelementEnd()()();
322
- i0.ɵɵtemplate(61, PSExperimentsComponent_Conditional_2_ng_template_61_Template, 21, 17, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
372
+ i0.ɵɵtemplate(69, PSExperimentsComponent_Conditional_2_ng_template_69_Template, 21, 17, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
323
373
  } if (rf & 2) {
324
374
  const ctx_r1 = i0.ɵɵnextContext();
325
375
  i0.ɵɵadvance(5);
376
+ i0.ɵɵconditional(ctx_r1.sessions.length > 1 ? 5 : -1);
377
+ i0.ɵɵadvance(2);
326
378
  i0.ɵɵtextInterpolate1("", ctx_r1.session.Name, " ");
327
379
  i0.ɵɵadvance();
328
380
  i0.ɵɵclassMap(ctx_r1.sessionBadgeClass);
@@ -333,43 +385,47 @@ function PSExperimentsComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
333
385
  i0.ɵɵadvance(3);
334
386
  i0.ɵɵtextInterpolate(ctx_r1.iterationCountLabel);
335
387
  i0.ɵɵadvance();
336
- i0.ɵɵconditional(ctx_r1.canPause ? 12 : -1);
388
+ i0.ɵɵproperty("disabled", ctx_r1.artifactLoading);
389
+ i0.ɵɵadvance(2);
390
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.artifactLoading ? "Loading\u2026" : "View Results Artifact", " ");
391
+ i0.ɵɵadvance(4);
392
+ i0.ɵɵconditional(ctx_r1.canPause ? 20 : -1);
337
393
  i0.ɵɵadvance();
338
- i0.ɵɵconditional(ctx_r1.canResume ? 13 : -1);
394
+ i0.ɵɵconditional(ctx_r1.canResume ? 21 : -1);
339
395
  i0.ɵɵadvance();
340
- i0.ɵɵconditional(ctx_r1.canCancel ? 14 : -1);
396
+ i0.ɵɵconditional(ctx_r1.canCancel ? 22 : -1);
341
397
  i0.ɵɵadvance(8);
342
398
  i0.ɵɵtextInterpolate1("", ctx_r1.leaderboard.length, " scored \u00B7 by metric");
343
399
  i0.ɵɵadvance();
344
- i0.ɵɵconditional(ctx_r1.leaderboard.length === 0 ? 23 : -1);
400
+ i0.ɵɵconditional(ctx_r1.leaderboard.length === 0 ? 31 : -1);
345
401
  i0.ɵɵadvance();
346
402
  i0.ɵɵrepeater(ctx_r1.leaderboard);
347
403
  i0.ɵɵadvance(2);
348
- i0.ɵɵconditional(ctx_r1.budget.length > 0 ? 26 : -1);
404
+ i0.ɵɵconditional(ctx_r1.budget.length > 0 ? 34 : -1);
349
405
  i0.ɵɵadvance(8);
350
406
  i0.ɵɵtextInterpolate(ctx_r1.kanban.running.length);
351
407
  i0.ɵɵadvance(2);
352
408
  i0.ɵɵrepeater(ctx_r1.kanban.running);
353
409
  i0.ɵɵadvance(2);
354
- i0.ɵɵconditional(ctx_r1.kanban.running.length === 0 ? 38 : -1);
410
+ i0.ɵɵconditional(ctx_r1.kanban.running.length === 0 ? 46 : -1);
355
411
  i0.ɵɵadvance(7);
356
412
  i0.ɵɵtextInterpolate(ctx_r1.kanban.completed.length);
357
413
  i0.ɵɵadvance(2);
358
414
  i0.ɵɵrepeater(ctx_r1.kanban.completed);
359
415
  i0.ɵɵadvance(2);
360
- i0.ɵɵconditional(ctx_r1.kanban.completed.length === 0 ? 49 : -1);
416
+ i0.ɵɵconditional(ctx_r1.kanban.completed.length === 0 ? 57 : -1);
361
417
  i0.ɵɵadvance(7);
362
418
  i0.ɵɵtextInterpolate(ctx_r1.kanban.pruned.length);
363
419
  i0.ɵɵadvance(2);
364
420
  i0.ɵɵrepeater(ctx_r1.kanban.pruned);
365
421
  i0.ɵɵadvance(2);
366
- i0.ɵɵconditional(ctx_r1.kanban.pruned.length === 0 ? 60 : -1);
422
+ i0.ɵɵconditional(ctx_r1.kanban.pruned.length === 0 ? 68 : -1);
367
423
  } }
368
424
  function PSExperimentsComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
369
- const _r13 = i0.ɵɵgetCurrentView();
370
- i0.ɵɵelementStart(0, "ps-confirm-modal", 67);
371
- i0.ɵɵlistener("confirmed", function PSExperimentsComponent_Conditional_3_Template_ps_confirm_modal_confirmed_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.confirmControl()); })("cancelled", function PSExperimentsComponent_Conditional_3_Template_ps_confirm_modal_cancelled_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelControl()); });
372
- i0.ɵɵelement(1, "div", 68);
425
+ const _r17 = i0.ɵɵgetCurrentView();
426
+ i0.ɵɵelementStart(0, "ps-confirm-modal", 79);
427
+ i0.ɵɵlistener("confirmed", function PSExperimentsComponent_Conditional_3_Template_ps_confirm_modal_confirmed_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.confirmControl()); })("cancelled", function PSExperimentsComponent_Conditional_3_Template_ps_confirm_modal_cancelled_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelControl()); });
428
+ i0.ɵɵelement(1, "div", 80);
373
429
  i0.ɵɵelementEnd();
374
430
  } if (rf & 2) {
375
431
  const ctx_r1 = i0.ɵɵnextContext();
@@ -377,6 +433,29 @@ function PSExperimentsComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
377
433
  i0.ɵɵadvance();
378
434
  i0.ɵɵproperty("innerHTML", ctx_r1.pendingMessage, i0.ɵɵsanitizeHtml);
379
435
  } }
436
+ function PSExperimentsComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
437
+ const _r18 = i0.ɵɵgetCurrentView();
438
+ i0.ɵɵelementStart(0, "div", 81);
439
+ i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_4_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeArtifactModal()); });
440
+ i0.ɵɵelementStart(1, "div", 82);
441
+ i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_4_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
442
+ i0.ɵɵelementStart(2, "div", 83)(3, "mj-artifact-viewer-panel", 84);
443
+ i0.ɵɵlistener("closed", function PSExperimentsComponent_Conditional_4_Template_mj_artifact_viewer_panel_closed_3_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeArtifactModal()); });
444
+ i0.ɵɵelementEnd()()()();
445
+ } if (rf & 2) {
446
+ const ctx_r1 = i0.ɵɵnextContext();
447
+ i0.ɵɵadvance(3);
448
+ i0.ɵɵproperty("artifactId", ctx_r1.activeArtifactId)("currentUser", ctx_r1.currentUser)("showCloseButton", true);
449
+ } }
450
+ function PSExperimentsComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
451
+ const _r19 = i0.ɵɵgetCurrentView();
452
+ i0.ɵɵelementStart(0, "ps-run-experiment-modal", 85);
453
+ i0.ɵɵlistener("started", function PSExperimentsComponent_Conditional_5_Template_ps_run_experiment_modal_started_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onExperimentStarted($event)); })("closed", function PSExperimentsComponent_Conditional_5_Template_ps_run_experiment_modal_closed_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeNewExperimentModal()); });
454
+ i0.ɵɵelementEnd();
455
+ } if (rf & 2) {
456
+ const ctx_r1 = i0.ɵɵnextContext();
457
+ i0.ɵɵproperty("engine", ctx_r1.engine)("provider", ctx_r1.provider)("currentUser", ctx_r1.currentUser);
458
+ } }
380
459
  /**
381
460
  * Experiments panel: a kanban of iteration cards in Running / Completed / Pruned columns, a leaderboard
382
461
  * strip ranked by score, and budget gauges — all live against `MJ: Experiment Sessions` + their
@@ -409,6 +488,115 @@ export class PSExperimentsComponent {
409
488
  pendingAction = null;
410
489
  /** Remote Op in flight. */
411
490
  busy = false;
491
+ showNewExperimentModal = false;
492
+ showArtifactModal = false;
493
+ activeArtifactId = null;
494
+ artifactLoading = false;
495
+ get sessions() {
496
+ return this.engine?.Sessions ?? [];
497
+ }
498
+ selectSession(id) {
499
+ this.sessionId = id;
500
+ this.rebuild();
501
+ this.cdr.detectChanges();
502
+ }
503
+ openNewExperimentModal() {
504
+ this.showNewExperimentModal = true;
505
+ }
506
+ closeNewExperimentModal() {
507
+ this.showNewExperimentModal = false;
508
+ }
509
+ async onExperimentStarted(newSessionId) {
510
+ this.closeNewExperimentModal();
511
+ await this.engine.Config(true, this.currentUser ?? undefined, this.provider ?? undefined);
512
+ this.sessionId = newSessionId;
513
+ this.rebuild();
514
+ this.cdr.detectChanges();
515
+ }
516
+ closeArtifactModal() {
517
+ this.showArtifactModal = false;
518
+ this.activeArtifactId = null;
519
+ }
520
+ async viewResultsArtifact() {
521
+ const s = this.session;
522
+ if (!s || this.artifactLoading)
523
+ return;
524
+ this.artifactLoading = true;
525
+ try {
526
+ const p = this.provider ?? Metadata.Provider;
527
+ const rv = new RunView();
528
+ const res = await rv.RunView({
529
+ EntityName: 'MJ: Artifacts',
530
+ ExtraFilter: `Name LIKE '${s.Name}%' OR Comments LIKE '%${s.ID}%'`,
531
+ ResultType: 'entity_object',
532
+ }, this.currentUser ?? undefined);
533
+ if (res.Success && res.Results && res.Results.length > 0) {
534
+ this.activeArtifactId = res.Results[0].ID;
535
+ this.showArtifactModal = true;
536
+ return;
537
+ }
538
+ const art = await p.GetEntityObject('MJ: Artifacts', this.currentUser ?? undefined);
539
+ art.Name = `${s.Name} — Results`;
540
+ art.Description = `Modeling results, leaderboard, and winning model metrics for ${s.Name}.`;
541
+ art.TypeID = 'D41AB707-58F1-4413-8725-9DF31C95F4C5';
542
+ art.Comments = `Auto-generated for Experiment Session ${s.ID}`;
543
+ const saved = await art.Save();
544
+ if (!saved) {
545
+ this.notifications.CreateSimpleNotification('Could not generate artifact record.', 'error', 5000);
546
+ return;
547
+ }
548
+ const ver = await p.GetEntityObject('MJ: Artifact Versions', this.currentUser ?? undefined);
549
+ ver.ArtifactID = art.ID;
550
+ ver.VersionNumber = 1;
551
+ ver.Comments = 'Initial results artifact';
552
+ const planSpec = this.parsePlanSpec(s.PlanSpec);
553
+ const winningRow = this.leaderboard[0];
554
+ const winningIteration = winningRow
555
+ ? this.engine.IterationsForSession(s.ID).find((it) => this.engine.AlgorithmForIteration(it.ID) === winningRow.algorithm && it.Score === winningRow.auc)
556
+ : undefined;
557
+ const winningRun = winningIteration ? this.engine.TrainingRuns.find((r) => UUIDsEqual(r.ExperimentSessionIterationID, winningIteration.ID)) : undefined;
558
+ const winningModelId = winningRun?.ResultingModelID ?? undefined;
559
+ const payload = {
560
+ Name: s.Name,
561
+ Goal: s.Goal || planSpec?.Goal || 'Predictive modeling experiment',
562
+ TargetMetric: planSpec?.TargetDefinition?.SuccessMetric || 'Score',
563
+ Summary: `Experiment session completed with ${this.leaderboard.length} iterations. Winning algorithm: ${winningRow?.algorithm ?? 'None'}.`,
564
+ Leaderboard: this.leaderboard.map((lb) => ({
565
+ rank: lb.rank,
566
+ algorithm: lb.algorithm,
567
+ algorithmName: lb.algorithm,
568
+ featureSet: lb.features,
569
+ score: lb.auc,
570
+ isWinner: lb.best,
571
+ })),
572
+ BestModelID: winningModelId,
573
+ BestModel: winningModelId && winningRow ? { ID: winningModelId, Name: winningRow.algorithm } : undefined,
574
+ Markdown: `## Experiment Session: ${s.Name}\n\n**Status:** ${s.Status}\n**Goal:** ${s.Goal || 'N/A'}\n\n### Leaderboard\n\nRanked by metric:\n` +
575
+ this.leaderboard.map(l => `- **#${l.rank} ${l.algorithm}**: Score ${l.auc.toFixed(3)} (${l.features})`).join('\n'),
576
+ };
577
+ ver.Content = JSON.stringify(payload);
578
+ await ver.Save();
579
+ this.activeArtifactId = art.ID;
580
+ this.showArtifactModal = true;
581
+ }
582
+ catch (e) {
583
+ this.notifications.CreateSimpleNotification(`Error: ${e instanceof Error ? e.message : String(e)}`, 'error', 5000);
584
+ }
585
+ finally {
586
+ this.artifactLoading = false;
587
+ this.cdr.detectChanges();
588
+ }
589
+ }
590
+ parsePlanSpec(raw) {
591
+ if (!raw)
592
+ return null;
593
+ try {
594
+ return JSON.parse(raw);
595
+ }
596
+ catch {
597
+ return null;
598
+ }
599
+ }
412
600
  ngOnInit() {
413
601
  this.selectActiveSession();
414
602
  this.rebuild();
@@ -617,37 +805,65 @@ export class PSExperimentsComponent {
617
805
  this.cdr.detectChanges();
618
806
  }
619
807
  static ɵfac = function PSExperimentsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PSExperimentsComponent)(); };
620
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PSExperimentsComponent, selectors: [["ps-experiments"]], inputs: { engine: "engine", provider: "provider", currentUser: "currentUser" }, decls: 4, vars: 2, consts: [["iterCard", ""], ["data-testid", "ps-experiments-panel", 1, "ps-panel", "ps-experiments"], ["data-testid", "ps-experiments-empty", 1, "ps-empty"], [3, "title", "icon", "confirmIcon", "confirmLabel", "variant", "busy"], [1, "ps-empty-ico"], [1, "fa-solid", "fa-flask"], [1, "sess-head"], [1, "ps-small", "ps-muted"], [1, "ps-badge"], [1, "ps-dot"], [1, "ps-spacer"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-experiments-pause"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-experiments-resume"], ["mjButton", "", "variant", "danger", "size", "sm", "data-testid", "ps-experiments-cancel"], ["data-testid", "ps-experiments-leaderboard", 1, "ps-card"], [1, "ps-card-body", "lead-strip"], [1, "lead-lbl"], [1, "t"], [1, "fa-solid", "fa-trophy", 2, "color", "var(--mj-status-warning)"], [1, "lp", 3, "best", "pruned"], [1, "ps-card"], ["data-testid", "ps-experiments-kanban", 1, "kanban"], ["data-testid", "ps-kanban-col-running", 1, "kcol", "run"], [1, "kcol-head"], [1, "fa-solid", "fa-spinner"], [1, "cnt"], [1, "kbody"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], ["data-testid", "ps-kanban-col-completed", 1, "kcol", "done"], [1, "fa-solid", "fa-circle-check"], ["data-testid", "ps-kanban-col-pruned", 1, "kcol", "prune"], [1, "fa-solid", "fa-scissors"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-experiments-pause", 3, "click"], [1, "fa-solid", "fa-pause"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-experiments-resume", 3, "click"], [1, "fa-solid", "fa-play"], ["mjButton", "", "variant", "danger", "size", "sm", "data-testid", "ps-experiments-cancel", 3, "click"], [1, "fa-solid", "fa-stop"], [1, "lp"], [1, "ps-rank"], [1, "algo-ic"], [1, "nm"], [1, "fs", "ps-muted", "ps-small"], [1, "auc"], [1, "ps-card-body", "budget-rail"], [1, "bud"], [1, "ps-gauge"], [1, "g-val"], [2, "flex", "1"], [1, "ps-section-title"], [1, "b-val"], [1, "ps-muted", "ps-small"], [1, "ps-bar", 2, "margin-top", "6px", "max-width", "150px"], [1, "icard"], [1, "ic-top"], [1, "it", "ps-muted", "ps-small"], [1, "feat-chips"], [1, "ps-tag"], [1, "ic-prog"], [1, "ic-score"], [1, "rationale"], [1, "fa-solid", "fa-robot"], [1, "ps-small"], [1, "ps-bar", "run"], [1, "meta"], [1, "v"], [1, "lbl", "ps-muted", "ps-small"], [3, "confirmed", "cancelled", "title", "icon", "confirmIcon", "confirmLabel", "variant", "busy"], [3, "innerHTML"]], template: function PSExperimentsComponent_Template(rf, ctx) { if (rf & 1) {
808
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PSExperimentsComponent, selectors: [["ps-experiments"]], inputs: { engine: "engine", provider: "provider", currentUser: "currentUser" }, decls: 6, vars: 4, consts: [["iterCard", ""], ["data-testid", "ps-experiments-panel", 1, "ps-panel", "ps-experiments"], ["data-testid", "ps-experiments-empty", 1, "ps-empty"], [3, "title", "icon", "confirmIcon", "confirmLabel", "variant", "busy"], [1, "ps-modal-backdrop"], [3, "engine", "provider", "currentUser"], [1, "ps-empty-ico"], [1, "fa-solid", "fa-flask"], [2, "margin-top", "12px", "display", "flex", "gap", "8px"], ["mjButton", "", "variant", "primary", "size", "sm", "data-testid", "ps-experiments-new-btn-empty", 3, "click"], [1, "sess-head"], [1, "ps-small", "ps-muted", 2, "display", "flex", "align-items", "center", "gap", "8px"], [1, "ps-badge"], [1, "ps-dot"], [1, "ps-spacer"], [1, "ps-small", "ps-muted"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-experiments-view-artifact", 3, "click", "disabled"], [1, "fa-solid", "fa-flask-vial"], ["mjButton", "", "variant", "primary", "size", "sm", "data-testid", "ps-experiments-new-btn", 3, "click"], [1, "fa-solid", "fa-plus"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-experiments-pause"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-experiments-resume"], ["mjButton", "", "variant", "danger", "size", "sm", "data-testid", "ps-experiments-cancel"], ["data-testid", "ps-experiments-leaderboard", 1, "ps-card"], [1, "ps-card-body", "lead-strip"], [1, "lead-lbl"], [1, "t"], [1, "fa-solid", "fa-trophy", 2, "color", "var(--mj-status-warning)"], [1, "lp", 3, "best", "pruned"], [1, "ps-card"], ["data-testid", "ps-experiments-kanban", 1, "kanban"], ["data-testid", "ps-kanban-col-running", 1, "kcol", "run"], [1, "kcol-head"], [1, "fa-solid", "fa-spinner"], [1, "cnt"], [1, "kbody"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], ["data-testid", "ps-kanban-col-completed", 1, "kcol", "done"], [1, "fa-solid", "fa-circle-check"], ["data-testid", "ps-kanban-col-pruned", 1, "kcol", "prune"], [1, "fa-solid", "fa-scissors"], [1, "ps-muted"], [1, "mj-input", 2, "padding", "2px 6px", "font-size", "12px", "height", "26px", 3, "change", "value"], [3, "value"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-experiments-pause", 3, "click"], [1, "fa-solid", "fa-pause"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-experiments-resume", 3, "click"], [1, "fa-solid", "fa-play"], ["mjButton", "", "variant", "danger", "size", "sm", "data-testid", "ps-experiments-cancel", 3, "click"], [1, "fa-solid", "fa-stop"], [1, "lp"], [1, "ps-rank"], [1, "algo-ic"], [1, "nm"], [1, "fs", "ps-muted", "ps-small"], [1, "auc"], [1, "ps-card-body", "budget-rail"], [1, "bud"], [1, "ps-gauge"], [1, "g-val"], [2, "flex", "1"], [1, "ps-section-title"], [1, "b-val"], [1, "ps-muted", "ps-small"], [1, "ps-bar", 2, "margin-top", "6px", "max-width", "150px"], [1, "icard"], [1, "ic-top"], [1, "it", "ps-muted", "ps-small"], [1, "feat-chips"], [1, "ps-tag"], [1, "ic-prog"], [1, "ic-score"], [1, "rationale"], [1, "fa-solid", "fa-robot"], [1, "ps-small"], [1, "ps-bar", "run"], [1, "meta"], [1, "v"], [1, "lbl", "ps-muted", "ps-small"], [3, "confirmed", "cancelled", "title", "icon", "confirmIcon", "confirmLabel", "variant", "busy"], [3, "innerHTML"], [1, "ps-modal-backdrop", 3, "click"], [1, "ps-modal-dialog", 2, "max-width", "960px", "width", "92vw", "height", "85vh", "display", "flex", "flex-direction", "column", "padding", "0", "overflow", "hidden", 3, "click"], [2, "flex", "1", "min-height", "0", "display", "flex", "flex-direction", "column"], [3, "closed", "artifactId", "currentUser", "showCloseButton"], [3, "started", "closed", "engine", "provider", "currentUser"]], template: function PSExperimentsComponent_Template(rf, ctx) { if (rf & 1) {
621
809
  i0.ɵɵelementStart(0, "div", 1);
622
- i0.ɵɵconditionalCreate(1, PSExperimentsComponent_Conditional_1_Template, 7, 0, "div", 2)(2, PSExperimentsComponent_Conditional_2_Template, 63, 19);
810
+ i0.ɵɵconditionalCreate(1, PSExperimentsComponent_Conditional_1_Template, 11, 0, "div", 2)(2, PSExperimentsComponent_Conditional_2_Template, 71, 22);
623
811
  i0.ɵɵconditionalCreate(3, PSExperimentsComponent_Conditional_3_Template, 2, 7, "ps-confirm-modal", 3);
812
+ i0.ɵɵconditionalCreate(4, PSExperimentsComponent_Conditional_4_Template, 4, 3, "div", 4);
813
+ i0.ɵɵconditionalCreate(5, PSExperimentsComponent_Conditional_5_Template, 1, 3, "ps-run-experiment-modal", 5);
624
814
  i0.ɵɵelementEnd();
625
815
  } if (rf & 2) {
626
816
  i0.ɵɵadvance();
627
817
  i0.ɵɵconditional(!ctx.session ? 1 : 2);
628
818
  i0.ɵɵadvance(2);
629
819
  i0.ɵɵconditional(ctx.pendingAction ? 3 : -1);
630
- } }, dependencies: [CommonModule, i1.NgTemplateOutlet, MJButtonDirective, PSConfirmModalComponent, i1.DecimalPipe], styles: ["/* ============================================================================\n Predictive Studio \u2014 shared panel styles (design-token compliant)\n Maps the mockup design system onto MemberJunction semantic --mj-* tokens.\n Loaded by every PS panel component (styleUrls) under ViewEncapsulation.None,\n so the class names are global within the PS dashboard subtree.\n No hardcoded colors except the intentional categorical node/algorithm palette\n (declared once as --ps-* custom props below) which must stay distinct across\n light/dark to remain readable as diagram accents.\n ============================================================================ */\n\n/* Categorical accents for DAG node types + algorithm chips. These are\n data-visualization colors that must remain distinct regardless of theme\n (allowed exception #3 in the design-token rules). */\n.ps-panel {\n --ps-node-source: #6b7280;\n --ps-node-feature: #2050c8;\n --ps-node-embedding: #7b3ff0;\n --ps-node-target: #1f9d57;\n --ps-node-algorithm: #d98213;\n /* budget-gauge categorical accents (reuse the node palette so light/dark stay distinct) */\n --ps-gauge-cost: var(--ps-node-algorithm);\n --ps-gauge-iterations: var(--ps-node-feature);\n}\n\n.ps-panel {\n display: block;\n height: 100%;\n}\n\n/* ---- generic layout helpers ---- */\n.ps-row { display: flex; gap: 16px; }\n.ps-col { display: flex; flex-direction: column; gap: 16px; }\n.ps-wrap { flex-wrap: wrap; }\n.ps-spacer { flex: 1; }\n.ps-muted { color: var(--mj-text-muted); }\n.ps-small { font-size: 12.5px; }\n.ps-mono { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-section-title {\n font-size: 12px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--mj-text-muted); margin: 4px 0 2px; font-weight: 700;\n}\n\n/* ---- cards ---- */\n.ps-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n.ps-card-head {\n display: flex; align-items: center; gap: 10px;\n padding: 14px 16px; border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-card-head h3 { font-size: 14.5px; margin: 0; font-weight: 650; color: var(--mj-text-primary); }\n.ps-card-body { padding: 16px; }\n\n/* ---- KPI tiles ---- */\n.ps-kpi {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 8px; padding: 16px 18px;\n}\n.ps-kpi .label { font-size: 12px; color: var(--mj-text-muted); font-weight: 600; }\n.ps-kpi .val { font-size: 26px; font-weight: 720; letter-spacing: -.02em; margin-top: 2px; color: var(--mj-text-primary); }\n\n/* ---- badges ---- */\n.ps-badge {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 650; line-height: 1.7;\n}\n.ps-badge.gray { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.ps-badge.blue { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n.ps-badge.green { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n.ps-badge.amber { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-badge.red { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }\n\n/* recommendation-level chips (the ranking matrix payoff) */\n.ps-lvl {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 92px; padding: 4px 10px; border-radius: 7px;\n font-weight: 650; font-size: 11.5px; color: var(--mj-text-inverse);\n}\n.ps-lvl-Primary { background: var(--mj-status-success); }\n.ps-lvl-Strong { background: var(--mj-status-info); }\n.ps-lvl-Viable { background: var(--mj-status-warning); }\n.ps-lvl-Weak { background: var(--mj-text-disabled); }\n.ps-lvl-NotRecommended { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* ---- tags ---- */\n.ps-tag {\n display: inline-block; padding: 2px 8px; border-radius: 6px;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n font-size: 11.5px; font-weight: 600;\n}\n.ps-tag.muted { opacity: .6; }\n.ps-divider { height: 1px; background: var(--mj-border-subtle); margin: 8px 0; }\n\n/* ---- tables ---- */\n.ps-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.ps-table th {\n text-align: left; font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.ps-table td { padding: 11px 12px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-primary); }\n.ps-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.ps-table .num { text-align: right; font-variant-numeric: tabular-nums; }\n\n.ps-rank {\n width: 22px; height: 22px; border-radius: 6px; background: var(--mj-bg-surface-sunken);\n display: inline-grid; place-items: center; font-weight: 700; font-size: 11.5px; color: var(--mj-text-secondary);\n}\n.ps-rank.gold { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n\n/* ---- progress bars ---- */\n.ps-bar { height: 8px; border-radius: 999px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--mj-brand-primary); }\n.ps-bar.warn > span { background: var(--mj-status-warning); }\n.ps-bar.run > span { background: var(--mj-brand-primary); }\n\n.ps-fbar { display: grid; grid-template-columns: minmax(150px, 1.3fr) 2fr 56px; align-items: center; gap: 14px; padding: 8px 0; }\n.ps-fbar + .ps-fbar { border-top: 1px solid var(--mj-border-subtle); }\n.ps-fbar .track { height: 10px; border-radius: var(--mj-radius-full); background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-fbar .track > span { display: block; height: 100%; border-radius: var(--mj-radius-full); background: var(--mj-brand-primary); }\n.ps-fbar .track > span.warn { background: var(--mj-status-warning); }\n.ps-fbar .name { color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ps-fbar > .ps-mono { text-align: right; color: var(--mj-text-secondary); font-variant-numeric: tabular-nums; }\n\n/* gauge */\n.ps-gauge {\n position: relative; width: 64px; height: 64px; border-radius: 50%; flex: 0 0 auto;\n background: conic-gradient(var(--ps-gauge-color, var(--mj-brand-primary)) calc(var(--ps-p, 40) * 1%), var(--mj-bg-surface-sunken) 0);\n display: grid; place-items: center;\n}\n.ps-gauge::after { content: ''; position: absolute; inset: 9px; background: var(--mj-bg-surface); border-radius: 50%; }\n.ps-gauge .g-val { position: relative; font-weight: 720; font-size: 14px; color: var(--mj-text-primary); }\n\n/* warning / info callouts */\n.ps-callout { display: flex; gap: 11px; padding: 12px 14px; border-radius: 10px; border: 1px solid; }\n.ps-callout.warn { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); color: var(--mj-status-warning-text); }\n.ps-callout.info { background: var(--mj-status-info-bg); border-color: var(--mj-status-info-border); color: var(--mj-status-info-text); }\n.ps-callout.success { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); color: var(--mj-status-success-text); }\n.ps-callout i { font-size: 16px; margin-top: 1px; }\n\n/* lifecycle stepper */\n.ps-stepper { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }\n.ps-step { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.ps-step .pip {\n width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--mj-border-strong);\n display: grid; place-items: center; font-size: 11px;\n}\n.ps-step.done { color: var(--mj-status-success-text); }\n.ps-step.done .pip { background: var(--mj-status-success); border-color: var(--mj-status-success); color: var(--mj-text-inverse); }\n.ps-step.curr { color: var(--mj-brand-primary); }\n.ps-step.curr .pip { border-color: var(--mj-brand-primary); color: var(--mj-brand-primary); }\n.ps-step .ln { width: 26px; height: 2px; background: var(--mj-border-strong); }\n\n/* ---- DAG flow canvas ---- */\n.ps-flow {\n position: relative;\n background:\n linear-gradient(var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n linear-gradient(90deg, var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default); border-radius: 10px;\n min-height: 620px; overflow: hidden;\n}\n.ps-node {\n position: absolute; width: 190px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong); border-left-width: 3px; border-radius: 8px;\n cursor: pointer;\n}\n.ps-node .nh {\n display: flex; align-items: center; gap: 8px; padding: 9px 11px;\n border-bottom: 1px solid var(--mj-border-subtle); font-weight: 650; font-size: 12.5px; color: var(--mj-text-primary);\n}\n.ps-node .nh i.tile {\n width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-node .nh .ps-tag { margin-left: auto; }\n.ps-node .nb { padding: 9px 11px; font-size: 12px; color: var(--mj-text-secondary); }\n.ps-node .nb-row { display: flex; justify-content: space-between; gap: 8px; padding: 2px 0; }\n.ps-node .nb-row .k { color: var(--mj-text-muted); }\n.ps-node.src { border-left-color: var(--ps-node-source); }\n.ps-node.src .nh i.tile { background: var(--ps-node-source); }\n.ps-node.feat { border-left-color: var(--ps-node-feature); }\n.ps-node.feat .nh i.tile { background: var(--ps-node-feature); }\n.ps-node.emb { border-left-color: var(--ps-node-embedding); }\n.ps-node.emb .nh i.tile { background: var(--ps-node-embedding); }\n.ps-node.target { border-left-color: var(--ps-node-target); }\n.ps-node.target .nh i.tile { background: var(--ps-node-target); }\n.ps-node.algo { border-left-color: var(--ps-node-algorithm); }\n.ps-node.algo .nh i.tile { background: var(--ps-node-algorithm); }\n.ps-node.output { border-left-color: var(--mj-status-success); }\n.ps-node.output .nh i.tile { background: var(--mj-status-success); }\n.ps-node.selected {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n.ps-node .port {\n position: absolute; width: 11px; height: 11px; border-radius: 50%;\n background: var(--mj-bg-surface); border: 2px solid var(--mj-brand-primary);\n top: 50%; transform: translateY(-50%);\n}\n.ps-node .port.in { left: -6px; }\n.ps-node .port.out { right: -6px; }\nsvg.ps-edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }\nsvg.ps-edges path { stroke: color-mix(in srgb, var(--mj-brand-primary) 45%, transparent); stroke-width: 2; fill: none; }\n\n/* palette chips */\n.ps-pchip {\n display: inline-flex; align-items: center; gap: 7px; padding: 6px 11px; border-radius: 8px;\n border: 1px dashed var(--mj-border-strong); background: var(--mj-bg-surface);\n font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); cursor: grab;\n}\n.ps-pchip i { font-size: 12px; color: var(--mj-text-inverse); width: 20px; height: 20px; border-radius: 5px; display: grid; place-items: center; }\n.ps-pchip.s i { background: var(--ps-node-source); }\n.ps-pchip.f i { background: var(--ps-node-feature); }\n.ps-pchip.e i { background: var(--ps-node-embedding); }\n.ps-pchip.t i { background: var(--ps-node-target); }\n.ps-pchip.a i { background: var(--ps-node-algorithm); }\n\n/* segmented control */\n.ps-seg { display: inline-flex; border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden; }\n.ps-seg button {\n border: none; background: var(--mj-bg-surface); color: var(--mj-text-secondary);\n padding: 6px 12px; font-size: 12.5px; font-weight: 600; cursor: pointer;\n border-right: 1px solid var(--mj-border-default);\n}\n.ps-seg button:last-child { border-right: none; }\n.ps-seg button.on { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n/* field control */\n.ps-field { margin-bottom: 14px; }\n.ps-field > label {\n display: block; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; margin-bottom: 6px;\n}\n.ps-input {\n width: 100%; padding: 8px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; background: var(--mj-bg-surface); color: var(--mj-text-primary);\n box-sizing: border-box;\n}\n.ps-input:focus { outline: none; border-color: var(--mj-brand-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); }\n\n/* loading container */\n.ps-loading { display: flex; align-items: center; justify-content: center; padding: 60px 0; }\n\n/* ---- empty / prompt states ---- */\n.ps-empty {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; gap: 10px; padding: 56px 24px; color: var(--mj-text-muted);\n}\n.ps-empty .ps-empty-ico {\n width: 60px; height: 60px; border-radius: 16px; display: grid; place-items: center;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-disabled); font-size: 24px;\n}\n.ps-empty h3 { margin: 4px 0 0; font-size: 16px; font-weight: 650; color: var(--mj-text-secondary); }\n.ps-empty p { margin: 0; max-width: 420px; font-size: 13px; line-height: 1.5; }\n\n/* ---- confirm modal ---- */\n.ps-modal-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n background: var(--mj-bg-overlay);\n display: flex; align-items: center; justify-content: center; padding: 24px;\n}\n.ps-modal {\n width: 100%; max-width: 480px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default); border-radius: 14px;\n box-shadow: var(--mj-shadow-lg, var(--mj-shadow-sm)); overflow: hidden;\n}\n.ps-modal-head {\n display: flex; align-items: center; gap: 12px; padding: 18px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-modal-head .ico {\n width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center;\n font-size: 16px; flex: 0 0 auto;\n background: var(--mj-status-info-bg); color: var(--mj-status-info-text);\n}\n.ps-modal-head.warn .ico { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-modal-head.danger .ico { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-modal-head h3 { margin: 0; font-size: 15.5px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-modal-body { padding: 18px 20px; font-size: 13.5px; line-height: 1.55; color: var(--mj-text-secondary); }\n.ps-modal-body .ps-field { margin-top: 14px; margin-bottom: 0; }\n.ps-modal-foot {\n display: flex; align-items: center; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle); background: var(--mj-bg-surface-card);\n}\n.ps-modal-foot .ps-spacer { flex: 1; }\n", ".ps-experiments { display: flex; flex-direction: column; gap: 16px; }\n\n.ps-experiments .sess-head { display: flex; align-items: center; gap: 12px; }\n.ps-experiments .sess-head h2 { font-size: 18px; color: var(--mj-text-primary); display: flex; align-items: center; gap: 10px; }\n\n/* leaderboard strip */\n.ps-experiments .lead-strip { display: flex; gap: 10px; align-items: center; overflow-x: auto; }\n.ps-experiments .lead-lbl { padding-right: 14px; border-right: 1px solid var(--mj-border-default); flex: 0 0 auto; }\n.ps-experiments .lead-lbl .t { display: flex; align-items: center; gap: 7px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-experiments .lp {\n display: flex; align-items: center; gap: 9px; flex: 0 0 auto; padding: 8px 12px;\n border: 1px solid var(--mj-border-default); border-radius: 9px; background: var(--mj-bg-surface);\n}\n.ps-experiments .lp.best { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); }\n.ps-experiments .lp.pruned { opacity: .55; }\n.ps-experiments .algo-ic {\n width: 26px; height: 26px; border-radius: 7px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-experiments .lp .nm { font-size: 12.5px; font-weight: 600; color: var(--mj-text-primary); }\n.ps-experiments .lp .auc { font-weight: 740; font-variant-numeric: tabular-nums; color: var(--mj-text-primary); }\n.ps-experiments .lp .auc.win { color: var(--mj-status-success-text); }\n\n/* budget rail */\n.ps-experiments .budget-rail { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }\n@media (max-width: 880px) { .ps-experiments .budget-rail { grid-template-columns: 1fr; } }\n.ps-experiments .bud { display: flex; align-items: center; gap: 13px; }\n.ps-experiments .b-val { font-size: 15px; color: var(--mj-text-primary); margin-top: 2px; }\n\n/* kanban */\n.ps-experiments .kanban { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; align-items: start; }\n@media (max-width: 980px) { .ps-experiments .kanban { grid-template-columns: 1fr; } }\n.ps-experiments .kcol { background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default); border-radius: 10px; overflow: hidden; }\n.ps-experiments .kcol-head {\n display: flex; align-items: center; gap: 9px; padding: 12px 14px; border-bottom: 1px solid var(--mj-border-subtle);\n font-weight: 650; color: var(--mj-text-primary);\n}\n.ps-experiments .kcol-head h3 { font-size: 13.5px; margin: 0; flex: 1; }\n.ps-experiments .kcol.run .kcol-head { border-top: 3px solid var(--mj-brand-primary); }\n.ps-experiments .kcol.done .kcol-head { border-top: 3px solid var(--mj-status-success); }\n.ps-experiments .kcol.prune .kcol-head { border-top: 3px solid var(--mj-text-disabled); }\n.ps-experiments .kcol.run .kcol-head i { color: var(--mj-brand-primary); }\n.ps-experiments .kcol.done .kcol-head i { color: var(--mj-status-success); }\n.ps-experiments .kcol.prune .kcol-head i { color: var(--mj-text-muted); }\n.ps-experiments .cnt {\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n border-radius: 999px; padding: 1px 9px; font-size: 12px; font-weight: 700;\n}\n.ps-experiments .kbody { padding: 11px; display: flex; flex-direction: column; gap: 11px; }\n\n.ps-experiments .icard {\n border: 1px solid var(--mj-border-default); border-radius: 9px; padding: 11px;\n background: var(--mj-bg-surface-card); display: flex; flex-direction: column; gap: 9px;\n}\n.ps-experiments .icard.running { border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-border-default)); }\n.ps-experiments .icard.best { border-left: 3px solid var(--mj-status-warning); }\n.ps-experiments .icard.pruned { opacity: .78; }\n.ps-experiments .ic-top { display: flex; align-items: center; gap: 9px; }\n.ps-experiments .ic-top .algo-ic { width: 30px; height: 30px; }\n.ps-experiments .ic-top .nm { font-weight: 600; color: var(--mj-text-primary); font-size: 13px; }\n.ps-experiments .feat-chips { display: flex; gap: 6px; flex-wrap: wrap; }\n.ps-experiments .ic-prog .meta { display: flex; justify-content: space-between; margin-top: 5px; }\n.ps-experiments .ic-score { display: flex; align-items: baseline; gap: 8px; }\n.ps-experiments .ic-score .v { font-size: 21px; font-weight: 720; color: var(--mj-text-primary); font-variant-numeric: tabular-nums; }\n.ps-experiments .ic-score .v.green { color: var(--mj-status-success-text); }\n.ps-experiments .rationale {\n display: flex; gap: 8px; padding-top: 8px; border-top: 1px solid var(--mj-border-subtle); color: var(--mj-text-secondary);\n}\n.ps-experiments .rationale i { color: var(--mj-brand-primary); margin-top: 2px; }\n"], encapsulation: 2 });
820
+ i0.ɵɵadvance();
821
+ i0.ɵɵconditional(ctx.showArtifactModal && ctx.activeArtifactId ? 4 : -1);
822
+ i0.ɵɵadvance();
823
+ i0.ɵɵconditional(ctx.showNewExperimentModal ? 5 : -1);
824
+ } }, dependencies: [CommonModule, i1.NgTemplateOutlet, MJButtonDirective, PSConfirmModalComponent, PSRunExperimentModalComponent, ArtifactsModule, i2.ArtifactViewerPanelComponent, i1.DecimalPipe], styles: ["/* ============================================================================\n Predictive Studio \u2014 shared panel styles (design-token compliant)\n Maps the mockup design system onto MemberJunction semantic --mj-* tokens.\n Loaded by every PS panel component (styleUrls) under ViewEncapsulation.None,\n so the class names are global within the PS dashboard subtree.\n No hardcoded colors except the intentional categorical node/algorithm palette\n (declared once as --ps-* custom props below) which must stay distinct across\n light/dark to remain readable as diagram accents.\n ============================================================================ */\n\n/* Categorical accents for DAG node types + algorithm chips. These are\n data-visualization colors that must remain distinct regardless of theme\n (allowed exception #3 in the design-token rules). */\n.ps-panel {\n --ps-node-source: #6b7280;\n --ps-node-feature: #2050c8;\n --ps-node-embedding: #7b3ff0;\n --ps-node-target: #1f9d57;\n --ps-node-algorithm: #d98213;\n /* budget-gauge categorical accents (reuse the node palette so light/dark stay distinct) */\n --ps-gauge-cost: var(--ps-node-algorithm);\n --ps-gauge-iterations: var(--ps-node-feature);\n}\n\n.ps-panel {\n display: block;\n height: 100%;\n}\n\n/* ---- generic layout helpers ---- */\n.ps-row { display: flex; gap: 16px; }\n.ps-col { display: flex; flex-direction: column; gap: 16px; }\n.ps-wrap { flex-wrap: wrap; }\n.ps-spacer { flex: 1; }\n.ps-muted { color: var(--mj-text-muted); }\n.ps-small { font-size: 12.5px; }\n.ps-mono { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-section-title {\n font-size: 12px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--mj-text-muted); margin: 4px 0 2px; font-weight: 700;\n}\n\n/* ---- cards ---- */\n.ps-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n.ps-card-head {\n display: flex; align-items: center; gap: 10px;\n padding: 14px 16px; border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-card-head h3 { font-size: 14.5px; margin: 0; font-weight: 650; color: var(--mj-text-primary); }\n.ps-card-body { padding: 16px; }\n\n/* ---- KPI tiles ---- */\n.ps-kpi {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 8px; padding: 16px 18px;\n}\n.ps-kpi .label { font-size: 12px; color: var(--mj-text-muted); font-weight: 600; }\n.ps-kpi .val { font-size: 26px; font-weight: 720; letter-spacing: -.02em; margin-top: 2px; color: var(--mj-text-primary); }\n\n/* ---- badges ---- */\n.ps-badge {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 650; line-height: 1.7;\n}\n.ps-badge.gray { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.ps-badge.blue { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n.ps-badge.green { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n.ps-badge.amber { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-badge.red { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }\n\n/* recommendation-level chips (the ranking matrix payoff) */\n.ps-lvl {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 92px; padding: 4px 10px; border-radius: 7px;\n font-weight: 650; font-size: 11.5px; color: var(--mj-text-inverse);\n}\n.ps-lvl-Primary { background: var(--mj-status-success); }\n.ps-lvl-Strong { background: var(--mj-status-info); }\n.ps-lvl-Viable { background: var(--mj-status-warning); }\n.ps-lvl-Weak { background: var(--mj-text-disabled); }\n.ps-lvl-NotRecommended { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* ---- tags ---- */\n.ps-tag {\n display: inline-block; padding: 2px 8px; border-radius: 6px;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n font-size: 11.5px; font-weight: 600;\n}\n.ps-tag.muted { opacity: .6; }\n.ps-divider { height: 1px; background: var(--mj-border-subtle); margin: 8px 0; }\n\n/* ---- tables ---- */\n.ps-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.ps-table th {\n text-align: left; font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.ps-table td { padding: 11px 12px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-primary); }\n.ps-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.ps-table .num { text-align: right; font-variant-numeric: tabular-nums; }\n\n.ps-rank {\n width: 22px; height: 22px; border-radius: 6px; background: var(--mj-bg-surface-sunken);\n display: inline-grid; place-items: center; font-weight: 700; font-size: 11.5px; color: var(--mj-text-secondary);\n}\n.ps-rank.gold { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n\n/* ---- progress bars ---- */\n.ps-bar { height: 8px; border-radius: 999px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--mj-brand-primary); }\n.ps-bar.warn > span { background: var(--mj-status-warning); }\n.ps-bar.run > span { background: var(--mj-brand-primary); }\n\n.ps-fbar { display: grid; grid-template-columns: minmax(150px, 1.3fr) 2fr 56px; align-items: center; gap: 14px; padding: 8px 0; }\n.ps-fbar + .ps-fbar { border-top: 1px solid var(--mj-border-subtle); }\n.ps-fbar .track { height: 10px; border-radius: var(--mj-radius-full); background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-fbar .track > span { display: block; height: 100%; border-radius: var(--mj-radius-full); background: var(--mj-brand-primary); }\n.ps-fbar .track > span.warn { background: var(--mj-status-warning); }\n.ps-fbar .name { color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ps-fbar > .ps-mono { text-align: right; color: var(--mj-text-secondary); font-variant-numeric: tabular-nums; }\n\n/* gauge */\n.ps-gauge {\n position: relative; width: 64px; height: 64px; border-radius: 50%; flex: 0 0 auto;\n background: conic-gradient(var(--ps-gauge-color, var(--mj-brand-primary)) calc(var(--ps-p, 40) * 1%), var(--mj-bg-surface-sunken) 0);\n display: grid; place-items: center;\n}\n.ps-gauge::after { content: ''; position: absolute; inset: 9px; background: var(--mj-bg-surface); border-radius: 50%; }\n.ps-gauge .g-val { position: relative; font-weight: 720; font-size: 14px; color: var(--mj-text-primary); }\n\n/* warning / info callouts */\n.ps-callout { display: flex; gap: 11px; padding: 12px 14px; border-radius: 10px; border: 1px solid; }\n.ps-callout.warn { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); color: var(--mj-status-warning-text); }\n.ps-callout.info { background: var(--mj-status-info-bg); border-color: var(--mj-status-info-border); color: var(--mj-status-info-text); }\n.ps-callout.success { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); color: var(--mj-status-success-text); }\n.ps-callout i { font-size: 16px; margin-top: 1px; }\n\n/* lifecycle stepper */\n.ps-stepper { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }\n.ps-step { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.ps-step .pip {\n width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--mj-border-strong);\n display: grid; place-items: center; font-size: 11px;\n}\n.ps-step.done { color: var(--mj-status-success-text); }\n.ps-step.done .pip { background: var(--mj-status-success); border-color: var(--mj-status-success); color: var(--mj-text-inverse); }\n.ps-step.curr { color: var(--mj-brand-primary); }\n.ps-step.curr .pip { border-color: var(--mj-brand-primary); color: var(--mj-brand-primary); }\n.ps-step .ln { width: 26px; height: 2px; background: var(--mj-border-strong); }\n\n/* ---- DAG flow canvas ---- */\n.ps-flow {\n position: relative;\n background:\n linear-gradient(var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n linear-gradient(90deg, var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default); border-radius: 10px;\n min-height: 620px; overflow: hidden;\n}\n.ps-node {\n position: absolute; width: 190px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong); border-left-width: 3px; border-radius: 8px;\n cursor: pointer;\n}\n.ps-node .nh {\n display: flex; align-items: center; gap: 8px; padding: 9px 11px;\n border-bottom: 1px solid var(--mj-border-subtle); font-weight: 650; font-size: 12.5px; color: var(--mj-text-primary);\n}\n.ps-node .nh i.tile {\n width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-node .nh .ps-tag { margin-left: auto; }\n.ps-node .nb { padding: 9px 11px; font-size: 12px; color: var(--mj-text-secondary); }\n.ps-node .nb-row { display: flex; justify-content: space-between; gap: 8px; padding: 2px 0; }\n.ps-node .nb-row .k { color: var(--mj-text-muted); }\n.ps-node.src { border-left-color: var(--ps-node-source); }\n.ps-node.src .nh i.tile { background: var(--ps-node-source); }\n.ps-node.feat { border-left-color: var(--ps-node-feature); }\n.ps-node.feat .nh i.tile { background: var(--ps-node-feature); }\n.ps-node.emb { border-left-color: var(--ps-node-embedding); }\n.ps-node.emb .nh i.tile { background: var(--ps-node-embedding); }\n.ps-node.target { border-left-color: var(--ps-node-target); }\n.ps-node.target .nh i.tile { background: var(--ps-node-target); }\n.ps-node.algo { border-left-color: var(--ps-node-algorithm); }\n.ps-node.algo .nh i.tile { background: var(--ps-node-algorithm); }\n.ps-node.output { border-left-color: var(--mj-status-success); }\n.ps-node.output .nh i.tile { background: var(--mj-status-success); }\n.ps-node.selected {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n.ps-node .port {\n position: absolute; width: 11px; height: 11px; border-radius: 50%;\n background: var(--mj-bg-surface); border: 2px solid var(--mj-brand-primary);\n top: 50%; transform: translateY(-50%);\n}\n.ps-node .port.in { left: -6px; }\n.ps-node .port.out { right: -6px; }\nsvg.ps-edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }\nsvg.ps-edges path { stroke: color-mix(in srgb, var(--mj-brand-primary) 45%, transparent); stroke-width: 2; fill: none; }\n\n/* palette chips */\n.ps-pchip {\n display: inline-flex; align-items: center; gap: 7px; padding: 6px 11px; border-radius: 8px;\n border: 1px dashed var(--mj-border-strong); background: var(--mj-bg-surface);\n font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); cursor: grab;\n}\n.ps-pchip i { font-size: 12px; color: var(--mj-text-inverse); width: 20px; height: 20px; border-radius: 5px; display: grid; place-items: center; }\n.ps-pchip.s i { background: var(--ps-node-source); }\n.ps-pchip.f i { background: var(--ps-node-feature); }\n.ps-pchip.e i { background: var(--ps-node-embedding); }\n.ps-pchip.t i { background: var(--ps-node-target); }\n.ps-pchip.a i { background: var(--ps-node-algorithm); }\n\n/* segmented control */\n.ps-seg { display: inline-flex; border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden; }\n.ps-seg button {\n border: none; background: var(--mj-bg-surface); color: var(--mj-text-secondary);\n padding: 6px 12px; font-size: 12.5px; font-weight: 600; cursor: pointer;\n border-right: 1px solid var(--mj-border-default);\n}\n.ps-seg button:last-child { border-right: none; }\n.ps-seg button.on { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n/* field control */\n.ps-field { margin-bottom: 14px; }\n.ps-field > label {\n display: block; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; margin-bottom: 6px;\n}\n.ps-input {\n width: 100%; padding: 8px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; background: var(--mj-bg-surface); color: var(--mj-text-primary);\n box-sizing: border-box;\n}\n.ps-input:focus { outline: none; border-color: var(--mj-brand-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); }\n\n/* loading container */\n.ps-loading { display: flex; align-items: center; justify-content: center; padding: 60px 0; }\n\n/* ---- empty / prompt states ---- */\n.ps-empty {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; gap: 10px; padding: 56px 24px; color: var(--mj-text-muted);\n}\n.ps-empty .ps-empty-ico {\n width: 60px; height: 60px; border-radius: 16px; display: grid; place-items: center;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-disabled); font-size: 24px;\n}\n.ps-empty h3 { margin: 4px 0 0; font-size: 16px; font-weight: 650; color: var(--mj-text-secondary); }\n.ps-empty p { margin: 0; max-width: 420px; font-size: 13px; line-height: 1.5; }\n\n/* ---- confirm modal ---- */\n.ps-modal-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n background: var(--mj-bg-overlay);\n display: flex; align-items: center; justify-content: center; padding: 24px;\n}\n.ps-modal {\n width: 100%; max-width: 480px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default); border-radius: 14px;\n box-shadow: var(--mj-shadow-lg, var(--mj-shadow-sm)); overflow: hidden;\n}\n.ps-modal-head {\n display: flex; align-items: center; gap: 12px; padding: 18px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-modal-head .ico {\n width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center;\n font-size: 16px; flex: 0 0 auto;\n background: var(--mj-status-info-bg); color: var(--mj-status-info-text);\n}\n.ps-modal-head.warn .ico { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-modal-head.danger .ico { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-modal-head h3 { margin: 0; font-size: 15.5px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-modal-body { padding: 18px 20px; font-size: 13.5px; line-height: 1.55; color: var(--mj-text-secondary); }\n.ps-modal-body .ps-field { margin-top: 14px; margin-bottom: 0; }\n.ps-modal-foot {\n display: flex; align-items: center; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle); background: var(--mj-bg-surface-card);\n}\n.ps-modal-foot .ps-spacer { flex: 1; }\n", ".ps-experiments { display: flex; flex-direction: column; gap: 16px; }\n\n.ps-experiments .sess-head { display: flex; align-items: center; gap: 12px; }\n.ps-experiments .sess-head h2 { font-size: 18px; color: var(--mj-text-primary); display: flex; align-items: center; gap: 10px; }\n\n/* leaderboard strip */\n.ps-experiments .lead-strip { display: flex; gap: 10px; align-items: center; overflow-x: auto; }\n.ps-experiments .lead-lbl { padding-right: 14px; border-right: 1px solid var(--mj-border-default); flex: 0 0 auto; }\n.ps-experiments .lead-lbl .t { display: flex; align-items: center; gap: 7px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-experiments .lp {\n display: flex; align-items: center; gap: 9px; flex: 0 0 auto; padding: 8px 12px;\n border: 1px solid var(--mj-border-default); border-radius: 9px; background: var(--mj-bg-surface);\n}\n.ps-experiments .lp.best { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); }\n.ps-experiments .lp.pruned { opacity: .55; }\n.ps-experiments .algo-ic {\n width: 26px; height: 26px; border-radius: 7px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-experiments .lp .nm { font-size: 12.5px; font-weight: 600; color: var(--mj-text-primary); }\n.ps-experiments .lp .auc { font-weight: 740; font-variant-numeric: tabular-nums; color: var(--mj-text-primary); }\n.ps-experiments .lp .auc.win { color: var(--mj-status-success-text); }\n\n/* budget rail */\n.ps-experiments .budget-rail { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }\n@media (max-width: 880px) { .ps-experiments .budget-rail { grid-template-columns: 1fr; } }\n.ps-experiments .bud { display: flex; align-items: center; gap: 13px; }\n.ps-experiments .b-val { font-size: 15px; color: var(--mj-text-primary); margin-top: 2px; }\n\n/* kanban */\n.ps-experiments .kanban { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; align-items: start; }\n@media (max-width: 980px) { .ps-experiments .kanban { grid-template-columns: 1fr; } }\n.ps-experiments .kcol { background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default); border-radius: 10px; overflow: hidden; }\n.ps-experiments .kcol-head {\n display: flex; align-items: center; gap: 9px; padding: 12px 14px; border-bottom: 1px solid var(--mj-border-subtle);\n font-weight: 650; color: var(--mj-text-primary);\n}\n.ps-experiments .kcol-head h3 { font-size: 13.5px; margin: 0; flex: 1; }\n.ps-experiments .kcol.run .kcol-head { border-top: 3px solid var(--mj-brand-primary); }\n.ps-experiments .kcol.done .kcol-head { border-top: 3px solid var(--mj-status-success); }\n.ps-experiments .kcol.prune .kcol-head { border-top: 3px solid var(--mj-text-disabled); }\n.ps-experiments .kcol.run .kcol-head i { color: var(--mj-brand-primary); }\n.ps-experiments .kcol.done .kcol-head i { color: var(--mj-status-success); }\n.ps-experiments .kcol.prune .kcol-head i { color: var(--mj-text-muted); }\n.ps-experiments .cnt {\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n border-radius: 999px; padding: 1px 9px; font-size: 12px; font-weight: 700;\n}\n.ps-experiments .kbody { padding: 11px; display: flex; flex-direction: column; gap: 11px; }\n\n.ps-experiments .icard {\n border: 1px solid var(--mj-border-default); border-radius: 9px; padding: 11px;\n background: var(--mj-bg-surface-card); display: flex; flex-direction: column; gap: 9px;\n}\n.ps-experiments .icard.running { border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-border-default)); }\n.ps-experiments .icard.best { border-left: 3px solid var(--mj-status-warning); }\n.ps-experiments .icard.pruned { opacity: .78; }\n.ps-experiments .ic-top { display: flex; align-items: center; gap: 9px; }\n.ps-experiments .ic-top .algo-ic { width: 30px; height: 30px; }\n.ps-experiments .ic-top .nm { font-weight: 600; color: var(--mj-text-primary); font-size: 13px; }\n.ps-experiments .feat-chips { display: flex; gap: 6px; flex-wrap: wrap; }\n.ps-experiments .ic-prog .meta { display: flex; justify-content: space-between; margin-top: 5px; }\n.ps-experiments .ic-score { display: flex; align-items: baseline; gap: 8px; }\n.ps-experiments .ic-score .v { font-size: 21px; font-weight: 720; color: var(--mj-text-primary); font-variant-numeric: tabular-nums; }\n.ps-experiments .ic-score .v.green { color: var(--mj-status-success-text); }\n.ps-experiments .rationale {\n display: flex; gap: 8px; padding-top: 8px; border-top: 1px solid var(--mj-border-subtle); color: var(--mj-text-secondary);\n}\n.ps-experiments .rationale i { color: var(--mj-brand-primary); margin-top: 2px; }\n"], encapsulation: 2 });
631
825
  }
632
826
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PSExperimentsComponent, [{
633
827
  type: Component,
634
- args: [{ standalone: true, selector: 'ps-experiments', imports: [CommonModule, MJButtonDirective, PSConfirmModalComponent], encapsulation: ViewEncapsulation.None, template: `
828
+ args: [{ standalone: true, selector: 'ps-experiments', imports: [CommonModule, MJButtonDirective, PSConfirmModalComponent, PSRunExperimentModalComponent, ArtifactsModule], encapsulation: ViewEncapsulation.None, template: `
635
829
  <div class="ps-panel ps-experiments" data-testid="ps-experiments-panel">
636
830
  @if (!session) {
637
831
  <div class="ps-empty" data-testid="ps-experiments-empty">
638
832
  <span class="ps-empty-ico"><i class="fa-solid fa-flask"></i></span>
639
833
  <h3>No experiment sessions yet</h3>
640
- <p>Launch an experiment to watch the Model Dev Agent search algorithms and feature sets in waves. Running and completed iterations will appear here with a live leaderboard.</p>
834
+ <p>Launch an experiment to watch the Model Dev Agent search algorithms and feature sets in waves, or configure a manual multi-algorithm tournament.</p>
835
+ <div style="margin-top: 12px; display: flex; gap: 8px;">
836
+ <button mjButton variant="primary" size="sm" data-testid="ps-experiments-new-btn-empty" (click)="openNewExperimentModal()">
837
+ <i class="fa-solid fa-flask"></i> New Experiment
838
+ </button>
839
+ </div>
641
840
  </div>
642
841
  } @else {
643
842
  <!-- session header strip -->
644
843
  <div class="sess-head">
645
844
  <div>
646
- <div class="ps-small ps-muted">Experiment session</div>
845
+ <div class="ps-small ps-muted" style="display: flex; align-items: center; gap: 8px;">
846
+ <span>Experiment session</span>
847
+ @if (sessions.length > 1) {
848
+ <span class="ps-muted">· Switch:</span>
849
+ <select class="mj-input" style="padding: 2px 6px; font-size: 12px; height: 26px;"
850
+ [value]="sessionId" (change)="selectSession($any($event.target).value)">
851
+ @for (s of sessions; track s.ID) {
852
+ <option [value]="s.ID">{{ s.Name }} ({{ s.Status }})</option>
853
+ }
854
+ </select>
855
+ }
856
+ </div>
647
857
  <h2>{{ session.Name }} <span class="ps-badge" [class]="sessionBadgeClass"><span class="ps-dot" [style.background]="sessionDotColor"></span> {{ session.Status }}</span></h2>
648
858
  </div>
649
859
  <span class="ps-spacer"></span>
650
860
  <span class="ps-small ps-muted">{{ iterationCountLabel }}</span>
861
+ <button mjButton variant="secondary" size="sm" data-testid="ps-experiments-view-artifact" [disabled]="artifactLoading" (click)="viewResultsArtifact()">
862
+ <i class="fa-solid fa-flask-vial"></i> {{ artifactLoading ? 'Loading…' : 'View Results Artifact' }}
863
+ </button>
864
+ <button mjButton variant="primary" size="sm" data-testid="ps-experiments-new-btn" (click)="openNewExperimentModal()">
865
+ <i class="fa-solid fa-plus"></i> New Experiment
866
+ </button>
651
867
  @if (canPause) {
652
868
  <button mjButton variant="secondary" size="sm" data-testid="ps-experiments-pause" (click)="requestControl('pause')"><i class="fa-solid fa-pause"></i> Pause</button>
653
869
  }
@@ -771,6 +987,32 @@ export class PSExperimentsComponent {
771
987
  <div [innerHTML]="pendingMessage"></div>
772
988
  </ps-confirm-modal>
773
989
  }
990
+
991
+ @if (showArtifactModal && activeArtifactId) {
992
+ <div class="ps-modal-backdrop" (click)="closeArtifactModal()">
993
+ <div class="ps-modal-dialog" style="max-width: 960px; width: 92vw; height: 85vh; display: flex; flex-direction: column; padding: 0; overflow: hidden;"
994
+ (click)="$event.stopPropagation()">
995
+ <div style="flex: 1; min-height: 0; display: flex; flex-direction: column;">
996
+ <mj-artifact-viewer-panel
997
+ [artifactId]="activeArtifactId"
998
+ [currentUser]="currentUser!"
999
+ [showCloseButton]="true"
1000
+ (closed)="closeArtifactModal()">
1001
+ </mj-artifact-viewer-panel>
1002
+ </div>
1003
+ </div>
1004
+ </div>
1005
+ }
1006
+
1007
+ @if (showNewExperimentModal) {
1008
+ <ps-run-experiment-modal
1009
+ [engine]="engine"
1010
+ [provider]="provider"
1011
+ [currentUser]="currentUser"
1012
+ (started)="onExperimentStarted($event)"
1013
+ (closed)="closeNewExperimentModal()">
1014
+ </ps-run-experiment-modal>
1015
+ }
774
1016
  </div>
775
1017
  `, styles: ["/* ============================================================================\n Predictive Studio \u2014 shared panel styles (design-token compliant)\n Maps the mockup design system onto MemberJunction semantic --mj-* tokens.\n Loaded by every PS panel component (styleUrls) under ViewEncapsulation.None,\n so the class names are global within the PS dashboard subtree.\n No hardcoded colors except the intentional categorical node/algorithm palette\n (declared once as --ps-* custom props below) which must stay distinct across\n light/dark to remain readable as diagram accents.\n ============================================================================ */\n\n/* Categorical accents for DAG node types + algorithm chips. These are\n data-visualization colors that must remain distinct regardless of theme\n (allowed exception #3 in the design-token rules). */\n.ps-panel {\n --ps-node-source: #6b7280;\n --ps-node-feature: #2050c8;\n --ps-node-embedding: #7b3ff0;\n --ps-node-target: #1f9d57;\n --ps-node-algorithm: #d98213;\n /* budget-gauge categorical accents (reuse the node palette so light/dark stay distinct) */\n --ps-gauge-cost: var(--ps-node-algorithm);\n --ps-gauge-iterations: var(--ps-node-feature);\n}\n\n.ps-panel {\n display: block;\n height: 100%;\n}\n\n/* ---- generic layout helpers ---- */\n.ps-row { display: flex; gap: 16px; }\n.ps-col { display: flex; flex-direction: column; gap: 16px; }\n.ps-wrap { flex-wrap: wrap; }\n.ps-spacer { flex: 1; }\n.ps-muted { color: var(--mj-text-muted); }\n.ps-small { font-size: 12.5px; }\n.ps-mono { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-section-title {\n font-size: 12px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--mj-text-muted); margin: 4px 0 2px; font-weight: 700;\n}\n\n/* ---- cards ---- */\n.ps-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n.ps-card-head {\n display: flex; align-items: center; gap: 10px;\n padding: 14px 16px; border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-card-head h3 { font-size: 14.5px; margin: 0; font-weight: 650; color: var(--mj-text-primary); }\n.ps-card-body { padding: 16px; }\n\n/* ---- KPI tiles ---- */\n.ps-kpi {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default);\n border-radius: 8px; padding: 16px 18px;\n}\n.ps-kpi .label { font-size: 12px; color: var(--mj-text-muted); font-weight: 600; }\n.ps-kpi .val { font-size: 26px; font-weight: 720; letter-spacing: -.02em; margin-top: 2px; color: var(--mj-text-primary); }\n\n/* ---- badges ---- */\n.ps-badge {\n display: inline-flex; align-items: center; gap: 5px;\n padding: 2px 9px; border-radius: 999px; font-size: 11.5px; font-weight: 650; line-height: 1.7;\n}\n.ps-badge.gray { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.ps-badge.blue { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); }\n.ps-badge.green { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n.ps-badge.amber { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-badge.red { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }\n\n/* recommendation-level chips (the ranking matrix payoff) */\n.ps-lvl {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 92px; padding: 4px 10px; border-radius: 7px;\n font-weight: 650; font-size: 11.5px; color: var(--mj-text-inverse);\n}\n.ps-lvl-Primary { background: var(--mj-status-success); }\n.ps-lvl-Strong { background: var(--mj-status-info); }\n.ps-lvl-Viable { background: var(--mj-status-warning); }\n.ps-lvl-Weak { background: var(--mj-text-disabled); }\n.ps-lvl-NotRecommended { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* ---- tags ---- */\n.ps-tag {\n display: inline-block; padding: 2px 8px; border-radius: 6px;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n font-size: 11.5px; font-weight: 600;\n}\n.ps-tag.muted { opacity: .6; }\n.ps-divider { height: 1px; background: var(--mj-border-subtle); margin: 8px 0; }\n\n/* ---- tables ---- */\n.ps-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.ps-table th {\n text-align: left; font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; padding: 9px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.ps-table td { padding: 11px 12px; border-bottom: 1px solid var(--mj-border-subtle); color: var(--mj-text-primary); }\n.ps-table tr:hover td { background: var(--mj-bg-surface-hover); }\n.ps-table .num { text-align: right; font-variant-numeric: tabular-nums; }\n\n.ps-rank {\n width: 22px; height: 22px; border-radius: 6px; background: var(--mj-bg-surface-sunken);\n display: inline-grid; place-items: center; font-weight: 700; font-size: 11.5px; color: var(--mj-text-secondary);\n}\n.ps-rank.gold { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n\n/* ---- progress bars ---- */\n.ps-bar { height: 8px; border-radius: 999px; background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--mj-brand-primary); }\n.ps-bar.warn > span { background: var(--mj-status-warning); }\n.ps-bar.run > span { background: var(--mj-brand-primary); }\n\n.ps-fbar { display: grid; grid-template-columns: minmax(150px, 1.3fr) 2fr 56px; align-items: center; gap: 14px; padding: 8px 0; }\n.ps-fbar + .ps-fbar { border-top: 1px solid var(--mj-border-subtle); }\n.ps-fbar .track { height: 10px; border-radius: var(--mj-radius-full); background: var(--mj-bg-surface-sunken); overflow: hidden; }\n.ps-fbar .track > span { display: block; height: 100%; border-radius: var(--mj-radius-full); background: var(--mj-brand-primary); }\n.ps-fbar .track > span.warn { background: var(--mj-status-warning); }\n.ps-fbar .name { color: var(--mj-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ps-fbar > .ps-mono { text-align: right; color: var(--mj-text-secondary); font-variant-numeric: tabular-nums; }\n\n/* gauge */\n.ps-gauge {\n position: relative; width: 64px; height: 64px; border-radius: 50%; flex: 0 0 auto;\n background: conic-gradient(var(--ps-gauge-color, var(--mj-brand-primary)) calc(var(--ps-p, 40) * 1%), var(--mj-bg-surface-sunken) 0);\n display: grid; place-items: center;\n}\n.ps-gauge::after { content: ''; position: absolute; inset: 9px; background: var(--mj-bg-surface); border-radius: 50%; }\n.ps-gauge .g-val { position: relative; font-weight: 720; font-size: 14px; color: var(--mj-text-primary); }\n\n/* warning / info callouts */\n.ps-callout { display: flex; gap: 11px; padding: 12px 14px; border-radius: 10px; border: 1px solid; }\n.ps-callout.warn { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); color: var(--mj-status-warning-text); }\n.ps-callout.info { background: var(--mj-status-info-bg); border-color: var(--mj-status-info-border); color: var(--mj-status-info-text); }\n.ps-callout.success { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); color: var(--mj-status-success-text); }\n.ps-callout i { font-size: 16px; margin-top: 1px; }\n\n/* lifecycle stepper */\n.ps-stepper { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }\n.ps-step { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.ps-step .pip {\n width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--mj-border-strong);\n display: grid; place-items: center; font-size: 11px;\n}\n.ps-step.done { color: var(--mj-status-success-text); }\n.ps-step.done .pip { background: var(--mj-status-success); border-color: var(--mj-status-success); color: var(--mj-text-inverse); }\n.ps-step.curr { color: var(--mj-brand-primary); }\n.ps-step.curr .pip { border-color: var(--mj-brand-primary); color: var(--mj-brand-primary); }\n.ps-step .ln { width: 26px; height: 2px; background: var(--mj-border-strong); }\n\n/* ---- DAG flow canvas ---- */\n.ps-flow {\n position: relative;\n background:\n linear-gradient(var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n linear-gradient(90deg, var(--mj-border-subtle) 1px, transparent 1px) 0 0 / 22px 22px,\n var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default); border-radius: 10px;\n min-height: 620px; overflow: hidden;\n}\n.ps-node {\n position: absolute; width: 190px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong); border-left-width: 3px; border-radius: 8px;\n cursor: pointer;\n}\n.ps-node .nh {\n display: flex; align-items: center; gap: 8px; padding: 9px 11px;\n border-bottom: 1px solid var(--mj-border-subtle); font-weight: 650; font-size: 12.5px; color: var(--mj-text-primary);\n}\n.ps-node .nh i.tile {\n width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-node .nh .ps-tag { margin-left: auto; }\n.ps-node .nb { padding: 9px 11px; font-size: 12px; color: var(--mj-text-secondary); }\n.ps-node .nb-row { display: flex; justify-content: space-between; gap: 8px; padding: 2px 0; }\n.ps-node .nb-row .k { color: var(--mj-text-muted); }\n.ps-node.src { border-left-color: var(--ps-node-source); }\n.ps-node.src .nh i.tile { background: var(--ps-node-source); }\n.ps-node.feat { border-left-color: var(--ps-node-feature); }\n.ps-node.feat .nh i.tile { background: var(--ps-node-feature); }\n.ps-node.emb { border-left-color: var(--ps-node-embedding); }\n.ps-node.emb .nh i.tile { background: var(--ps-node-embedding); }\n.ps-node.target { border-left-color: var(--ps-node-target); }\n.ps-node.target .nh i.tile { background: var(--ps-node-target); }\n.ps-node.algo { border-left-color: var(--ps-node-algorithm); }\n.ps-node.algo .nh i.tile { background: var(--ps-node-algorithm); }\n.ps-node.output { border-left-color: var(--mj-status-success); }\n.ps-node.output .nh i.tile { background: var(--mj-status-success); }\n.ps-node.selected {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n}\n.ps-node .port {\n position: absolute; width: 11px; height: 11px; border-radius: 50%;\n background: var(--mj-bg-surface); border: 2px solid var(--mj-brand-primary);\n top: 50%; transform: translateY(-50%);\n}\n.ps-node .port.in { left: -6px; }\n.ps-node .port.out { right: -6px; }\nsvg.ps-edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }\nsvg.ps-edges path { stroke: color-mix(in srgb, var(--mj-brand-primary) 45%, transparent); stroke-width: 2; fill: none; }\n\n/* palette chips */\n.ps-pchip {\n display: inline-flex; align-items: center; gap: 7px; padding: 6px 11px; border-radius: 8px;\n border: 1px dashed var(--mj-border-strong); background: var(--mj-bg-surface);\n font-size: 12.5px; font-weight: 600; color: var(--mj-text-secondary); cursor: grab;\n}\n.ps-pchip i { font-size: 12px; color: var(--mj-text-inverse); width: 20px; height: 20px; border-radius: 5px; display: grid; place-items: center; }\n.ps-pchip.s i { background: var(--ps-node-source); }\n.ps-pchip.f i { background: var(--ps-node-feature); }\n.ps-pchip.e i { background: var(--ps-node-embedding); }\n.ps-pchip.t i { background: var(--ps-node-target); }\n.ps-pchip.a i { background: var(--ps-node-algorithm); }\n\n/* segmented control */\n.ps-seg { display: inline-flex; border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden; }\n.ps-seg button {\n border: none; background: var(--mj-bg-surface); color: var(--mj-text-secondary);\n padding: 6px 12px; font-size: 12.5px; font-weight: 600; cursor: pointer;\n border-right: 1px solid var(--mj-border-default);\n}\n.ps-seg button:last-child { border-right: none; }\n.ps-seg button.on { background: var(--mj-brand-primary); color: var(--mj-text-inverse); }\n\n/* field control */\n.ps-field { margin-bottom: 14px; }\n.ps-field > label {\n display: block; font-size: 11px; text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700; margin-bottom: 6px;\n}\n.ps-input {\n width: 100%; padding: 8px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; background: var(--mj-bg-surface); color: var(--mj-text-primary);\n box-sizing: border-box;\n}\n.ps-input:focus { outline: none; border-color: var(--mj-brand-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); }\n\n/* loading container */\n.ps-loading { display: flex; align-items: center; justify-content: center; padding: 60px 0; }\n\n/* ---- empty / prompt states ---- */\n.ps-empty {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; gap: 10px; padding: 56px 24px; color: var(--mj-text-muted);\n}\n.ps-empty .ps-empty-ico {\n width: 60px; height: 60px; border-radius: 16px; display: grid; place-items: center;\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-disabled); font-size: 24px;\n}\n.ps-empty h3 { margin: 4px 0 0; font-size: 16px; font-weight: 650; color: var(--mj-text-secondary); }\n.ps-empty p { margin: 0; max-width: 420px; font-size: 13px; line-height: 1.5; }\n\n/* ---- confirm modal ---- */\n.ps-modal-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n background: var(--mj-bg-overlay);\n display: flex; align-items: center; justify-content: center; padding: 24px;\n}\n.ps-modal {\n width: 100%; max-width: 480px; background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default); border-radius: 14px;\n box-shadow: var(--mj-shadow-lg, var(--mj-shadow-sm)); overflow: hidden;\n}\n.ps-modal-head {\n display: flex; align-items: center; gap: 12px; padding: 18px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.ps-modal-head .ico {\n width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center;\n font-size: 16px; flex: 0 0 auto;\n background: var(--mj-status-info-bg); color: var(--mj-status-info-text);\n}\n.ps-modal-head.warn .ico { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n.ps-modal-head.danger .ico { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n.ps-modal-head h3 { margin: 0; font-size: 15.5px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-modal-body { padding: 18px 20px; font-size: 13.5px; line-height: 1.55; color: var(--mj-text-secondary); }\n.ps-modal-body .ps-field { margin-top: 14px; margin-bottom: 0; }\n.ps-modal-foot {\n display: flex; align-items: center; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle); background: var(--mj-bg-surface-card);\n}\n.ps-modal-foot .ps-spacer { flex: 1; }\n", ".ps-experiments { display: flex; flex-direction: column; gap: 16px; }\n\n.ps-experiments .sess-head { display: flex; align-items: center; gap: 12px; }\n.ps-experiments .sess-head h2 { font-size: 18px; color: var(--mj-text-primary); display: flex; align-items: center; gap: 10px; }\n\n/* leaderboard strip */\n.ps-experiments .lead-strip { display: flex; gap: 10px; align-items: center; overflow-x: auto; }\n.ps-experiments .lead-lbl { padding-right: 14px; border-right: 1px solid var(--mj-border-default); flex: 0 0 auto; }\n.ps-experiments .lead-lbl .t { display: flex; align-items: center; gap: 7px; font-weight: 650; color: var(--mj-text-primary); }\n.ps-experiments .lp {\n display: flex; align-items: center; gap: 9px; flex: 0 0 auto; padding: 8px 12px;\n border: 1px solid var(--mj-border-default); border-radius: 9px; background: var(--mj-bg-surface);\n}\n.ps-experiments .lp.best { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); }\n.ps-experiments .lp.pruned { opacity: .55; }\n.ps-experiments .algo-ic {\n width: 26px; height: 26px; border-radius: 7px; display: grid; place-items: center;\n color: var(--mj-text-inverse); font-size: 12px; flex: 0 0 auto;\n}\n.ps-experiments .lp .nm { font-size: 12.5px; font-weight: 600; color: var(--mj-text-primary); }\n.ps-experiments .lp .auc { font-weight: 740; font-variant-numeric: tabular-nums; color: var(--mj-text-primary); }\n.ps-experiments .lp .auc.win { color: var(--mj-status-success-text); }\n\n/* budget rail */\n.ps-experiments .budget-rail { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }\n@media (max-width: 880px) { .ps-experiments .budget-rail { grid-template-columns: 1fr; } }\n.ps-experiments .bud { display: flex; align-items: center; gap: 13px; }\n.ps-experiments .b-val { font-size: 15px; color: var(--mj-text-primary); margin-top: 2px; }\n\n/* kanban */\n.ps-experiments .kanban { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; align-items: start; }\n@media (max-width: 980px) { .ps-experiments .kanban { grid-template-columns: 1fr; } }\n.ps-experiments .kcol { background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default); border-radius: 10px; overflow: hidden; }\n.ps-experiments .kcol-head {\n display: flex; align-items: center; gap: 9px; padding: 12px 14px; border-bottom: 1px solid var(--mj-border-subtle);\n font-weight: 650; color: var(--mj-text-primary);\n}\n.ps-experiments .kcol-head h3 { font-size: 13.5px; margin: 0; flex: 1; }\n.ps-experiments .kcol.run .kcol-head { border-top: 3px solid var(--mj-brand-primary); }\n.ps-experiments .kcol.done .kcol-head { border-top: 3px solid var(--mj-status-success); }\n.ps-experiments .kcol.prune .kcol-head { border-top: 3px solid var(--mj-text-disabled); }\n.ps-experiments .kcol.run .kcol-head i { color: var(--mj-brand-primary); }\n.ps-experiments .kcol.done .kcol-head i { color: var(--mj-status-success); }\n.ps-experiments .kcol.prune .kcol-head i { color: var(--mj-text-muted); }\n.ps-experiments .cnt {\n background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary);\n border-radius: 999px; padding: 1px 9px; font-size: 12px; font-weight: 700;\n}\n.ps-experiments .kbody { padding: 11px; display: flex; flex-direction: column; gap: 11px; }\n\n.ps-experiments .icard {\n border: 1px solid var(--mj-border-default); border-radius: 9px; padding: 11px;\n background: var(--mj-bg-surface-card); display: flex; flex-direction: column; gap: 9px;\n}\n.ps-experiments .icard.running { border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-border-default)); }\n.ps-experiments .icard.best { border-left: 3px solid var(--mj-status-warning); }\n.ps-experiments .icard.pruned { opacity: .78; }\n.ps-experiments .ic-top { display: flex; align-items: center; gap: 9px; }\n.ps-experiments .ic-top .algo-ic { width: 30px; height: 30px; }\n.ps-experiments .ic-top .nm { font-weight: 600; color: var(--mj-text-primary); font-size: 13px; }\n.ps-experiments .feat-chips { display: flex; gap: 6px; flex-wrap: wrap; }\n.ps-experiments .ic-prog .meta { display: flex; justify-content: space-between; margin-top: 5px; }\n.ps-experiments .ic-score { display: flex; align-items: baseline; gap: 8px; }\n.ps-experiments .ic-score .v { font-size: 21px; font-weight: 720; color: var(--mj-text-primary); font-variant-numeric: tabular-nums; }\n.ps-experiments .ic-score .v.green { color: var(--mj-status-success-text); }\n.ps-experiments .rationale {\n display: flex; gap: 8px; padding-top: 8px; border-top: 1px solid var(--mj-border-subtle); color: var(--mj-text-secondary);\n}\n.ps-experiments .rationale i { color: var(--mj-brand-primary); margin-top: 2px; }\n"] }]
776
1018
  }], null, { engine: [{
@@ -780,7 +1022,7 @@ export class PSExperimentsComponent {
780
1022
  }], currentUser: [{
781
1023
  type: Input
782
1024
  }] }); })();
783
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PSExperimentsComponent, { className: "PSExperimentsComponent", filePath: "src/PredictiveStudio/components/ps-experiments.component.ts", lineNumber: 195 }); })();
1025
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PSExperimentsComponent, { className: "PSExperimentsComponent", filePath: "src/PredictiveStudio/components/ps-experiments.component.ts", lineNumber: 248 }); })();
784
1026
  /** Minimal HTML-escape for interpolating session names into the modal's innerHTML message. */
785
1027
  function escapeHtml(value) {
786
1028
  return value