@memberjunction/ng-core-entity-forms 6.2.1 → 6.3.0-edge.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +5 -6
  2. package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.d.ts.map +1 -1
  3. package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.js +3 -3
  4. package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.js.map +1 -1
  5. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts +12 -0
  6. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts.map +1 -1
  7. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +293 -230
  8. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
  9. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +2 -2
  10. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +2 -2
  11. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +11 -0
  12. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  13. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +862 -812
  14. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  15. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +2 -2
  16. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +2 -2
  17. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +2 -2
  18. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +2 -2
  19. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +2 -2
  20. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +2 -2
  21. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +12 -0
  22. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  23. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +821 -763
  24. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  25. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +2 -2
  26. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +10 -0
  27. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  28. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +700 -605
  29. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  30. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +10 -0
  31. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
  32. package/dist/lib/custom/Actions/action-execution-log-form.component.js +223 -175
  33. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  34. package/dist/lib/custom/Actions/action-form.component.d.ts +10 -0
  35. package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
  36. package/dist/lib/custom/Actions/action-form.component.js +502 -453
  37. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  38. package/dist/lib/custom/Companies/company-header.panel.d.ts.map +1 -1
  39. package/dist/lib/custom/Companies/company-header.panel.js +3 -3
  40. package/dist/lib/custom/Companies/company-header.panel.js.map +1 -1
  41. package/dist/lib/custom/Conversations/conversation-header.panel.d.ts.map +1 -1
  42. package/dist/lib/custom/Conversations/conversation-header.panel.js +3 -3
  43. package/dist/lib/custom/Conversations/conversation-header.panel.js.map +1 -1
  44. package/dist/lib/custom/Employees/employee-header.panel.d.ts.map +1 -1
  45. package/dist/lib/custom/Employees/employee-header.panel.js +3 -3
  46. package/dist/lib/custom/Employees/employee-header.panel.js.map +1 -1
  47. package/dist/lib/custom/Entities/entity-form.component.d.ts +15 -0
  48. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  49. package/dist/lib/custom/Entities/entity-form.component.js +836 -801
  50. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  51. package/dist/lib/custom/EntityActions/entityaction.form.component.js +2 -2
  52. package/dist/lib/custom/Files/file-form.component.js +2 -2
  53. package/dist/lib/custom/Lists/list-form.component.d.ts +5 -0
  54. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  55. package/dist/lib/custom/Lists/list-form.component.js +355 -338
  56. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  57. package/dist/lib/custom/MLModels/ml-model-form.component.js +3 -3
  58. package/dist/lib/custom/MLModels/ml-model-form.component.js.map +1 -1
  59. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +17 -35
  60. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
  61. package/dist/lib/custom/MLModels/ml-model-view-models.js +55 -54
  62. package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
  63. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +7 -99
  64. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
  65. package/dist/lib/custom/MLModels/ps-model-detail.component.js +124 -303
  66. package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
  67. package/dist/lib/custom/Queries/query-form.component.d.ts +9 -0
  68. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  69. package/dist/lib/custom/Queries/query-form.component.js +493 -444
  70. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  71. package/dist/lib/custom/Queries/query-run-dialog.component.js +2 -2
  72. package/dist/lib/custom/Templates/template-param-dialog.component.js +2 -2
  73. package/dist/lib/custom/Templates/templates-form.component.d.ts +9 -0
  74. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  75. package/dist/lib/custom/Templates/templates-form.component.js +118 -74
  76. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  77. package/dist/lib/custom/Tests/test-form.component.d.ts +5 -0
  78. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  79. package/dist/lib/custom/Tests/test-form.component.js +471 -451
  80. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  81. package/dist/lib/custom/Tests/test-run-form.component.d.ts +5 -0
  82. package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
  83. package/dist/lib/custom/Tests/test-run-form.component.js +312 -289
  84. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  85. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +5 -0
  86. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  87. package/dist/lib/custom/Tests/test-suite-form.component.js +697 -677
  88. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  89. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +5 -0
  90. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
  91. package/dist/lib/custom/Tests/test-suite-run-form.component.js +453 -433
  92. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  93. package/dist/lib/custom/Users/user-header.panel.d.ts.map +1 -1
  94. package/dist/lib/custom/Users/user-header.panel.js +3 -3
  95. package/dist/lib/custom/Users/user-header.panel.js.map +1 -1
  96. package/dist/lib/custom/ai-agent-run/agent-run-cost-split.d.ts +2 -2
  97. package/dist/lib/custom/ai-agent-run/agent-run-cost-split.d.ts.map +1 -1
  98. package/dist/lib/custom/ai-agent-run/agent-run-cost-split.js +30 -13
  99. package/dist/lib/custom/ai-agent-run/agent-run-cost-split.js.map +1 -1
  100. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +23 -0
  101. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  102. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +276 -216
  103. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  104. package/dist/lib/custom/custom-forms.module.d.ts +1 -1
  105. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  106. package/dist/lib/custom/custom-forms.module.js +7 -1
  107. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  108. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  109. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +32 -14
  110. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  111. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.d.ts.map +1 -1
  112. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +119 -95
  113. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
  114. package/dist/lib/generated/Entities/MJComment/mjcomment.form.component.d.ts +10 -0
  115. package/dist/lib/generated/Entities/MJComment/mjcomment.form.component.d.ts.map +1 -0
  116. package/dist/lib/generated/Entities/MJComment/mjcomment.form.component.js +124 -0
  117. package/dist/lib/generated/Entities/MJComment/mjcomment.form.component.js.map +1 -0
  118. package/dist/lib/generated/Entities/MJCommentType/mjcommenttype.form.component.d.ts +10 -0
  119. package/dist/lib/generated/Entities/MJCommentType/mjcommenttype.form.component.d.ts.map +1 -0
  120. package/dist/lib/generated/Entities/MJCommentType/mjcommenttype.form.component.js +99 -0
  121. package/dist/lib/generated/Entities/MJCommentType/mjcommenttype.form.component.js.map +1 -0
  122. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +2 -2
  123. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
  124. package/dist/lib/generated/Entities/MJConversationType/mjconversationtype.form.component.d.ts +10 -0
  125. package/dist/lib/generated/Entities/MJConversationType/mjconversationtype.form.component.d.ts.map +1 -0
  126. package/dist/lib/generated/Entities/MJConversationType/mjconversationtype.form.component.js +95 -0
  127. package/dist/lib/generated/Entities/MJConversationType/mjconversationtype.form.component.js.map +1 -0
  128. package/dist/lib/generated/Entities/MJDocumentSequenceCounter/mjdocumentsequencecounter.form.component.d.ts +10 -0
  129. package/dist/lib/generated/Entities/MJDocumentSequenceCounter/mjdocumentsequencecounter.form.component.d.ts.map +1 -0
  130. package/dist/lib/generated/Entities/MJDocumentSequenceCounter/mjdocumentsequencecounter.form.component.js +60 -0
  131. package/dist/lib/generated/Entities/MJDocumentSequenceCounter/mjdocumentsequencecounter.form.component.js.map +1 -0
  132. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  133. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +124 -106
  134. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  135. package/dist/lib/generated/Entities/MJEntityFieldValue/mjentityfieldvalue.form.component.d.ts.map +1 -1
  136. package/dist/lib/generated/Entities/MJEntityFieldValue/mjentityfieldvalue.form.component.js +12 -4
  137. package/dist/lib/generated/Entities/MJEntityFieldValue/mjentityfieldvalue.form.component.js.map +1 -1
  138. package/dist/lib/generated/Entities/MJEntityOrganicKey/mjentityorganickey.form.component.d.ts.map +1 -1
  139. package/dist/lib/generated/Entities/MJEntityOrganicKey/mjentityorganickey.form.component.js +19 -11
  140. package/dist/lib/generated/Entities/MJEntityOrganicKey/mjentityorganickey.form.component.js.map +1 -1
  141. package/dist/lib/generated/Entities/MJEntityUniqueKey/mjentityuniquekey.form.component.d.ts +10 -0
  142. package/dist/lib/generated/Entities/MJEntityUniqueKey/mjentityuniquekey.form.component.d.ts.map +1 -0
  143. package/dist/lib/generated/Entities/MJEntityUniqueKey/mjentityuniquekey.form.component.js +62 -0
  144. package/dist/lib/generated/Entities/MJEntityUniqueKey/mjentityuniquekey.form.component.js.map +1 -0
  145. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.d.ts.map +1 -1
  146. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js +26 -12
  147. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js.map +1 -1
  148. package/dist/lib/generated/Entities/MJFieldSuggestion/mjfieldsuggestion.form.component.d.ts +10 -0
  149. package/dist/lib/generated/Entities/MJFieldSuggestion/mjfieldsuggestion.form.component.d.ts.map +1 -0
  150. package/dist/lib/generated/Entities/MJFieldSuggestion/mjfieldsuggestion.form.component.js +140 -0
  151. package/dist/lib/generated/Entities/MJFieldSuggestion/mjfieldsuggestion.form.component.js.map +1 -0
  152. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.d.ts.map +1 -1
  153. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +69 -15
  154. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
  155. package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.d.ts.map +1 -1
  156. package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js +31 -13
  157. package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js.map +1 -1
  158. package/dist/lib/generated/Entities/MJMLEvaluationProtocol/mjmlevaluationprotocol.form.component.d.ts +10 -0
  159. package/dist/lib/generated/Entities/MJMLEvaluationProtocol/mjmlevaluationprotocol.form.component.d.ts.map +1 -0
  160. package/dist/lib/generated/Entities/MJMLEvaluationProtocol/mjmlevaluationprotocol.form.component.js +205 -0
  161. package/dist/lib/generated/Entities/MJMLEvaluationProtocol/mjmlevaluationprotocol.form.component.js.map +1 -0
  162. package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.d.ts.map +1 -1
  163. package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.js +24 -6
  164. package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.js.map +1 -1
  165. package/dist/lib/generated/Entities/MJMLPredictionUnit/mjmlpredictionunit.form.component.d.ts +10 -0
  166. package/dist/lib/generated/Entities/MJMLPredictionUnit/mjmlpredictionunit.form.component.d.ts.map +1 -0
  167. package/dist/lib/generated/Entities/MJMLPredictionUnit/mjmlpredictionunit.form.component.js +173 -0
  168. package/dist/lib/generated/Entities/MJMLPredictionUnit/mjmlpredictionunit.form.component.js.map +1 -0
  169. package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.d.ts.map +1 -1
  170. package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.js +46 -24
  171. package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.js.map +1 -1
  172. package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.js +22 -14
  173. package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.js.map +1 -1
  174. package/dist/lib/generated/Entities/MJMLTrainingSnapshot/mjmltrainingsnapshot.form.component.d.ts +10 -0
  175. package/dist/lib/generated/Entities/MJMLTrainingSnapshot/mjmltrainingsnapshot.form.component.d.ts.map +1 -0
  176. package/dist/lib/generated/Entities/MJMLTrainingSnapshot/mjmltrainingsnapshot.form.component.js +175 -0
  177. package/dist/lib/generated/Entities/MJMLTrainingSnapshot/mjmltrainingsnapshot.form.component.js.map +1 -0
  178. package/dist/lib/generated/Entities/MJQueryField/mjqueryfield.form.component.js +8 -6
  179. package/dist/lib/generated/Entities/MJQueryField/mjqueryfield.form.component.js.map +1 -1
  180. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
  181. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +44 -36
  182. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
  183. package/dist/lib/generated/Entities/MJTask/mjtask.form.component.d.ts.map +1 -1
  184. package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js +54 -32
  185. package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js.map +1 -1
  186. package/dist/lib/generated/generated-forms.module.d.ts +452 -443
  187. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  188. package/dist/lib/generated/generated-forms.module.js +27 -0
  189. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  190. package/dist/lib/panels/feature-values/feature-values.panel.js +1 -1
  191. package/dist/lib/panels/feature-values/feature-values.panel.js.map +1 -1
  192. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +1 -1
  193. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
  194. package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
  195. package/dist/lib/shared/components/template-editor.component.js +2 -2
  196. package/dist/lib/shared/phone-hero.d.ts +17 -0
  197. package/dist/lib/shared/phone-hero.d.ts.map +1 -0
  198. package/dist/lib/shared/phone-hero.js +30 -0
  199. package/dist/lib/shared/phone-hero.js.map +1 -0
  200. package/dist/lib/shared/phone-sections-state.d.ts +28 -0
  201. package/dist/lib/shared/phone-sections-state.d.ts.map +1 -0
  202. package/dist/lib/shared/phone-sections-state.js +38 -0
  203. package/dist/lib/shared/phone-sections-state.js.map +1 -0
  204. package/package.json +50 -50
