@memberjunction/ng-dashboards 6.2.0-edge.4 → 6.2.0-edge.6

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 (205) hide show
  1. package/README.md +28 -0
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +1 -1
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +15 -7
  5. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  6. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +7 -1
  7. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  8. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +209 -57
  9. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +12 -11
  11. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -1
  12. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +15 -15
  13. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -1
  14. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +28 -16
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
  18. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  19. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +30 -6
  20. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  21. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -1
  22. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  23. package/dist/AI/components/tags/tags-resource.component.js +15 -7
  24. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  25. package/dist/AI/components/vectors/sensitive-fields.d.ts +58 -0
  26. package/dist/AI/components/vectors/sensitive-fields.d.ts.map +1 -0
  27. package/dist/AI/components/vectors/sensitive-fields.js +251 -0
  28. package/dist/AI/components/vectors/sensitive-fields.js.map +1 -0
  29. package/dist/AI/components/vectors/vector-document-rules.d.ts +139 -0
  30. package/dist/AI/components/vectors/vector-document-rules.d.ts.map +1 -0
  31. package/dist/AI/components/vectors/vector-document-rules.js +182 -0
  32. package/dist/AI/components/vectors/vector-document-rules.js.map +1 -0
  33. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +83 -14
  34. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  35. package/dist/AI/components/vectors/vector-management-resource.component.js +546 -271
  36. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  37. package/dist/AI/components/vectors/vector-store-selection.d.ts +32 -0
  38. package/dist/AI/components/vectors/vector-store-selection.d.ts.map +1 -0
  39. package/dist/AI/components/vectors/vector-store-selection.js +57 -0
  40. package/dist/AI/components/vectors/vector-store-selection.js.map +1 -0
  41. package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts +236 -0
  42. package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts.map +1 -0
  43. package/dist/ChiefOfStaff/chief-of-staff-agent-context.js +374 -0
  44. package/dist/ChiefOfStaff/chief-of-staff-agent-context.js.map +1 -0
  45. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts +195 -0
  46. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts.map +1 -0
  47. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js +2910 -0
  48. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js.map +1 -0
  49. package/dist/ChiefOfStaff/index.d.ts +3 -0
  50. package/dist/ChiefOfStaff/index.d.ts.map +1 -0
  51. package/dist/ChiefOfStaff/index.js +3 -0
  52. package/dist/ChiefOfStaff/index.js.map +1 -0
  53. package/dist/Communication/communication-agent-context.d.ts +11 -1
  54. package/dist/Communication/communication-agent-context.d.ts.map +1 -1
  55. package/dist/Communication/communication-agent-context.js +15 -0
  56. package/dist/Communication/communication-agent-context.js.map +1 -1
  57. package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
  58. package/dist/Communication/communication-dashboard.component.js +5 -0
  59. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  60. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  61. package/dist/Communication/communication-logs-resource.component.js +2 -1
  62. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  63. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  64. package/dist/Communication/communication-monitor-resource.component.js +23 -18
  65. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  66. package/dist/Communication/communication-providers-resource.component.d.ts +27 -1
  67. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  68. package/dist/Communication/communication-providers-resource.component.js +722 -78
  69. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  70. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  71. package/dist/Communication/communication-runs-resource.component.js +11 -10
  72. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  73. package/dist/DashboardEditor/dashboard-editor.component.d.ts +17 -2
  74. package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -1
  75. package/dist/DashboardEditor/dashboard-editor.component.js +94 -43
  76. package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -1
  77. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +49 -0
  78. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  79. package/dist/DataExplorer/data-explorer-dashboard.component.js +220 -55
  80. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  81. package/dist/DataExplorer/models/explorer-state.interface.d.ts +2 -0
  82. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
  83. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
  84. package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
  85. package/dist/DevTools/app-state-inspector.component.js +1 -0
  86. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  87. package/dist/DevTools/class-registry.component.d.ts.map +1 -1
  88. package/dist/DevTools/class-registry.component.js +1 -0
  89. package/dist/DevTools/class-registry.component.js.map +1 -1
  90. package/dist/DevTools/event-monitor.component.d.ts.map +1 -1
  91. package/dist/DevTools/event-monitor.component.js +2 -0
  92. package/dist/DevTools/event-monitor.component.js.map +1 -1
  93. package/dist/DevTools/graphql-console.component.d.ts.map +1 -1
  94. package/dist/DevTools/graphql-console.component.js.map +1 -1
  95. package/dist/DevTools/grid-width-lab.component.d.ts.map +1 -1
  96. package/dist/DevTools/grid-width-lab.component.js +1 -0
  97. package/dist/DevTools/grid-width-lab.component.js.map +1 -1
  98. package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
  99. package/dist/DevTools/layout-inspector.component.js +1 -0
  100. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  101. package/dist/DevTools/lazy-module-status.component.d.ts.map +1 -1
  102. package/dist/DevTools/lazy-module-status.component.js +1 -0
  103. package/dist/DevTools/lazy-module-status.component.js.map +1 -1
  104. package/dist/DevTools/settings-explorer.component.d.ts.map +1 -1
  105. package/dist/DevTools/settings-explorer.component.js +1 -0
  106. package/dist/DevTools/settings-explorer.component.js.map +1 -1
  107. package/dist/DevTools/tab-strip-lab.component.d.ts.map +1 -1
  108. package/dist/DevTools/tab-strip-lab.component.js +1 -0
  109. package/dist/DevTools/tab-strip-lab.component.js.map +1 -1
  110. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +5 -0
  111. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  112. package/dist/EntityAdmin/entity-admin-dashboard.component.js +8 -5
  113. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  114. package/dist/Integration/components/overview/overview.component.js +2 -2
  115. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +2 -2
  116. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  117. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.d.ts +11 -1
  118. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.d.ts.map +1 -1
  119. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.js +24 -2
  120. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.js.map +1 -1
  121. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts +16 -2
  122. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts.map +1 -1
  123. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +87 -33
  124. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
  125. package/dist/LoginStudio/login-studio-inspector.component.d.ts +130 -0
  126. package/dist/LoginStudio/login-studio-inspector.component.d.ts.map +1 -0
  127. package/dist/LoginStudio/login-studio-inspector.component.js +781 -0
  128. package/dist/LoginStudio/login-studio-inspector.component.js.map +1 -0
  129. package/dist/LoginStudio/login-studio-resource.component.d.ts +161 -0
  130. package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -0
  131. package/dist/LoginStudio/login-studio-resource.component.js +890 -0
  132. package/dist/LoginStudio/login-studio-resource.component.js.map +1 -0
  133. package/dist/MCP/mcp-dashboard.component.d.ts +24 -4
  134. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  135. package/dist/MCP/mcp-dashboard.component.js +118 -65
  136. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  137. package/dist/PredictiveStudio/business-predictions.view-models.d.ts +1 -1
  138. package/dist/PredictiveStudio/business-predictions.view-models.d.ts.map +1 -1
  139. package/dist/PredictiveStudio/business-predictions.view-models.js +3 -3
  140. package/dist/PredictiveStudio/business-predictions.view-models.js.map +1 -1
  141. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts +6 -63
  142. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
  143. package/dist/PredictiveStudio/components/ps-experiments.component.js +256 -521
  144. package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
  145. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts +0 -18
  146. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts.map +1 -1
  147. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +122 -249
  148. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js.map +1 -1
  149. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +5 -9
  150. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
  151. package/dist/PredictiveStudio/components/ps-pipelines.component.js +98 -130
  152. package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
  153. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts +53 -4
  154. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -1
  155. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +335 -326
  156. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -1
  157. package/dist/PredictiveStudio/components/ps-row-drivers.component.d.ts +19 -0
  158. package/dist/PredictiveStudio/components/ps-row-drivers.component.d.ts.map +1 -0
  159. package/dist/PredictiveStudio/components/ps-row-drivers.component.js +85 -0
  160. package/dist/PredictiveStudio/components/ps-row-drivers.component.js.map +1 -0
  161. package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts +19 -1
  162. package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts.map +1 -1
  163. package/dist/PredictiveStudio/engine/predictive-studio.engine.js +51 -2
  164. package/dist/PredictiveStudio/engine/predictive-studio.engine.js.map +1 -1
  165. package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts +3 -1
  166. package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts.map +1 -1
  167. package/dist/PredictiveStudio/predictive-studio-agent-context.js +3 -0
  168. package/dist/PredictiveStudio/predictive-studio-agent-context.js.map +1 -1
  169. package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts +27 -4
  170. package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts.map +1 -1
  171. package/dist/PredictiveStudio/predictive-studio-score-history.service.js +94 -61
  172. package/dist/PredictiveStudio/predictive-studio-score-history.service.js.map +1 -1
  173. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts +29 -5
  174. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
  175. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +185 -103
  176. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
  177. package/dist/PredictiveStudio/resources/ps-studio-resource.component.js +1 -1
  178. package/dist/PredictiveStudio/resources/ps-studio-resource.component.js.map +1 -1
  179. package/dist/Workflows/components/workflow-runs-resource.component.js +4 -4
  180. package/dist/Workflows/components/workflow-runs-resource.component.js.map +1 -1
  181. package/dist/ai-dashboards.module.d.ts +22 -21
  182. package/dist/ai-dashboards.module.d.ts.map +1 -1
  183. package/dist/ai-dashboards.module.js +8 -2
  184. package/dist/ai-dashboards.module.js.map +1 -1
  185. package/dist/core-dashboards.module.d.ts +2 -1
  186. package/dist/core-dashboards.module.d.ts.map +1 -1
  187. package/dist/core-dashboards.module.js +11 -3
  188. package/dist/core-dashboards.module.js.map +1 -1
  189. package/dist/public-api.d.ts +3 -0
  190. package/dist/public-api.d.ts.map +1 -1
  191. package/dist/public-api.js +4 -0
  192. package/dist/public-api.js.map +1 -1
  193. package/package.json +72 -69
  194. package/dist/PredictiveStudio/at-risk.view-models.d.ts +0 -120
  195. package/dist/PredictiveStudio/at-risk.view-models.d.ts.map +0 -1
  196. package/dist/PredictiveStudio/at-risk.view-models.js +0 -261
  197. package/dist/PredictiveStudio/at-risk.view-models.js.map +0 -1
  198. package/dist/PredictiveStudio/components/ps-confirm-modal.component.d.ts +0 -109
  199. package/dist/PredictiveStudio/components/ps-confirm-modal.component.d.ts.map +0 -1
  200. package/dist/PredictiveStudio/components/ps-confirm-modal.component.js +0 -323
  201. package/dist/PredictiveStudio/components/ps-confirm-modal.component.js.map +0 -1
  202. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts +0 -137
  203. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts.map +0 -1
  204. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js +0 -826
  205. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js.map +0 -1
