@memberjunction/ng-core-entity-forms 6.1.4 → 6.2.0-edge.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/README.md +22 -0
  2. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.d.ts +1 -1
  3. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js +2 -2
  4. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js.map +1 -1
  5. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
  6. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +90 -16
  7. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
  8. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +218 -70
  9. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
  10. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +80 -16
  11. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
  12. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +146 -46
  13. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
  14. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +329 -27
  15. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  16. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +794 -262
  17. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  18. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +76 -0
  19. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
  20. package/dist/lib/custom/AIAgents/ai-agent-management.service.js +77 -33
  21. package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
  22. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +69 -15
  23. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
  24. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +182 -74
  25. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
  26. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +105 -25
  27. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
  28. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +272 -112
  29. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  30. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +32 -6
  31. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
  32. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +71 -19
  33. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  34. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +10 -0
  35. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
  36. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +27 -7
  37. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
  38. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +65 -15
  39. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
  40. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +152 -52
  41. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  42. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +81 -15
  43. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
  44. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +145 -45
  45. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
  46. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +71 -17
  47. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  48. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +175 -67
  49. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  50. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +173 -27
  51. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  52. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +385 -93
  53. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  54. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts +64 -4
  55. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts.map +1 -1
  56. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +129 -29
  57. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
  58. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +260 -27
  59. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  60. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +686 -238
  61. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  62. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +10 -0
  63. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
  64. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +17 -9
  65. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
  66. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +74 -16
  67. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
  68. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +174 -58
  69. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
  70. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +108 -14
  71. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
  72. package/dist/lib/custom/Actions/action-execution-log-form.component.js +258 -70
  73. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  74. package/dist/lib/custom/Actions/action-form.component.d.ts +198 -14
  75. package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
  76. package/dist/lib/custom/Actions/action-form.component.js +387 -107
  77. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  78. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts +12 -6
  79. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts.map +1 -1
  80. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js +41 -29
  81. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js.map +1 -1
  82. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js +14 -14
  83. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js.map +1 -1
  84. package/dist/lib/custom/Companies/company-overview.panel.d.ts +1 -1
  85. package/dist/lib/custom/Companies/company-overview.panel.js +2 -2
  86. package/dist/lib/custom/Companies/company-overview.panel.js.map +1 -1
  87. package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +1 -1
  88. package/dist/lib/custom/Conversations/conversation-overview.panel.js +2 -2
  89. package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
  90. package/dist/lib/custom/Employees/employee-overview.panel.d.ts +1 -1
  91. package/dist/lib/custom/Employees/employee-overview.panel.js +2 -2
  92. package/dist/lib/custom/Employees/employee-overview.panel.js.map +1 -1
  93. package/dist/lib/custom/Entities/entity-form.component.d.ts +209 -28
  94. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  95. package/dist/lib/custom/Entities/entity-form.component.js +494 -138
  96. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  97. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +5 -1
  98. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
  99. package/dist/lib/custom/EntityActions/entityaction.form.component.js +10 -2
  100. package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
  101. package/dist/lib/custom/Files/file-form.component.d.ts +1 -1
  102. package/dist/lib/custom/Files/file-form.component.js +2 -2
  103. package/dist/lib/custom/Files/file-form.component.js.map +1 -1
  104. package/dist/lib/custom/Lists/list-form.component.d.ts +300 -36
  105. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  106. package/dist/lib/custom/Lists/list-form.component.js +664 -208
  107. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  108. package/dist/lib/custom/MLModels/ml-model-form.component.d.ts +27 -0
  109. package/dist/lib/custom/MLModels/ml-model-form.component.d.ts.map +1 -0
  110. package/dist/lib/custom/MLModels/ml-model-form.component.js +193 -0
  111. package/dist/lib/custom/MLModels/ml-model-form.component.js.map +1 -0
  112. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +75 -0
  113. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -0
  114. package/dist/lib/custom/MLModels/ml-model-view-models.js +244 -0
  115. package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -0
  116. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +173 -0
  117. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -0
  118. package/dist/lib/custom/MLModels/ps-model-detail.component.js +883 -0
  119. package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -0
  120. package/dist/lib/custom/Queries/query-form.component.d.ts +201 -26
  121. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  122. package/dist/lib/custom/Queries/query-form.component.js +429 -109
  123. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  124. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +107 -14
  125. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
  126. package/dist/lib/custom/Queries/query-run-dialog.component.js +249 -79
  127. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  128. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +133 -7
  129. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
  130. package/dist/lib/custom/RecordProcesses/record-process-form.component.js +1268 -19
  131. package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
  132. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +1 -1
  133. package/dist/lib/custom/SearchScopes/searchscope-form.component.js +4 -4
  134. package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
  135. package/dist/lib/custom/SessionBridges/session-bridge-form.component.js.map +1 -1
  136. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +77 -13
  137. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
  138. package/dist/lib/custom/Templates/template-param-dialog.component.js +196 -78
  139. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  140. package/dist/lib/custom/Templates/template-params-grid.component.d.ts +49 -7
  141. package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
  142. package/dist/lib/custom/Templates/template-params-grid.component.js +132 -44
  143. package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
  144. package/dist/lib/custom/Templates/templates-form.component.d.ts +142 -17
  145. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  146. package/dist/lib/custom/Templates/templates-form.component.js +333 -113
  147. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  148. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +24 -4
  149. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
  150. package/dist/lib/custom/Tests/entity-link-pill.component.js +64 -20
  151. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  152. package/dist/lib/custom/Tests/test-form.component.d.ts +217 -27
  153. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  154. package/dist/lib/custom/Tests/test-form.component.js +549 -169
  155. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  156. package/dist/lib/custom/Tests/test-run-checks.d.ts +2 -0
  157. package/dist/lib/custom/Tests/test-run-checks.d.ts.map +1 -1
  158. package/dist/lib/custom/Tests/test-run-checks.js +5 -1
  159. package/dist/lib/custom/Tests/test-run-checks.js.map +1 -1
  160. package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts +2 -0
  161. package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts.map +1 -1
  162. package/dist/lib/custom/Tests/test-run-feedback-form.component.js +5 -1
  163. package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
  164. package/dist/lib/custom/Tests/test-run-form.component.d.ts +146 -18
  165. package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
  166. package/dist/lib/custom/Tests/test-run-form.component.js +362 -106
  167. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  168. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +390 -47
  169. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  170. package/dist/lib/custom/Tests/test-suite-form.component.js +1015 -343
  171. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  172. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +214 -26
  173. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
  174. package/dist/lib/custom/Tests/test-suite-run-form.component.js +535 -159
  175. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  176. package/dist/lib/custom/Users/user-overview.panel.d.ts +1 -1
  177. package/dist/lib/custom/Users/user-overview.panel.js +2 -2
  178. package/dist/lib/custom/Users/user-overview.panel.js.map +1 -1
  179. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +208 -29
  180. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  181. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +446 -138
  182. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  183. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts +6 -0
  184. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -1
  185. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +16 -4
  186. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -1
  187. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +50 -6
  188. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  189. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +84 -12
  190. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  191. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +89 -5
  192. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
  193. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +216 -70
  194. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  195. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts +62 -3
  196. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
  197. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +140 -42
  198. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
  199. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +81 -10
  200. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  201. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +165 -37
  202. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  203. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +121 -14
  204. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  205. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +287 -79
  206. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  207. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts +101 -15
  208. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -1
  209. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +281 -97
  210. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -1
  211. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +43 -25
  212. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -1
  213. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +100 -64
  214. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -1
  215. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts +14 -2
  216. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts.map +1 -1
  217. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js +71 -53
  218. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js.map +1 -1
  219. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts +14 -2
  220. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts.map +1 -1
  221. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js +70 -52
  222. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js.map +1 -1
  223. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts +8 -0
  224. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts.map +1 -1
  225. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js +22 -6
  226. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js.map +1 -1
  227. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts +24 -2
  228. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts.map +1 -1
  229. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js +91 -59
  230. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js.map +1 -1
  231. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts +10 -2
  232. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts.map +1 -1
  233. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js +33 -17
  234. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js.map +1 -1
  235. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts +2 -0
  236. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts.map +1 -1
  237. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js +34 -30
  238. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js.map +1 -1
  239. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts +14 -2
  240. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts.map +1 -1
  241. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js +69 -51
  242. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js.map +1 -1
  243. package/dist/lib/custom/custom-forms.module.d.ts +32 -30
  244. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  245. package/dist/lib/custom/custom-forms.module.js +21 -4
  246. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  247. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +38 -12
  248. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  249. package/dist/lib/custom/shared/entity-selector-dialog.component.js +103 -51
  250. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  251. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.d.ts.map +1 -1
  252. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +62 -26
  253. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
  254. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  255. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +59 -51
  256. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  257. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js +76 -74
  258. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js.map +1 -1
  259. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
  260. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +33 -15
  261. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
  262. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  263. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +100 -82
  264. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  265. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js +24 -20
  266. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js.map +1 -1
  267. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.d.ts +10 -0
  268. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.d.ts.map +1 -0
  269. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js +122 -0
  270. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js.map +1 -0
  271. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.d.ts +10 -0
  272. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.d.ts.map +1 -0
  273. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js +125 -0
  274. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js.map +1 -0
  275. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.d.ts.map +1 -1
  276. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +23 -5
  277. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
  278. package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.d.ts.map +1 -1
  279. package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js +25 -6
  280. package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js.map +1 -1
  281. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js +27 -25
  282. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js.map +1 -1
  283. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.d.ts.map +1 -1
  284. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js +11 -15
  285. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js.map +1 -1
  286. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
  287. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +43 -7
  288. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
  289. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  290. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +155 -119
  291. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  292. package/dist/lib/generated/Entities/MJWebSearchProvider/mjwebsearchprovider.form.component.d.ts +10 -0
  293. package/dist/lib/generated/Entities/MJWebSearchProvider/mjwebsearchprovider.form.component.d.ts.map +1 -0
  294. package/dist/lib/generated/Entities/MJWebSearchProvider/mjwebsearchprovider.form.component.js +78 -0
  295. package/dist/lib/generated/Entities/MJWebSearchProvider/mjwebsearchprovider.form.component.js.map +1 -0
  296. package/dist/lib/generated/generated-forms.module.d.ts +240 -237
  297. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  298. package/dist/lib/generated/generated-forms.module.js +11 -2
  299. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  300. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts +5 -1
  301. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts.map +1 -1
  302. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +11 -3
  303. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -1
  304. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts +2 -0
  305. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts.map +1 -1
  306. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +16 -12
  307. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js.map +1 -1
  308. package/dist/lib/panels/content-sources/website-crawler-settings.panel.d.ts +1 -1
  309. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +2 -2
  310. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js.map +1 -1
  311. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +122 -1
  312. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
  313. package/dist/lib/panels/model-predictions/model-prediction.logic.js +236 -11
  314. package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
  315. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +72 -13
  316. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
  317. package/dist/lib/panels/model-predictions/model-prediction.panel.js +577 -78
  318. package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
  319. package/dist/lib/shared/components/template-editor.component.d.ts +133 -14
  320. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  321. package/dist/lib/shared/components/template-editor.component.js +322 -124
  322. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  323. package/dist/public-api.d.ts +4 -0
  324. package/dist/public-api.d.ts.map +1 -1
  325. package/dist/public-api.js +4 -0
  326. package/dist/public-api.js.map +1 -1
  327. package/package.json +43 -41