@@ -68,7 +68,7 @@ function MLModelFormComponentExtended_Conditional_0_Template(rf, ctx) { if (rf &
68
68
  i0.ɵɵadvance();
69
69
  i0.ɵɵproperty("Form", ctx_r1)("FormContext", ctx_r1.formContext)("DefaultExpanded", true);
70
70
  i0.ɵɵadvance(2);
71
- i0.ɵɵproperty("model", ctx_r1.record)("provider", ctx_r1.ProviderToUse)("currentUser", ctx_r1.ProviderToUse.CurrentUser ?? null);
71
+ i0.ɵɵproperty("Model", ctx_r1.record)("Provider", ctx_r1.ProviderToUse)("CurrentUser", ctx_r1.ProviderToUse.CurrentUser ?? null);
72
72
  i0.ɵɵadvance();
73
73
  i0.ɵɵproperty("Form", ctx_r1)("FormContext", ctx_r1.formContext);
74
74
  i0.ɵɵadvance();
@@ -148,7 +148,7 @@ let MLModelFormComponentExtended = class MLModelFormComponentExtended extends MJ
148
148
  ]);
149
149
  }
150
150
  static { this.ɵfac = /*@__PURE__*/ (() => { let ɵMLModelFormComponentExtended_BaseFactory; return function MLModelFormComponentExtended_Factory(__ngFactoryType__) { return (ɵMLModelFormComponentExtended_BaseFactory || (ɵMLModelFormComponentExtended_BaseFactory = i0.ɵɵgetInheritedFactory(MLModelFormComponentExtended)))(__ngFactoryType__ || MLModelFormComponentExtended); }; })(); }