@@ -2,13 +2,11 @@ import { ChangeDetectorRef, Component, Input, ViewEncapsulation, inject } from '
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { MJButtonDirective } from '@memberjunction/ng-ui-components';
4
4
  import { MJNotificationService } from '@memberjunction/ng-notifications';
5
- import { UUIDsEqual } from '@memberjunction/global';
6
- import { Metadata, RunView } from '@memberjunction/core';
7
- import { PredictiveStudioControlExperimentSessionOperation, } from '@memberjunction/core-entities';
5
+ import { EscapeSQLString, UUIDsEqual } from '@memberjunction/global';
6
+ import { LogError, Metadata, RunView } from '@memberjunction/core';
7
+ import { ExperimentSessions } from '@memberjunction/predictive-studio-core';
8
8
  import { ArtifactsModule } from '@memberjunction/ng-artifacts';
9
9
  import { DeriveLeaderboard, GroupIterationsToKanban, } from '../predictive-studio.view-models';
10
- import { PSConfirmModalComponent } from './ps-confirm-modal.component';
11
- import { PSRunExperimentModalComponent } from './ps-run-experiment-modal.component';
12
10
  import * as i0 from "@angular/core";
13
11
  import * as i1 from "@angular/common";
14
12
  import * as i2 from "@memberjunction/ng-artifacts";
@@ -17,444 +15,404 @@ const _forTrack0 = ($index, $item) => $item.rank;
17
15
  const _forTrack1 = ($index, $item) => $item.Iteration;
18
16
  const _forTrack2 = ($index, $item) => $item.ID;
19
17
  const _forTrack3 = ($index, $item) => $item.label;
18
+ function PSExperimentsComponent_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
19
+ i0.ɵɵelementStart(0, "p", 6);
20
+ i0.ɵɵtext(1);
21
+ i0.ɵɵelementEnd();
22
+ } if (rf & 2) {
23
+ const ctx_r0 = i0.ɵɵnextContext(2);
24
+ i0.ɵɵadvance();
25
+ i0.ɵɵtextInterpolate(ctx_r0.SessionsDisabledReason);
26
+ } }
20
27
  function PSExperimentsComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
21
- const _r1 = i0.ɵɵgetCurrentView();
22
- i0.ɵɵelementStart(0, "div", 2)(1, "span", 6);
23
- i0.ɵɵelement(2, "i", 7);
28
+ i0.ɵɵelementStart(0, "div", 2)(1, "span", 4);
29
+ i0.ɵɵelement(2, "i", 5);
24
30
  i0.ɵɵelementEnd();
25
31
  i0.ɵɵelementStart(3, "h3");
26
32
  i0.ɵɵtext(4, "No experiment sessions yet");
27
33
  i0.ɵɵelementEnd();
28
- i0.ɵɵelementStart(5, "p");
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.");
34
+ i0.ɵɵconditionalCreate(5, PSExperimentsComponent_Conditional_1_Conditional_5_Template, 2, 1, "p", 6);
30
35
  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()()();
36
+ } if (rf & 2) {
37
+ const ctx_r0 = i0.ɵɵnextContext();
38
+ i0.ɵɵadvance(5);
39
+ i0.ɵɵconditional(!ctx_r0.SessionsEnabled ? 5 : -1);
36
40
  } }
37
41
  function PSExperimentsComponent_Conditional_2_Conditional_5_For_4_Template(rf, ctx) { if (rf & 1) {
38
- i0.ɵɵelementStart(0, "option", 43);
42
+ i0.ɵɵelementStart(0, "option", 36);
39
43
  i0.ɵɵtext(1);
40
44
  i0.ɵɵelementEnd();
41
45
  } if (rf & 2) {
42
- const s_r5 = ctx.$implicit;
43
- i0.ɵɵproperty("value", s_r5.ID);
46
+ const s_r4 = ctx.$implicit;
47
+ i0.ɵɵproperty("value", s_r4.ID);
44
48
  i0.ɵɵadvance();
45
- i0.ɵɵtextInterpolate2("", s_r5.Name, " (", s_r5.Status, ")");
49
+ i0.ɵɵtextInterpolate2("", s_r4.Name, " (", s_r4.Status, ")");
46
50
  } }
47
51
  function PSExperimentsComponent_Conditional_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
48
- const _r4 = i0.ɵɵgetCurrentView();
49
- i0.ɵɵelementStart(0, "span", 41);
52
+ const _r3 = i0.ɵɵgetCurrentView();
53
+ i0.ɵɵelementStart(0, "span", 34);
50
54
  i0.ɵɵtext(1, "\u00B7 Switch:");
51
55
  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);
56
+ i0.ɵɵelementStart(2, "select", 35);
57
+ i0.ɵɵlistener("change", function PSExperimentsComponent_Conditional_2_Conditional_5_Template_select_change_2_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.selectSession($event.target.value)); });
58
+ i0.ɵɵrepeaterCreate(3, PSExperimentsComponent_Conditional_2_Conditional_5_For_4_Template, 2, 3, "option", 36, _forTrack2);
55
59
  i0.ɵɵelementEnd();
56
60
  } if (rf & 2) {
57
- const ctx_r1 = i0.ɵɵnextContext(2);
61
+ const ctx_r0 = i0.ɵɵnextContext(2);
58
62
  i0.ɵɵadvance(2);
59
- i0.ɵɵproperty("value", ctx_r1.sessionId);
63
+ i0.ɵɵproperty("value", ctx_r0.sessionId);
60
64
  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);
68
- i0.ɵɵtext(2, " Pause");
69
- i0.ɵɵelementEnd();
70
- } }
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);
76
- i0.ɵɵtext(2, " Resume");
77
- i0.ɵɵelementEnd();
65
+ i0.ɵɵrepeater(ctx_r0.sessions);
78
66
  } }
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);
84
- i0.ɵɵtext(2, " Cancel");
85
- i0.ɵɵelementEnd();
67
+ function PSExperimentsComponent_Conditional_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelementStart(0, "div", 15);
69
+ i0.ɵɵelement(1, "i", 37);
70
+ i0.ɵɵelementStart(2, "div", 38);
71
+ i0.ɵɵtext(3);
72
+ i0.ɵɵelementEnd()();
73
+ } if (rf & 2) {
74
+ const ctx_r0 = i0.ɵɵnextContext(2);
75
+ i0.ɵɵadvance(3);
76
+ i0.ɵɵtextInterpolate(ctx_r0.SessionsDisabledReason);
86
77
  } }