@@ -0,0 +1,883 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, inject, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { MJButtonDirective } from '@memberjunction/ng-ui-components';
5
+ import { MJNotificationService } from '@memberjunction/ng-notifications';
6
+ import { PredictiveStudioPromoteModelOperation, } from '@memberjunction/core-entities';
7
+ import { PS_FEATURE_DOMINANCE_THRESHOLD, FormatMetricValue, HumanizeFeatureName, MaxFeatureImportance, MetricsToDisplay, OverfitGap, ParseFeatureImportance, ParseMetrics, PrimaryModelScore, } from './ml-model-view-models';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/forms";
10
+ const _forTrack0 = ($index, $item) => $item.key;
11
+ const _forTrack1 = ($index, $item) => $item.name;
12
+ function PSModelDetailComponent_Conditional_1_For_19_Conditional_2_Template(rf, ctx) { if (rf & 1) {
13
+ i0.ɵɵelement(0, "i", 28);
14
+ } }
15
+ function PSModelDetailComponent_Conditional_1_For_19_Conditional_3_Template(rf, ctx) { if (rf & 1) {
16
+ i0.ɵɵtext(0);
17
+ } if (rf & 2) {
18
+ const $index_r1 = i0.ɵɵnextContext().$index;
19
+ i0.ɵɵtextInterpolate1(" ", $index_r1 + 1, " ");
20
+ } }
21
+ function PSModelDetailComponent_Conditional_1_For_19_Conditional_5_Template(rf, ctx) { if (rf & 1) {
22
+ i0.ɵɵelement(0, "span", 29);
23
+ } }
24
+ function PSModelDetailComponent_Conditional_1_For_19_Template(rf, ctx) { if (rf & 1) {
25
+ i0.ɵɵelementStart(0, "div", 26)(1, "span", 27);
26
+ i0.ɵɵconditionalCreate(2, PSModelDetailComponent_Conditional_1_For_19_Conditional_2_Template, 1, 0, "i", 28)(3, PSModelDetailComponent_Conditional_1_For_19_Conditional_3_Template, 1, 1);
27
+ i0.ɵɵelementEnd();
28
+ i0.ɵɵtext(4);
29
+ i0.ɵɵelementEnd();
30
+ i0.ɵɵconditionalCreate(5, PSModelDetailComponent_Conditional_1_For_19_Conditional_5_Template, 1, 0, "span", 29);
31
+ } if (rf & 2) {
32
+ const step_r2 = ctx.$implicit;
33
+ const ɵ$index_35_r3 = ctx.$index;
34
+ const ɵ$count_35_r4 = ctx.$count;
35
+ const ctx_r4 = i0.ɵɵnextContext(2);
36
+ i0.ɵɵclassProp("done", ctx_r4.stepState(step_r2) === "done")("curr", ctx_r4.stepState(step_r2) === "curr");
37
+ i0.ɵɵadvance(2);
38
+ i0.ɵɵconditional(ctx_r4.stepState(step_r2) === "done" ? 2 : 3);
39
+ i0.ɵɵadvance(2);
40
+ i0.ɵɵtextInterpolate1(" ", step_r2, " ");
41
+ i0.ɵɵadvance();
42
+ i0.ɵɵconditional(!(ɵ$index_35_r3 === ɵ$count_35_r4 - 1) ? 5 : -1);
43
+ } }
44
+ function PSModelDetailComponent_Conditional_1_Conditional_44_For_2_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "div", 30)(1, "span", 16);
46
+ i0.ɵɵtext(2);
47
+ i0.ɵɵelementEnd();
48
+ i0.ɵɵelementStart(3, "strong");
49
+ i0.ɵɵtext(4);
50
+ i0.ɵɵelementEnd()();
51
+ } if (rf & 2) {
52
+ const s_r6 = ctx.$implicit;
53
+ i0.ɵɵadvance(2);
54
+ i0.ɵɵtextInterpolate(s_r6.label);
55
+ i0.ɵɵadvance(2);
56
+ i0.ɵɵtextInterpolate(s_r6.value);
57
+ } }
58
+ function PSModelDetailComponent_Conditional_1_Conditional_44_Template(rf, ctx) { if (rf & 1) {
59
+ i0.ɵɵelementStart(0, "div", 21);
60
+ i0.ɵɵrepeaterCreate(1, PSModelDetailComponent_Conditional_1_Conditional_44_For_2_Template, 5, 2, "div", 30, _forTrack0);
61
+ i0.ɵɵelementEnd();
62
+ } if (rf & 2) {
63
+ const ctx_r4 = i0.ɵɵnextContext(2);
64
+ i0.ɵɵadvance();
65
+ i0.ɵɵrepeater(ctx_r4.secondaryMetrics);
66
+ } }
67
+ function PSModelDetailComponent_Conditional_1_Conditional_45_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelementStart(0, "div", 22);
69
+ i0.ɵɵtext(1, "No secondary metrics recorded for this model.");
70
+ i0.ɵɵelementEnd();
71
+ } }
72
+ function PSModelDetailComponent_Conditional_1_Conditional_46_Template(rf, ctx) { if (rf & 1) {
73
+ i0.ɵɵelementStart(0, "div", 14);
74
+ i0.ɵɵtext(1, " Train\u2013holdout gap of ");
75
+ i0.ɵɵelementStart(2, "strong");
76
+ i0.ɵɵtext(3);
77
+ i0.ɵɵelementEnd();
78
+ i0.ɵɵtext(4);
79
+ i0.ɵɵelementEnd();
80
+ } if (rf & 2) {
81
+ const ctx_r4 = i0.ɵɵnextContext(2);
82
+ i0.ɵɵadvance(3);
83
+ i0.ɵɵtextInterpolate(ctx_r4.gapText);
84
+ i0.ɵɵadvance();
85
+ i0.ɵɵtextInterpolate1(" ", ctx_r4.gapVerdict, ". ");
86
+ } }
87
+ function PSModelDetailComponent_Conditional_1_Conditional_54_For_1_Template(rf, ctx) { if (rf & 1) {
88
+ i0.ɵɵelementStart(0, "div", 31)(1, "span", 32);
89
+ i0.ɵɵtext(2);
90
+ i0.ɵɵelementEnd();
91
+ i0.ɵɵelementStart(3, "div", 33);
92
+ i0.ɵɵelement(4, "span");
93
+ i0.ɵɵelementEnd();
94
+ i0.ɵɵelementStart(5, "span", 34);
95
+ i0.ɵɵtext(6);
96
+ i0.ɵɵelementEnd()();
97
+ } if (rf & 2) {
98
+ const f_r7 = ctx.$implicit;
99
+ i0.ɵɵadvance();
100
+ i0.ɵɵproperty("title", f_r7.name);
101
+ i0.ɵɵadvance();
102
+ i0.ɵɵtextInterpolate(f_r7.name);
103
+ i0.ɵɵadvance(2);
104
+ i0.ɵɵstyleProp("width", f_r7.pct, "%");
105
+ i0.ɵɵclassProp("warn", f_r7.warning);
106
+ i0.ɵɵadvance(2);
107
+ i0.ɵɵtextInterpolate(f_r7.value);
108
+ } }
109
+ function PSModelDetailComponent_Conditional_1_Conditional_54_Template(rf, ctx) { if (rf & 1) {
110
+ i0.ɵɵrepeaterCreate(0, PSModelDetailComponent_Conditional_1_Conditional_54_For_1_Template, 7, 7, "div", 31, _forTrack1);
111
+ } if (rf & 2) {
112
+ const ctx_r4 = i0.ɵɵnextContext(2);
113
+ i0.ɵɵrepeater(ctx_r4.importance);
114
+ } }
115
+ function PSModelDetailComponent_Conditional_1_Conditional_55_Template(rf, ctx) { if (rf & 1) {
116
+ i0.ɵɵelementStart(0, "div", 23);
117
+ i0.ɵɵtext(1, "No feature-importance data was recorded for this model.");
118
+ i0.ɵɵelementEnd();
119
+ } }
120
+ function PSModelDetailComponent_Conditional_1_Conditional_56_Conditional_3_Template(rf, ctx) { if (rf & 1) {
121
+ i0.ɵɵelementStart(0, "strong");
122
+ i0.ɵɵtext(1, "Leakage flag raised.");
123
+ i0.ɵɵelementEnd();
124
+ i0.ɵɵtext(2, " A single feature dominates \u2014 top importance is ");
125
+ i0.ɵɵelementStart(3, "strong");
126
+ i0.ɵɵtext(4);
127
+ i0.ɵɵelementEnd();
128
+ i0.ɵɵtext(5, ", at/above the ");
129
+ i0.ɵɵelementStart(6, "strong");
130
+ i0.ɵɵtext(7);
131
+ i0.ɵɵelementEnd();
132
+ i0.ɵɵtext(8, " dominance threshold. ");
133
+ i0.ɵɵelementStart(9, "div", 36);
134
+ i0.ɵɵelement(10, "i", 37);
135
+ i0.ɵɵtext(11, " Sign-off with a reason is required to publish this model. ");
136
+ i0.ɵɵelementEnd();
137
+ } if (rf & 2) {
138
+ const ctx_r4 = i0.ɵɵnextContext(3);
139
+ i0.ɵɵadvance(4);
140
+ i0.ɵɵtextInterpolate2("", ctx_r4.topFeatureName, " at ", ctx_r4.topFeatureValue);
141
+ i0.ɵɵadvance(3);
142
+ i0.ɵɵtextInterpolate(ctx_r4.dominanceThreshold);
143
+ } }
144
+ function PSModelDetailComponent_Conditional_1_Conditional_56_Conditional_4_Template(rf, ctx) { if (rf & 1) {
145
+ i0.ɵɵelementStart(0, "strong");
146
+ i0.ɵɵtext(1, "Leakage gate clear.");
147
+ i0.ɵɵelementEnd();
148
+ i0.ɵɵtext(2, " No single feature dominates \u2014 top importance is ");
149
+ i0.ɵɵelementStart(3, "strong");
150
+ i0.ɵɵtext(4);
151
+ i0.ɵɵelementEnd();
152
+ i0.ɵɵtext(5, ", below the ");
153
+ i0.ɵɵelementStart(6, "strong");
154
+ i0.ɵɵtext(7);
155
+ i0.ɵɵelementEnd();
156
+ i0.ɵɵtext(8, " dominance threshold. ");
157
+ i0.ɵɵelementStart(9, "div", 36);
158
+ i0.ɵɵelement(10, "i", 28);
159
+ i0.ɵɵtext(11, " Sign-off required before any Validated \u2192 Published promotion. ");
160
+ i0.ɵɵelementEnd();
161
+ } if (rf & 2) {
162
+ const ctx_r4 = i0.ɵɵnextContext(3);
163
+ i0.ɵɵadvance(4);
164
+ i0.ɵɵtextInterpolate2("", ctx_r4.topFeatureName, " at ", ctx_r4.topFeatureValue);
165
+ i0.ɵɵadvance(3);
166
+ i0.ɵɵtextInterpolate(ctx_r4.dominanceThreshold);
167
+ } }
168
+ function PSModelDetailComponent_Conditional_1_Conditional_56_Template(rf, ctx) { if (rf & 1) {
169
+ i0.ɵɵelementStart(0, "div", 35);
170
+ i0.ɵɵelement(1, "i");
171
+ i0.ɵɵelementStart(2, "div");
172
+ i0.ɵɵconditionalCreate(3, PSModelDetailComponent_Conditional_1_Conditional_56_Conditional_3_Template, 12, 3)(4, PSModelDetailComponent_Conditional_1_Conditional_56_Conditional_4_Template, 12, 3);
173
+ i0.ɵɵelementEnd()();
174
+ } if (rf & 2) {
175
+ const ctx_r4 = i0.ɵɵnextContext(2);
176
+ i0.ɵɵclassProp("success", !ctx_r4.leakageFlagged)("warn", ctx_r4.leakageFlagged);
177
+ i0.ɵɵadvance();
178
+ i0.ɵɵclassMap(ctx_r4.leakageFlagged ? "fa-solid fa-triangle-exclamation" : "fa-solid fa-shield-halved");
179
+ i0.ɵɵadvance(2);
180
+ i0.ɵɵconditional(ctx_r4.leakageFlagged ? 3 : 4);
181
+ } }
182
+ function PSModelDetailComponent_Conditional_1_Conditional_57_Conditional_4_Template(rf, ctx) { if (rf & 1) {
183
+ const _r8 = i0.ɵɵgetCurrentView();
184
+ i0.ɵɵelementStart(0, "button", 43);
185
+ i0.ɵɵlistener("click", function PSModelDetailComponent_Conditional_1_Conditional_57_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.requestPromote("Validated")); });
186
+ i0.ɵɵelement(1, "i", 44);
187
+ i0.ɵɵtext(2, " Mark Validated ");
188
+ i0.ɵɵelementEnd();
189
+ } }
190
+ function PSModelDetailComponent_Conditional_1_Conditional_57_Conditional_5_Template(rf, ctx) { if (rf & 1) {
191
+ const _r9 = i0.ɵɵgetCurrentView();
192
+ i0.ɵɵelementStart(0, "button", 45);
193
+ i0.ɵɵlistener("click", function PSModelDetailComponent_Conditional_1_Conditional_57_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.requestPromote("Published")); });
194
+ i0.ɵɵelement(1, "i", 46);
195
+ i0.ɵɵtext(2, " Promote to Published ");
196
+ i0.ɵɵelementEnd();
197
+ } }
198
+ function PSModelDetailComponent_Conditional_1_Conditional_57_Conditional_6_Template(rf, ctx) { if (rf & 1) {
199
+ const _r10 = i0.ɵɵgetCurrentView();
200
+ i0.ɵɵelementStart(0, "button", 47);
201
+ i0.ɵɵlistener("click", function PSModelDetailComponent_Conditional_1_Conditional_57_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.requestPromote("Archived")); });
202
+ i0.ɵɵelement(1, "i", 48);
203
+ i0.ɵɵtext(2, " Archive ");
204
+ i0.ɵɵelementEnd();
205
+ } }
206
+ function PSModelDetailComponent_Conditional_1_Conditional_57_Template(rf, ctx) { if (rf & 1) {
207
+ i0.ɵɵelementStart(0, "div", 2)(1, "div", 38)(2, "span", 39);
208
+ i0.ɵɵtext(3);
209
+ i0.ɵɵelementEnd();
210
+ i0.ɵɵconditionalCreate(4, PSModelDetailComponent_Conditional_1_Conditional_57_Conditional_4_Template, 3, 0, "button", 40);
211
+ i0.ɵɵconditionalCreate(5, PSModelDetailComponent_Conditional_1_Conditional_57_Conditional_5_Template, 3, 0, "button", 41);
212
+ i0.ɵɵconditionalCreate(6, PSModelDetailComponent_Conditional_1_Conditional_57_Conditional_6_Template, 3, 0, "button", 42);
213
+ i0.ɵɵelementEnd()();
214
+ } if (rf & 2) {
215
+ const ctx_r4 = i0.ɵɵnextContext(2);
216
+ i0.ɵɵadvance(3);
217
+ i0.ɵɵtextInterpolate(ctx_r4.actionHint);
218
+ i0.ɵɵadvance();
219
+ i0.ɵɵconditional(ctx_r4.canValidate ? 4 : -1);
220
+ i0.ɵɵadvance();
221
+ i0.ɵɵconditional(ctx_r4.canPublish ? 5 : -1);
222
+ i0.ɵɵadvance();
223
+ i0.ɵɵconditional(ctx_r4.canArchive ? 6 : -1);
224
+ } }
225
+ function PSModelDetailComponent_Conditional_1_Conditional_58_Conditional_9_Template(rf, ctx) { if (rf & 1) {
226
+ const _r12 = i0.ɵɵgetCurrentView();
227
+ i0.ɵɵelementStart(0, "div", 55)(1, "label");
228
+ i0.ɵɵtext(2);
229
+ i0.ɵɵelementEnd();
230
+ i0.ɵɵelementStart(3, "textarea", 62);
231
+ i0.ɵɵtwoWayListener("ngModelChange", function PSModelDetailComponent_Conditional_1_Conditional_58_Conditional_9_Template_textarea_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r4 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r4.pendingReason, $event) || (ctx_r4.pendingReason = $event); return i0.ɵɵresetView($event); });
232
+ i0.ɵɵelementEnd()();
233
+ } if (rf & 2) {
234
+ const ctx_r4 = i0.ɵɵnextContext(3);
235
+ i0.ɵɵadvance(2);
236
+ i0.ɵɵtextInterpolate2(" ", ctx_r4.pending.leakageFlagged ? "Leakage sign-off reason" : "Reason (optional)", " ", ctx_r4.pending.leakageFlagged ? " *" : "", " ");
237
+ i0.ɵɵadvance();
238
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r4.pendingReason);
239
+ i0.ɵɵproperty("placeholder", ctx_r4.pending.leakageFlagged ? "Explain why this model is safe to publish despite the leakage flag\u2026" : "Add an optional note for the record\u2026")("disabled", ctx_r4.busy);
240
+ } }
241
+ function PSModelDetailComponent_Conditional_1_Conditional_58_Conditional_12_Template(rf, ctx) { if (rf & 1) {
242
+ i0.ɵɵelement(0, "i", 58);
243
+ } }
244
+ function PSModelDetailComponent_Conditional_1_Conditional_58_Conditional_13_Template(rf, ctx) { if (rf & 1) {
245
+ i0.ɵɵelement(0, "i");
246
+ } if (rf & 2) {
247
+ const ctx_r4 = i0.ɵɵnextContext(3);
248
+ i0.ɵɵclassMap(ctx_r4.pendingIcon);
249
+ } }
250
+ function PSModelDetailComponent_Conditional_1_Conditional_58_Template(rf, ctx) { if (rf & 1) {
251
+ const _r11 = i0.ɵɵgetCurrentView();
252
+ i0.ɵɵelementStart(0, "div", 49);
253
+ i0.ɵɵlistener("click", function PSModelDetailComponent_Conditional_1_Conditional_58_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.cancelPromote()); });
254
+ i0.ɵɵelementStart(1, "div", 50);
255
+ i0.ɵɵlistener("click", function PSModelDetailComponent_Conditional_1_Conditional_58_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
256
+ i0.ɵɵelementStart(2, "div", 51)(3, "span", 52);
257
+ i0.ɵɵelement(4, "i");
258
+ i0.ɵɵelementEnd();
259
+ i0.ɵɵelementStart(5, "h3");
260
+ i0.ɵɵtext(6);
261
+ i0.ɵɵelementEnd()();
262
+ i0.ɵɵelementStart(7, "div", 53);
263
+ i0.ɵɵelement(8, "div", 54);
264
+ i0.ɵɵconditionalCreate(9, PSModelDetailComponent_Conditional_1_Conditional_58_Conditional_9_Template, 4, 5, "div", 55);
265
+ i0.ɵɵelementEnd();
266
+ i0.ɵɵelementStart(10, "div", 56)(11, "button", 57);
267
+ i0.ɵɵlistener("click", function PSModelDetailComponent_Conditional_1_Conditional_58_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r11); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.confirmPromote(ctx_r4.pendingReason.trim())); });
268
+ i0.ɵɵconditionalCreate(12, PSModelDetailComponent_Conditional_1_Conditional_58_Conditional_12_Template, 1, 0, "i", 58)(13, PSModelDetailComponent_Conditional_1_Conditional_58_Conditional_13_Template, 1, 2, "i", 59);
269
+ i0.ɵɵtext(14);
270
+ i0.ɵɵelementEnd();
271
+ i0.ɵɵelement(15, "span", 60);
272
+ i0.ɵɵelementStart(16, "button", 61);
273
+ i0.ɵɵlistener("click", function PSModelDetailComponent_Conditional_1_Conditional_58_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r11); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.cancelPromote()); });
274
+ i0.ɵɵtext(17, " Cancel ");
275
+ i0.ɵɵelementEnd()()()();
276
+ } if (rf & 2) {
277
+ const ctx_r4 = i0.ɵɵnextContext(2);
278
+ i0.ɵɵadvance(2);
279
+ i0.ɵɵclassProp("warn", ctx_r4.pendingVariant === "warn")("danger", ctx_r4.pendingVariant === "danger");
280
+ i0.ɵɵadvance(2);
281
+ i0.ɵɵclassMap(ctx_r4.pendingIcon);
282
+ i0.ɵɵadvance(2);
283
+ i0.ɵɵtextInterpolate(ctx_r4.pendingTitle);
284
+ i0.ɵɵadvance(2);
285
+ i0.ɵɵproperty("innerHTML", ctx_r4.pendingMessage, i0.ɵɵsanitizeHtml);
286
+ i0.ɵɵadvance();
287
+ i0.ɵɵconditional(ctx_r4.pending.leakageFlagged || ctx_r4.pending.targetStatus === "Archived" ? 9 : -1);
288
+ i0.ɵɵadvance(2);
289
+ i0.ɵɵproperty("variant", ctx_r4.pendingVariant === "danger" ? "danger" : "primary")("disabled", ctx_r4.busy || ctx_r4.pending.leakageFlagged && !ctx_r4.pendingReason.trim());
290
+ i0.ɵɵadvance();
291
+ i0.ɵɵconditional(ctx_r4.busy ? 12 : 13);
292
+ i0.ɵɵadvance(2);
293
+ i0.ɵɵtextInterpolate1(" ", ctx_r4.pendingConfirmLabel, " ");
294
+ i0.ɵɵadvance(2);
295
+ i0.ɵɵproperty("disabled", ctx_r4.busy);
296
+ } }
297
+ function PSModelDetailComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
298
+ i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "div", 4);
299
+ i0.ɵɵelement(3, "i", 5);
300
+ i0.ɵɵelementEnd();
301
+ i0.ɵɵelementStart(4, "div", 6)(5, "h2", 7);
302
+ i0.ɵɵtext(6);
303
+ i0.ɵɵelementStart(7, "span", 8);
304
+ i0.ɵɵtext(8);
305
+ i0.ɵɵelementEnd()();
306
+ i0.ɵɵelementStart(9, "div", 9);
307
+ i0.ɵɵtext(10);
308
+ i0.ɵɵelementEnd()();
309
+ i0.ɵɵelementStart(11, "span", 10);
310
+ i0.ɵɵtext(12);
311
+ i0.ɵɵelementEnd()()();
312
+ i0.ɵɵelementStart(13, "div", 2)(14, "div", 11)(15, "div", 12);
313
+ i0.ɵɵtext(16, "Lifecycle");
314
+ i0.ɵɵelementEnd();
315
+ i0.ɵɵelementStart(17, "div", 13);
316
+ i0.ɵɵrepeaterCreate(18, PSModelDetailComponent_Conditional_1_For_19_Template, 6, 7, null, null, i0.ɵɵrepeaterTrackByIdentity);
317
+ i0.ɵɵelementEnd();
318
+ i0.ɵɵelementStart(20, "div", 14);
319
+ i0.ɵɵtext(21, " Models are immutable once registered; promotion only changes lifecycle state, never weights. ");
320
+ i0.ɵɵelementEnd()()();
321
+ i0.ɵɵelementStart(22, "div", 2)(23, "div", 15)(24, "h3");
322
+ i0.ɵɵtext(25, "Performance");
323
+ i0.ɵɵelementEnd();
324
+ i0.ɵɵelementStart(26, "span", 16);
325
+ i0.ɵɵtext(27, "Holdout = held-out test fold, never seen in training");
326
+ i0.ɵɵelementEnd()();
327
+ i0.ɵɵelementStart(28, "div", 11)(29, "div", 17)(30, "div", 18)(31, "div", 12);
328
+ i0.ɵɵtext(32);
329
+ i0.ɵɵelementEnd();
330
+ i0.ɵɵelementStart(33, "div", 19);
331
+ i0.ɵɵtext(34);
332
+ i0.ɵɵelementEnd();
333
+ i0.ɵɵelementStart(35, "div", 16);
334
+ i0.ɵɵtext(36, "in-sample \u2022 optimistic");
335
+ i0.ɵɵelementEnd()();
336
+ i0.ɵɵelementStart(37, "div", 20)(38, "div", 12);
337
+ i0.ɵɵtext(39);
338
+ i0.ɵɵelementEnd();
339
+ i0.ɵɵelementStart(40, "div", 19);
340
+ i0.ɵɵtext(41);
341
+ i0.ɵɵelementEnd();
342
+ i0.ɵɵelementStart(42, "div", 16);
343
+ i0.ɵɵtext(43, "out-of-sample \u2022 the honest number");
344
+ i0.ɵɵelementEnd()()();
345
+ i0.ɵɵconditionalCreate(44, PSModelDetailComponent_Conditional_1_Conditional_44_Template, 3, 0, "div", 21)(45, PSModelDetailComponent_Conditional_1_Conditional_45_Template, 2, 0, "div", 22);
346
+ i0.ɵɵconditionalCreate(46, PSModelDetailComponent_Conditional_1_Conditional_46_Template, 5, 2, "div", 14);
347
+ i0.ɵɵelementEnd()();
348
+ i0.ɵɵelementStart(47, "div", 2)(48, "div", 15)(49, "h3");
349
+ i0.ɵɵtext(50, "Feature Importance");
350
+ i0.ɵɵelementEnd();
351
+ i0.ɵɵelementStart(51, "span", 16);
352
+ i0.ɵɵtext(52);
353
+ i0.ɵɵelementEnd()();
354
+ i0.ɵɵelementStart(53, "div", 11);
355
+ i0.ɵɵconditionalCreate(54, PSModelDetailComponent_Conditional_1_Conditional_54_Template, 2, 0)(55, PSModelDetailComponent_Conditional_1_Conditional_55_Template, 2, 0, "div", 23);
356
+ i0.ɵɵelementEnd()();
357
+ i0.ɵɵconditionalCreate(56, PSModelDetailComponent_Conditional_1_Conditional_56_Template, 5, 7, "div", 24);
358
+ i0.ɵɵconditionalCreate(57, PSModelDetailComponent_Conditional_1_Conditional_57_Template, 7, 4, "div", 2);
359
+ i0.ɵɵconditionalCreate(58, PSModelDetailComponent_Conditional_1_Conditional_58_Template, 18, 14, "div", 25);
360
+ } if (rf & 2) {
361
+ const ctx_r4 = i0.ɵɵnextContext();
362
+ i0.ɵɵadvance(6);
363
+ i0.ɵɵtextInterpolate1(" ", ctx_r4.modelDisplayName, " ");
364
+ i0.ɵɵadvance(2);
365
+ i0.ɵɵtextInterpolate1("v", ctx_r4.model.Version);
366
+ i0.ɵɵadvance(2);
367
+ i0.ɵɵtextInterpolate2(" ", ctx_r4.model.Algorithm || "Model", "", ctx_r4.targetSuffix, " \u2022 immutable snapshot ");
368
+ i0.ɵɵadvance();
369
+ i0.ɵɵclassMap(ctx_r4.statusBadgeClass(ctx_r4.model.Status));
370
+ i0.ɵɵadvance();
371
+ i0.ɵɵtextInterpolate(ctx_r4.model.Status);
372
+ i0.ɵɵadvance(6);
373
+ i0.ɵɵrepeater(ctx_r4.lifecycleSteps);
374
+ i0.ɵɵadvance(14);
375
+ i0.ɵɵtextInterpolate1("Train ", ctx_r4.primaryScoreLabel);
376
+ i0.ɵɵadvance(2);
377
+ i0.ɵɵtextInterpolate(ctx_r4.trainPrimaryScore);
378
+ i0.ɵɵadvance(5);
379
+ i0.ɵɵtextInterpolate1("Holdout ", ctx_r4.primaryScoreLabel);
380
+ i0.ɵɵadvance(2);
381
+ i0.ɵɵtextInterpolate(ctx_r4.holdoutPrimaryScore);
382
+ i0.ɵɵadvance(3);
383
+ i0.ɵɵconditional(ctx_r4.secondaryMetrics.length > 0 ? 44 : 45);
384
+ i0.ɵɵadvance(2);
385
+ i0.ɵɵconditional(ctx_r4.gapText ? 46 : -1);
386
+ i0.ɵɵadvance(6);
387
+ i0.ɵɵtextInterpolate(ctx_r4.importanceCaption);
388
+ i0.ɵɵadvance(2);
389
+ i0.ɵɵconditional(ctx_r4.importance.length > 0 ? 54 : 55);
390
+ i0.ɵɵadvance(2);
391
+ i0.ɵɵconditional(ctx_r4.importance.length > 0 ? 56 : -1);
392
+ i0.ɵɵadvance();
393
+ i0.ɵɵconditional(ctx_r4.showActions ? 57 : -1);
394
+ i0.ɵɵadvance();
395
+ i0.ɵɵconditional(ctx_r4.pending ? 58 : -1);
396
+ } }
397
+ function PSModelDetailComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
398
+ i0.ɵɵelementStart(0, "div", 1)(1, "span", 63);
399
+ i0.ɵɵelement(2, "i", 5);
400
+ i0.ɵɵelementEnd();
401
+ i0.ɵɵelementStart(3, "h3");
402
+ i0.ɵɵtext(4, "No Model Selected");
403
+ i0.ɵɵelementEnd();
404
+ i0.ɵɵelementStart(5, "p", 64);
405
+ i0.ɵɵtext(6, "Select an ML Model from the list to inspect its configuration and metrics.");
406
+ i0.ɵɵelementEnd()();
407
+ } }
408
+ /**
409
+ * **PSModelDetailComponent** — Unified enterprise component for inspecting, evaluating,
410
+ * and promoting versioned ML Models. Shared between:
411
+ * 1. **Predictive Studio Model Registry** (`PSRegistryComponent`)
412
+ * 2. **Custom Entity Form for `MJ: ML Models`** (`MLModelFormComponentExtended`)
413
+ *
414
+ * Renders:
415
+ * - Identity & immutable snapshot badge
416
+ * - Progressive 4-stage lifecycle stepper (Draft → Validated → Published → Archived)
417
+ * - In-sample train vs out-of-sample holdout performance cards and overfit gap check
418
+ * - Key feature importance rankings with single-feature dominance warnings
419
+ * - Target leakage gate verification and required sign-off rationale capture
420
+ * - Remote Operation lifecycle promotion (Validate, Publish, Archive)
421
+ */
422
+ export class PSModelDetailComponent {
423
+ constructor() {
424
+ this.Model = null;
425
+ this.Provider = null;
426
+ this.CurrentUser = null;
427
+ this.ShowActions = true;
428
+ this.StatusChanged = new EventEmitter();
429
+ /**
430
+ * @deprecated Use {@link StatusChanged}.
431
+ *
432
+ * The same emitter under the old binding name, so a template still binding
433
+ * (statusChanged) keeps working. Must stay AFTER StatusChanged: class fields
434
+ * initialise in order, and the other way round this captures undefined.
435
+ */
436
+ this.statusChanged = this.StatusChanged;
437
+ this.cdr = inject(ChangeDetectorRef);
438
+ this.notifications = inject(MJNotificationService);
439
+ this.LifecycleSteps = ['Draft', 'Validated', 'Published', 'Archived'];
440
+ this.DominanceThreshold = PS_FEATURE_DOMINANCE_THRESHOLD.toFixed(2);
441
+ this.Pending = null;
442
+ this.PendingReason = '';
443
+ this.Busy = false;
444
+ }
445
+ /** @deprecated Use {@link Model}. */
446
+ set model(value) {
447
+ this.Model = value;
448
+ }
449
+ /** @deprecated Use {@link Model}. */
450
+ get model() {
451
+ return this.Model;
452
+ }
453
+ /** @deprecated Use {@link Provider}. */
454
+ set provider(value) {
455
+ this.Provider = value;
456
+ }
457
+ /** @deprecated Use {@link Provider}. */
458
+ get provider() {
459
+ return this.Provider;
460
+ }
461
+ /** @deprecated Use {@link CurrentUser}. */
462
+ set currentUser(value) {
463
+ this.CurrentUser = value;
464
+ }
465
+ /** @deprecated Use {@link CurrentUser}. */
466
+ get currentUser() {
467
+ return this.CurrentUser;
468
+ }
469
+ /** @deprecated Use {@link ShowActions}. */
470
+ set showActions(value) {
471
+ this.ShowActions = value;
472
+ }
473
+ /** @deprecated Use {@link ShowActions}. */
474
+ get showActions() {
475
+ return this.ShowActions;
476
+ }
477
+ /** @deprecated Use {@link LifecycleSteps}. */
478
+ get lifecycleSteps() {
479
+ return this.LifecycleSteps;
480
+ }
481
+ /** @deprecated Use {@link DominanceThreshold}. */
482
+ get dominanceThreshold() {
483
+ return this.DominanceThreshold;
484
+ }
485
+ /** @deprecated Use {@link Pending}. */
486
+ get pending() {
487
+ return this.Pending;
488
+ }
489
+ /** @deprecated Use {@link Pending}. */
490
+ set pending(value) {
491
+ this.Pending = value;
492
+ }
493
+ /** @deprecated Use {@link PendingReason}. */
494
+ get pendingReason() {
495
+ return this.PendingReason;
496
+ }
497
+ /** @deprecated Use {@link PendingReason}. */
498
+ set pendingReason(value) {
499
+ this.PendingReason = value;
500
+ }
501
+ /** @deprecated Use {@link Busy}. */
502
+ get busy() {
503
+ return this.Busy;
504
+ }
505
+ /** @deprecated Use {@link Busy}. */
506
+ set busy(value) {
507
+ this.Busy = value;
508
+ }
509
+ get ModelDisplayName() {
510
+ if (this.displayName)
511
+ return this.displayName;
512
+ if (!this.Model)
513
+ return '';
514
+ return this.Model.Pipeline || (this.Model.Algorithm ? `${this.Model.Algorithm} Model` : 'ML Model');
515
+ }
516
+ /** @deprecated Use {@link ModelDisplayName}. */
517
+ get modelDisplayName() {
518
+ return this.ModelDisplayName;
519
+ }
520
+ // ── Badges & Lifecycle Stepper ──
521
+ StatusBadgeClass(status) {
522
+ switch ((status ?? '').toLowerCase()) {
523
+ case 'published':
524
+ return 'green';
525
+ case 'validated':
526
+ return 'blue';
527
+ case 'draft':
528
+ return 'amber';
529
+ case 'archived':
530
+ return 'gray';
531
+ default:
532
+ return 'gray';
533
+ }
534
+ }
535
+ /** @deprecated Use {@link StatusBadgeClass}. */
536
+ statusBadgeClass(status) {
537
+ return this.StatusBadgeClass(status);
538
+ }
539
+ StepState(step) {
540
+ const order = ['Draft', 'Validated', 'Published', 'Archived'];
541
+ const currIdx = order.indexOf(this.Model?.Status ?? 'Draft');
542
+ const stepIdx = order.indexOf(step);
543
+ if (stepIdx < currIdx)
544
+ return 'done';
545
+ if (stepIdx === currIdx)
546
+ return 'curr';
547
+ return 'todo';
548
+ }
549
+ /** @deprecated Use {@link StepState}. */
550
+ stepState(step) {
551
+ return this.StepState(step);
552
+ }
553
+ get TargetSuffix() {
554
+ const target = this.Model?.TargetVariable;
555
+ return target ? ` · predicts ${target}` : '';
556
+ }
557
+ /** @deprecated Use {@link TargetSuffix}. */
558
+ get targetSuffix() {
559
+ return this.TargetSuffix;
560
+ }
561
+ // ── Metrics & Performance Derivations ──
562
+ get PrimaryScoreLabel() {
563
+ if (!this.Model)
564
+ return 'Score';
565
+ const score = PrimaryModelScore(this.Model);
566
+ return score?.label ?? 'AUC';
567
+ }
568
+ /** @deprecated Use {@link PrimaryScoreLabel}. */
569
+ get primaryScoreLabel() {
570
+ return this.PrimaryScoreLabel;
571
+ }
572
+ get TrainPrimaryScore() {
573
+ if (!this.Model)
574
+ return '—';
575
+ const score = PrimaryModelScore(this.Model);
576
+ const trainMetrics = ParseMetrics(this.Model.Metrics);
577
+ if (score && trainMetrics[score.key] != null) {
578
+ return FormatMetricValue(score.key, trainMetrics[score.key]);
579
+ }
580
+ return trainMetrics.AUC != null ? trainMetrics.AUC.toFixed(3) : '—';
581
+ }
582
+ /** @deprecated Use {@link TrainPrimaryScore}. */
583
+ get trainPrimaryScore() {
584
+ return this.TrainPrimaryScore;
585
+ }
586
+ get HoldoutPrimaryScore() {
587
+ if (!this.Model)
588
+ return '—';
589
+ const score = PrimaryModelScore(this.Model);
590
+ const holdoutMetrics = ParseMetrics(this.Model.HoldoutMetrics);
591
+ if (score && holdoutMetrics[score.key] != null) {
592
+ return FormatMetricValue(score.key, holdoutMetrics[score.key]);
593
+ }
594
+ return holdoutMetrics.AUC != null ? holdoutMetrics.AUC.toFixed(3) : '—';
595
+ }
596
+ /** @deprecated Use {@link HoldoutPrimaryScore}. */
597
+ get holdoutPrimaryScore() {
598
+ return this.HoldoutPrimaryScore;
599
+ }
600
+ get SecondaryMetrics() {
601
+ if (!this.Model)
602
+ return [];
603
+ const score = PrimaryModelScore(this.Model);
604
+ const primaryKey = score?.key;
605
+ const holdout = MetricsToDisplay(ParseMetrics(this.Model.HoldoutMetrics), { excludeAuc: false });
606
+ const all = holdout.length > 0 ? holdout : MetricsToDisplay(ParseMetrics(this.Model.Metrics), { excludeAuc: false });
607
+ return primaryKey ? all.filter((m) => m.key !== primaryKey) : all.filter((m) => m.key !== 'AUC');
608
+ }
609
+ /** @deprecated Use {@link SecondaryMetrics}. */
610
+ get secondaryMetrics() {
611
+ return this.SecondaryMetrics;
612
+ }
613
+ get GapText() {
614
+ if (!this.Model)
615
+ return '';
616
+ const gap = OverfitGap(this.Model);
617
+ return gap == null ? '' : Math.abs(gap).toFixed(3);
618
+ }
619
+ /** @deprecated Use {@link GapText}. */
620
+ get gapText() {
621
+ return this.GapText;
622
+ }
623
+ get GapVerdict() {
624
+ if (!this.Model)
625
+ return '';
626
+ const gap = OverfitGap(this.Model);
627
+ if (gap == null)
628
+ return '';
629
+ return gap > 0.1 ? 'is wide — watch for overfitting' : 'is within tolerance — no overfitting flag';
630
+ }
631
+ /** @deprecated Use {@link GapVerdict}. */
632
+ get gapVerdict() {
633
+ return this.GapVerdict;
634
+ }
635
+ // ── Feature Importance & Leakage Gate ──
636
+ get Importance() {
637
+ if (!this.Model)
638
+ return [];
639
+ return ParseFeatureImportance(this.Model.FeatureImportance, 6).map((b) => ({
640
+ ...b,
641
+ name: HumanizeFeatureName(b.name),
642
+ }));
643
+ }
644
+ /** @deprecated Use {@link Importance}. */
645
+ get importance() {
646
+ return this.Importance;
647
+ }
648
+ get ImportanceCaption() {
649
+ const n = this.Importance.length;
650
+ return n === 0 ? 'no data' : `normalized · top ${n}`;
651
+ }
652
+ /** @deprecated Use {@link ImportanceCaption}. */
653
+ get importanceCaption() {
654
+ return this.ImportanceCaption;
655
+ }
656
+ get TopFeatureName() {
657
+ return this.Importance[0]?.name ?? '—';
658
+ }
659
+ /** @deprecated Use {@link TopFeatureName}. */
660
+ get topFeatureName() {
661
+ return this.TopFeatureName;
662
+ }
663
+ get TopFeatureValue() {
664
+ return this.Importance[0]?.value ?? '—';
665
+ }
666
+ /** @deprecated Use {@link TopFeatureValue}. */
667
+ get topFeatureValue() {
668
+ return this.TopFeatureValue;
669
+ }
670
+ get LeakageFlagged() {
671
+ if (!this.Model)
672
+ return false;
673
+ const max = MaxFeatureImportance(this.Model.FeatureImportance);
674
+ return max != null && max >= PS_FEATURE_DOMINANCE_THRESHOLD;
675
+ }
676
+ /** @deprecated Use {@link LeakageFlagged}. */
677
+ get leakageFlagged() {
678
+ return this.LeakageFlagged;
679
+ }
680
+ // ── Actions & Promotion Flow ──
681
+ get CanValidate() {
682
+ return this.Model?.Status === 'Draft';
683
+ }
684
+ /** @deprecated Use {@link CanValidate}. */
685
+ get canValidate() {
686
+ return this.CanValidate;
687
+ }
688
+ get CanPublish() {
689
+ return this.Model?.Status === 'Validated';
690
+ }
691
+ /** @deprecated Use {@link CanPublish}. */
692
+ get canPublish() {
693
+ return this.CanPublish;
694
+ }
695
+ get CanArchive() {
696
+ return this.Model?.Status === 'Published' || this.Model?.Status === 'Validated';
697
+ }
698
+ /** @deprecated Use {@link CanArchive}. */
699
+ get canArchive() {
700
+ return this.CanArchive;
701
+ }
702
+ get ActionHint() {
703
+ switch (this.Model?.Status) {
704
+ case 'Draft':
705
+ return 'Verify metrics and feature importance before validating or publishing.';
706
+ case 'Validated':
707
+ return 'Validated and sign-off clear. Ready to promote to production serving.';
708
+ case 'Published':
709
+ return 'Active in production serving. Archiving will detach live predictions.';
710
+ case 'Archived':
711
+ return 'Archived snapshot. Preserved for governance and historical auditing.';
712
+ default:
713
+ return '';
714
+ }
715
+ }
716
+ /** @deprecated Use {@link ActionHint}. */
717
+ get actionHint() {
718
+ return this.ActionHint;
719
+ }
720
+ RequestPromote(targetStatus) {
721
+ if (!this.Model)
722
+ return;
723
+ this.PendingReason = '';
724
+ this.Pending = {
725
+ modelId: this.Model.ID,
726
+ modelName: `${this.ModelDisplayName} v${this.Model.Version}`,
727
+ targetStatus,
728
+ leakageFlagged: this.LeakageFlagged && targetStatus !== 'Archived',
729
+ };
730
+ this.cdr.markForCheck();
731
+ }
732
+ /** @deprecated Use {@link RequestPromote}. */
733
+ requestPromote(targetStatus) {
734
+ return this.RequestPromote(targetStatus);
735
+ }
736
+ CancelPromote() {
737
+ if (this.Busy)
738
+ return;
739
+ this.Pending = null;
740
+ this.PendingReason = '';
741
+ this.cdr.markForCheck();
742
+ }
743
+ /** @deprecated Use {@link CancelPromote}. */
744
+ cancelPromote() {
745
+ return this.CancelPromote();
746
+ }
747
+ get PendingTitle() {
748
+ if (!this.Pending)
749
+ return '';
750
+ return this.Pending.targetStatus === 'Archived' ? 'Archive model' : `Promote to ${this.Pending.targetStatus}`;
751
+ }
752
+ /** @deprecated Use {@link PendingTitle}. */
753
+ get pendingTitle() {
754
+ return this.PendingTitle;
755
+ }
756
+ get PendingIcon() {
757
+ if (!this.Pending)
758
+ return 'fa-solid fa-check';
759
+ return this.Pending.targetStatus === 'Archived' ? 'fa-solid fa-box-archive' : 'fa-solid fa-arrow-up';
760
+ }
761
+ /** @deprecated Use {@link PendingIcon}. */
762
+ get pendingIcon() {
763
+ return this.PendingIcon;
764
+ }
765
+ get PendingConfirmLabel() {
766
+ if (!this.Pending)
767
+ return 'Confirm';
768
+ return this.Pending.targetStatus === 'Archived' ? 'Archive' : `Promote to ${this.Pending.targetStatus}`;
769
+ }
770
+ /** @deprecated Use {@link PendingConfirmLabel}. */
771
+ get pendingConfirmLabel() {
772
+ return this.PendingConfirmLabel;
773
+ }
774
+ get PendingVariant() {
775
+ if (!this.Pending)
776
+ return 'info';
777
+ if (this.Pending.targetStatus === 'Archived')
778
+ return 'warn';
779
+ return this.Pending.leakageFlagged ? 'warn' : 'info';
780
+ }
781
+ /** @deprecated Use {@link PendingVariant}. */
782
+ get pendingVariant() {
783
+ return this.PendingVariant;
784
+ }
785
+ get PendingMessage() {
786
+ if (!this.Pending)
787
+ return '';
788
+ const name = this.escapeHtml(this.Pending.modelName);
789
+ if (this.Pending.targetStatus === 'Archived') {
790
+ return `Archive <strong>${name}</strong>? This detaches any active scoring bindings and removes it from production scoring. The model artifact remains immutable and recoverable.`;
791
+ }
792
+ if (this.Pending.leakageFlagged) {
793
+ return `<strong>${name}</strong> is flagged for possible target leakage. Publishing requires an explicit sign-off — confirm you understand the risk and provide a reason below.`;
794
+ }
795
+ return `Promote <strong>${name}</strong> to <strong>${this.Pending.targetStatus}</strong>? This changes only the lifecycle state — the trained weights never change.`;
796
+ }
797
+ /** @deprecated Use {@link PendingMessage}. */
798
+ get pendingMessage() {
799
+ return this.PendingMessage;
800
+ }
801
+ async ConfirmPromote(reason) {
802
+ if (!this.Pending || this.Busy || !this.Model)
803
+ return;
804
+ this.Busy = true;
805
+ this.cdr.markForCheck();
806
+ const { modelId, modelName, targetStatus, leakageFlagged } = this.Pending;
807
+ try {
808
+ const op = new PredictiveStudioPromoteModelOperation();
809
+ const result = await op.Execute({
810
+ modelId,
811
+ targetStatus,
812
+ signOff: leakageFlagged ? true : undefined,
813
+ reason: reason || undefined,
814
+ }, { provider: this.Provider ?? undefined, user: this.CurrentUser ?? undefined });
815
+ if (result.Success && result.Output?.promoted) {
816
+ const newStatus = result.Output.status;
817
+ this.Model.Status = newStatus;
818
+ this.notifications.CreateSimpleNotification(`${modelName} → ${newStatus}`, 'success', 3500);
819
+ this.StatusChanged.emit({ modelId, newStatus });
820
+ this.Pending = null;
821
+ this.PendingReason = '';
822
+ }
823
+ else {
824
+ this.notifications.CreateSimpleNotification(result.ErrorMessage || `Could not promote ${modelName} (status: ${result.Output?.status ?? 'unchanged'}).`, 'error', 5000);
825
+ }
826
+ }
827
+ catch (e) {
828
+ this.notifications.CreateSimpleNotification(`Promotion failed: ${e instanceof Error ? e.message : String(e)}`, 'error', 5000);
829
+ }
830
+ finally {
831
+ this.Busy = false;
832
+ this.cdr.markForCheck();
833
+ }
834
+ }
835
+ /** @deprecated Use {@link ConfirmPromote}. */
836
+ async confirmPromote(reason) {
837
+ return this.ConfirmPromote(reason);
838
+ }
839
+ escapeHtml(value) {
840
+ return value
841
+ .replace(/&/g, '&amp;')
842
+ .replace(/</g, '&lt;')
843
+ .replace(/>/g, '&gt;')
844
+ .replace(/"/g, '&quot;');
845
+ }
846
+ static { this.ɵfac = function PSModelDetailComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PSModelDetailComponent)(); }; }
847
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PSModelDetailComponent, selectors: [["ps-model-detail"]], inputs: { Model: "Model", model: "model", Provider: "Provider", provider: "provider", CurrentUser: "CurrentUser", currentUser: "currentUser", ShowActions: "ShowActions", showActions: "showActions", displayName: "displayName" }, outputs: { StatusChanged: "StatusChanged", statusChanged: "statusChanged" }, decls: 3, vars: 1, consts: [["data-testid", "ps-model-detail", 1, "ps-model-detail"], [1, "ps-empty", 2, "padding", "32px", "text-align", "center"], [1, "ps-card"], [1, "ps-card-body", "dh"], [1, "big-ico"], [1, "fa-solid", "fa-cube"], [2, "flex", "1", "min-width", "0"], ["data-testid", "ps-registry-detail-name"], [1, "ps-tag", "ps-mono"], [1, "ps-muted", "ps-small", "sub"], [1, "ps-badge"], [1, "ps-card-body"], [1, "ps-section-title"], [1, "ps-stepper"], [1, "ps-small", "ps-muted", 2, "margin-top", "10px"], [1, "ps-card-head"], [1, "ps-muted", "ps-small"], [1, "metric-pair"], [1, "mtile"], [1, "v"], [1, "mtile", "honest"], [1, "stat-bar"], [1, "ps-small", "ps-muted", 2, "margin-top", "6px"], [1, "ps-small", "ps-muted"], [1, "ps-callout", "gate", 3, "success", "warn"], [1, "ps-modal-backdrop"], [1, "ps-step"], [1, "pip"], [1, "fa-solid", "fa-check"], [1, "ln"], [1, "b"], [1, "ps-fbar"], [1, "name", "ps-small", 3, "title"], [1, "track"], [1, "ps-mono"], [1, "ps-callout", "gate"], [1, "ps-small", 2, "margin-top", "6px"], [1, "fa-solid", "fa-pen"], [1, "ps-card-body", "ps-row", 2, "align-items", "center", "flex-wrap", "wrap", "gap", "8px"], [1, "ps-muted", "ps-small", 2, "flex", "1"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-registry-validate"], ["mjButton", "", "variant", "primary", "size", "sm", "data-testid", "ps-registry-promote"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-registry-archive"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-registry-validate", 3, "click"], [1, "fa-solid", "fa-circle-check"], ["mjButton", "", "variant", "primary", "size", "sm", "data-testid", "ps-registry-promote", 3, "click"], [1, "fa-solid", "fa-arrow-up"], ["mjButton", "", "variant", "secondary", "size", "sm", "data-testid", "ps-registry-archive", 3, "click"], [1, "fa-solid", "fa-box-archive"], [1, "ps-modal-backdrop", 3, "click"], ["data-testid", "ps-confirm-modal", 1, "ps-modal", 3, "click"], [1, "ps-modal-head"], [1, "ico"], [1, "ps-modal-body"], [3, "innerHTML"], [1, "ps-field", 2, "margin-top", "12px"], [1, "ps-modal-foot"], ["mjButton", "", "size", "sm", 3, "click", "variant", "disabled"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [3, "class"], [1, "ps-spacer", 2, "flex", "1"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click", "disabled"], ["rows", "3", 1, "ps-input", 3, "ngModelChange", "ngModel", "placeholder", "disabled"], [1, "ps-empty-ico"], [1, "ps-muted"]], template: function PSModelDetailComponent_Template(rf, ctx) { if (rf & 1) {
848
+ i0.ɵɵelementStart(0, "div", 0);
849
+ i0.ɵɵconditionalCreate(1, PSModelDetailComponent_Conditional_1_Template, 59, 18)(2, PSModelDetailComponent_Conditional_2_Template, 7, 0, "div", 1);
850
+ i0.ɵɵelementEnd();
851
+ } if (rf & 2) {
852
+ i0.ɵɵadvance();
853
+ i0.ɵɵconditional(ctx.model ? 1 : 2);
854
+ } }, dependencies: [CommonModule, FormsModule, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, MJButtonDirective], styles: ["\n\n.ps-model-detail[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n color: var(--mj-text-primary);\n background: transparent;\n font-family: inherit;\n}\n\n\n.ps-model-detail[_ngcontent-%COMP%] .ps-row[_ngcontent-%COMP%] { display: flex; gap: 16px; }\n.ps-model-detail[_ngcontent-%COMP%] .ps-col[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 16px; }\n.ps-model-detail[_ngcontent-%COMP%] .ps-spacer[_ngcontent-%COMP%] { flex: 1; }\n.ps-model-detail[_ngcontent-%COMP%] .ps-muted[_ngcontent-%COMP%] { color: var(--mj-text-muted); }\n.ps-model-detail[_ngcontent-%COMP%] .ps-small[_ngcontent-%COMP%] { font-size: 12.5px; }\n.ps-model-detail[_ngcontent-%COMP%] .ps-mono[_ngcontent-%COMP%] { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-model-detail[_ngcontent-%COMP%] .ps-section-title[_ngcontent-%COMP%] {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: .06em;\n color: var(--mj-text-muted);\n margin: 4px 0 2px;\n font-weight: 700;\n}\n\n\n.ps-model-detail[_ngcontent-%COMP%] .ps-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-card-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-card-head[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 14.5px;\n margin: 0;\n font-weight: 650;\n color: var(--mj-text-primary);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-card-body[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n\n.ps-model-detail[_ngcontent-%COMP%] .ps-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 11.5px;\n font-weight: 650;\n line-height: 1.5;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-badge.gray[_ngcontent-%COMP%] { background: var(--mj-bg-surface-sunken, #f3f4f6); color: var(--mj-text-secondary); }\n.ps-model-detail[_ngcontent-%COMP%] .ps-badge.blue[_ngcontent-%COMP%] { background: var(--mj-status-info-bg, #eff6ff); color: var(--mj-status-info-text, #1d4ed8); }\n.ps-model-detail[_ngcontent-%COMP%] .ps-badge.green[_ngcontent-%COMP%] { background: var(--mj-status-success-bg, #f0fdf4); color: var(--mj-status-success-text, #15803d); }\n.ps-model-detail[_ngcontent-%COMP%] .ps-badge.amber[_ngcontent-%COMP%] { background: var(--mj-status-warning-bg, #fffbeb); color: var(--mj-status-warning-text, #b45309); }\n.ps-model-detail[_ngcontent-%COMP%] .ps-badge.red[_ngcontent-%COMP%] { background: var(--mj-status-error-bg, #fef2f2); color: var(--mj-status-error-text, #b91c1c); }\n\n.ps-model-detail[_ngcontent-%COMP%] .ps-tag[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 7px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n background: var(--mj-bg-surface-sunken, #f3f4f6);\n color: var(--mj-text-secondary);\n}\n\n\n.ps-model-detail[_ngcontent-%COMP%] .dh[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n}\n.ps-model-detail[_ngcontent-%COMP%] .big-ico[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n display: grid;\n place-items: center;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 20px;\n flex: 0 0 auto;\n}\n.ps-model-detail[_ngcontent-%COMP%] .dh[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n font-size: 18px;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-weight: 700;\n}\n.ps-model-detail[_ngcontent-%COMP%] .dh[_ngcontent-%COMP%] .sub[_ngcontent-%COMP%] {\n margin-top: 2px;\n}\n\n\n.ps-model-detail[_ngcontent-%COMP%] .ps-stepper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n flex-wrap: wrap;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-step[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-muted);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-step.curr[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-step.done[_ngcontent-%COMP%] {\n color: var(--mj-status-success, #15803d);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-step[_ngcontent-%COMP%] .pip[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n border-radius: 50%;\n display: grid;\n place-items: center;\n font-size: 11px;\n border: 1.5px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-step.curr[_ngcontent-%COMP%] .pip[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 700;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-step.done[_ngcontent-%COMP%] .pip[_ngcontent-%COMP%] {\n background: var(--mj-status-success, #15803d);\n border-color: var(--mj-status-success, #15803d);\n color: var(--mj-text-inverse);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-stepper[_ngcontent-%COMP%] .ln[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 16px;\n height: 2px;\n background: var(--mj-border-default);\n}\n\n\n.ps-model-detail[_ngcontent-%COMP%] .metric-pair[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n}\n@media (max-width: 640px) {\n .ps-model-detail[_ngcontent-%COMP%] .metric-pair[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n.ps-model-detail[_ngcontent-%COMP%] .mtile[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 9px;\n padding: 14px;\n background: var(--mj-bg-surface);\n}\n.ps-model-detail[_ngcontent-%COMP%] .mtile[_ngcontent-%COMP%] .v[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 720;\n color: var(--mj-text-primary);\n letter-spacing: -.02em;\n}\n.ps-model-detail[_ngcontent-%COMP%] .mtile.honest[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n}\n.ps-model-detail[_ngcontent-%COMP%] .mtile.honest[_ngcontent-%COMP%] .v[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.ps-model-detail[_ngcontent-%COMP%] .stat-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n margin-top: 14px;\n flex-wrap: wrap;\n}\n.ps-model-detail[_ngcontent-%COMP%] .stat-bar[_ngcontent-%COMP%] .b[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n border-radius: 8px;\n flex: 1;\n min-width: 90px;\n}\n.ps-model-detail[_ngcontent-%COMP%] .stat-bar[_ngcontent-%COMP%] .b[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-size: 15px;\n}\n\n\n.ps-model-detail[_ngcontent-%COMP%] .ps-fbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 8px;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-fbar[_ngcontent-%COMP%] .name[_ngcontent-%COMP%] {\n width: 170px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 0;\n color: var(--mj-text-secondary);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-fbar[_ngcontent-%COMP%] .track[_ngcontent-%COMP%] {\n flex: 1;\n height: 8px;\n background: var(--mj-bg-surface-sunken, #f3f4f6);\n border-radius: 999px;\n overflow: hidden;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-fbar[_ngcontent-%COMP%] .track[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 999px;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-fbar[_ngcontent-%COMP%] .track[_ngcontent-%COMP%] span.warn[_ngcontent-%COMP%] {\n background: var(--mj-status-warning, #d98213);\n}\n\n\n.ps-model-detail[_ngcontent-%COMP%] .ps-callout[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-callout.gate[_ngcontent-%COMP%] {\n align-items: flex-start;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-callout.gate[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n margin-top: 2px;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-callout.success[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg, #f0fdf4);\n border-color: color-mix(in srgb, var(--mj-status-success) 25%, transparent);\n color: var(--mj-status-success-text, #15803d);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-callout.warn[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg, #fffbeb);\n border-color: color-mix(in srgb, var(--mj-status-warning) 25%, transparent);\n color: var(--mj-status-warning-text, #b45309);\n}\n\n\n.ps-model-detail[_ngcontent-%COMP%] .ps-modal-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.45);\n z-index: 10000;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-modal[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n width: 100%;\n max-width: 480px;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-modal-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-modal-head[_ngcontent-%COMP%] .ico[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: grid;\n place-items: center;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 15px;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-modal-head.warn[_ngcontent-%COMP%] .ico[_ngcontent-%COMP%] {\n background: var(--mj-status-warning, #d98213);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-modal-head.danger[_ngcontent-%COMP%] .ico[_ngcontent-%COMP%] {\n background: var(--mj-status-error, #b91c1c);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-modal-head[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-modal-body[_ngcontent-%COMP%] {\n padding: 20px;\n font-size: 13.5px;\n line-height: 1.5;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-modal-foot[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n background: var(--mj-bg-surface-sunken, #f9fafb);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-family: inherit;\n font-size: 13px;\n resize: vertical;\n}\n.ps-model-detail[_ngcontent-%COMP%] .ps-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}"], changeDetection: 0 }); }
855
+ }
856
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PSModelDetailComponent, [{
857
+ type: Component,
858
+ args: [{ standalone: true, selector: 'ps-model-detail', imports: [CommonModule, FormsModule, MJButtonDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ps-model-detail\" data-testid=\"ps-model-detail\">\n @if (model) {\n <!-- 1. Header Card -->\n <div class=\"ps-card\">\n <div class=\"ps-card-body dh\">\n <div class=\"big-ico\"><i class=\"fa-solid fa-cube\"></i></div>\n <div style=\"flex:1;min-width:0;\">\n <h2 data-testid=\"ps-registry-detail-name\">\n {{ modelDisplayName }}\n <span class=\"ps-tag ps-mono\">v{{ model.Version }}</span>\n </h2>\n <div class=\"ps-muted ps-small sub\">\n {{ model.Algorithm || 'Model' }}{{ targetSuffix }} &bull; immutable snapshot\n </div>\n </div>\n <span class=\"ps-badge\" [class]=\"statusBadgeClass(model.Status)\">{{ model.Status }}</span>\n </div>\n </div>\n\n <!-- 2. Lifecycle Stepper -->\n <div class=\"ps-card\">\n <div class=\"ps-card-body\">\n <div class=\"ps-section-title\">Lifecycle</div>\n <div class=\"ps-stepper\">\n @for (step of lifecycleSteps; track step; let last = $last) {\n <div class=\"ps-step\" [class.done]=\"stepState(step) === 'done'\" [class.curr]=\"stepState(step) === 'curr'\">\n <span class=\"pip\">\n @if (stepState(step) === 'done') {\n <i class=\"fa-solid fa-check\"></i>\n } @else {\n {{ $index + 1 }}\n }\n </span>\n {{ step }}\n </div>\n @if (!last) {\n <span class=\"ln\"></span>\n }\n }\n </div>\n <div class=\"ps-small ps-muted\" style=\"margin-top:10px\">\n Models are immutable once registered; promotion only changes lifecycle state, never weights.\n </div>\n </div>\n </div>\n\n <!-- 3. Performance Metrics -->\n <div class=\"ps-card\">\n <div class=\"ps-card-head\">\n <h3>Performance</h3>\n <span class=\"ps-muted ps-small\">Holdout = held-out test fold, never seen in training</span>\n </div>\n <div class=\"ps-card-body\">\n <div class=\"metric-pair\">\n <div class=\"mtile\">\n <div class=\"ps-section-title\">Train {{ primaryScoreLabel }}</div>\n <div class=\"v\">{{ trainPrimaryScore }}</div>\n <div class=\"ps-muted ps-small\">in-sample &bull; optimistic</div>\n </div>\n <div class=\"mtile honest\">\n <div class=\"ps-section-title\">Holdout {{ primaryScoreLabel }}</div>\n <div class=\"v\">{{ holdoutPrimaryScore }}</div>\n <div class=\"ps-muted ps-small\">out-of-sample &bull; the honest number</div>\n </div>\n </div>\n\n @if (secondaryMetrics.length > 0) {\n <div class=\"stat-bar\">\n @for (s of secondaryMetrics; track s.key) {\n <div class=\"b\">\n <span class=\"ps-muted ps-small\">{{ s.label }}</span>\n <strong>{{ s.value }}</strong>\n </div>\n }\n </div>\n } @else {\n <div class=\"ps-small ps-muted\" style=\"margin-top:6px\">No secondary metrics recorded for this model.</div>\n }\n\n @if (gapText) {\n <div class=\"ps-small ps-muted\" style=\"margin-top:10px\">\n Train\u2013holdout gap of <strong>{{ gapText }}</strong> {{ gapVerdict }}.\n </div>\n }\n </div>\n </div>\n\n <!-- 4. Feature Importance -->\n <div class=\"ps-card\">\n <div class=\"ps-card-head\">\n <h3>Feature Importance</h3>\n <span class=\"ps-muted ps-small\">{{ importanceCaption }}</span>\n </div>\n <div class=\"ps-card-body\">\n @if (importance.length > 0) {\n @for (f of importance; track f.name) {\n <div class=\"ps-fbar\">\n <span class=\"name ps-small\" [title]=\"f.name\">{{ f.name }}</span>\n <div class=\"track\">\n <span [class.warn]=\"f.warning\" [style.width.%]=\"f.pct\"></span>\n </div>\n <span class=\"ps-mono\">{{ f.value }}</span>\n </div>\n }\n } @else {\n <div class=\"ps-small ps-muted\">No feature-importance data was recorded for this model.</div>\n }\n </div>\n </div>\n\n <!-- 5. Leakage Sign-Off Gate -->\n @if (importance.length > 0) {\n <div class=\"ps-callout gate\" [class.success]=\"!leakageFlagged\" [class.warn]=\"leakageFlagged\">\n <i [class]=\"leakageFlagged ? 'fa-solid fa-triangle-exclamation' : 'fa-solid fa-shield-halved'\"></i>\n <div>\n @if (leakageFlagged) {\n <strong>Leakage flag raised.</strong> A single feature dominates \u2014 top importance is\n <strong>{{ topFeatureName }} at {{ topFeatureValue }}</strong>, at/above the\n <strong>{{ dominanceThreshold }}</strong> dominance threshold.\n <div class=\"ps-small\" style=\"margin-top:6px\">\n <i class=\"fa-solid fa-pen\"></i> Sign-off with a reason is required to publish this model.\n </div>\n } @else {\n <strong>Leakage gate clear.</strong> No single feature dominates \u2014 top importance is\n <strong>{{ topFeatureName }} at {{ topFeatureValue }}</strong>, below the\n <strong>{{ dominanceThreshold }}</strong> dominance threshold.\n <div class=\"ps-small\" style=\"margin-top:6px\">\n <i class=\"fa-solid fa-check\"></i> Sign-off required before any Validated &rarr; Published promotion.\n </div>\n }\n </div>\n </div>\n }\n\n <!-- 6. Lifecycle Actions -->\n @if (showActions) {\n <div class=\"ps-card\">\n <div class=\"ps-card-body ps-row\" style=\"align-items:center;flex-wrap:wrap;gap:8px\">\n <span class=\"ps-muted ps-small\" style=\"flex:1\">{{ actionHint }}</span>\n @if (canValidate) {\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-registry-validate\" (click)=\"requestPromote('Validated')\">\n <i class=\"fa-solid fa-circle-check\"></i> Mark Validated\n </button>\n }\n @if (canPublish) {\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-registry-promote\" (click)=\"requestPromote('Published')\">\n <i class=\"fa-solid fa-arrow-up\"></i> Promote to Published\n </button>\n }\n @if (canArchive) {\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-registry-archive\" (click)=\"requestPromote('Archived')\">\n <i class=\"fa-solid fa-box-archive\"></i> Archive\n </button>\n }\n </div>\n </div>\n }\n\n <!-- 7. Confirm Promotion Modal -->\n @if (pending) {\n <div class=\"ps-modal-backdrop\" (click)=\"cancelPromote()\">\n <div class=\"ps-modal\" (click)=\"$event.stopPropagation()\" data-testid=\"ps-confirm-modal\">\n <div class=\"ps-modal-head\" [class.warn]=\"pendingVariant === 'warn'\" [class.danger]=\"pendingVariant === 'danger'\">\n <span class=\"ico\"><i [class]=\"pendingIcon\"></i></span>\n <h3>{{ pendingTitle }}</h3>\n </div>\n <div class=\"ps-modal-body\">\n <div [innerHTML]=\"pendingMessage\"></div>\n @if (pending.leakageFlagged || pending.targetStatus === 'Archived') {\n <div class=\"ps-field\" style=\"margin-top:12px\">\n <label>\n {{ pending.leakageFlagged ? 'Leakage sign-off reason' : 'Reason (optional)' }}\n {{ pending.leakageFlagged ? ' *' : '' }}\n </label>\n <textarea\n class=\"ps-input\"\n rows=\"3\"\n [(ngModel)]=\"pendingReason\"\n [placeholder]=\"pending.leakageFlagged ? 'Explain why this model is safe to publish despite the leakage flag\u2026' : 'Add an optional note for the record\u2026'\"\n [disabled]=\"busy\"></textarea>\n </div>\n }\n </div>\n <div class=\"ps-modal-foot\">\n <button\n mjButton\n [variant]=\"pendingVariant === 'danger' ? 'danger' : 'primary'\"\n size=\"sm\"\n [disabled]=\"busy || (pending.leakageFlagged && !pendingReason.trim())\"\n (click)=\"confirmPromote(pendingReason.trim())\">\n @if (busy) {\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n } @else {\n <i [class]=\"pendingIcon\"></i>\n }\n {{ pendingConfirmLabel }}\n </button>\n <span class=\"ps-spacer\" style=\"flex:1\"></span>\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"busy\" (click)=\"cancelPromote()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n } @else {\n <div class=\"ps-empty\" style=\"padding: 32px; text-align: center;\">\n <span class=\"ps-empty-ico\"><i class=\"fa-solid fa-cube\"></i></span>\n <h3>No Model Selected</h3>\n <p class=\"ps-muted\">Select an ML Model from the list to inspect its configuration and metrics.</p>\n </div>\n }\n</div>\n", styles: ["/* PSModelDetailComponent Styles \u2014 Design Token Compliant */\n\n.ps-model-detail {\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n color: var(--mj-text-primary);\n background: transparent;\n font-family: inherit;\n}\n\n/* ---- generic helpers ---- */\n.ps-model-detail .ps-row { display: flex; gap: 16px; }\n.ps-model-detail .ps-col { display: flex; flex-direction: column; gap: 16px; }\n.ps-model-detail .ps-spacer { flex: 1; }\n.ps-model-detail .ps-muted { color: var(--mj-text-muted); }\n.ps-model-detail .ps-small { font-size: 12.5px; }\n.ps-model-detail .ps-mono { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 12.5px; }\n.ps-model-detail .ps-section-title {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: .06em;\n color: var(--mj-text-muted);\n margin: 4px 0 2px;\n font-weight: 700;\n}\n\n/* ---- cards ---- */\n.ps-model-detail .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-model-detail .ps-card-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n}\n.ps-model-detail .ps-card-head h3 {\n font-size: 14.5px;\n margin: 0;\n font-weight: 650;\n color: var(--mj-text-primary);\n}\n.ps-model-detail .ps-card-body {\n padding: 16px;\n}\n\n/* ---- badges & tags ---- */\n.ps-model-detail .ps-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 11.5px;\n font-weight: 650;\n line-height: 1.5;\n}\n.ps-model-detail .ps-badge.gray { background: var(--mj-bg-surface-sunken, #f3f4f6); color: var(--mj-text-secondary); }\n.ps-model-detail .ps-badge.blue { background: var(--mj-status-info-bg, #eff6ff); color: var(--mj-status-info-text, #1d4ed8); }\n.ps-model-detail .ps-badge.green { background: var(--mj-status-success-bg, #f0fdf4); color: var(--mj-status-success-text, #15803d); }\n.ps-model-detail .ps-badge.amber { background: var(--mj-status-warning-bg, #fffbeb); color: var(--mj-status-warning-text, #b45309); }\n.ps-model-detail .ps-badge.red { background: var(--mj-status-error-bg, #fef2f2); color: var(--mj-status-error-text, #b91c1c); }\n\n.ps-model-detail .ps-tag {\n display: inline-flex;\n align-items: center;\n padding: 2px 7px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n background: var(--mj-bg-surface-sunken, #f3f4f6);\n color: var(--mj-text-secondary);\n}\n\n/* ---- detail header ---- */\n.ps-model-detail .dh {\n display: flex;\n align-items: center;\n gap: 14px;\n}\n.ps-model-detail .big-ico {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n display: grid;\n place-items: center;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 20px;\n flex: 0 0 auto;\n}\n.ps-model-detail .dh h2 {\n font-size: 18px;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-weight: 700;\n}\n.ps-model-detail .dh .sub {\n margin-top: 2px;\n}\n\n/* ---- stepper ---- */\n.ps-model-detail .ps-stepper {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n flex-wrap: wrap;\n}\n.ps-model-detail .ps-step {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-muted);\n}\n.ps-model-detail .ps-step.curr {\n color: var(--mj-text-primary);\n}\n.ps-model-detail .ps-step.done {\n color: var(--mj-status-success, #15803d);\n}\n.ps-model-detail .ps-step .pip {\n width: 22px;\n height: 22px;\n border-radius: 50%;\n display: grid;\n place-items: center;\n font-size: 11px;\n border: 1.5px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n.ps-model-detail .ps-step.curr .pip {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 700;\n}\n.ps-model-detail .ps-step.done .pip {\n background: var(--mj-status-success, #15803d);\n border-color: var(--mj-status-success, #15803d);\n color: var(--mj-text-inverse);\n}\n.ps-model-detail .ps-stepper .ln {\n flex: 1;\n min-width: 16px;\n height: 2px;\n background: var(--mj-border-default);\n}\n\n/* ---- performance metrics ---- */\n.ps-model-detail .metric-pair {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n}\n@media (max-width: 640px) {\n .ps-model-detail .metric-pair {\n grid-template-columns: 1fr;\n }\n}\n.ps-model-detail .mtile {\n border: 1px solid var(--mj-border-default);\n border-radius: 9px;\n padding: 14px;\n background: var(--mj-bg-surface);\n}\n.ps-model-detail .mtile .v {\n font-size: 28px;\n font-weight: 720;\n color: var(--mj-text-primary);\n letter-spacing: -.02em;\n}\n.ps-model-detail .mtile.honest {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n}\n.ps-model-detail .mtile.honest .v {\n color: var(--mj-brand-primary);\n}\n\n.ps-model-detail .stat-bar {\n display: flex;\n gap: 10px;\n margin-top: 14px;\n flex-wrap: wrap;\n}\n.ps-model-detail .stat-bar .b {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n border-radius: 8px;\n flex: 1;\n min-width: 90px;\n}\n.ps-model-detail .stat-bar .b strong {\n color: var(--mj-text-primary);\n font-size: 15px;\n}\n\n/* ---- feature importance bars ---- */\n.ps-model-detail .ps-fbar {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 8px;\n}\n.ps-model-detail .ps-fbar .name {\n width: 170px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 0;\n color: var(--mj-text-secondary);\n}\n.ps-model-detail .ps-fbar .track {\n flex: 1;\n height: 8px;\n background: var(--mj-bg-surface-sunken, #f3f4f6);\n border-radius: 999px;\n overflow: hidden;\n}\n.ps-model-detail .ps-fbar .track span {\n display: block;\n height: 100%;\n background: var(--mj-brand-primary);\n border-radius: 999px;\n}\n.ps-model-detail .ps-fbar .track span.warn {\n background: var(--mj-status-warning, #d98213);\n}\n\n/* ---- leakage gate callout ---- */\n.ps-model-detail .ps-callout {\n display: flex;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n.ps-model-detail .ps-callout.gate {\n align-items: flex-start;\n}\n.ps-model-detail .ps-callout.gate i {\n font-size: 20px;\n margin-top: 2px;\n}\n.ps-model-detail .ps-callout.success {\n background: var(--mj-status-success-bg, #f0fdf4);\n border-color: color-mix(in srgb, var(--mj-status-success) 25%, transparent);\n color: var(--mj-status-success-text, #15803d);\n}\n.ps-model-detail .ps-callout.warn {\n background: var(--mj-status-warning-bg, #fffbeb);\n border-color: color-mix(in srgb, var(--mj-status-warning) 25%, transparent);\n color: var(--mj-status-warning-text, #b45309);\n}\n\n/* ---- confirmation modal ---- */\n.ps-model-detail .ps-modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.45);\n z-index: 10000;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n}\n.ps-model-detail .ps-modal {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n width: 100%;\n max-width: 480px;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n}\n.ps-model-detail .ps-modal-head {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n}\n.ps-model-detail .ps-modal-head .ico {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: grid;\n place-items: center;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 15px;\n}\n.ps-model-detail .ps-modal-head.warn .ico {\n background: var(--mj-status-warning, #d98213);\n}\n.ps-model-detail .ps-modal-head.danger .ico {\n background: var(--mj-status-error, #b91c1c);\n}\n.ps-model-detail .ps-modal-head h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n}\n.ps-model-detail .ps-modal-body {\n padding: 20px;\n font-size: 13.5px;\n line-height: 1.5;\n}\n.ps-model-detail .ps-modal-foot {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n background: var(--mj-bg-surface-sunken, #f9fafb);\n}\n.ps-model-detail .ps-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.ps-model-detail .ps-field label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.ps-model-detail .ps-input {\n width: 100%;\n padding: 8px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-family: inherit;\n font-size: 13px;\n resize: vertical;\n}\n.ps-model-detail .ps-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n"] }]
859
+ }], null, { Model: [{
860
+ type: Input
861
+ }], model: [{
862
+ type: Input
863
+ }], Provider: [{
864
+ type: Input
865
+ }], provider: [{
866
+ type: Input
867
+ }], CurrentUser: [{
868
+ type: Input
869
+ }], currentUser: [{
870
+ type: Input
871
+ }], ShowActions: [{
872
+ type: Input
873
+ }], showActions: [{
874
+ type: Input
875
+ }], StatusChanged: [{
876
+ type: Output
877
+ }], statusChanged: [{
878
+ type: Output
879
+ }], displayName: [{
880
+ type: Input
881
+ }] }); })();
882
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PSModelDetailComponent, { className: "PSModelDetailComponent", filePath: "src/lib/custom/MLModels/ps-model-detail.component.ts", lineNumber: 65 }); })();
883
+ //# sourceMappingURL=ps-model-detail.component.js.map