151
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MLModelFormComponentExtended, selectors: [["mj-ml-model-form-extended"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[3, "Record", "FormComponent"], [3, "Navigate", "DeleteRequested", "FavoriteToggled", "HistoryRequested", "ListManagementRequested", "Record", "FormComponent"], ["Slot", "before-fields", 3, "Entity", "Record", "FormComponent", "FormContext"], ["SectionKey", "modelOverview", "SectionName", "Overview & Lifecycle", "Icon", "fa-solid fa-gauge-high", "Variant", "related-entity", 3, "Form", "FormContext", "DefaultExpanded"], [1, "ml-model-form-content"], [3, "model", "provider", "currentUser"], ["SectionKey", "modelIdentityStatus", "SectionName", "Model Identity & Status", "Icon", "fa fa-tag", 3, "Form", "FormContext"], ["FieldName", "PipelineID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Version", "Type", "number", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "AlgorithmID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ArtifactFileID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Lineage", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Status", "Type", "select", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "schemaConfiguration", "SectionName", "Schema & Configuration", "Icon", "fa fa-sliders-h", 3, "Form", "FormContext"], ["FieldName", "FittedPreprocessing", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "FeatureSchema", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TargetVariable", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ProblemType", "Type", "select", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "trainingPerformance", "SectionName", "Training & Performance", "Icon", "fa fa-chart-line", 3, "Form", "FormContext"], ["FieldName", "Metrics", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "HoldoutMetrics", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "FeatureImportance", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TrainedAt", "Type", "datepicker", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TrainingDurationSec", "Type", "number", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TrainingRowCount", "Type", "number", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "systemMetadata", "SectionName", "System Metadata", "Icon", "fa fa-cog", 3, "Form", "FormContext"], ["FieldName", "__mj_CreatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "__mj_UpdatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["Slot", "after-fields", 3, "Entity", "Record", "FormComponent", "FormContext"], ["SectionKey", "mJMLTrainingRuns", "SectionName", "ML Training Runs", "Icon", "fa-solid fa-flask", "Variant", "related-entity", 3, "Form", "FormContext", "BadgeCount", "DefaultExpanded"], ["SectionKey", "mJMLModelScoringBindings", "SectionName", "ML Model Scoring Bindings", "Icon", "fa-solid fa-satellite-dish", "Variant", "related-entity", 3, "Form", "FormContext", "BadgeCount", "DefaultExpanded"], ["Slot", "after-related", 3, "Entity", "Record", "FormComponent", "FormContext"], [3, "Navigate", "AfterDataLoad", "Params", "NewRecordValues", "AllowLoad", "ShowToolbar"]], template: function MLModelFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
151
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MLModelFormComponentExtended, selectors: [["mj-ml-model-form-extended"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[3, "Record", "FormComponent"], [3, "Navigate", "DeleteRequested", "FavoriteToggled", "HistoryRequested", "ListManagementRequested", "Record", "FormComponent"], ["Slot", "before-fields", 3, "Entity", "Record", "FormComponent", "FormContext"], ["SectionKey", "modelOverview", "SectionName", "Overview & Lifecycle", "Icon", "fa-solid fa-gauge-high", "Variant", "related-entity", 3, "Form", "FormContext", "DefaultExpanded"], [1, "ml-model-form-content"], [3, "Model", "Provider", "CurrentUser"], ["SectionKey", "modelIdentityStatus", "SectionName", "Model Identity & Status", "Icon", "fa fa-tag", 3, "Form", "FormContext"], ["FieldName", "PipelineID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Version", "Type", "number", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "AlgorithmID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ArtifactFileID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Lineage", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Status", "Type", "select", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "schemaConfiguration", "SectionName", "Schema & Configuration", "Icon", "fa fa-sliders-h", 3, "Form", "FormContext"], ["FieldName", "FittedPreprocessing", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "FeatureSchema", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TargetVariable", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ProblemType", "Type", "select", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "trainingPerformance", "SectionName", "Training & Performance", "Icon", "fa fa-chart-line", 3, "Form", "FormContext"], ["FieldName", "Metrics", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "HoldoutMetrics", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "FeatureImportance", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TrainedAt", "Type", "datepicker", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TrainingDurationSec", "Type", "number", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TrainingRowCount", "Type", "number", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "systemMetadata", "SectionName", "System Metadata", "Icon", "fa fa-cog", 3, "Form", "FormContext"], ["FieldName", "__mj_CreatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "__mj_UpdatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["Slot", "after-fields", 3, "Entity", "Record", "FormComponent", "FormContext"], ["SectionKey", "mJMLTrainingRuns", "SectionName", "ML Training Runs", "Icon", "fa-solid fa-flask", "Variant", "related-entity", 3, "Form", "FormContext", "BadgeCount", "DefaultExpanded"], ["SectionKey", "mJMLModelScoringBindings", "SectionName", "ML Model Scoring Bindings", "Icon", "fa-solid fa-satellite-dish", "Variant", "related-entity", 3, "Form", "FormContext", "BadgeCount", "DefaultExpanded"], ["Slot", "after-related", 3, "Entity", "Record", "FormComponent", "FormContext"], [3, "Navigate", "AfterDataLoad", "Params", "NewRecordValues", "AllowLoad", "ShowToolbar"]], template: function MLModelFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
152
152
  i0.ɵɵconditionalCreate(0, MLModelFormComponentExtended_Conditional_0_Template, 33, 113, "mj-record-form-container", 0);
153
153
  } if (rf & 2) {
154
154
  i0.ɵɵconditional(ctx.record ? 0 : -1);
@@ -160,7 +160,7 @@ MLModelFormComponentExtended = __decorate([
160
160
  export { MLModelFormComponentExtended };
161
161
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MLModelFormComponentExtended, [{
162
162
  type: Component,
163
- args: [{ standalone: false, selector: 'mj-ml-model-form-extended', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n OVERVIEW PANEL (Lead Panel)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"modelOverview\"\n SectionName=\"Overview & Lifecycle\"\n Icon=\"fa-solid fa-gauge-high\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n <div class=\"ml-model-form-content\">\n <ps-model-detail\n [model]=\"record\"\n [provider]=\"ProviderToUse\"\n [currentUser]=\"ProviderToUse.CurrentUser ?? null\">\n </ps-model-detail>\n </div>\n </mj-collapsible-panel>\n\n <!-- ========================================\n FIELD PANELS (Fold into Details)\n ======================================== -->\n <!-- Model Identity & Status Section -->\n <mj-collapsible-panel\n SectionKey=\"modelIdentityStatus\"\n SectionName=\"Model Identity & Status\"\n Icon=\"fa fa-tag\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"PipelineID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Version\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"AlgorithmID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ArtifactFileID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Lineage\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Status\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Schema & Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"schemaConfiguration\"\n SectionName=\"Schema & Configuration\"\n Icon=\"fa fa-sliders-h\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FittedPreprocessing\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureSchema\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TargetVariable\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ProblemType\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Training & Performance Section -->\n <mj-collapsible-panel\n SectionKey=\"trainingPerformance\"\n SectionName=\"Training & Performance\"\n Icon=\"fa fa-chart-line\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Metrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"HoldoutMetrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureImportance\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainedAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingDurationSec\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingRowCount\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-cog\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n RELATED ENTITY PANELS\n ======================================== -->\n\n <!-- ML Training Runs Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLTrainingRuns\"\n SectionName=\"ML Training Runs\"\n Icon=\"fa-solid fa-flask\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLTrainingRuns')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Training Runs','ResultingModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Training Runs','ResultingModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLTrainingRuns')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLTrainingRuns', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ML Model Scoring Bindings Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLModelScoringBindings\"\n SectionName=\"ML Model Scoring Bindings\"\n Icon=\"fa-solid fa-satellite-dish\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLModelScoringBindings')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Model Scoring Bindings','MLModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Model Scoring Bindings','MLModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLModelScoringBindings')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLModelScoringBindings', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n</mj-record-form-container>\n}\n", styles: [".ml-model-form-content {\n padding: 20px 24px;\n max-width: 1200px;\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n}\n"] }]
163
+ args: [{ standalone: false, selector: 'mj-ml-model-form-extended', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n OVERVIEW PANEL (Lead Panel)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"modelOverview\"\n SectionName=\"Overview & Lifecycle\"\n Icon=\"fa-solid fa-gauge-high\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n <div class=\"ml-model-form-content\">\n <ps-model-detail\n [Model]=\"record\"\n [Provider]=\"ProviderToUse\"\n [CurrentUser]=\"ProviderToUse.CurrentUser ?? null\">\n </ps-model-detail>\n </div>\n </mj-collapsible-panel>\n\n <!-- ========================================\n FIELD PANELS (Fold into Details)\n ======================================== -->\n <!-- Model Identity & Status Section -->\n <mj-collapsible-panel\n SectionKey=\"modelIdentityStatus\"\n SectionName=\"Model Identity & Status\"\n Icon=\"fa fa-tag\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"PipelineID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Version\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"AlgorithmID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ArtifactFileID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Lineage\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Status\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Schema & Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"schemaConfiguration\"\n SectionName=\"Schema & Configuration\"\n Icon=\"fa fa-sliders-h\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FittedPreprocessing\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureSchema\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TargetVariable\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ProblemType\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Training & Performance Section -->\n <mj-collapsible-panel\n SectionKey=\"trainingPerformance\"\n SectionName=\"Training & Performance\"\n Icon=\"fa fa-chart-line\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Metrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"HoldoutMetrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureImportance\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainedAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingDurationSec\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingRowCount\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-cog\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n RELATED ENTITY PANELS\n ======================================== -->\n\n <!-- ML Training Runs Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLTrainingRuns\"\n SectionName=\"ML Training Runs\"\n Icon=\"fa-solid fa-flask\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLTrainingRuns')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Training Runs','ResultingModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Training Runs','ResultingModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLTrainingRuns')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLTrainingRuns', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ML Model Scoring Bindings Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLModelScoringBindings\"\n SectionName=\"ML Model Scoring Bindings\"\n Icon=\"fa-solid fa-satellite-dish\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLModelScoringBindings')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Model Scoring Bindings','MLModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Model Scoring Bindings','MLModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLModelScoringBindings')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLModelScoringBindings', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n</mj-record-form-container>\n}\n", styles: [".ml-model-form-content {\n padding: 20px 24px;\n max-width: 1200px;\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n}\n"] }]
164
164
  }], null, null); })();
165
165
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MLModelFormComponentExtended, { className: "MLModelFormComponentExtended", filePath: "src/lib/custom/MLModels/ml-model-form.component.ts", lineNumber: 21 }); })();
166
166
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ml-model-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/MLModels/ml-model-form.component.ts","../../../../src/lib/custom/MLModels/ml-model-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit } from '@angular/core';\nimport { RegisterClass, RegisterClassEx } from '@memberjunction/global';\nimport { BaseFormComponent, BaseFormPolicy, FormChromeContext, FormChromeSpec } from '@memberjunction/ng-base-forms';\nimport { MJMLModelFormComponent } from '../../generated/Entities/MJMLModel/mjmlmodel.form.component';\n\n/**\n * Custom form override for `MJ: ML Models` (priority 100).\n * Presents the ML Model in a left-nav experience with:\n * - Lead panel: \"Overview & Lifecycle\" (<ps-model-detail>)\n * - Details card: Model Identity & Status, Schema & Configuration, Training & Performance\n * - Related grids: ML Training Runs, ML Model Scoring Bindings\n * - More folder: System Metadata\n */\n@RegisterClass(BaseFormComponent, 'MJ: ML Models', 100)\n@Component({\n standalone: false,\n selector: 'mj-ml-model-form-extended',\n templateUrl: './ml-model-form.component.html',\n styleUrls: ['./ml-model-form.component.css'],\n})\nexport class MLModelFormComponentExtended extends MJMLModelFormComponent implements OnInit {\n override async ngOnInit() {\n await super.ngOnInit();\n this.initSections([\n { sectionKey: 'modelOverview', sectionName: 'Overview & Lifecycle', isExpanded: true },\n { sectionKey: 'modelIdentityStatus', sectionName: 'Model Identity & Status', isExpanded: true },\n { sectionKey: 'schemaConfiguration', sectionName: 'Schema & Configuration', isExpanded: true },\n { sectionKey: 'trainingPerformance', sectionName: 'Training & Performance', isExpanded: true },\n { sectionKey: 'systemMetadata', sectionName: 'System Metadata', isExpanded: false },\n { sectionKey: 'mJMLTrainingRuns', sectionName: 'ML Training Runs', isExpanded: false },\n { sectionKey: 'mJMLModelScoringBindings', sectionName: 'ML Model Scoring Bindings', isExpanded: false }\n ]);\n }\n}\n\n/**\n * Policy ensuring that the Overview & Lifecycle panel sits as the lead group\n * before the Details group on the left-nav rail.\n */\n@RegisterClassEx(BaseFormPolicy, { key: 'MJ: ML Models', metadata: { entity: 'MJ: ML Models' } })\nexport class MLModelFormPolicy extends BaseFormPolicy {\n public override DecorateChrome(spec: FormChromeSpec, _ctx: FormChromeContext): FormChromeSpec {\n const overview = spec.Groups.find(g => g.Key === 'modelOverview');\n if (overview) {\n overview.IsLead = true;\n const remaining = spec.Groups.filter(g => g.Key !== 'modelOverview');\n return {\n ...spec,\n Groups: [overview, ...remaining],\n };\n }\n return spec;\n }\n}\n\n/** Tree-shaking guard so the override and policy register with the ClassFactory. */\nexport function LoadMLModelFormComponentExtended(): void {\n void MLModelFormComponentExtended;\n void MLModelFormPolicy;\n}\n","@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n OVERVIEW PANEL (Lead Panel)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"modelOverview\"\n SectionName=\"Overview & Lifecycle\"\n Icon=\"fa-solid fa-gauge-high\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n <div class=\"ml-model-form-content\">\n <ps-model-detail\n [model]=\"record\"\n [provider]=\"ProviderToUse\"\n [currentUser]=\"ProviderToUse.CurrentUser ?? null\">\n </ps-model-detail>\n </div>\n </mj-collapsible-panel>\n\n <!-- ========================================\n FIELD PANELS (Fold into Details)\n ======================================== -->\n <!-- Model Identity & Status Section -->\n <mj-collapsible-panel\n SectionKey=\"modelIdentityStatus\"\n SectionName=\"Model Identity & Status\"\n Icon=\"fa fa-tag\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"PipelineID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Version\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"AlgorithmID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ArtifactFileID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Lineage\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Status\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Schema & Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"schemaConfiguration\"\n SectionName=\"Schema & Configuration\"\n Icon=\"fa fa-sliders-h\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FittedPreprocessing\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureSchema\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TargetVariable\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ProblemType\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Training & Performance Section -->\n <mj-collapsible-panel\n SectionKey=\"trainingPerformance\"\n SectionName=\"Training & Performance\"\n Icon=\"fa fa-chart-line\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Metrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"HoldoutMetrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureImportance\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainedAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingDurationSec\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingRowCount\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-cog\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n RELATED ENTITY PANELS\n ======================================== -->\n\n <!-- ML Training Runs Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLTrainingRuns\"\n SectionName=\"ML Training Runs\"\n Icon=\"fa-solid fa-flask\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLTrainingRuns')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Training Runs','ResultingModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Training Runs','ResultingModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLTrainingRuns')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLTrainingRuns', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ML Model Scoring Bindings Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLModelScoringBindings\"\n SectionName=\"ML Model Scoring Bindings\"\n Icon=\"fa-solid fa-satellite-dish\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLModelScoringBindings')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Model Scoring Bindings','MLModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Model Scoring Bindings','MLModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLModelScoringBindings')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLModelScoringBindings', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n</mj-record-form-container>\n}\n"]}
1
+ {"version":3,"file":"ml-model-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/MLModels/ml-model-form.component.ts","../../../../src/lib/custom/MLModels/ml-model-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit } from '@angular/core';\nimport { RegisterClass, RegisterClassEx } from '@memberjunction/global';\nimport { BaseFormComponent, BaseFormPolicy, FormChromeContext, FormChromeSpec } from '@memberjunction/ng-base-forms';\nimport { MJMLModelFormComponent } from '../../generated/Entities/MJMLModel/mjmlmodel.form.component';\n\n/**\n * Custom form override for `MJ: ML Models` (priority 100).\n * Presents the ML Model in a left-nav experience with:\n * - Lead panel: \"Overview & Lifecycle\" (<ps-model-detail>)\n * - Details card: Model Identity & Status, Schema & Configuration, Training & Performance\n * - Related grids: ML Training Runs, ML Model Scoring Bindings\n * - More folder: System Metadata\n */\n@RegisterClass(BaseFormComponent, 'MJ: ML Models', 100)\n@Component({\n standalone: false,\n selector: 'mj-ml-model-form-extended',\n templateUrl: './ml-model-form.component.html',\n styleUrls: ['./ml-model-form.component.css'],\n})\nexport class MLModelFormComponentExtended extends MJMLModelFormComponent implements OnInit {\n override async ngOnInit() {\n await super.ngOnInit();\n this.initSections([\n { sectionKey: 'modelOverview', sectionName: 'Overview & Lifecycle', isExpanded: true },\n { sectionKey: 'modelIdentityStatus', sectionName: 'Model Identity & Status', isExpanded: true },\n { sectionKey: 'schemaConfiguration', sectionName: 'Schema & Configuration', isExpanded: true },\n { sectionKey: 'trainingPerformance', sectionName: 'Training & Performance', isExpanded: true },\n { sectionKey: 'systemMetadata', sectionName: 'System Metadata', isExpanded: false },\n { sectionKey: 'mJMLTrainingRuns', sectionName: 'ML Training Runs', isExpanded: false },\n { sectionKey: 'mJMLModelScoringBindings', sectionName: 'ML Model Scoring Bindings', isExpanded: false }\n ]);\n }\n}\n\n/**\n * Policy ensuring that the Overview & Lifecycle panel sits as the lead group\n * before the Details group on the left-nav rail.\n */\n@RegisterClassEx(BaseFormPolicy, { key: 'MJ: ML Models', metadata: { entity: 'MJ: ML Models' } })\nexport class MLModelFormPolicy extends BaseFormPolicy {\n public override DecorateChrome(spec: FormChromeSpec, _ctx: FormChromeContext): FormChromeSpec {\n const overview = spec.Groups.find(g => g.Key === 'modelOverview');\n if (overview) {\n overview.IsLead = true;\n const remaining = spec.Groups.filter(g => g.Key !== 'modelOverview');\n return {\n ...spec,\n Groups: [overview, ...remaining],\n };\n }\n return spec;\n }\n}\n\n/** Tree-shaking guard so the override and policy register with the ClassFactory. */\nexport function LoadMLModelFormComponentExtended(): void {\n void MLModelFormComponentExtended;\n void MLModelFormPolicy;\n}\n","@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n OVERVIEW PANEL (Lead Panel)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"modelOverview\"\n SectionName=\"Overview & Lifecycle\"\n Icon=\"fa-solid fa-gauge-high\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n <div class=\"ml-model-form-content\">\n <ps-model-detail\n [Model]=\"record\"\n [Provider]=\"ProviderToUse\"\n [CurrentUser]=\"ProviderToUse.CurrentUser ?? null\">\n </ps-model-detail>\n </div>\n </mj-collapsible-panel>\n\n <!-- ========================================\n FIELD PANELS (Fold into Details)\n ======================================== -->\n <!-- Model Identity & Status Section -->\n <mj-collapsible-panel\n SectionKey=\"modelIdentityStatus\"\n SectionName=\"Model Identity & Status\"\n Icon=\"fa fa-tag\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"PipelineID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Version\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"AlgorithmID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ArtifactFileID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Lineage\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Status\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Schema & Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"schemaConfiguration\"\n SectionName=\"Schema & Configuration\"\n Icon=\"fa fa-sliders-h\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FittedPreprocessing\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureSchema\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TargetVariable\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ProblemType\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Training & Performance Section -->\n <mj-collapsible-panel\n SectionKey=\"trainingPerformance\"\n SectionName=\"Training & Performance\"\n Icon=\"fa fa-chart-line\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Metrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"HoldoutMetrics\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"FeatureImportance\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainedAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingDurationSec\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TrainingRowCount\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-cog\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n RELATED ENTITY PANELS\n ======================================== -->\n\n <!-- ML Training Runs Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLTrainingRuns\"\n SectionName=\"ML Training Runs\"\n Icon=\"fa-solid fa-flask\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLTrainingRuns')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Training Runs','ResultingModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Training Runs','ResultingModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLTrainingRuns')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLTrainingRuns', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ML Model Scoring Bindings Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLModelScoringBindings\"\n SectionName=\"ML Model Scoring Bindings\"\n Icon=\"fa-solid fa-satellite-dish\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLModelScoringBindings')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Model Scoring Bindings','MLModelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Model Scoring Bindings','MLModelID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLModelScoringBindings')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLModelScoringBindings', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n</mj-record-form-container>\n}\n"]}
@@ -10,7 +10,7 @@ export interface PSMetricDisplay {
10
10
  value: string;
11
11
  raw: number;
12
12
  }