87
- function PSExperimentsComponent_Conditional_2_Conditional_31_Template(rf, ctx) { if (rf & 1) {
88
- i0.ɵɵelementStart(0, "span", 15);
78
+ function PSExperimentsComponent_Conditional_2_Conditional_26_Template(rf, ctx) { if (rf & 1) {
79
+ i0.ɵɵelementStart(0, "span", 12);
89
80
  i0.ɵɵtext(1, "No scored iterations yet.");
90
81
  i0.ɵɵelementEnd();
91
82
  } }
92
- function PSExperimentsComponent_Conditional_2_For_33_Template(rf, ctx) { if (rf & 1) {
93
- i0.ɵɵelementStart(0, "div", 50)(1, "span", 51);
83
+ function PSExperimentsComponent_Conditional_2_For_28_Template(rf, ctx) { if (rf & 1) {
84
+ i0.ɵɵelementStart(0, "div", 39)(1, "span", 40);
94
85
  i0.ɵɵtext(2);
95
86
  i0.ɵɵelementEnd();
96
- i0.ɵɵelementStart(3, "span", 52);
87
+ i0.ɵɵelementStart(3, "span", 41);
97
88
  i0.ɵɵelement(4, "i");
98
89
  i0.ɵɵelementEnd();
99
- i0.ɵɵelementStart(5, "div")(6, "div", 53);
90
+ i0.ɵɵelementStart(5, "div")(6, "div", 42);
100
91
  i0.ɵɵtext(7);
101
92
  i0.ɵɵelementEnd();
102
- i0.ɵɵelementStart(8, "div", 54);
93
+ i0.ɵɵelementStart(8, "div", 43);
103
94
  i0.ɵɵtext(9);
104
95
  i0.ɵɵelementEnd()();
105
- i0.ɵɵelementStart(10, "span", 55);
96
+ i0.ɵɵelementStart(10, "span", 44);
106
97
  i0.ɵɵtext(11);
107
98
  i0.ɵɵpipe(12, "number");
108
99
  i0.ɵɵelementEnd()();
109
100
  } if (rf & 2) {
110
- const lp_r9 = ctx.$implicit;
111
- i0.ɵɵclassProp("best", lp_r9.best)("pruned", lp_r9.pruned);
101
+ const lp_r5 = ctx.$implicit;
102
+ i0.ɵɵclassProp("best", lp_r5.best)("pruned", lp_r5.pruned);
112
103
  i0.ɵɵadvance();
113
- i0.ɵɵclassProp("gold", lp_r9.best);
104
+ i0.ɵɵclassProp("gold", lp_r5.best);
114
105
  i0.ɵɵadvance();
115
- i0.ɵɵtextInterpolate(lp_r9.rank);
106
+ i0.ɵɵtextInterpolate(lp_r5.rank);
116
107
  i0.ɵɵadvance();
117
- i0.ɵɵstyleProp("background", lp_r9.algorithmColor);
108
+ i0.ɵɵstyleProp("background", lp_r5.algorithmColor);
118
109
  i0.ɵɵadvance();
119
- i0.ɵɵclassMap(lp_r9.algorithmIcon);
110
+ i0.ɵɵclassMap(lp_r5.algorithmIcon);
120
111
  i0.ɵɵadvance(3);
121
- i0.ɵɵtextInterpolate(lp_r9.algorithm);
112
+ i0.ɵɵtextInterpolate(lp_r5.algorithm);
122
113
  i0.ɵɵadvance(2);
123
- i0.ɵɵtextInterpolate(lp_r9.features);
114
+ i0.ɵɵtextInterpolate(lp_r5.features);
124
115
  i0.ɵɵadvance();
125
- i0.ɵɵclassProp("win", lp_r9.best);
116
+ i0.ɵɵclassProp("win", lp_r5.best);
126
117
  i0.ɵɵadvance();
127
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(12, 16, lp_r9.auc, "1.3-3"));
118
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(12, 16, lp_r5.auc, "1.3-3"));
128
119
  } }
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);
120
+ function PSExperimentsComponent_Conditional_2_Conditional_29_For_3_Template(rf, ctx) { if (rf & 1) {
121
+ i0.ɵɵelementStart(0, "div", 46)(1, "div", 47)(2, "span", 48);
131
122
  i0.ɵɵtext(3);
132
123
  i0.ɵɵelementEnd()();
133
- i0.ɵɵelementStart(4, "div", 60)(5, "div", 61);
124
+ i0.ɵɵelementStart(4, "div", 49)(5, "div", 50);
134
125
  i0.ɵɵtext(6);
135
126
  i0.ɵɵelementEnd();
136
- i0.ɵɵelementStart(7, "div", 62)(8, "strong");
127
+ i0.ɵɵelementStart(7, "div", 51)(8, "strong");
137
128
  i0.ɵɵtext(9);
138
129
  i0.ɵɵelementEnd();
139
- i0.ɵɵelementStart(10, "span", 63);
130
+ i0.ɵɵelementStart(10, "span", 52);
140
131
  i0.ɵɵtext(11);
141
132
  i0.ɵɵelementEnd()();
142
- i0.ɵɵelementStart(12, "div", 64);
133
+ i0.ɵɵelementStart(12, "div", 53);
143
134
  i0.ɵɵelement(13, "span");
144
135
  i0.ɵɵelementEnd()()();
145
136
  } if (rf & 2) {
146
- const b_r10 = ctx.$implicit;
137
+ const b_r6 = ctx.$implicit;
147
138
  i0.ɵɵadvance();
148
- i0.ɵɵstyleProp("--ps-p", b_r10.fillPct)("--ps-gauge-color", b_r10.color);
139
+ i0.ɵɵstyleProp("--ps-p", b_r6.fillPct)("--ps-gauge-color", b_r6.color);
149
140
  i0.ɵɵadvance(2);
150
- i0.ɵɵtextInterpolate(b_r10.centerText);
141
+ i0.ɵɵtextInterpolate(b_r6.centerText);
151
142
  i0.ɵɵadvance(3);
152
- i0.ɵɵtextInterpolate(b_r10.label);
143
+ i0.ɵɵtextInterpolate(b_r6.label);
153
144
  i0.ɵɵadvance(3);
154
- i0.ɵɵtextInterpolate(b_r10.value);
145
+ i0.ɵɵtextInterpolate(b_r6.value);
155
146
  i0.ɵɵadvance(2);
156
- i0.ɵɵtextInterpolate1("/ ", b_r10.cap);
147
+ i0.ɵɵtextInterpolate1("/ ", b_r6.cap);
157
148
  i0.ɵɵadvance(2);
158
- i0.ɵɵstyleProp("width", b_r10.fillPct, "%")("background", b_r10.color);
149
+ i0.ɵɵstyleProp("width", b_r6.fillPct, "%")("background", b_r6.color);
159
150
  } }
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);
151
+ function PSExperimentsComponent_Conditional_2_Conditional_29_Template(rf, ctx) { if (rf & 1) {
152
+ i0.ɵɵelementStart(0, "div", 22)(1, "div", 45);
153
+ i0.ɵɵrepeaterCreate(2, PSExperimentsComponent_Conditional_2_Conditional_29_For_3_Template, 14, 12, "div", 46, _forTrack3);
163
154
  i0.ɵɵelementEnd()();
164
155
  } if (rf & 2) {
165
- const ctx_r1 = i0.ɵɵnextContext(2);
156
+ const ctx_r0 = i0.ɵɵnextContext(2);
166
157
  i0.ɵɵadvance(2);
167
- i0.ɵɵrepeater(ctx_r1.budget);
158
+ i0.ɵɵrepeater(ctx_r0.budget);
168
159
  } }
169
- function PSExperimentsComponent_Conditional_2_For_45_Template(rf, ctx) { if (rf & 1) {
170
- i0.ɵɵelementContainer(0, 36);
160
+ function PSExperimentsComponent_Conditional_2_For_40_Template(rf, ctx) { if (rf & 1) {
161
+ i0.ɵɵelementContainer(0, 29);
171
162
  } if (rf & 2) {
172
- const c_r11 = ctx.$implicit;
163
+ const c_r7 = ctx.$implicit;
173
164
  i0.ɵɵnextContext();
174
- const iterCard_r12 = i0.ɵɵreference(70);
175
- i0.ɵɵproperty("ngTemplateOutlet", iterCard_r12)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, c_r11));
165
+ const iterCard_r8 = i0.ɵɵreference(65);
166
+ i0.ɵɵproperty("ngTemplateOutlet", iterCard_r8)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, c_r7));
176
167
  } }
177
- function PSExperimentsComponent_Conditional_2_Conditional_46_Template(rf, ctx) { if (rf & 1) {
178
- i0.ɵɵelementStart(0, "span", 15);
168
+ function PSExperimentsComponent_Conditional_2_Conditional_41_Template(rf, ctx) { if (rf & 1) {
169
+ i0.ɵɵelementStart(0, "span", 12);
179
170
  i0.ɵɵtext(1, "No running iterations.");
180
171
  i0.ɵɵelementEnd();
181
172
  } }
182
- function PSExperimentsComponent_Conditional_2_For_56_Template(rf, ctx) { if (rf & 1) {
183
- i0.ɵɵelementContainer(0, 36);
173
+ function PSExperimentsComponent_Conditional_2_For_51_Template(rf, ctx) { if (rf & 1) {
174
+ i0.ɵɵelementContainer(0, 29);
184
175
  } if (rf & 2) {
185
- const c_r13 = ctx.$implicit;
176
+ const c_r9 = ctx.$implicit;
186
177
  i0.ɵɵnextContext();
187
- const iterCard_r12 = i0.ɵɵreference(70);
188
- i0.ɵɵproperty("ngTemplateOutlet", iterCard_r12)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, c_r13));
178
+ const iterCard_r8 = i0.ɵɵreference(65);
179
+ i0.ɵɵproperty("ngTemplateOutlet", iterCard_r8)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, c_r9));
189
180
  } }
190
- function PSExperimentsComponent_Conditional_2_Conditional_57_Template(rf, ctx) { if (rf & 1) {
191
- i0.ɵɵelementStart(0, "span", 15);
181
+ function PSExperimentsComponent_Conditional_2_Conditional_52_Template(rf, ctx) { if (rf & 1) {
182
+ i0.ɵɵelementStart(0, "span", 12);
192
183
  i0.ɵɵtext(1, "No completed iterations.");
193
184
  i0.ɵɵelementEnd();
194
185
  } }
195
- function PSExperimentsComponent_Conditional_2_For_67_Template(rf, ctx) { if (rf & 1) {
196
- i0.ɵɵelementContainer(0, 36);
186
+ function PSExperimentsComponent_Conditional_2_For_62_Template(rf, ctx) { if (rf & 1) {
187
+ i0.ɵɵelementContainer(0, 29);
197
188
  } if (rf & 2) {
198
- const c_r14 = ctx.$implicit;
189
+ const c_r10 = ctx.$implicit;
199
190
  i0.ɵɵnextContext();
200
- const iterCard_r12 = i0.ɵɵreference(70);
201
- i0.ɵɵproperty("ngTemplateOutlet", iterCard_r12)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, c_r14));
191
+ const iterCard_r8 = i0.ɵɵreference(65);
192
+ i0.ɵɵproperty("ngTemplateOutlet", iterCard_r8)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, c_r10));
202
193
  } }
203
- function PSExperimentsComponent_Conditional_2_Conditional_68_Template(rf, ctx) { if (rf & 1) {
204
- i0.ɵɵelementStart(0, "span", 15);
194
+ function PSExperimentsComponent_Conditional_2_Conditional_63_Template(rf, ctx) { if (rf & 1) {
195
+ i0.ɵɵelementStart(0, "span", 12);
205
196
  i0.ɵɵtext(1, "Nothing pruned.");
206
197
  i0.ɵɵelementEnd();
207
198
  } }
208
- function PSExperimentsComponent_Conditional_2_ng_template_69_For_14_Template(rf, ctx) { if (rf & 1) {
209
- i0.ɵɵelementStart(0, "span", 69);
199
+ function PSExperimentsComponent_Conditional_2_ng_template_64_For_14_Template(rf, ctx) { if (rf & 1) {
200
+ i0.ɵɵelementStart(0, "span", 58);
210
201
  i0.ɵɵtext(1);
211
202
  i0.ɵɵelementEnd();
212
203
  } if (rf & 2) {
213
- const f_r15 = ctx.$implicit;
204
+ const f_r11 = ctx.$implicit;
214
205
  i0.ɵɵadvance();
215
- i0.ɵɵtextInterpolate(f_r15);
206
+ i0.ɵɵtextInterpolate(f_r11);
216
207
  } }
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);
208
+ function PSExperimentsComponent_Conditional_2_ng_template_64_Conditional_15_Template(rf, ctx) { if (rf & 1) {
209
+ i0.ɵɵelementStart(0, "div", 59)(1, "div", 64);
219
210
  i0.ɵɵelement(2, "span");
220
211
  i0.ɵɵelementEnd();
221
- i0.ɵɵelementStart(3, "div", 76)(4, "span", 63);
212
+ i0.ɵɵelementStart(3, "div", 65)(4, "span", 52);
222
213
  i0.ɵɵtext(5);
223
214
  i0.ɵɵelementEnd()()();
224
215
  } if (rf & 2) {
225
- const c_r16 = i0.ɵɵnextContext().c;
216
+ const c_r12 = i0.ɵɵnextContext().c;
226
217
  i0.ɵɵadvance(2);
227
- i0.ɵɵstyleProp("width", c_r16.Progress, "%");
218
+ i0.ɵɵstyleProp("width", c_r12.Progress, "%");
228
219
  i0.ɵɵadvance(3);
229
- i0.ɵɵtextInterpolate(c_r16.ProgressDetail);
220
+ i0.ɵɵtextInterpolate(c_r12.ProgressDetail);
230
221
  } }
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);
222
+ function PSExperimentsComponent_Conditional_2_ng_template_64_Conditional_16_Template(rf, ctx) { if (rf & 1) {
223
+ i0.ɵɵelementStart(0, "div", 60)(1, "span", 66);
233
224
  i0.ɵɵtext(2);
234
225
  i0.ɵɵpipe(3, "number");
235
226
  i0.ɵɵelementEnd();
236
- i0.ɵɵelementStart(4, "span", 78);
227
+ i0.ɵɵelementStart(4, "span", 67);
237
228
  i0.ɵɵtext(5);
238
229
  i0.ɵɵelementEnd()();
239
230
  } if (rf & 2) {
240
- const c_r16 = i0.ɵɵnextContext().c;
231
+ const c_r12 = i0.ɵɵnextContext().c;
241
232
  i0.ɵɵadvance();
242
- i0.ɵɵclassProp("green", c_r16.status === "Best");
233
+ i0.ɵɵclassProp("green", c_r12.status === "Best");
243
234
  i0.ɵɵadvance();
244
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(3, 4, c_r16.score, "1.3-3"));
235
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(3, 4, c_r12.score, "1.3-3"));
245
236
  i0.ɵɵadvance(3);
246
- i0.ɵɵtextInterpolate1("score \u00B7 ", c_r16.ScoreDelta);
237
+ i0.ɵɵtextInterpolate1("score \u00B7 ", c_r12.ScoreDelta);
247
238
  } }
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);
239
+ function PSExperimentsComponent_Conditional_2_ng_template_64_Template(rf, ctx) { if (rf & 1) {
240
+ i0.ɵɵelementStart(0, "div", 54)(1, "div", 55)(2, "span", 41);
250
241
  i0.ɵɵelement(3, "i");
251
242
  i0.ɵɵelementEnd();
252
- i0.ɵɵelementStart(4, "div")(5, "div", 53);
243
+ i0.ɵɵelementStart(4, "div")(5, "div", 42);
253
244
  i0.ɵɵtext(6);
254
245
  i0.ɵɵelementEnd();
255
- i0.ɵɵelementStart(7, "div", 67);
246
+ i0.ɵɵelementStart(7, "div", 56);
256
247
  i0.ɵɵtext(8);
257
248
  i0.ɵɵelementEnd()();
258
- i0.ɵɵelement(9, "span", 14);
259
- i0.ɵɵelementStart(10, "span", 12);
249
+ i0.ɵɵelement(9, "span", 11);
250
+ i0.ɵɵelementStart(10, "span", 9);
260
251
  i0.ɵɵtext(11);
261
252
  i0.ɵɵelementEnd()();
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);
253
+ i0.ɵɵelementStart(12, "div", 57);
254
+ i0.ɵɵrepeaterCreate(13, PSExperimentsComponent_Conditional_2_ng_template_64_For_14_Template, 2, 1, "span", 58, i0.ɵɵrepeaterTrackByIdentity);
264
255
  i0.ɵɵelementEnd();
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);
256
+ i0.ɵɵconditionalCreate(15, PSExperimentsComponent_Conditional_2_ng_template_64_Conditional_15_Template, 6, 3, "div", 59)(16, PSExperimentsComponent_Conditional_2_ng_template_64_Conditional_16_Template, 6, 7, "div", 60);
257
+ i0.ɵɵelementStart(17, "div", 61);
258
+ i0.ɵɵelement(18, "i", 62);
259
+ i0.ɵɵelementStart(19, "span", 63);
269
260
  i0.ɵɵtext(20);
270
261
  i0.ɵɵelementEnd()()();
271
262
  } if (rf & 2) {
272
- const c_r16 = ctx.c;
273
- const ctx_r1 = i0.ɵɵnextContext(2);
274
- i0.ɵɵclassProp("best", c_r16.status === "Best")("running", c_r16.status === "Running")("pruned", c_r16.status === "Pruned");
263
+ const c_r12 = ctx.c;
264
+ const ctx_r0 = i0.ɵɵnextContext(2);
265
+ i0.ɵɵclassProp("best", c_r12.status === "Best")("running", c_r12.status === "Running")("pruned", c_r12.status === "Pruned");
275
266
  i0.ɵɵadvance(2);
276
- i0.ɵɵstyleProp("background", c_r16.algorithmColor);
267
+ i0.ɵɵstyleProp("background", c_r12.algorithmColor);
277
268
  i0.ɵɵadvance();
278
- i0.ɵɵclassMap(c_r16.algorithmIcon);
269
+ i0.ɵɵclassMap(c_r12.algorithmIcon);
279
270
  i0.ɵɵadvance(3);
280
- i0.ɵɵtextInterpolate(c_r16.algorithm);
271
+ i0.ɵɵtextInterpolate(c_r12.algorithm);
281
272
  i0.ɵɵadvance(2);
282
- i0.ɵɵtextInterpolate(c_r16.iteration);
273
+ i0.ɵɵtextInterpolate(c_r12.iteration);
283
274
  i0.ɵɵadvance(2);
284
- i0.ɵɵclassMap(ctx_r1.statusBadgeClass(c_r16.status));
275
+ i0.ɵɵclassMap(ctx_r0.statusBadgeClass(c_r12.status));
285
276
  i0.ɵɵadvance();
286
- i0.ɵɵtextInterpolate(ctx_r1.statusLabel(c_r16.status));
277
+ i0.ɵɵtextInterpolate(ctx_r0.statusLabel(c_r12.status));
287
278
  i0.ɵɵadvance(2);
288
- i0.ɵɵrepeater(c_r16.features);
279
+ i0.ɵɵrepeater(c_r12.features);
289
280
  i0.ɵɵadvance(2);
290
- i0.ɵɵconditional(c_r16.status === "Running" ? 15 : 16);
281
+ i0.ɵɵconditional(c_r12.status === "Running" ? 15 : 16);
291
282
  i0.ɵɵadvance(5);
292
- i0.ɵɵtextInterpolate(c_r16.rationale);
283
+ i0.ɵɵtextInterpolate(c_r12.rationale);
293
284
  } }