13
- export type PSMetricKey = 'AUC' | 'Accuracy' | 'Precision' | 'Recall' | 'F1' | 'LogLoss' | 'R2' | 'RMSE' | 'MAE';
13
+ export type PSMetricKey = 'AUC' | 'Accuracy' | 'Precision' | 'Recall' | 'F1' | 'LogLoss' | 'MulticlassLogLoss' | 'Brier' | 'R2' | 'RMSE' | 'MAE' | 'PoissonDeviance' | 'TweedieDeviance' | 'MASE';
14
14
  export type PSMetricMap = Partial<Record<PSMetricKey, number>>;
15
15
  export declare const PS_KNOWN_METRIC_KEYS: readonly PSMetricKey[];
16
16
  export declare const METRIC_LABELS: Record<PSMetricKey, string>;
@@ -22,61 +22,43 @@ export declare const PS_FEATURE_DOMINANCE_THRESHOLD = 0.6;
22
22
  * keeps an `Is` prefix and sentence-cases snake_case names.
23
23
  */
24
24
  export declare function HumanizeFeatureName(name: string): string;
25
- /** @deprecated Use {@link HumanizeFeatureName}. */
26
- export declare function humanizeFeatureName(name: string): string;
27
25
  export declare function ParseMetrics(json: string | null | undefined): PSMetricMap;
28
- /** @deprecated Use {@link ParseMetrics}. */
29
- export declare function parseMetrics(json: string | null | undefined): PSMetricMap;
30
26
  export declare function CanonicalMetricKey(rawKey: string): PSMetricKey | null;