294
285
  function PSExperimentsComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
295
- const _r3 = i0.ɵɵgetCurrentView();
296
- i0.ɵɵelementStart(0, "div", 10)(1, "div")(2, "div", 11)(3, "span");
286
+ const _r2 = i0.ɵɵgetCurrentView();
287
+ i0.ɵɵelementStart(0, "div", 7)(1, "div")(2, "div", 8)(3, "span");
297
288
  i0.ɵɵtext(4, "Experiment session");
298
289
  i0.ɵɵelementEnd();
299
290
  i0.ɵɵconditionalCreate(5, PSExperimentsComponent_Conditional_2_Conditional_5_Template, 5, 1);
300
291
  i0.ɵɵelementEnd();
301
292
  i0.ɵɵelementStart(6, "h2");
302
293
  i0.ɵɵtext(7);
303
- i0.ɵɵelementStart(8, "span", 12);
304
- i0.ɵɵelement(9, "span", 13);
294
+ i0.ɵɵelementStart(8, "span", 9);
295
+ i0.ɵɵelement(9, "span", 10);
305
296
  i0.ɵɵtext(10);
306
297
  i0.ɵɵelementEnd()()();
307
- i0.ɵɵelement(11, "span", 14);
308
- i0.ɵɵelementStart(12, "span", 15);
298
+ i0.ɵɵelement(11, "span", 11);
299
+ i0.ɵɵelementStart(12, "span", 12);
309
300
  i0.ɵɵtext(13);
310
301
  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);
302
+ i0.ɵɵelementStart(14, "button", 13);
303
+ i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_2_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.viewResultsArtifact()); });
304
+ i0.ɵɵelement(15, "i", 14);
314
305
  i0.ɵɵtext(16);
306
+ i0.ɵɵelementEnd()();
307
+ i0.ɵɵconditionalCreate(17, PSExperimentsComponent_Conditional_2_Conditional_17_Template, 4, 1, "div", 15);
308
+ i0.ɵɵelementStart(18, "div", 16)(19, "div", 17)(20, "div", 18)(21, "div", 19);
309
+ i0.ɵɵelement(22, "i", 20);
310
+ i0.ɵɵtext(23, " Leaderboard");
315
311
  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 ");
320
- i0.ɵɵelementEnd();
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);
324
- i0.ɵɵelementEnd();
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");
328
- i0.ɵɵelementEnd();
329
- i0.ɵɵelementStart(29, "div", 15);
330
- i0.ɵɵtext(30);
312
+ i0.ɵɵelementStart(24, "div", 12);
313
+ i0.ɵɵtext(25);
331
314
  i0.ɵɵelementEnd()();
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);
315
+ i0.ɵɵconditionalCreate(26, PSExperimentsComponent_Conditional_2_Conditional_26_Template, 2, 0, "span", 12);
316
+ i0.ɵɵrepeaterCreate(27, PSExperimentsComponent_Conditional_2_For_28_Template, 13, 19, "div", 21, _forTrack0);
334
317
  i0.ɵɵelementEnd()();
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);
318
+ i0.ɵɵconditionalCreate(29, PSExperimentsComponent_Conditional_2_Conditional_29_Template, 4, 0, "div", 22);
319
+ i0.ɵɵelementStart(30, "div", 23)(31, "div", 24)(32, "div", 25);
320
+ i0.ɵɵelement(33, "i", 26);
321
+ i0.ɵɵelementStart(34, "h3");
322
+ i0.ɵɵtext(35, "Running");
323
+ i0.ɵɵelementEnd();
324
+ i0.ɵɵelementStart(36, "span", 27);
325
+ i0.ɵɵtext(37);
343
326
  i0.ɵɵelementEnd()();
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);
327
+ i0.ɵɵelementStart(38, "div", 28);
328
+ i0.ɵɵrepeaterCreate(39, PSExperimentsComponent_Conditional_2_For_40_Template, 1, 4, "ng-container", 29, _forTrack1);
329
+ i0.ɵɵconditionalCreate(41, PSExperimentsComponent_Conditional_2_Conditional_41_Template, 2, 0, "span", 12);
347
330
  i0.ɵɵelementEnd()();
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");
331
+ i0.ɵɵelementStart(42, "div", 30)(43, "div", 25);
332
+ i0.ɵɵelement(44, "i", 31);
333
+ i0.ɵɵelementStart(45, "h3");
334
+ i0.ɵɵtext(46, "Completed");
352
335
  i0.ɵɵelementEnd();
353
- i0.ɵɵelementStart(52, "span", 34);
354
- i0.ɵɵtext(53);
336
+ i0.ɵɵelementStart(47, "span", 27);
337
+ i0.ɵɵtext(48);
355
338
  i0.ɵɵelementEnd()();
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);
339
+ i0.ɵɵelementStart(49, "div", 28);
340
+ i0.ɵɵrepeaterCreate(50, PSExperimentsComponent_Conditional_2_For_51_Template, 1, 4, "ng-container", 29, _forTrack1);
341
+ i0.ɵɵconditionalCreate(52, PSExperimentsComponent_Conditional_2_Conditional_52_Template, 2, 0, "span", 12);
359
342
  i0.ɵɵelementEnd()();
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");
343
+ i0.ɵɵelementStart(53, "div", 32)(54, "div", 25);
344
+ i0.ɵɵelement(55, "i", 33);
345
+ i0.ɵɵelementStart(56, "h3");
346
+ i0.ɵɵtext(57, "Pruned");
364
347
  i0.ɵɵelementEnd();
365
- i0.ɵɵelementStart(63, "span", 34);
366
- i0.ɵɵtext(64);
348
+ i0.ɵɵelementStart(58, "span", 27);
349
+ i0.ɵɵtext(59);
367
350
  i0.ɵɵelementEnd()();
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);
351
+ i0.ɵɵelementStart(60, "div", 28);
352
+ i0.ɵɵrepeaterCreate(61, PSExperimentsComponent_Conditional_2_For_62_Template, 1, 4, "ng-container", 29, _forTrack1);
353
+ i0.ɵɵconditionalCreate(63, PSExperimentsComponent_Conditional_2_Conditional_63_Template, 2, 0, "span", 12);
371
354
  i0.ɵɵelementEnd()()();
372
- i0.ɵɵtemplate(69, PSExperimentsComponent_Conditional_2_ng_template_69_Template, 21, 17, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
355
+ i0.ɵɵtemplate(64, PSExperimentsComponent_Conditional_2_ng_template_64_Template, 21, 17, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
373
356
  } if (rf & 2) {
374
- const ctx_r1 = i0.ɵɵnextContext();
357
+ const ctx_r0 = i0.ɵɵnextContext();
375
358
  i0.ɵɵadvance(5);
376
- i0.ɵɵconditional(ctx_r1.sessions.length > 1 ? 5 : -1);
359
+ i0.ɵɵconditional(ctx_r0.sessions.length > 1 ? 5 : -1);
377
360
  i0.ɵɵadvance(2);
378
- i0.ɵɵtextInterpolate1("", ctx_r1.session.Name, " ");
361
+ i0.ɵɵtextInterpolate1("", ctx_r0.session.Name, " ");
379
362
  i0.ɵɵadvance();
380
- i0.ɵɵclassMap(ctx_r1.sessionBadgeClass);
363
+ i0.ɵɵclassMap(ctx_r0.sessionBadgeClass);
381
364
  i0.ɵɵadvance();
382
- i0.ɵɵstyleProp("background", ctx_r1.sessionDotColor);
365
+ i0.ɵɵstyleProp("background", ctx_r0.sessionDotColor);
383
366
  i0.ɵɵadvance();
384
- i0.ɵɵtextInterpolate1(" ", ctx_r1.session.Status);
367
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.session.Status);
385
368
  i0.ɵɵadvance(3);
386
- i0.ɵɵtextInterpolate(ctx_r1.iterationCountLabel);
369
+ i0.ɵɵtextInterpolate(ctx_r0.iterationCountLabel);
387
370
  i0.ɵɵadvance();
388
- i0.ɵɵproperty("disabled", ctx_r1.artifactLoading);
371
+ i0.ɵɵproperty("disabled", ctx_r0.artifactLoading);
389
372
  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);