31
- /** @deprecated Use {@link CanonicalMetricKey}. */
32
- export declare function canonicalMetricKey(rawKey: string): PSMetricKey | null;
33
27
  export declare function FormatMetricValue(key: PSMetricKey | string, val: number): string;
34
- /** @deprecated Use {@link FormatMetricValue}. */
35
- export declare function formatMetricValue(key: PSMetricKey | string, val: number): string;
36
- export declare function PrimaryModelScore(model: {
37
- Metrics?: string | null;
38
- HoldoutMetrics?: string | null;
39
- ProblemType?: string | null;
40
- }): {
28
+ /** A model's score as the form shows it: the metric, its label and the value. */
29
+ type PSModelScore = {
41
30
  key: PSMetricKey;
42
31
  label: string;
43
32
  value: number;
44
- } | null;
45
- /** @deprecated Use {@link PrimaryModelScore}. */
46
- export declare function primaryModelScore(model: {
33
+ };
34
+ /**
35
+ * The primary metric score of a model: holdout preferred, else training. R² first for a regression, AUC for a
36
+ * classification; failing those, the first metric the holdout stores, which a trained model's holdout lists first as the
37
+ * protocol's primary proper score (all a kept simple baseline or a forecast stores).
38
+ */
39
+ export declare function PrimaryModelScore(model: {
47
40
  Metrics?: string | null;
48
41
  HoldoutMetrics?: string | null;
49
42
  ProblemType?: string | null;
50
- }): {
51
- key: PSMetricKey;
52
- label: string;
53
- value: number;
54
- } | null;
43
+ }): PSModelScore | null;
44
+ /**
45
+ * Whether a model's train-side `Metrics` hold an inner cross-validation estimate rather than an in-sample score: true
46
+ * for a model trained under an Evaluation Protocol, whose lineage names the protocol (`evaluationProtocolId`).
47
+ */
48
+ export declare function TrainScoreIsInnerCv(lineageJson: string | null | undefined): boolean;
55
49
  export declare function MetricsToDisplay(metrics: PSMetricMap, options?: {
56
50
  excludeAuc?: boolean;
57
51
  }): PSMetricDisplay[];
58
- /** @deprecated Use {@link MetricsToDisplay}. */
59
- export declare function metricsToDisplay(metrics: PSMetricMap, options?: {
60
- excludeAuc?: boolean;
61
- }): PSMetricDisplay[];
62
52
  export declare function ParseFeatureImportance(raw: string | null | undefined, topN?: number): PSFeatureBar[];
63
- /** @deprecated Use {@link ParseFeatureImportance}. */
64
- export declare function parseFeatureImportance(raw: string | null | undefined, topN?: number): PSFeatureBar[];
65
53
  export declare function MaxFeatureImportance(raw: string | null | undefined): number | null;
66
- /** @deprecated Use {@link MaxFeatureImportance}. */
67
- export declare function maxFeatureImportance(raw: string | null | undefined): number | null;
68
54
  export declare function OverfitGap(model: {
69
55
  Metrics?: string | null;
70
56
  HoldoutMetrics?: string | null;
71
57
  }): number | null;
72
- /** @deprecated Use {@link OverfitGap}. */
73
- export declare function overfitGap(model: {
74
- Metrics?: string | null;
75
- HoldoutMetrics?: string | null;
76
- }): number | null;
77
58
  /** The importance a model view may show. */
78
59
  export declare class ModelImportanceView {
79
60
  /** The importance bars a person may see: coefficient models only (split / impurity counts are not comparable across features and read as importance they are not, so they are hidden). */
80
61
  static DisplayedFeatureImportance(lineageJSON: string | null | undefined, raw: string | null | undefined, topN?: number): PSFeatureBar[];
81
62
  }
63
+ export {};
82
64
  //# sourceMappingURL=ml-model-view-models.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ml-model-view-models.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/MLModels/ml-model-view-models.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ml-model-view-models.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/MLModels/ml-model-view-models.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,WAAW,GACnB,KAAK,GACL,UAAU,GACV,WAAW,GACX,QAAQ,GACR,IAAI,GACJ,SAAS,GACT,mBAAmB,GACnB,OAAO,GACP,IAAI,GACJ,MAAM,GACN,KAAK,GACL,iBAAiB,GACjB,iBAAiB,GACjB,MAAM,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAE/D,eAAO,MAAM,oBAAoB,EAAE,SAAS,WAAW,EAe7C,CAAC;AAEX,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAerD,CAAC;AA+BF,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,CAiBzE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAIrE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAsBhF;AAED,iFAAiF;AACjF,KAAK,YAAY,GAAG;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC9F,YAAY,GAAG,IAAI,CAOrB;AAgBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAQnF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,eAAe,EAAE,CAehH;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,GAAE,MAAU,GAAG,YAAY,EAAE,CAyCvG;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAKlF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAU5G;AAED,4CAA4C;AAC5C,qBAAa,mBAAmB;IAC9B,0LAA0L;WAC5K,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,GAAE,MAAU,GAAG,YAAY,EAAE;CAGnJ"}
@@ -10,9 +10,14 @@ export const PS_KNOWN_METRIC_KEYS = [
10
10
  'Recall',
11
11
  'F1',
12
12
  'LogLoss',
13
+ 'MulticlassLogLoss',
14
+ 'Brier',
13
15
  'R2',
14
16
  'RMSE',
15
17
  'MAE',
18
+ 'PoissonDeviance',
19
+ 'TweedieDeviance',
20
+ 'MASE',
16
21
  ];