393
- i0.ɵɵadvance();
394
- i0.ɵɵconditional(ctx_r1.canResume ? 21 : -1);
373
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.artifactLoading ? "Loading\u2026" : "View Results Artifact", " ");
395
374
  i0.ɵɵadvance();
396
- i0.ɵɵconditional(ctx_r1.canCancel ? 22 : -1);
375
+ i0.ɵɵconditional(!ctx_r0.SessionsEnabled ? 17 : -1);
397
376
  i0.ɵɵadvance(8);
398
- i0.ɵɵtextInterpolate1("", ctx_r1.leaderboard.length, " scored \u00B7 by metric");
377
+ i0.ɵɵtextInterpolate1("", ctx_r0.leaderboard.length, " scored \u00B7 by metric");
399
378
  i0.ɵɵadvance();
400
- i0.ɵɵconditional(ctx_r1.leaderboard.length === 0 ? 31 : -1);
379
+ i0.ɵɵconditional(ctx_r0.leaderboard.length === 0 ? 26 : -1);
401
380
  i0.ɵɵadvance();
402
- i0.ɵɵrepeater(ctx_r1.leaderboard);
381
+ i0.ɵɵrepeater(ctx_r0.leaderboard);
403
382
  i0.ɵɵadvance(2);
404
- i0.ɵɵconditional(ctx_r1.budget.length > 0 ? 34 : -1);
383
+ i0.ɵɵconditional(ctx_r0.budget.length > 0 ? 29 : -1);
405
384
  i0.ɵɵadvance(8);
406
- i0.ɵɵtextInterpolate(ctx_r1.kanban.Running.length);
385
+ i0.ɵɵtextInterpolate(ctx_r0.kanban.Running.length);
407
386
  i0.ɵɵadvance(2);
408
- i0.ɵɵrepeater(ctx_r1.kanban.Running);
387
+ i0.ɵɵrepeater(ctx_r0.kanban.Running);
409
388
  i0.ɵɵadvance(2);
410
- i0.ɵɵconditional(ctx_r1.kanban.Running.length === 0 ? 46 : -1);
389
+ i0.ɵɵconditional(ctx_r0.kanban.Running.length === 0 ? 41 : -1);
411
390
  i0.ɵɵadvance(7);
412
- i0.ɵɵtextInterpolate(ctx_r1.kanban.Completed.length);
391
+ i0.ɵɵtextInterpolate(ctx_r0.kanban.Completed.length);
413
392
  i0.ɵɵadvance(2);
414
- i0.ɵɵrepeater(ctx_r1.kanban.Completed);
393
+ i0.ɵɵrepeater(ctx_r0.kanban.Completed);
415
394
  i0.ɵɵadvance(2);
416
- i0.ɵɵconditional(ctx_r1.kanban.Completed.length === 0 ? 57 : -1);
395
+ i0.ɵɵconditional(ctx_r0.kanban.Completed.length === 0 ? 52 : -1);
417
396
  i0.ɵɵadvance(7);
418
- i0.ɵɵtextInterpolate(ctx_r1.kanban.Pruned.length);
397
+ i0.ɵɵtextInterpolate(ctx_r0.kanban.Pruned.length);
419
398
  i0.ɵɵadvance(2);
420
- i0.ɵɵrepeater(ctx_r1.kanban.Pruned);
399
+ i0.ɵɵrepeater(ctx_r0.kanban.Pruned);
421
400
  i0.ɵɵadvance(2);
422
- i0.ɵɵconditional(ctx_r1.kanban.Pruned.length === 0 ? 68 : -1);
401
+ i0.ɵɵconditional(ctx_r0.kanban.Pruned.length === 0 ? 63 : -1);
423
402
  } }
424
403
  function PSExperimentsComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
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);
429
- i0.ɵɵelementEnd();
430
- } if (rf & 2) {
431
- const ctx_r1 = i0.ɵɵnextContext();
432
- i0.ɵɵproperty("title", ctx_r1.pendingTitle)("icon", ctx_r1.pendingIcon)("confirmIcon", ctx_r1.pendingIcon)("confirmLabel", ctx_r1.pendingConfirmLabel)("variant", ctx_r1.pendingAction === "cancel" ? "danger" : "warn")("busy", ctx_r1.busy);
433
- i0.ɵɵadvance();
434
- i0.ɵɵproperty("innerHTML", ctx_r1.pendingMessage, i0.ɵɵsanitizeHtml);
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()); });
404
+ const _r13 = i0.ɵɵgetCurrentView();
405
+ i0.ɵɵelementStart(0, "div", 68);
406
+ i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_3_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.closeArtifactModal()); });
407
+ i0.ɵɵelementStart(1, "div", 69);
408
+ i0.ɵɵlistener("click", function PSExperimentsComponent_Conditional_3_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
409
+ i0.ɵɵelementStart(2, "div", 70)(3, "mj-artifact-viewer-panel", 71);
410
+ i0.ɵɵlistener("closed", function PSExperimentsComponent_Conditional_3_Template_mj_artifact_viewer_panel_closed_3_listener() { i0.ɵɵrestoreView(_r13); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.closeArtifactModal()); });
444
411
  i0.ɵɵelementEnd()()()();
445
412
  } if (rf & 2) {
446
- const ctx_r1 = i0.ɵɵnextContext();
413
+ const ctx_r0 = i0.ɵɵnextContext();
447
414
  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);
415
+ i0.ɵɵproperty("artifactId", ctx_r0.activeArtifactId)("currentUser", ctx_r0.currentUser)("showCloseButton", true);
458
416
  } }
459
417
  /**
460
418
  * Experiments panel: a kanban of iteration cards in Running / Completed / Pruned columns, a leaderboard
@@ -466,14 +424,16 @@ function PSExperimentsComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
466
424
  * ranked by score) via the pure {@link groupIterationsToKanban} / {@link deriveLeaderboard} helpers.
467
425
  * - **Budget gauges** combine the session's budget JSON caps with actual iteration spend (compute
468
426
  * cost, iteration count).
469
- * - **Pause / Cancel** call the {@link PredictiveStudioControlExperimentSessionOperation} Remote Op
470
- * behind a confirmation; on success the engine refreshes.
427
+ * - Sessions are switched off: the panel shows earlier sessions and offers no start or control action.
471
428
  *
472
429
  * Empty state when there are no sessions. 100% entity-agnostic.
473
430
  */
474
431
  export class PSExperimentsComponent {
432
+ /** Whether experiment sessions can run, and why not when they cannot: one source shared with the server refusal. */
433
+ SessionsEnabled = ExperimentSessions.Enabled;
434
+ SessionsDisabledReason = ExperimentSessions.DisabledReason;
475
435
  engine;
476
- /** Provider to route the control Remote Op + engine refresh through (multi-provider correctness). */
436
+ /** Provider the panel reads and writes through (multi-provider correctness); the global provider when unset. */
477
437
  provider = null;
478
438
  /** Acting user for the engine refresh after a mutation. */
479
439
  CurrentUser = null;
@@ -516,35 +476,6 @@ export class PSExperimentsComponent {
516
476
  set budget(value) {
517
477
  this.Budget = value;
518
478
  }
519
- /** Pending control action awaiting confirmation (null when no modal is open). */
520
- PendingAction = null;
521
- /** @deprecated Use {@link PendingAction}. */
522
- get pendingAction() {
523
- return this.PendingAction;
524
- }
525
- /** @deprecated Use {@link PendingAction}. */
526
- set pendingAction(value) {
527
- this.PendingAction = value;
528
- }
529
- /** Remote Op in flight. */
530
- Busy = false;
531
- /** @deprecated Use {@link Busy}. */
532
- get busy() {
533
- return this.Busy;
534
- }
535
- /** @deprecated Use {@link Busy}. */
536
- set busy(value) {
537
- this.Busy = value;
538
- }
539
- ShowNewExperimentModal = false;
540
- /** @deprecated Use {@link ShowNewExperimentModal}. */
541
- get showNewExperimentModal() {
542
- return this.ShowNewExperimentModal;
543
- }
544
- /** @deprecated Use {@link ShowNewExperimentModal}. */
545
- set showNewExperimentModal(value) {
546
- this.ShowNewExperimentModal = value;
547
- }
548
479
  ShowArtifactModal = false;
549
480
  /** @deprecated Use {@link ShowArtifactModal}. */
550
481
  get showArtifactModal() {
@@ -588,31 +519,6 @@ export class PSExperimentsComponent {
588
519
  selectSession(id) {
589
520
  return this.SelectSession(id);
590
521
  }
591
- OpenNewExperimentModal() {
592
- this.ShowNewExperimentModal = true;
593
- }
594
- /** @deprecated Use {@link OpenNewExperimentModal}. */
595
- openNewExperimentModal() {
596
- return this.OpenNewExperimentModal();
597
- }
598
- CloseNewExperimentModal() {
599
- this.ShowNewExperimentModal = false;
600
- }
601
- /** @deprecated Use {@link CloseNewExperimentModal}. */
602
- closeNewExperimentModal() {
603
- return this.CloseNewExperimentModal();
604
- }
605
- async OnExperimentStarted(newSessionId) {
606
- this.CloseNewExperimentModal();
607
- await this.engine.Config(true, this.currentUser ?? undefined, this.provider ?? undefined);
608
- this.sessionId = newSessionId;
609
- this.rebuild();
610
- this.cdr.detectChanges();
611
- }
612
- /** @deprecated Use {@link OnExperimentStarted}. */
613
- async onExperimentStarted(newSessionId) {
614
- return this.OnExperimentStarted(newSessionId);
615
- }
616
522
  CloseArtifactModal() {
617
523
  this.ShowArtifactModal = false;
618
524
  this.ActiveArtifactId = null;
@@ -628,11 +534,14 @@ export class PSExperimentsComponent {
628
534
  this.ArtifactLoading = true;
629
535
  try {
630
536
  const p = this.provider ?? Metadata.Provider;
631
- const rv = new RunView();
632
- const res = await rv.RunView({
537
+ // The artifact this button generated earlier carries this exact comment; matched exactly, not by substring.
538
+ const sessionComment = `Auto-generated for Experiment Session ${s.ID}`;
539
+ const res = await RunView.FromMetadataProvider(p).RunView({
633
540
  EntityName: 'MJ: Artifacts',
634
- ExtraFilter: `Name LIKE '${s.Name}%' OR Comments LIKE '%${s.ID}%'`,
635
- ResultType: 'entity_object',
541
+ ExtraFilter: `Comments = '${EscapeSQLString(sessionComment)}'`,
542
+ Fields: ['ID'],
543
+ MaxRows: 1,
544
+ ResultType: 'simple',
636
545
  }, this.currentUser ?? undefined);
637
546
  if (res.Success && res.Results && res.Results.length > 0) {
638
547
  this.ActiveArtifactId = res.Results[0].ID;
@@ -643,7 +552,7 @@ export class PSExperimentsComponent {
643
552
  art.Name = `${s.Name} — Results`;
644
553
  art.Description = `Modeling results, leaderboard, and winning model metrics for ${s.Name}.`;
645
554
  art.TypeID = 'D41AB707-58F1-4413-8725-9DF31C95F4C5';
646
- art.Comments = `Auto-generated for Experiment Session ${s.ID}`;
555
+ art.Comments = sessionComment;
647
556
  const saved = await art.Save();
648
557
  if (!saved) {
649
558
  this.notifications.CreateSimpleNotification('Could not generate artifact record.', 'error', 5000);
@@ -679,7 +588,16 @@ export class PSExperimentsComponent {
679
588
  this.leaderboard.map(l => `- **#${l.rank} ${l.algorithm}**: Score ${l.auc.toFixed(3)} (${l.features})`).join('\n'),
680
589
  };
681
590
  ver.Content = JSON.stringify(payload);
682
- await ver.Save();
591
+ if (!(await ver.Save())) {
592
+ const message = ver.LatestResult?.CompleteMessage ?? 'unknown error';
593
+ LogError(`PSExperimentsComponent.ViewResultsArtifact: artifact version save failed: ${message}`);
594
+ // Remove the empty artifact, so the next click generates it again instead of finding an artifact with no content.
595
+ if (!(await art.Delete())) {
596
+ LogError(`PSExperimentsComponent.ViewResultsArtifact: could not remove the empty artifact ${art.ID}: ${art.LatestResult?.CompleteMessage ?? 'unknown error'}`);
597
+ }
598
+ this.notifications.CreateSimpleNotification(`Could not save the results artifact: ${message}`, 'error', 5000);
599
+ return;
600
+ }
683
601
  this.ActiveArtifactId = art.ID;
684
602
  this.ShowArtifactModal = true;
685
603
  }
@@ -842,173 +760,28 @@ export class PSExperimentsComponent {
842
760
  statusLabel(status) {
843
761
  return this.StatusLabel(status);
844
762
  }
845
- // ---- control availability ----
846
- get CanPause() {
847
- return this.Session?.Status === 'Running';
848
- }
849
- /** @deprecated Use {@link CanPause}. */
850
- get canPause() {
851
- return this.CanPause;
852
- }
853
- get CanResume() {
854
- return this.Session?.Status === 'Paused';
855
- }
856
- /** @deprecated Use {@link CanResume}. */
857
- get canResume() {
858
- return this.CanResume;
859
- }
860
- get CanCancel() {
861
- const s = this.Session?.Status;
862
- return s === 'Running' || s === 'Paused' || s === 'AwaitingApproval';
863
- }
864
- /** @deprecated Use {@link CanCancel}. */
865
- get canCancel() {
866
- return this.CanCancel;
867
- }
868
- // ---- control flow (Remote Op) ----
869
- RequestControl(action) {
870
- if (!this.Session)
871
- return;
872
- this.PendingAction = action;
873
- }
874
- /** @deprecated Use {@link RequestControl}. */
875
- requestControl(action) {
876
- return this.RequestControl(action);
877
- }
878
- CancelControl() {
879
- if (this.Busy)
880
- return;
881
- this.PendingAction = null;
882
- }
883
- /** @deprecated Use {@link CancelControl}. */
884
- cancelControl() {
885
- return this.CancelControl();
886
- }
887
- get PendingTitle() {
888
- switch (this.PendingAction) {
889
- case 'pause': return 'Pause experiment';
890
- case 'resume': return 'Resume experiment';
891
- case 'cancel': return 'Cancel experiment';
892
- default: return '';
893
- }
894
- }
895
- /** @deprecated Use {@link PendingTitle}. */
896
- get pendingTitle() {
897
- return this.PendingTitle;
898
- }
899
- get PendingIcon() {
900
- switch (this.PendingAction) {
901
- case 'pause': return 'fa-solid fa-pause';
902
- case 'resume': return 'fa-solid fa-play';
903
- case 'cancel': return 'fa-solid fa-stop';
904
- default: return 'fa-solid fa-check';
905
- }
906
- }
907
- /** @deprecated Use {@link PendingIcon}. */
908
- get pendingIcon() {
909
- return this.PendingIcon;
910
- }
911
- get PendingConfirmLabel() {
912
- switch (this.PendingAction) {
913
- case 'pause': return 'Pause';
914
- case 'resume': return 'Resume';
915
- case 'cancel': return 'Cancel run';
916
- default: return 'Confirm';
917
- }
918
- }
919
- /** @deprecated Use {@link PendingConfirmLabel}. */
920
- get pendingConfirmLabel() {
921
- return this.PendingConfirmLabel;
922
- }
923
- get PendingMessage() {
924
- const name = escapeHtml(this.Session?.Name ?? 'this session');
925
- switch (this.PendingAction) {
926
- case 'pause':
927
- return `Pause <strong>${name}</strong>? The orchestrator stops at the next wave checkpoint; in-flight iterations finish. You can resume later.`;
928
- case 'resume':
929
- return `Resume <strong>${name}</strong>? The orchestrator continues searching from where it paused.`;
930
- case 'cancel':
931
- return `Cancel <strong>${name}</strong>? This stops the search at the next checkpoint. Completed iterations and the leaderboard are kept, but the session cannot be resumed.`;
932
- default:
933
- return '';
934
- }
935
- }
936
- /** @deprecated Use {@link PendingMessage}. */
937
- get pendingMessage() {
938
- return this.PendingMessage;
939
- }
940
- /** Run the control Remote Op, then refresh the engine + close on success. */
941
- async ConfirmControl() {
942
- if (!this.PendingAction || !this.Session || this.Busy)
943
- return;
944
- this.Busy = true;
945
- const action = this.PendingAction;
946
- const sessionId = this.Session.ID;
947
- const name = this.Session.Name;
948
- try {
949
- const op = new PredictiveStudioControlExperimentSessionOperation();
950
- const result = await op.Execute({ sessionId, action }, { provider: this.provider ?? undefined, user: this.CurrentUser ?? undefined });
951
- if (result.Success) {
952
- this.notifications.CreateSimpleNotification(`${name} → ${result.Output?.status ?? action}`, 'success', 3500);
953
- await this.refreshAfterMutation();
954
- this.PendingAction = null;
955
- }
956
- else {
957
- this.notifications.CreateSimpleNotification(result.ErrorMessage || `Could not ${action} ${name}.`, 'error', 5000);
958
- }
959
- }
960
- catch (e) {
961
- this.notifications.CreateSimpleNotification(`${action} failed: ${e instanceof Error ? e.message : String(e)}`, 'error', 5000);
962
- }
963
- finally {
964
- this.Busy = false;
965
- this.cdr.detectChanges();
966
- }
967
- }
968
- /** @deprecated Use {@link ConfirmControl}. */
969
- async confirmControl() {
970
- return this.ConfirmControl();
971
- }
972
- /** Force-refresh the engine's cached sessions/iterations, then rebuild. */
973
- async refreshAfterMutation() {
974
- await this.engine.Config(true, this.CurrentUser ?? undefined, this.provider ?? undefined);
975
- this.selectActiveSession();
976
- this.rebuild();
977
- this.cdr.detectChanges();
978
- }
979
763
  static ɵfac = function PSExperimentsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PSExperimentsComponent)(); };
980
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PSExperimentsComponent, selectors: [["ps-experiments"]], inputs: { engine: "engine", provider: "provider", CurrentUser: "CurrentUser", 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) {
764
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PSExperimentsComponent, selectors: [["ps-experiments"]], inputs: { engine: "engine", provider: "provider", CurrentUser: "CurrentUser", 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"], [1, "ps-modal-backdrop"], [1, "ps-empty-ico"], [1, "fa-solid", "fa-flask"], ["data-testid", "ps-experiments-disabled-reason"], [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"], ["data-testid", "ps-experiments-unavailable", 1, "ps-callout", "warn"], ["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"], [1, "fa-solid", "fa-circle-info"], ["data-testid", "ps-experiments-unavailable-reason"], [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"], [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"]], template: function PSExperimentsComponent_Template(rf, ctx) { if (rf & 1) {
981
765
  i0.ɵɵelementStart(0, "div", 1);
982
- i0.ɵɵconditionalCreate(1, PSExperimentsComponent_Conditional_1_Template, 11, 0, "div", 2)(2, PSExperimentsComponent_Conditional_2_Template, 71, 22);
983
- i0.ɵɵconditionalCreate(3, PSExperimentsComponent_Conditional_3_Template, 2, 7, "ps-confirm-modal", 3);
984
- i0.ɵɵconditionalCreate(4, PSExperimentsComponent_Conditional_4_Template, 4, 3, "div", 4);
985
- i0.ɵɵconditionalCreate(5, PSExperimentsComponent_Conditional_5_Template, 1, 3, "ps-run-experiment-modal", 5);
766
+ i0.ɵɵconditionalCreate(1, PSExperimentsComponent_Conditional_1_Template, 6, 1, "div", 2)(2, PSExperimentsComponent_Conditional_2_Template, 66, 20);
767
+ i0.ɵɵconditionalCreate(3, PSExperimentsComponent_Conditional_3_Template, 4, 3, "div", 3);
986
768
  i0.ɵɵelementEnd();
987
769
  } if (rf & 2) {
988
770
  i0.ɵɵadvance();
989
771
  i0.ɵɵconditional(!ctx.session ? 1 : 2);
990
772
  i0.ɵɵadvance(2);
991
- i0.ɵɵconditional(ctx.pendingAction ? 3 : -1);
992
- i0.ɵɵadvance();
993
- i0.ɵɵconditional(ctx.showArtifactModal && ctx.activeArtifactId ? 4 : -1);
994
- i0.ɵɵadvance();
995
- i0.ɵɵconditional(ctx.showNewExperimentModal ? 5 : -1);
996
- } }, 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 });
773
+ i0.ɵɵconditional(ctx.showArtifactModal && ctx.activeArtifactId ? 3 : -1);
774
+ } }, dependencies: [CommonModule, i1.NgTemplateOutlet, MJButtonDirective, 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 });
997
775
  }
998
776
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PSExperimentsComponent, [{
999
777
  type: Component,
1000
- args: [{ standalone: true, selector: 'ps-experiments', imports: [CommonModule, MJButtonDirective, PSConfirmModalComponent, PSRunExperimentModalComponent, ArtifactsModule], encapsulation: ViewEncapsulation.None, template: `
778
+ args: [{ standalone: true, selector: 'ps-experiments', imports: [CommonModule, MJButtonDirective, ArtifactsModule], encapsulation: ViewEncapsulation.None, template: `
1001
779
  <div class="ps-panel ps-experiments" data-testid="ps-experiments-panel">
1002
780
  @if (!session) {
1003
781
  <div class="ps-empty" data-testid="ps-experiments-empty">
1004
782
  <span class="ps-empty-ico"><i class="fa-solid fa-flask"></i></span>
1005
783
  <h3>No experiment sessions yet</h3>
1006
- <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>
1007
- <div style="margin-top: 12px; display: flex; gap: 8px;">
1008
- <button mjButton variant="primary" size="sm" data-testid="ps-experiments-new-btn-empty" (click)="openNewExperimentModal()">
1009
- <i class="fa-solid fa-flask"></i> New Experiment
1010
- </button>
1011
- </div>
784
+ @if (!SessionsEnabled) { <p data-testid="ps-experiments-disabled-reason">{{ SessionsDisabledReason }}</p> }
1012
785
  </div>
1013
786
  } @else {
1014
787
  <!-- session header strip -->
@@ -1033,19 +806,13 @@ export class PSExperimentsComponent {
1033
806
  <button mjButton variant="secondary" size="sm" data-testid="ps-experiments-view-artifact" [disabled]="artifactLoading" (click)="viewResultsArtifact()">
1034
807
  <i class="fa-solid fa-flask-vial"></i> {{ artifactLoading ? 'Loading…' : 'View Results Artifact' }}
1035
808
  </button>
1036
- <button mjButton variant="primary" size="sm" data-testid="ps-experiments-new-btn" (click)="openNewExperimentModal()">
1037
- <i class="fa-solid fa-plus"></i> New Experiment
1038
- </button>
1039
- @if (canPause) {
1040
- <button mjButton variant="secondary" size="sm" data-testid="ps-experiments-pause" (click)="requestControl('pause')"><i class="fa-solid fa-pause"></i> Pause</button>
1041
- }
1042
- @if (canResume) {
1043
- <button mjButton variant="secondary" size="sm" data-testid="ps-experiments-resume" (click)="requestControl('resume')"><i class="fa-solid fa-play"></i> Resume</button>
1044
- }
1045
- @if (canCancel) {
1046
- <button mjButton variant="danger" size="sm" data-testid="ps-experiments-cancel" (click)="requestControl('cancel')"><i class="fa-solid fa-stop"></i> Cancel</button>
1047
- }
1048
809
  </div>
810
+ @if (!SessionsEnabled) {
811
+ <div class="ps-callout warn" data-testid="ps-experiments-unavailable">
812
+ <i class="fa-solid fa-circle-info"></i>
813
+ <div data-testid="ps-experiments-unavailable-reason">{{ SessionsDisabledReason }}</div>
814
+ </div>
815
+ }
1049
816
 
1050
817
  <!-- Leaderboard strip -->
1051
818
  <div class="ps-card" data-testid="ps-experiments-leaderboard">
@@ -1146,20 +913,6 @@ export class PSExperimentsComponent {
1146
913
  </ng-template>
1147
914
  }
1148
915
 
1149
- @if (pendingAction) {
1150
- <ps-confirm-modal
1151
- [title]="pendingTitle"
1152
- [icon]="pendingIcon"
1153
- [confirmIcon]="pendingIcon"
1154
- [confirmLabel]="pendingConfirmLabel"
1155
- [variant]="pendingAction === 'cancel' ? 'danger' : 'warn'"
1156
- [busy]="busy"
1157
- (confirmed)="confirmControl()"
1158
- (cancelled)="cancelControl()">
1159
- <div [innerHTML]="pendingMessage"></div>
1160
- </ps-confirm-modal>
1161
- }
1162
-
1163
916
  @if (showArtifactModal && activeArtifactId) {
1164
917
  <div class="ps-modal-backdrop" (click)="closeArtifactModal()">
1165
918
  <div class="ps-modal-dialog" style="max-width: 960px; width: 92vw; height: 85vh; display: flex; flex-direction: column; padding: 0; overflow: hidden;"
@@ -1175,16 +928,6 @@ export class PSExperimentsComponent {
1175
928
  </div>
1176
929
  </div>
1177
930
  }
1178
-
1179
- @if (showNewExperimentModal) {
1180
- <ps-run-experiment-modal
1181
- [engine]="engine"
1182
- [provider]="provider"
1183
- [currentUser]="currentUser"
1184
- (started)="onExperimentStarted($event)"
1185
- (closed)="closeNewExperimentModal()">
1186
- </ps-run-experiment-modal>
1187
- }
1188
931
  </div>
1189
932
  `, 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"] }]
1190
933
  }], null, { engine: [{
@@ -1196,13 +939,5 @@ export class PSExperimentsComponent {
1196
939
  }], currentUser: [{
1197
940
  type: Input
1198
941
  }] }); })();
1199
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PSExperimentsComponent, { className: "PSExperimentsComponent", filePath: "src/PredictiveStudio/components/ps-experiments.component.ts", lineNumber: 248 }); })();
1200
- /** Minimal HTML-escape for interpolating session names into the modal's innerHTML message. */
1201
- function escapeHtml(value) {
1202
- return value
1203
- .replace(/&/g, '&amp;')
1204
- .replace(/</g, '&lt;')
1205
- .replace(/>/g, '&gt;')
1206
- .replace(/"/g, '&quot;');
1207
- }
942
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PSExperimentsComponent, { className: "PSExperimentsComponent", filePath: "src/PredictiveStudio/components/ps-experiments.component.ts", lineNumber: 208 }); })();
1208
943
  //# sourceMappingURL=ps-experiments.component.js.map