17
22
  export const METRIC_LABELS = {
18
23
  AUC: 'AUC (ROC)',
@@ -21,9 +26,14 @@ export const METRIC_LABELS = {
21
26
  Recall: 'Recall',
22
27
  F1: 'F1 Score',
23
28
  LogLoss: 'Log Loss',
29
+ MulticlassLogLoss: 'Multiclass Log Loss',
30
+ Brier: 'Brier Score',
24
31
  R2: 'R² (Fit)',
25
32
  RMSE: 'RMSE',
26
33
  MAE: 'MAE',
34
+ PoissonDeviance: 'Poisson Deviance',
35
+ TweedieDeviance: 'Tweedie Deviance',
36
+ MASE: 'MASE',
27
37
  };
28
38
  const METRIC_ALIASES = {
29
39
  auc: 'AUC',
@@ -41,6 +51,12 @@ const METRIC_ALIASES = {
41
51
  logloss: 'LogLoss',
42
52
  'log-loss': 'LogLoss',
43
53
  log_loss: 'LogLoss',
54
+ 'multiclass-log-loss': 'MulticlassLogLoss',
55
+ brier: 'Brier',
56
+ brier_score: 'Brier',
57
+ 'poisson-deviance': 'PoissonDeviance',
58
+ 'tweedie-deviance': 'TweedieDeviance',
59
+ mase: 'MASE',
44
60
  r2: 'R2',
45
61
  'r-squared': 'R2',
46
62
  r_squared: 'R2',
@@ -64,10 +80,6 @@ export function HumanizeFeatureName(name) {
64
80
  .trim()
65
81
  .replace(/\b[a-z]/g, (c) => c.toUpperCase());
66
82
  }
67
- /** @deprecated Use {@link HumanizeFeatureName}. */
68
- export function humanizeFeatureName(name) {
69
- return HumanizeFeatureName(name);
70
- }
71
83
  export function ParseMetrics(json) {
72
84
  if (!json)
73
85
  return {};
@@ -91,20 +103,12 @@ export function ParseMetrics(json) {
91
103
  }
92
104
  return out;
93
105
  }
94
- /** @deprecated Use {@link ParseMetrics}. */
95
- export function parseMetrics(json) {
96
- return ParseMetrics(json);
97
- }
98
106
  export function CanonicalMetricKey(rawKey) {
99
107
  const exact = PS_KNOWN_METRIC_KEYS.find((k) => k === rawKey);
100
108
  if (exact)
101
109
  return exact;
102
110
  return METRIC_ALIASES[rawKey.trim().toLowerCase()] ?? null;
103
111
  }
104
- /** @deprecated Use {@link CanonicalMetricKey}. */
105
- export function canonicalMetricKey(rawKey) {
106
- return CanonicalMetricKey(rawKey);
107
- }
108
112
  export function FormatMetricValue(key, val) {
109
113
  if (!Number.isFinite(val))
110
114
  return '—';
@@ -117,44 +121,57 @@ export function FormatMetricValue(key, val) {
117
121
  case 'R2':
118
122
  return val.toFixed(3);
119
123
  case 'LogLoss':
124
+ case 'MulticlassLogLoss':
125
+ case 'Brier':
120
126
  case 'RMSE':
121
127
  case 'MAE':
128
+ case 'PoissonDeviance':
129
+ case 'TweedieDeviance':
130
+ case 'MASE':
122
131
  return val < 10 ? val.toFixed(3) : val.toLocaleString(undefined, { maximumFractionDigits: 2 });
123
132
  default:
124
133
  return val.toFixed(3);
125
134
  }
126
135
  }
127
- /** @deprecated Use {@link FormatMetricValue}. */
128
- export function formatMetricValue(key, val) {
129
- return FormatMetricValue(key, val);
130
- }
136
+ /**
137
+ * The primary metric score of a model: holdout preferred, else training. R² first for a regression, AUC for a
138
+ * classification; failing those, the first metric the holdout stores, which a trained model's holdout lists first as the
139
+ * protocol's primary proper score (all a kept simple baseline or a forecast stores).
140
+ */
131
141
  export function PrimaryModelScore(model) {
132
- const isReg = (model.ProblemType ?? '').toLowerCase() === 'regression';
142
+ const preferred = (model.ProblemType ?? '').toLowerCase() === 'regression'
143
+ ? ['R2', 'RMSE', 'MAE', 'AUC', 'Accuracy', 'F1']
144
+ : ['AUC', 'Accuracy', 'F1', 'R2', 'RMSE'];
133
145
  const holdout = ParseMetrics(model.HoldoutMetrics);
134
146
  const train = ParseMetrics(model.Metrics);
135
- if (isReg) {
136
- for (const k of ['R2', 'RMSE', 'MAE']) {
137
- if (holdout[k] != null)
138
- return { key: k, label: METRIC_LABELS[k], value: holdout[k] };
139
- }
140
- for (const k of ['R2', 'RMSE', 'MAE']) {
141
- if (train[k] != null)
142
- return { key: k, label: METRIC_LABELS[k], value: train[k] };
143
- }
144
- }
145
- for (const k of ['AUC', 'Accuracy', 'F1', 'R2', 'RMSE']) {
146
- if (holdout[k] != null)
147
- return { key: k, label: METRIC_LABELS[k], value: holdout[k] };
147
+ return preferredScore(holdout, preferred) || firstStoredScore(holdout) || preferredScore(train, preferred) || firstStoredScore(train);
148
+ }
149
+ /** The first of `keys` the map holds. */
150
+ function preferredScore(metrics, keys) {
151
+ const key = keys.find((k) => metrics[k] != null);
152
+ const value = key === undefined ? undefined : metrics[key];
153
+ return key === undefined || value === undefined ? null : { key, label: METRIC_LABELS[key], value };
154
+ }
155
+ /** The first metric the map holds, in the order the stored JSON lists them. */
156
+ function firstStoredScore(metrics) {
157
+ const key = Object.keys(metrics).map((k) => CanonicalMetricKey(k)).find((k) => k !== null);
158
+ const value = key === undefined ? undefined : metrics[key];
159
+ return key === undefined || value === undefined ? null : { key, label: METRIC_LABELS[key], value };
160
+ }
161
+ /**
162
+ * Whether a model's train-side `Metrics` hold an inner cross-validation estimate rather than an in-sample score: true
163
+ * for a model trained under an Evaluation Protocol, whose lineage names the protocol (`evaluationProtocolId`).
164
+ */
165
+ export function TrainScoreIsInnerCv(lineageJson) {
166
+ if (!lineageJson)
167
+ return false;
168
+ try {
169
+ const parsed = JSON.parse(lineageJson);
170
+ return typeof parsed?.evaluationProtocolId === 'string' && parsed.evaluationProtocolId.length > 0;
148
171
  }
149
- for (const k of ['AUC', 'Accuracy', 'F1', 'R2', 'RMSE']) {
150
- if (train[k] != null)
151
- return { key: k, label: METRIC_LABELS[k], value: train[k] };
172
+ catch {
173
+ return false;
152
174
  }
153
- return null;
154
- }
155
- /** @deprecated Use {@link PrimaryModelScore}. */
156
- export function primaryModelScore(model) {
157
- return PrimaryModelScore(model);
158
175
  }
159
176
  export function MetricsToDisplay(metrics, options = {}) {
160
177
  const out = [];
@@ -173,10 +190,6 @@ export function MetricsToDisplay(metrics, options = {}) {
173
190
  }
174
191
  return out;
175
192
  }
176
- /** @deprecated Use {@link MetricsToDisplay}. */
177
- export function metricsToDisplay(metrics, options = {}) {
178
- return MetricsToDisplay(metrics, options);
179
- }
180
193
  export function ParseFeatureImportance(raw, topN = 6) {
181
194
  if (!raw)
182
195
  return [];
@@ -218,10 +231,6 @@ export function ParseFeatureImportance(raw, topN = 6) {
218
231
  warning: e.val >= PS_FEATURE_DOMINANCE_THRESHOLD,
219
232
  }));
220
233
  }
221
- /** @deprecated Use {@link ParseFeatureImportance}. */
222
- export function parseFeatureImportance(raw, topN = 6) {
223
- return ParseFeatureImportance(raw, topN);
224
- }
225
234
  export function MaxFeatureImportance(raw) {
226
235
  const bars = ParseFeatureImportance(raw, 1);
227
236
  if (bars.length === 0)
@@ -229,10 +238,6 @@ export function MaxFeatureImportance(raw) {
229
238
  const num = parseFloat(bars[0].value);
230
239
  return Number.isFinite(num) ? num : null;
231
240
  }
232
- /** @deprecated Use {@link MaxFeatureImportance}. */
233
- export function maxFeatureImportance(raw) {
234
- return MaxFeatureImportance(raw);
235
- }
236
241
  export function OverfitGap(model) {
237
242
  const train = ParseMetrics(model.Metrics);
238
243
  const holdout = ParseMetrics(model.HoldoutMetrics);
@@ -244,10 +249,6 @@ export function OverfitGap(model) {
244
249
  }
245
250
  return null;
246
251
  }
247
- /** @deprecated Use {@link OverfitGap}. */
248
- export function overfitGap(model) {
249
- return OverfitGap(model);
250
- }
251
252
  /** The importance a model view may show. */
252
253
  export class ModelImportanceView {
253
254
  /** The importance bars a person may see: coefficient models only (split / impurity counts are not comparable across features and read as importance they are not, so they are hidden). */
@@ -1 +1 @@
1
- {"version":3,"file":"ml-model-view-models.js","sourceRoot":"","sources":["../../../../src/lib/custom/MLModels/ml-model-view-models.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure view-model functions and types for ML Model detail and metrics rendering.\n * Framework-free, deterministic calculations over plain model entity data.\n */\nimport { ImportanceDisplay } from '@memberjunction/predictive-studio-core';\n\nexport interface PSFeatureBar {\n name: string;\n value: string;\n pct: number;\n warning: boolean;\n}\n\nexport interface PSMetricDisplay {\n key: string;\n label: string;\n value: string;\n raw: number;\n}\n\nexport type PSMetricKey =\n | 'AUC'\n | 'Accuracy'\n | 'Precision'\n | 'Recall'\n | 'F1'\n | 'LogLoss'\n | 'R2'\n | 'RMSE'\n | 'MAE';\n\nexport type PSMetricMap = Partial<Record<PSMetricKey, number>>;\n\nexport const PS_KNOWN_METRIC_KEYS: readonly PSMetricKey[] = [\n 'AUC',\n 'Accuracy',\n 'Precision',\n 'Recall',\n 'F1',\n 'LogLoss',\n 'R2',\n 'RMSE',\n 'MAE',\n] as const;\n\nexport const METRIC_LABELS: Record<PSMetricKey, string> = {\n AUC: 'AUC (ROC)',\n Accuracy: 'Accuracy',\n Precision: 'Precision',\n Recall: 'Recall',\n F1: 'F1 Score',\n LogLoss: 'Log Loss',\n R2: 'R² (Fit)',\n RMSE: 'RMSE',\n MAE: 'MAE',\n};\n\nconst METRIC_ALIASES: Record<string, PSMetricKey> = {\n auc: 'AUC',\n 'roc-auc': 'AUC',\n roc_auc: 'AUC',\n acc: 'Accuracy',\n accuracy: 'Accuracy',\n prec: 'Precision',\n precision: 'Precision',\n rec: 'Recall',\n recall: 'Recall',\n f1: 'F1',\n 'f1-score': 'F1',\n f1_score: 'F1',\n logloss: 'LogLoss',\n 'log-loss': 'LogLoss',\n log_loss: 'LogLoss',\n r2: 'R2',\n 'r-squared': 'R2',\n r_squared: 'R2',\n rmse: 'RMSE',\n mae: 'MAE',\n};\n\nexport const PS_FEATURE_DOMINANCE_THRESHOLD = 0.6;\n\n/**\n * The ML Model form's label for a feature column: drops a leading `Is` before a capital, splits camelCase, turns `_`\n * into spaces and title-cases every word (`IsActive` → `Active`, `membership_type` → `Membership Type`). A published\n * export whose output is fixed; the dashboards' at-risk drivers use `AtRiskRules.HumanizeFeatureName` (predictive-studio-core), which\n * keeps an `Is` prefix and sentence-cases snake_case names.\n */\nexport function HumanizeFeatureName(name: string): string {\n if (!name) return '';\n return name\n .replace(/^Is([A-Z])/, '$1')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .trim()\n .replace(/\\b[a-z]/g, (c) => c.toUpperCase());\n}\n\n/** @deprecated Use {@link HumanizeFeatureName}. */\nexport function humanizeFeatureName(name: string): string {\n return HumanizeFeatureName(name);\n}\n\nexport function ParseMetrics(json: string | null | undefined): PSMetricMap {\n if (!json) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n return {};\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {};\n const out: PSMetricMap = {};\n for (const [rawKey, rawVal] of Object.entries(parsed as Record<string, unknown>)) {\n const value = typeof rawVal === 'number' && Number.isFinite(rawVal) ? rawVal : null;\n if (value == null) continue;\n const canonical = CanonicalMetricKey(rawKey);\n if (canonical && out[canonical] == null) out[canonical] = value;\n }\n return out;\n}\n\n/** @deprecated Use {@link ParseMetrics}. */\nexport function parseMetrics(json: string | null | undefined): PSMetricMap {\n return ParseMetrics(json);\n}\n\nexport function CanonicalMetricKey(rawKey: string): PSMetricKey | null {\n const exact = PS_KNOWN_METRIC_KEYS.find((k) => k === rawKey);\n if (exact) return exact;\n return METRIC_ALIASES[rawKey.trim().toLowerCase()] ?? null;\n}\n\n/** @deprecated Use {@link CanonicalMetricKey}. */\nexport function canonicalMetricKey(rawKey: string): PSMetricKey | null {\n return CanonicalMetricKey(rawKey);\n}\n\nexport function FormatMetricValue(key: PSMetricKey | string, val: number): string {\n if (!Number.isFinite(val)) return '—';\n switch (key) {\n case 'AUC':\n case 'Accuracy':\n case 'Precision':\n case 'Recall':\n case 'F1':\n case 'R2':\n return val.toFixed(3);\n case 'LogLoss':\n case 'RMSE':\n case 'MAE':\n return val < 10 ? val.toFixed(3) : val.toLocaleString(undefined, { maximumFractionDigits: 2 });\n default:\n return val.toFixed(3);\n }\n}\n\n/** @deprecated Use {@link FormatMetricValue}. */\nexport function formatMetricValue(key: PSMetricKey | string, val: number): string {\n return FormatMetricValue(key, val);\n}\n\nexport function PrimaryModelScore(\n model: { Metrics?: string | null; HoldoutMetrics?: string | null; ProblemType?: string | null },\n): { key: PSMetricKey; label: string; value: number } | null {\n const isReg = (model.ProblemType ?? '').toLowerCase() === 'regression';\n const holdout = ParseMetrics(model.HoldoutMetrics);\n const train = ParseMetrics(model.Metrics);\n\n if (isReg) {\n for (const k of ['R2', 'RMSE', 'MAE'] as const) {\n if (holdout[k] != null) return { key: k, label: METRIC_LABELS[k], value: holdout[k]! };\n }\n for (const k of ['R2', 'RMSE', 'MAE'] as const) {\n if (train[k] != null) return { key: k, label: METRIC_LABELS[k], value: train[k]! };\n }\n }\n\n for (const k of ['AUC', 'Accuracy', 'F1', 'R2', 'RMSE'] as const) {\n if (holdout[k] != null) return { key: k, label: METRIC_LABELS[k], value: holdout[k]! };\n }\n for (const k of ['AUC', 'Accuracy', 'F1', 'R2', 'RMSE'] as const) {\n if (train[k] != null) return { key: k, label: METRIC_LABELS[k], value: train[k]! };\n }\n return null;\n}\n\n/** @deprecated Use {@link PrimaryModelScore}. */\nexport function primaryModelScore(\n model: { Metrics?: string | null; HoldoutMetrics?: string | null; ProblemType?: string | null },\n): { key: PSMetricKey; label: string; value: number } | null {\n return PrimaryModelScore(model);\n}\n\nexport function MetricsToDisplay(metrics: PSMetricMap, options: { excludeAuc?: boolean } = {}): PSMetricDisplay[] {\n const out: PSMetricDisplay[] = [];\n for (const k of PS_KNOWN_METRIC_KEYS) {\n if (options.excludeAuc && k === 'AUC') continue;\n const v = metrics[k];\n if (v != null) {\n out.push({\n key: k,\n label: METRIC_LABELS[k] ?? k,\n value: FormatMetricValue(k, v),\n raw: v,\n });\n }\n }\n return out;\n}\n\n/** @deprecated Use {@link MetricsToDisplay}. */\nexport function metricsToDisplay(metrics: PSMetricMap, options: { excludeAuc?: boolean } = {}): PSMetricDisplay[] {\n return MetricsToDisplay(metrics, options);\n}\n\nexport function ParseFeatureImportance(raw: string | null | undefined, topN: number = 6): PSFeatureBar[] {\n if (!raw) return [];\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return [];\n }\n\n const entries: { name: string; val: number }[] = [];\n\n if (Array.isArray(parsed)) {\n for (const item of parsed as Array<{ feature?: unknown; name?: unknown; importance?: unknown; weight?: unknown; value?: unknown }>) {\n const name = typeof item?.feature === 'string' ? item.feature : typeof item?.name === 'string' ? item.name : '';\n const rawVal = typeof item?.importance === 'number' ? item.importance : typeof item?.weight === 'number' ? item.weight : typeof item?.value === 'number' ? item.value : NaN;\n const val = Number(rawVal);\n if (name && Number.isFinite(val)) {\n entries.push({ name, val: Math.abs(val) });\n }\n }\n } else if (parsed && typeof parsed === 'object') {\n for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {\n const val = typeof v === 'number' && Number.isFinite(v) ? Math.abs(v) : NaN;\n if (k && Number.isFinite(val)) {\n entries.push({ name: k, val });\n }\n }\n }\n\n if (entries.length === 0) return [];\n\n entries.sort((a, b) => b.val - a.val);\n const sliced = entries.slice(0, topN);\n const max = sliced[0]?.val ?? 1;\n\n return sliced.map((e) => ({\n name: e.name,\n value: e.val < 1 ? e.val.toFixed(3) : e.val.toFixed(1),\n pct: max > 0 ? Math.round((e.val / max) * 100) : 0,\n warning: e.val >= PS_FEATURE_DOMINANCE_THRESHOLD,\n }));\n}\n\n/** @deprecated Use {@link ParseFeatureImportance}. */\nexport function parseFeatureImportance(raw: string | null | undefined, topN: number = 6): PSFeatureBar[] {\n return ParseFeatureImportance(raw, topN);\n}\n\nexport function MaxFeatureImportance(raw: string | null | undefined): number | null {\n const bars = ParseFeatureImportance(raw, 1);\n if (bars.length === 0) return null;\n const num = parseFloat(bars[0].value);\n return Number.isFinite(num) ? num : null;\n}\n\n/** @deprecated Use {@link MaxFeatureImportance}. */\nexport function maxFeatureImportance(raw: string | null | undefined): number | null {\n return MaxFeatureImportance(raw);\n}\n\nexport function OverfitGap(model: { Metrics?: string | null; HoldoutMetrics?: string | null }): number | null {\n const train = ParseMetrics(model.Metrics);\n const holdout = ParseMetrics(model.HoldoutMetrics);\n if (train.AUC != null && holdout.AUC != null) {\n return train.AUC - holdout.AUC;\n }\n if (train.R2 != null && holdout.R2 != null) {\n return train.R2 - holdout.R2;\n }\n return null;\n}\n\n/** @deprecated Use {@link OverfitGap}. */\nexport function overfitGap(model: { Metrics?: string | null; HoldoutMetrics?: string | null }): number | null {\n return OverfitGap(model);\n}\n\n/** The importance a model view may show. */\nexport class ModelImportanceView {\n /** The importance bars a person may see: coefficient models only (split / impurity counts are not comparable across features and read as importance they are not, so they are hidden). */\n public static DisplayedFeatureImportance(lineageJSON: string | null | undefined, raw: string | null | undefined, topN: number = 6): PSFeatureBar[] {\n return ImportanceDisplay.GlobalDriversShowable(lineageJSON) ? ParseFeatureImportance(raw, topN) : [];\n }\n}\n"]}
1
+ {"version":3,"file":"ml-model-view-models.js","sourceRoot":"","sources":["../../../../src/lib/custom/MLModels/ml-model-view-models.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure view-model functions and types for ML Model detail and metrics rendering.\n * Framework-free, deterministic calculations over plain model entity data.\n */\nimport { ImportanceDisplay } from '@memberjunction/predictive-studio-core';\n\nexport interface PSFeatureBar {\n name: string;\n value: string;\n pct: number;\n warning: boolean;\n}\n\nexport interface PSMetricDisplay {\n key: string;\n label: string;\n value: string;\n raw: number;\n}\n\nexport type PSMetricKey =\n | 'AUC'\n | 'Accuracy'\n | 'Precision'\n | 'Recall'\n | 'F1'\n | 'LogLoss'\n | 'MulticlassLogLoss'\n | 'Brier'\n | 'R2'\n | 'RMSE'\n | 'MAE'\n | 'PoissonDeviance'\n | 'TweedieDeviance'\n | 'MASE';\n\nexport type PSMetricMap = Partial<Record<PSMetricKey, number>>;\n\nexport const PS_KNOWN_METRIC_KEYS: readonly PSMetricKey[] = [\n 'AUC',\n 'Accuracy',\n 'Precision',\n 'Recall',\n 'F1',\n 'LogLoss',\n 'MulticlassLogLoss',\n 'Brier',\n 'R2',\n 'RMSE',\n 'MAE',\n 'PoissonDeviance',\n 'TweedieDeviance',\n 'MASE',\n] as const;\n\nexport const METRIC_LABELS: Record<PSMetricKey, string> = {\n AUC: 'AUC (ROC)',\n Accuracy: 'Accuracy',\n Precision: 'Precision',\n Recall: 'Recall',\n F1: 'F1 Score',\n LogLoss: 'Log Loss',\n MulticlassLogLoss: 'Multiclass Log Loss',\n Brier: 'Brier Score',\n R2: 'R² (Fit)',\n RMSE: 'RMSE',\n MAE: 'MAE',\n PoissonDeviance: 'Poisson Deviance',\n TweedieDeviance: 'Tweedie Deviance',\n MASE: 'MASE',\n};\n\nconst METRIC_ALIASES: Record<string, PSMetricKey> = {\n auc: 'AUC',\n 'roc-auc': 'AUC',\n roc_auc: 'AUC',\n acc: 'Accuracy',\n accuracy: 'Accuracy',\n prec: 'Precision',\n precision: 'Precision',\n rec: 'Recall',\n recall: 'Recall',\n f1: 'F1',\n 'f1-score': 'F1',\n f1_score: 'F1',\n logloss: 'LogLoss',\n 'log-loss': 'LogLoss',\n log_loss: 'LogLoss',\n 'multiclass-log-loss': 'MulticlassLogLoss',\n brier: 'Brier',\n brier_score: 'Brier',\n 'poisson-deviance': 'PoissonDeviance',\n 'tweedie-deviance': 'TweedieDeviance',\n mase: 'MASE',\n r2: 'R2',\n 'r-squared': 'R2',\n r_squared: 'R2',\n rmse: 'RMSE',\n mae: 'MAE',\n};\n\nexport const PS_FEATURE_DOMINANCE_THRESHOLD = 0.6;\n\n/**\n * The ML Model form's label for a feature column: drops a leading `Is` before a capital, splits camelCase, turns `_`\n * into spaces and title-cases every word (`IsActive` → `Active`, `membership_type` → `Membership Type`). A published\n * export whose output is fixed; the dashboards' at-risk drivers use `AtRiskRules.HumanizeFeatureName` (predictive-studio-core), which\n * keeps an `Is` prefix and sentence-cases snake_case names.\n */\nexport function HumanizeFeatureName(name: string): string {\n if (!name) return '';\n return name\n .replace(/^Is([A-Z])/, '$1')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .trim()\n .replace(/\\b[a-z]/g, (c) => c.toUpperCase());\n}\n\nexport function ParseMetrics(json: string | null | undefined): PSMetricMap {\n if (!json) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n return {};\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {};\n const out: PSMetricMap = {};\n for (const [rawKey, rawVal] of Object.entries(parsed as Record<string, unknown>)) {\n const value = typeof rawVal === 'number' && Number.isFinite(rawVal) ? rawVal : null;\n if (value == null) continue;\n const canonical = CanonicalMetricKey(rawKey);\n if (canonical && out[canonical] == null) out[canonical] = value;\n }\n return out;\n}\n\nexport function CanonicalMetricKey(rawKey: string): PSMetricKey | null {\n const exact = PS_KNOWN_METRIC_KEYS.find((k) => k === rawKey);\n if (exact) return exact;\n return METRIC_ALIASES[rawKey.trim().toLowerCase()] ?? null;\n}\n\nexport function FormatMetricValue(key: PSMetricKey | string, val: number): string {\n if (!Number.isFinite(val)) return '—';\n switch (key) {\n case 'AUC':\n case 'Accuracy':\n case 'Precision':\n case 'Recall':\n case 'F1':\n case 'R2':\n return val.toFixed(3);\n case 'LogLoss':\n case 'MulticlassLogLoss':\n case 'Brier':\n case 'RMSE':\n case 'MAE':\n case 'PoissonDeviance':\n case 'TweedieDeviance':\n case 'MASE':\n return val < 10 ? val.toFixed(3) : val.toLocaleString(undefined, { maximumFractionDigits: 2 });\n default:\n return val.toFixed(3);\n }\n}\n\n/** A model's score as the form shows it: the metric, its label and the value. */\ntype PSModelScore = { key: PSMetricKey; label: string; value: number };\n\n/**\n * The primary metric score of a model: holdout preferred, else training. R² first for a regression, AUC for a\n * classification; failing those, the first metric the holdout stores, which a trained model's holdout lists first as the\n * protocol's primary proper score (all a kept simple baseline or a forecast stores).\n */\nexport function PrimaryModelScore(\n model: { Metrics?: string | null; HoldoutMetrics?: string | null; ProblemType?: string | null },\n): PSModelScore | null {\n const preferred: readonly PSMetricKey[] = (model.ProblemType ?? '').toLowerCase() === 'regression'\n ? ['R2', 'RMSE', 'MAE', 'AUC', 'Accuracy', 'F1']\n : ['AUC', 'Accuracy', 'F1', 'R2', 'RMSE'];\n const holdout = ParseMetrics(model.HoldoutMetrics);\n const train = ParseMetrics(model.Metrics);\n return preferredScore(holdout, preferred) || firstStoredScore(holdout) || preferredScore(train, preferred) || firstStoredScore(train);\n}\n\n/** The first of `keys` the map holds. */\nfunction preferredScore(metrics: PSMetricMap, keys: readonly PSMetricKey[]): PSModelScore | null {\n const key = keys.find((k) => metrics[k] != null);\n const value = key === undefined ? undefined : metrics[key];\n return key === undefined || value === undefined ? null : { key, label: METRIC_LABELS[key], value };\n}\n\n/** The first metric the map holds, in the order the stored JSON lists them. */\nfunction firstStoredScore(metrics: PSMetricMap): PSModelScore | null {\n const key = Object.keys(metrics).map((k) => CanonicalMetricKey(k)).find((k): k is PSMetricKey => k !== null);\n const value = key === undefined ? undefined : metrics[key];\n return key === undefined || value === undefined ? null : { key, label: METRIC_LABELS[key], value };\n}\n\n/**\n * Whether a model's train-side `Metrics` hold an inner cross-validation estimate rather than an in-sample score: true\n * for a model trained under an Evaluation Protocol, whose lineage names the protocol (`evaluationProtocolId`).\n */\nexport function TrainScoreIsInnerCv(lineageJson: string | null | undefined): boolean {\n if (!lineageJson) return false;\n try {\n const parsed: { evaluationProtocolId?: string | null } | null = JSON.parse(lineageJson);\n return typeof parsed?.evaluationProtocolId === 'string' && parsed.evaluationProtocolId.length > 0;\n } catch {\n return false;\n }\n}\n\nexport function MetricsToDisplay(metrics: PSMetricMap, options: { excludeAuc?: boolean } = {}): PSMetricDisplay[] {\n const out: PSMetricDisplay[] = [];\n for (const k of PS_KNOWN_METRIC_KEYS) {\n if (options.excludeAuc && k === 'AUC') continue;\n const v = metrics[k];\n if (v != null) {\n out.push({\n key: k,\n label: METRIC_LABELS[k] ?? k,\n value: FormatMetricValue(k, v),\n raw: v,\n });\n }\n }\n return out;\n}\n\nexport function ParseFeatureImportance(raw: string | null | undefined, topN: number = 6): PSFeatureBar[] {\n if (!raw) return [];\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return [];\n }\n\n const entries: { name: string; val: number }[] = [];\n\n if (Array.isArray(parsed)) {\n for (const item of parsed as Array<{ feature?: unknown; name?: unknown; importance?: unknown; weight?: unknown; value?: unknown }>) {\n const name = typeof item?.feature === 'string' ? item.feature : typeof item?.name === 'string' ? item.name : '';\n const rawVal = typeof item?.importance === 'number' ? item.importance : typeof item?.weight === 'number' ? item.weight : typeof item?.value === 'number' ? item.value : NaN;\n const val = Number(rawVal);\n if (name && Number.isFinite(val)) {\n entries.push({ name, val: Math.abs(val) });\n }\n }\n } else if (parsed && typeof parsed === 'object') {\n for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {\n const val = typeof v === 'number' && Number.isFinite(v) ? Math.abs(v) : NaN;\n if (k && Number.isFinite(val)) {\n entries.push({ name: k, val });\n }\n }\n }\n\n if (entries.length === 0) return [];\n\n entries.sort((a, b) => b.val - a.val);\n const sliced = entries.slice(0, topN);\n const max = sliced[0]?.val ?? 1;\n\n return sliced.map((e) => ({\n name: e.name,\n value: e.val < 1 ? e.val.toFixed(3) : e.val.toFixed(1),\n pct: max > 0 ? Math.round((e.val / max) * 100) : 0,\n warning: e.val >= PS_FEATURE_DOMINANCE_THRESHOLD,\n }));\n}\n\nexport function MaxFeatureImportance(raw: string | null | undefined): number | null {\n const bars = ParseFeatureImportance(raw, 1);\n if (bars.length === 0) return null;\n const num = parseFloat(bars[0].value);\n return Number.isFinite(num) ? num : null;\n}\n\nexport function OverfitGap(model: { Metrics?: string | null; HoldoutMetrics?: string | null }): number | null {\n const train = ParseMetrics(model.Metrics);\n const holdout = ParseMetrics(model.HoldoutMetrics);\n if (train.AUC != null && holdout.AUC != null) {\n return train.AUC - holdout.AUC;\n }\n if (train.R2 != null && holdout.R2 != null) {\n return train.R2 - holdout.R2;\n }\n return null;\n}\n\n/** The importance a model view may show. */\nexport class ModelImportanceView {\n /** The importance bars a person may see: coefficient models only (split / impurity counts are not comparable across features and read as importance they are not, so they are hidden). */\n public static DisplayedFeatureImportance(lineageJSON: string | null | undefined, raw: string | null | undefined, topN: number = 6): PSFeatureBar[] {\n return ImportanceDisplay.GlobalDriversShowable(lineageJSON) ? ParseFeatureImportance(raw, topN) : [];\n }\n}\n"]}