@memberjunction/ng-core-entity-forms 6.2.0-edge.4 → 6.2.0-edge.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts +2 -0
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +103 -95
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +13 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +37 -17
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +9 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +193 -178
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.d.ts +48 -0
- package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.d.ts.map +1 -0
- package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.js +195 -0
- package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.js.map +1 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +2 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +345 -323
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.d.ts +2 -0
- package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +29 -11
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +2 -0
- package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.js +2 -0
- package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +11 -4
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.js +14 -0
- package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +15 -0
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.js +186 -92
- package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.d.ts +2 -0
- package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +2 -0
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js +6 -3
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +3 -3
- package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts.map +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js +5 -7
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.d.ts +19 -1
- package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +20 -27
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.js +14 -6
- package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +8 -8
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +37 -5
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +155 -79
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +8 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +59 -8
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +34 -9
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +281 -150
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js +3 -1
- package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +82 -80
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +10 -0
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +65 -47
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +17 -17
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +64 -24
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +74 -52
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.js +86 -0
- package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.js +132 -0
- package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js +12 -10
- package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +86 -32
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js +25 -7
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +180 -160
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js +16 -14
- package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js +23 -21
- package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js +21 -19
- package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.js +74 -0
- package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.js +64 -0
- package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js +77 -21
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.js +28 -10
- package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.js +189 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.js +116 -0
- package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js +51 -35
- package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentFileType/mjcontentfiletype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentFileType/mjcontentfiletype.form.component.js +36 -18
- package/dist/lib/generated/Entities/MJContentFileType/mjcontentfiletype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js +74 -60
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.js +30 -32
- package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +43 -35
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js +21 -19
- package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +69 -75
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +35 -17
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.js +45 -29
- package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJDuplicateRun/mjduplicaterun.form.component.js +19 -17
- package/dist/lib/generated/Entities/MJDuplicateRun/mjduplicaterun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +128 -92
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.js +129 -0
- package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js +27 -9
- package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.js +130 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js +26 -14
- package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js +23 -19
- package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +30 -12
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js +26 -8
- package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js +24 -6
- package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.js +25 -6
- package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +29 -27
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js +17 -15
- package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js +73 -59
- package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJQueryEntity/mjqueryentity.form.component.js +10 -8
- package/dist/lib/generated/Entities/MJQueryEntity/mjqueryentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJQueryParameter/mjqueryparameter.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJQueryParameter/mjqueryparameter.form.component.js +12 -4
- package/dist/lib/generated/Entities/MJQueryParameter/mjqueryparameter.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +27 -9
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js +24 -6
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js +29 -11
- package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.js +13 -3
- package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +256 -130
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js +31 -25
- package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.js +50 -38
- package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +446 -438
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +24 -0
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/panels/feature-values/feature-values.logic.d.ts +55 -0
- package/dist/lib/panels/feature-values/feature-values.logic.d.ts.map +1 -0
- package/dist/lib/panels/feature-values/feature-values.logic.js +88 -0
- package/dist/lib/panels/feature-values/feature-values.logic.js.map +1 -0
- package/dist/lib/panels/feature-values/feature-values.panel.d.ts +39 -0
- package/dist/lib/panels/feature-values/feature-values.panel.d.ts.map +1 -0
- package/dist/lib/panels/feature-values/feature-values.panel.js +303 -0
- package/dist/lib/panels/feature-values/feature-values.panel.js.map +1 -0
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +10 -0
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.js +15 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +4 -0
- package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.panel.js +77 -61
- package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.d.ts +37 -0
- package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +425 -286
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +48 -48
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* or domain-specific — it operates purely on numbers, strings, and the model's
|
|
8
8
|
* generic `ProblemType` / `FeatureImportance` JSON.
|
|
9
9
|
*/
|
|
10
|
-
import { resolveOutcomeConfig, resolveOutcomeStyle, resolveScoreBand, } from '@memberjunction/predictive-studio-core';
|
|
10
|
+
import { ImportanceDisplay, resolveOutcomeConfig, resolveOutcomeStyle, resolveScoreBand, } from '@memberjunction/predictive-studio-core';
|
|
11
11
|
/** Maximum number of feature-importance drivers shown per card. */
|
|
12
12
|
export const MAX_DRIVERS = 5;
|
|
13
13
|
/**
|
|
@@ -145,6 +145,20 @@ export function ParseDrivers(featureImportanceJson) {
|
|
|
145
145
|
export function parseDrivers(featureImportanceJson) {
|
|
146
146
|
return ParseDrivers(featureImportanceJson);
|
|
147
147
|
}
|
|
148
|
+
/** The global drivers a prediction card may show. */
|
|
149
|
+
export class PredictionDrivers {
|
|
150
|
+
/** Global drivers for a model's card: coefficient models only (split / impurity counts are not comparable across features and read as importance they are not, so they are hidden). */
|
|
151
|
+
static DriversForModel(lineageJSON, featureImportanceJson) {
|
|
152
|
+
return ImportanceDisplay.GlobalDriversShowable(lineageJSON) ? ParseDrivers(featureImportanceJson) : [];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* True when the model has stored importances that {@link DriversForModel} withholds because of their kind, so the card
|
|
156
|
+
* shows {@link ImportanceDisplay.HiddenNote} in their place (the same note the model detail page shows).
|
|
157
|
+
*/
|
|
158
|
+
static DriversHidden(lineageJSON, featureImportanceJson) {
|
|
159
|
+
return !ImportanceDisplay.GlobalDriversShowable(lineageJSON) && ParseDrivers(featureImportanceJson).length > 0;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
148
162
|
/** Format a last-scored timestamp to a short date, or null when absent/invalid. */
|
|
149
163
|
export function FormatLastScored(lastScoredAt) {
|
|
150
164
|
if (!lastScoredAt) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-prediction.logic.js","sourceRoot":"","sources":["../../../../src/lib/panels/model-predictions/model-prediction.logic.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure, framework-free logic for the entity-agnostic Model Predictions panel.\n *\n * Extracted from the Angular component so the band computation, value\n * formatting, and feature-importance parsing can be unit-tested without\n * standing up Angular or a real entity record. NONE of this is entity-specific\n * or domain-specific — it operates purely on numbers, strings, and the model's\n * generic `ProblemType` / `FeatureImportance` JSON.\n */\n\nimport {\n OutcomeBand,\n OutcomeConfig,\n formatPredictionScore,\n resolveOutcomeConfig,\n resolveOutcomeStyle,\n resolveScoreBand,\n} from '@memberjunction/predictive-studio-core';\n\n/**\n * The neutral tercile a numeric prediction falls into. No moral direction is\n * implied — `low`/`mid`/`high` describe position on the value axis only.\n */\nexport type PredictionBand = 'low' | 'mid' | 'high';\n\n/** Generic problem types a trained model can have. */\nexport type ModelProblemType = 'classification' | 'regression';\n\n/** One normalized feature-importance driver for display. */\nexport interface PredictionDriver {\n /** Raw feature name as the model stored it. */\n name: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** Importance magnitude (absolute value of the raw contribution). */\n importance: number; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n /** Importance as a 0–100 share of the strongest driver, for the bar width. */\n RelativePct: number;\n}\n\n/** How a prediction's primary value should be rendered. */\nexport type PredictionValueKind = 'probability' | 'numeric' | 'class';\n\n/** Maximum number of feature-importance drivers shown per card. */\nexport const MAX_DRIVERS = 5;\n\n/**\n * Coerce a dynamic field value into a finite number, or null when it isn't one.\n */\nexport function ToNumber(value: unknown): number | null {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : null;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n }\n return null;\n}\n\n/** @deprecated Use {@link ToNumber}. */\nexport function toNumber(value: unknown): number | null {\n return ToNumber(value);\n}\n\n/**\n * Decide how to render a value given the model's problem type and the value.\n * - regression + numeric → 'numeric'\n * - classification + value in [0,1] → 'probability' (a confidence/score we can gauge)\n * - everything else (a class label, a missing value) → 'class'\n */\nexport function ValueKind(problemType: ModelProblemType, numeric: number | null): PredictionValueKind {\n const isRegression = problemType === 'regression';\n if (isRegression && numeric != null) {\n return 'numeric';\n }\n if (!isRegression && numeric != null && numeric >= 0 && numeric <= 1) {\n return 'probability';\n }\n return 'class';\n}\n\n/** @deprecated Use {@link ValueKind}. */\nexport function valueKind(problemType: ModelProblemType, numeric: number | null): PredictionValueKind {\n return ValueKind(problemType, numeric);\n}\n\n/**\n * Neutral tercile for a 0–1 value. Position on the value axis only — no\n * assumption that high is good or bad. Values are clamped to [0,1].\n */\nexport function BandFor(value: number): PredictionBand {\n const v = Math.max(0, Math.min(1, value));\n if (v < 1 / 3) return 'low';\n if (v < 2 / 3) return 'mid';\n return 'high';\n}\n\n/** @deprecated Use {@link BandFor}. */\nexport function bandFor(value: number): PredictionBand {\n return BandFor(value);\n}\n\n/** Round a 0–1 probability to an integer 0–100 gauge fill, clamped. */\nexport function GaugePct(value: number): number {\n return Math.round(Math.max(0, Math.min(1, value)) * 100);\n}\n\n/** @deprecated Use {@link GaugePct}. */\nexport function gaugePct(value: number): number {\n return GaugePct(value);\n}\n\n/**\n * Format the primary value for display:\n * - probability → \"72%\"\n * - numeric (regression) → grouped number, up to 4 decimals\n * - class label → the label string\n * - missing/empty → \"—\" (em dash)\n */\nexport function FormatValue(rawValue: unknown, numeric: number | null, kind: PredictionValueKind): string {\n if (kind === 'probability' && numeric != null) {\n return `${GaugePct(numeric)}%`;\n }\n if (kind === 'numeric' && numeric != null) {\n return numeric.toLocaleString(undefined, { maximumFractionDigits: 4 });\n }\n if (rawValue == null || rawValue === '') {\n return '—';\n }\n return String(rawValue);\n}\n\n/** @deprecated Use {@link FormatValue}. */\nexport function formatValue(rawValue: unknown, numeric: number | null, kind: PredictionValueKind): string {\n return FormatValue(rawValue, numeric, kind);\n}\n\n/**\n * Pick the human label for a prediction: prefer the model's target variable,\n * then the bound column name, then a generic fallback.\n */\nexport function ResolveLabel(targetVariable: string | null, targetColumn: string | null): string {\n const target = targetVariable?.trim();\n if (target) return target;\n const col = targetColumn?.trim();\n if (col) return col;\n return 'Prediction';\n}\n\n/** @deprecated Use {@link ResolveLabel}. */\nexport function resolveLabel(targetVariable: string | null, targetColumn: string | null): string {\n return ResolveLabel(targetVariable, targetColumn);\n}\n\n/**\n * Parse a model's `FeatureImportance` JSON (`Record<string, number>`) into the\n * top-N sorted drivers with relative bar widths. Returns [] on null / invalid /\n * empty input — the caller omits the drivers section cleanly when empty.\n */\nexport function ParseDrivers(featureImportanceJson: string | null): PredictionDriver[] {\n if (!featureImportanceJson) {\n return [];\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(featureImportanceJson);\n } catch {\n return [];\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return [];\n }\n const entries = Object.entries(parsed as Record<string, unknown>)\n .map(([name, raw]) => ({ name, importance: Math.abs(ToNumber(raw) ?? 0) }))\n .filter(d => d.importance > 0)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, MAX_DRIVERS);\n\n const max = entries.length > 0 ? entries[0].importance : 0;\n return entries.map(d => ({\n ...d,\n RelativePct: max > 0 ? Math.round((d.importance / max) * 100) : 0,\n }));\n}\n\n/** @deprecated Use {@link ParseDrivers}. */\nexport function parseDrivers(featureImportanceJson: string | null): PredictionDriver[] {\n return ParseDrivers(featureImportanceJson);\n}\n\n/** Format a last-scored timestamp to a short date, or null when absent/invalid. */\nexport function FormatLastScored(lastScoredAt: Date | string | null): string | null {\n if (!lastScoredAt) {\n return null;\n }\n const d = lastScoredAt instanceof Date ? lastScoredAt : new Date(lastScoredAt);\n if (isNaN(d.getTime())) {\n return null;\n }\n return d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\n/** @deprecated Use {@link FormatLastScored}. */\nexport function formatLastScored(lastScoredAt: Date | string | null): string | null {\n return FormatLastScored(lastScoredAt);\n}\n\n/**\n * A resolved historical prediction row from `MJ: Process Run Details` for an entity record.\n */\nexport interface PredictionHistoryItem {\n /** The MJ: Process Run Details primary key ID */\n id: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** The parent Process Run ID */\n ProcessRunId: string;\n /** Model ID if resolved from payload or model lookup */\n modelId: string | null; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** Resolved model name (e.g. \"Member Churn Risk\" or \"LatePaymentOutcome\") */\n ModelName: string;\n /** Resolved pipeline & version string (e.g. \"Pipeline v1\") */\n Provenance: string;\n /** Target variable / label */\n target: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** Problem type: classification or regression */\n problemType: ModelProblemType; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** Primary numeric value / score */\n NumericValue: number | null;\n /** Class label if classification */\n PredictedClass: string | null;\n /** Formatted display value (e.g. \"88%\", \"Late\", \"1,240.5\") */\n DisplayValue: string;\n /** True if 0–1 probability we can gauge/badge */\n IsProbability: boolean;\n /** Neutral band: 'low' | 'mid' | 'high' */\n Band: PredictionBand | null;\n /** Resolved semantic status band from outcomeConfig */\n StatusBand: OutcomeBand | null;\n /** Human-readable status label (e.g. \"Low Risk\", \"High\") */\n StatusLabel: string | null;\n /** Semantic badge color ('green' | 'amber' | 'red' | 'blue' | 'gray') */\n BadgeColor: 'green' | 'amber' | 'red' | 'blue' | 'gray';\n /** Icon class if specified in band/style */\n BadgeIcon: string | null;\n /** Execution status: 'Succeeded' | 'Failed' | 'Pending' | 'Skipped' */\n status: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** When processing completed */\n CompletedAt: Date | null;\n /** Formatted date/time for history display */\n FormattedTime: string;\n /** Drivers if available in payload */\n Drivers: PredictionDriver[];\n /** Error message if Failed */\n ErrorMessage: string | null;\n /** Full raw payload object for JSON inspection */\n RawPayload: Record<string, unknown> | null;\n}\n\n/** Summary descriptor of a model represented in prediction history. */\nexport interface ModelHistorySummary {\n modelId: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n ModelName: string;\n count: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n}\n\n/** Input contract for parsing a Process Run Detail record. */\nexport interface RawProcessRunDetail {\n ID: string;\n ProcessRunID: string;\n Status: string;\n CompletedAt: Date | string | null;\n ResultPayload: string | null;\n ErrorMessage: string | null;\n}\n\n/** Model metadata lookup contract for decorating history items. */\nexport interface HistoryModelMetadata {\n Name?: string;\n Pipeline?: string;\n Version?: number;\n ProblemType?: string;\n TargetVariable?: string;\n Lineage?: string | null;\n outcomeConfig?: OutcomeConfig | null; // case-violation-ok-legacy-back-compat: optional, and the old name is also read off a value the checker cannot type; renaming it stays assignable and silently yields undefined\n}\n\n/**\n * Format a history completion timestamp with date and time.\n */\nexport function FormatHistoryTimestamp(date: Date | string | null): string {\n if (!date) return '—';\n const d = date instanceof Date ? date : new Date(date);\n if (isNaN(d.getTime())) return '—';\n return d.toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n}\n\n/** @deprecated Use {@link FormatHistoryTimestamp}. */\nexport function formatHistoryTimestamp(date: Date | string | null): string {\n return FormatHistoryTimestamp(date);\n}\n\n/**\n * Parse an array of drivers from payload driver shapes (array of { feature, value } or map).\n */\nexport function ParsePayloadDrivers(rawDrivers: unknown): PredictionDriver[] {\n if (!rawDrivers) return [];\n if (Array.isArray(rawDrivers)) {\n const entries = rawDrivers\n .map((item: unknown) => {\n if (!item || typeof item !== 'object') return null;\n const rec = item as Record<string, unknown>;\n const name = typeof rec['feature'] === 'string' ? rec['feature'] : (typeof rec['name'] === 'string' ? rec['name'] : '');\n const val = ToNumber(rec['value'] ?? rec['importance']);\n if (!name || val == null) return null;\n return { name, importance: Math.abs(val) };\n })\n .filter((d): d is { name: string; importance: number } => d != null && d.importance > 0)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, MAX_DRIVERS);\n\n const max = entries.length > 0 ? entries[0].importance : 0;\n return entries.map(d => ({\n ...d,\n RelativePct: max > 0 ? Math.round((d.importance / max) * 100) : 0,\n }));\n }\n if (typeof rawDrivers === 'object') {\n return ParseDrivers(JSON.stringify(rawDrivers));\n }\n return [];\n}\n\n/** @deprecated Use {@link ParsePayloadDrivers}. */\nexport function parsePayloadDrivers(rawDrivers: unknown): PredictionDriver[] {\n return ParsePayloadDrivers(rawDrivers);\n}\n\n/**\n * Parse a raw `MJ: Process Run Details` row into a decorated {@link PredictionHistoryItem}.\n */\nexport function ParseHistoryItem(\n detail: RawProcessRunDetail,\n modelLookup?: Map<string, HistoryModelMetadata>,\n): PredictionHistoryItem {\n let rawPayload: Record<string, unknown> | null = null;\n let payloadSection: Record<string, unknown> | null = null;\n\n if (detail.ResultPayload) {\n try {\n const parsed = JSON.parse(detail.ResultPayload);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n rawPayload = parsed as Record<string, unknown>;\n const outputObj = rawPayload['output'];\n if (outputObj && typeof outputObj === 'object' && !Array.isArray(outputObj)) {\n payloadSection = outputObj as Record<string, unknown>;\n } else {\n payloadSection = rawPayload;\n }\n }\n } catch {\n rawPayload = null;\n payloadSection = null;\n }\n }\n\n const payloadModelId = typeof payloadSection?.['modelId'] === 'string' ? payloadSection['modelId'] : null;\n const modelMeta = payloadModelId && modelLookup ? modelLookup.get(payloadModelId) : undefined;\n\n const rawScore = payloadSection?.['score'] ?? payloadSection?.['value'] ?? null;\n const numericScore = ToNumber(rawScore);\n const predictedClass = typeof payloadSection?.['class'] === 'string' ? payloadSection['class'] : null;\n\n const probTypeStr = (typeof payloadSection?.['problemType'] === 'string' ? payloadSection['problemType'] : modelMeta?.ProblemType) ?? '';\n const problemType: ModelProblemType = probTypeStr.toLowerCase() === 'regression' ? 'regression' : 'classification';\n\n const kind = ValueKind(problemType, numericScore);\n const displayValue = predictedClass ?? FormatValue(rawScore, numericScore, kind);\n\n const targetVar = (typeof payloadSection?.['target'] === 'string' ? payloadSection['target'] : modelMeta?.TargetVariable) ?? '';\n const label = ResolveLabel(targetVar, null);\n\n const modelName = modelMeta?.Name ?? label;\n const provenance = modelMeta?.Pipeline && modelMeta?.Version\n ? `${modelMeta.Pipeline} v${modelMeta.Version}`\n : (modelMeta?.Name ?? 'Predictive Model');\n\n const completedAt = detail.CompletedAt ? (detail.CompletedAt instanceof Date ? detail.CompletedAt : new Date(detail.CompletedAt)) : null;\n const drivers = ParsePayloadDrivers(payloadSection?.['drivers']);\n\n const rawOutcomeConfig = (payloadSection?.['outcomeConfig'] ?? modelMeta?.outcomeConfig) as OutcomeConfig | undefined;\n const outcomeConfig = rawOutcomeConfig\n ? resolveOutcomeConfig({ outcomeConfig: rawOutcomeConfig })\n : resolveOutcomeConfig({\n Lineage: modelMeta?.Lineage ?? null,\n TargetVariable: targetVar || modelMeta?.TargetVariable || null,\n ProblemType: probTypeStr || modelMeta?.ProblemType || null,\n });\n\n let statusBand: OutcomeBand | null = null;\n let badgeColor: 'green' | 'amber' | 'red' | 'blue' | 'gray' = 'gray';\n let badgeIcon: string | null = null;\n let statusLabel: string | null = null;\n\n if (numericScore != null) {\n statusBand = resolveScoreBand(numericScore, outcomeConfig);\n if (statusBand) {\n badgeColor = statusBand.BadgeColor;\n badgeIcon = statusBand.Icon ?? null;\n statusLabel = statusBand.Label;\n }\n } else if (predictedClass) {\n const style = resolveOutcomeStyle(predictedClass, outcomeConfig);\n badgeColor = style.BadgeColor;\n badgeIcon = style.Icon ?? null;\n statusLabel = style.DisplayLabel ?? predictedClass;\n }\n\n return {\n id: detail.ID,\n ProcessRunId: detail.ProcessRunID,\n modelId: payloadModelId,\n ModelName: modelName,\n Provenance: provenance,\n target: targetVar || label,\n problemType,\n NumericValue: numericScore,\n PredictedClass: predictedClass,\n DisplayValue: displayValue,\n IsProbability: kind === 'probability',\n Band: kind === 'probability' && numericScore != null ? BandFor(numericScore) : null,\n StatusBand: statusBand,\n StatusLabel: statusLabel,\n BadgeColor: badgeColor,\n BadgeIcon: badgeIcon,\n status: detail.Status || 'Succeeded',\n CompletedAt: completedAt,\n FormattedTime: FormatHistoryTimestamp(completedAt),\n Drivers: drivers,\n ErrorMessage: detail.ErrorMessage,\n RawPayload: rawPayload,\n };\n}\n\n/** @deprecated Use {@link ParseHistoryItem}. */\nexport function parseHistoryItem(\n detail: RawProcessRunDetail,\n modelLookup?: Map<string, HistoryModelMetadata>,\n): PredictionHistoryItem {\n return ParseHistoryItem(detail, modelLookup);\n}\n\n/**\n * Filter prediction history by a selected model ID (or return all when null / 'ALL').\n */\nexport function FilterHistoryByModel(\n history: PredictionHistoryItem[],\n selectedModelId: string | null,\n): PredictionHistoryItem[] {\n if (!selectedModelId || selectedModelId === 'ALL') {\n return history;\n }\n return history.filter(item => item.modelId === selectedModelId);\n}\n\n/** @deprecated Use {@link FilterHistoryByModel}. */\nexport function filterHistoryByModel(\n history: PredictionHistoryItem[],\n selectedModelId: string | null,\n): PredictionHistoryItem[] {\n return FilterHistoryByModel(history, selectedModelId);\n}\n\n/**\n * Aggregate unique models from prediction history for multi-model tabs / filters.\n */\nexport function GetDistinctModelsFromHistory(history: PredictionHistoryItem[]): ModelHistorySummary[] {\n const counts = new Map<string, { ModelName: string; count: number }>();\n for (const item of history) {\n const id = item.modelId ?? 'UNKNOWN';\n const existing = counts.get(id);\n if (existing) {\n existing.count += 1;\n } else {\n counts.set(id, { ModelName: item.ModelName, count: 1 });\n }\n }\n return Array.from(counts.entries()).map(([modelId, data]) => ({\n modelId,\n ModelName: data.ModelName,\n count: data.count,\n }));\n}\n\n/** @deprecated Use {@link GetDistinctModelsFromHistory}. */\nexport function getDistinctModelsFromHistory(history: PredictionHistoryItem[]): ModelHistorySummary[] {\n return GetDistinctModelsFromHistory(history);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model-prediction.logic.js","sourceRoot":"","sources":["../../../../src/lib/panels/model-predictions/model-prediction.logic.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure, framework-free logic for the entity-agnostic Model Predictions panel.\n *\n * Extracted from the Angular component so the band computation, value\n * formatting, and feature-importance parsing can be unit-tested without\n * standing up Angular or a real entity record. NONE of this is entity-specific\n * or domain-specific — it operates purely on numbers, strings, and the model's\n * generic `ProblemType` / `FeatureImportance` JSON.\n */\n\nimport {\n ImportanceDisplay,\n OutcomeBand,\n OutcomeConfig,\n formatPredictionScore,\n resolveOutcomeConfig,\n resolveOutcomeStyle,\n resolveScoreBand,\n} from '@memberjunction/predictive-studio-core';\n\n/**\n * The neutral tercile a numeric prediction falls into. No moral direction is\n * implied — `low`/`mid`/`high` describe position on the value axis only.\n */\nexport type PredictionBand = 'low' | 'mid' | 'high';\n\n/** Generic problem types a trained model can have. */\nexport type ModelProblemType = 'classification' | 'regression';\n\n/** One normalized feature-importance driver for display. */\nexport interface PredictionDriver {\n /** Raw feature name as the model stored it. */\n name: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** Importance magnitude (absolute value of the raw contribution). */\n importance: number; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n /** Importance as a 0–100 share of the strongest driver, for the bar width. */\n RelativePct: number;\n}\n\n/** How a prediction's primary value should be rendered. */\nexport type PredictionValueKind = 'probability' | 'numeric' | 'class';\n\n/** Maximum number of feature-importance drivers shown per card. */\nexport const MAX_DRIVERS = 5;\n\n/**\n * Coerce a dynamic field value into a finite number, or null when it isn't one.\n */\nexport function ToNumber(value: unknown): number | null {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : null;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n }\n return null;\n}\n\n/** @deprecated Use {@link ToNumber}. */\nexport function toNumber(value: unknown): number | null {\n return ToNumber(value);\n}\n\n/**\n * Decide how to render a value given the model's problem type and the value.\n * - regression + numeric → 'numeric'\n * - classification + value in [0,1] → 'probability' (a confidence/score we can gauge)\n * - everything else (a class label, a missing value) → 'class'\n */\nexport function ValueKind(problemType: ModelProblemType, numeric: number | null): PredictionValueKind {\n const isRegression = problemType === 'regression';\n if (isRegression && numeric != null) {\n return 'numeric';\n }\n if (!isRegression && numeric != null && numeric >= 0 && numeric <= 1) {\n return 'probability';\n }\n return 'class';\n}\n\n/** @deprecated Use {@link ValueKind}. */\nexport function valueKind(problemType: ModelProblemType, numeric: number | null): PredictionValueKind {\n return ValueKind(problemType, numeric);\n}\n\n/**\n * Neutral tercile for a 0–1 value. Position on the value axis only — no\n * assumption that high is good or bad. Values are clamped to [0,1].\n */\nexport function BandFor(value: number): PredictionBand {\n const v = Math.max(0, Math.min(1, value));\n if (v < 1 / 3) return 'low';\n if (v < 2 / 3) return 'mid';\n return 'high';\n}\n\n/** @deprecated Use {@link BandFor}. */\nexport function bandFor(value: number): PredictionBand {\n return BandFor(value);\n}\n\n/** Round a 0–1 probability to an integer 0–100 gauge fill, clamped. */\nexport function GaugePct(value: number): number {\n return Math.round(Math.max(0, Math.min(1, value)) * 100);\n}\n\n/** @deprecated Use {@link GaugePct}. */\nexport function gaugePct(value: number): number {\n return GaugePct(value);\n}\n\n/**\n * Format the primary value for display:\n * - probability → \"72%\"\n * - numeric (regression) → grouped number, up to 4 decimals\n * - class label → the label string\n * - missing/empty → \"—\" (em dash)\n */\nexport function FormatValue(rawValue: unknown, numeric: number | null, kind: PredictionValueKind): string {\n if (kind === 'probability' && numeric != null) {\n return `${GaugePct(numeric)}%`;\n }\n if (kind === 'numeric' && numeric != null) {\n return numeric.toLocaleString(undefined, { maximumFractionDigits: 4 });\n }\n if (rawValue == null || rawValue === '') {\n return '—';\n }\n return String(rawValue);\n}\n\n/** @deprecated Use {@link FormatValue}. */\nexport function formatValue(rawValue: unknown, numeric: number | null, kind: PredictionValueKind): string {\n return FormatValue(rawValue, numeric, kind);\n}\n\n/**\n * Pick the human label for a prediction: prefer the model's target variable,\n * then the bound column name, then a generic fallback.\n */\nexport function ResolveLabel(targetVariable: string | null, targetColumn: string | null): string {\n const target = targetVariable?.trim();\n if (target) return target;\n const col = targetColumn?.trim();\n if (col) return col;\n return 'Prediction';\n}\n\n/** @deprecated Use {@link ResolveLabel}. */\nexport function resolveLabel(targetVariable: string | null, targetColumn: string | null): string {\n return ResolveLabel(targetVariable, targetColumn);\n}\n\n/**\n * Parse a model's `FeatureImportance` JSON (`Record<string, number>`) into the\n * top-N sorted drivers with relative bar widths. Returns [] on null / invalid /\n * empty input — the caller omits the drivers section cleanly when empty.\n */\nexport function ParseDrivers(featureImportanceJson: string | null): PredictionDriver[] {\n if (!featureImportanceJson) {\n return [];\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(featureImportanceJson);\n } catch {\n return [];\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return [];\n }\n const entries = Object.entries(parsed as Record<string, unknown>)\n .map(([name, raw]) => ({ name, importance: Math.abs(ToNumber(raw) ?? 0) }))\n .filter(d => d.importance > 0)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, MAX_DRIVERS);\n\n const max = entries.length > 0 ? entries[0].importance : 0;\n return entries.map(d => ({\n ...d,\n RelativePct: max > 0 ? Math.round((d.importance / max) * 100) : 0,\n }));\n}\n\n/** @deprecated Use {@link ParseDrivers}. */\nexport function parseDrivers(featureImportanceJson: string | null): PredictionDriver[] {\n return ParseDrivers(featureImportanceJson);\n}\n\n/** The global drivers a prediction card may show. */\nexport class PredictionDrivers {\n /** Global drivers for a model's card: 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 DriversForModel(lineageJSON: string | null | undefined, featureImportanceJson: string | null): PredictionDriver[] {\n return ImportanceDisplay.GlobalDriversShowable(lineageJSON) ? ParseDrivers(featureImportanceJson) : [];\n }\n\n /**\n * True when the model has stored importances that {@link DriversForModel} withholds because of their kind, so the card\n * shows {@link ImportanceDisplay.HiddenNote} in their place (the same note the model detail page shows).\n */\n public static DriversHidden(lineageJSON: string | null | undefined, featureImportanceJson: string | null): boolean {\n return !ImportanceDisplay.GlobalDriversShowable(lineageJSON) && ParseDrivers(featureImportanceJson).length > 0;\n }\n}\n\n/** Format a last-scored timestamp to a short date, or null when absent/invalid. */\nexport function FormatLastScored(lastScoredAt: Date | string | null): string | null {\n if (!lastScoredAt) {\n return null;\n }\n const d = lastScoredAt instanceof Date ? lastScoredAt : new Date(lastScoredAt);\n if (isNaN(d.getTime())) {\n return null;\n }\n return d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\n/** @deprecated Use {@link FormatLastScored}. */\nexport function formatLastScored(lastScoredAt: Date | string | null): string | null {\n return FormatLastScored(lastScoredAt);\n}\n\n/**\n * A resolved historical prediction row from `MJ: Process Run Details` for an entity record.\n */\nexport interface PredictionHistoryItem {\n /** The MJ: Process Run Details primary key ID */\n id: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** The parent Process Run ID */\n ProcessRunId: string;\n /** Model ID if resolved from payload or model lookup */\n modelId: string | null; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** Resolved model name (e.g. \"Member Churn Risk\" or \"LatePaymentOutcome\") */\n ModelName: string;\n /** Resolved pipeline & version string (e.g. \"Pipeline v1\") */\n Provenance: string;\n /** Target variable / label */\n target: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** Problem type: classification or regression */\n problemType: ModelProblemType; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** Primary numeric value / score */\n NumericValue: number | null;\n /** Class label if classification */\n PredictedClass: string | null;\n /** Formatted display value (e.g. \"88%\", \"Late\", \"1,240.5\") */\n DisplayValue: string;\n /** True if 0–1 probability we can gauge/badge */\n IsProbability: boolean;\n /** Neutral band: 'low' | 'mid' | 'high' */\n Band: PredictionBand | null;\n /** Resolved semantic status band from outcomeConfig */\n StatusBand: OutcomeBand | null;\n /** Human-readable status label (e.g. \"Low Risk\", \"High\") */\n StatusLabel: string | null;\n /** Semantic badge color ('green' | 'amber' | 'red' | 'blue' | 'gray') */\n BadgeColor: 'green' | 'amber' | 'red' | 'blue' | 'gray';\n /** Icon class if specified in band/style */\n BadgeIcon: string | null;\n /** Execution status: 'Succeeded' | 'Failed' | 'Pending' | 'Skipped' */\n status: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n /** When processing completed */\n CompletedAt: Date | null;\n /** Formatted date/time for history display */\n FormattedTime: string;\n /** Drivers if available in payload */\n Drivers: PredictionDriver[];\n /** Error message if Failed */\n ErrorMessage: string | null;\n /** Full raw payload object for JSON inspection */\n RawPayload: Record<string, unknown> | null;\n}\n\n/** Summary descriptor of a model represented in prediction history. */\nexport interface ModelHistorySummary {\n modelId: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n ModelName: string;\n count: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n}\n\n/** Input contract for parsing a Process Run Detail record. */\nexport interface RawProcessRunDetail {\n ID: string;\n ProcessRunID: string;\n Status: string;\n CompletedAt: Date | string | null;\n ResultPayload: string | null;\n ErrorMessage: string | null;\n}\n\n/** Model metadata lookup contract for decorating history items. */\nexport interface HistoryModelMetadata {\n Name?: string;\n Pipeline?: string;\n Version?: number;\n ProblemType?: string;\n TargetVariable?: string;\n Lineage?: string | null;\n outcomeConfig?: OutcomeConfig | null; // case-violation-ok-legacy-back-compat: optional, and the old name is also read off a value the checker cannot type; renaming it stays assignable and silently yields undefined\n}\n\n/**\n * Format a history completion timestamp with date and time.\n */\nexport function FormatHistoryTimestamp(date: Date | string | null): string {\n if (!date) return '—';\n const d = date instanceof Date ? date : new Date(date);\n if (isNaN(d.getTime())) return '—';\n return d.toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n}\n\n/** @deprecated Use {@link FormatHistoryTimestamp}. */\nexport function formatHistoryTimestamp(date: Date | string | null): string {\n return FormatHistoryTimestamp(date);\n}\n\n/**\n * Parse an array of drivers from payload driver shapes (array of { feature, value } or map).\n */\nexport function ParsePayloadDrivers(rawDrivers: unknown): PredictionDriver[] {\n if (!rawDrivers) return [];\n if (Array.isArray(rawDrivers)) {\n const entries = rawDrivers\n .map((item: unknown) => {\n if (!item || typeof item !== 'object') return null;\n const rec = item as Record<string, unknown>;\n const name = typeof rec['feature'] === 'string' ? rec['feature'] : (typeof rec['name'] === 'string' ? rec['name'] : '');\n const val = ToNumber(rec['value'] ?? rec['importance']);\n if (!name || val == null) return null;\n return { name, importance: Math.abs(val) };\n })\n .filter((d): d is { name: string; importance: number } => d != null && d.importance > 0)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, MAX_DRIVERS);\n\n const max = entries.length > 0 ? entries[0].importance : 0;\n return entries.map(d => ({\n ...d,\n RelativePct: max > 0 ? Math.round((d.importance / max) * 100) : 0,\n }));\n }\n if (typeof rawDrivers === 'object') {\n return ParseDrivers(JSON.stringify(rawDrivers));\n }\n return [];\n}\n\n/** @deprecated Use {@link ParsePayloadDrivers}. */\nexport function parsePayloadDrivers(rawDrivers: unknown): PredictionDriver[] {\n return ParsePayloadDrivers(rawDrivers);\n}\n\n/**\n * Parse a raw `MJ: Process Run Details` row into a decorated {@link PredictionHistoryItem}.\n */\nexport function ParseHistoryItem(\n detail: RawProcessRunDetail,\n modelLookup?: Map<string, HistoryModelMetadata>,\n): PredictionHistoryItem {\n let rawPayload: Record<string, unknown> | null = null;\n let payloadSection: Record<string, unknown> | null = null;\n\n if (detail.ResultPayload) {\n try {\n const parsed = JSON.parse(detail.ResultPayload);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n rawPayload = parsed as Record<string, unknown>;\n const outputObj = rawPayload['output'];\n if (outputObj && typeof outputObj === 'object' && !Array.isArray(outputObj)) {\n payloadSection = outputObj as Record<string, unknown>;\n } else {\n payloadSection = rawPayload;\n }\n }\n } catch {\n rawPayload = null;\n payloadSection = null;\n }\n }\n\n const payloadModelId = typeof payloadSection?.['modelId'] === 'string' ? payloadSection['modelId'] : null;\n const modelMeta = payloadModelId && modelLookup ? modelLookup.get(payloadModelId) : undefined;\n\n const rawScore = payloadSection?.['score'] ?? payloadSection?.['value'] ?? null;\n const numericScore = ToNumber(rawScore);\n const predictedClass = typeof payloadSection?.['class'] === 'string' ? payloadSection['class'] : null;\n\n const probTypeStr = (typeof payloadSection?.['problemType'] === 'string' ? payloadSection['problemType'] : modelMeta?.ProblemType) ?? '';\n const problemType: ModelProblemType = probTypeStr.toLowerCase() === 'regression' ? 'regression' : 'classification';\n\n const kind = ValueKind(problemType, numericScore);\n const displayValue = predictedClass ?? FormatValue(rawScore, numericScore, kind);\n\n const targetVar = (typeof payloadSection?.['target'] === 'string' ? payloadSection['target'] : modelMeta?.TargetVariable) ?? '';\n const label = ResolveLabel(targetVar, null);\n\n const modelName = modelMeta?.Name ?? label;\n const provenance = modelMeta?.Pipeline && modelMeta?.Version\n ? `${modelMeta.Pipeline} v${modelMeta.Version}`\n : (modelMeta?.Name ?? 'Predictive Model');\n\n const completedAt = detail.CompletedAt ? (detail.CompletedAt instanceof Date ? detail.CompletedAt : new Date(detail.CompletedAt)) : null;\n const drivers = ParsePayloadDrivers(payloadSection?.['drivers']);\n\n const rawOutcomeConfig = (payloadSection?.['outcomeConfig'] ?? modelMeta?.outcomeConfig) as OutcomeConfig | undefined;\n const outcomeConfig = rawOutcomeConfig\n ? resolveOutcomeConfig({ outcomeConfig: rawOutcomeConfig })\n : resolveOutcomeConfig({\n Lineage: modelMeta?.Lineage ?? null,\n TargetVariable: targetVar || modelMeta?.TargetVariable || null,\n ProblemType: probTypeStr || modelMeta?.ProblemType || null,\n });\n\n let statusBand: OutcomeBand | null = null;\n let badgeColor: 'green' | 'amber' | 'red' | 'blue' | 'gray' = 'gray';\n let badgeIcon: string | null = null;\n let statusLabel: string | null = null;\n\n if (numericScore != null) {\n statusBand = resolveScoreBand(numericScore, outcomeConfig);\n if (statusBand) {\n badgeColor = statusBand.BadgeColor;\n badgeIcon = statusBand.Icon ?? null;\n statusLabel = statusBand.Label;\n }\n } else if (predictedClass) {\n const style = resolveOutcomeStyle(predictedClass, outcomeConfig);\n badgeColor = style.BadgeColor;\n badgeIcon = style.Icon ?? null;\n statusLabel = style.DisplayLabel ?? predictedClass;\n }\n\n return {\n id: detail.ID,\n ProcessRunId: detail.ProcessRunID,\n modelId: payloadModelId,\n ModelName: modelName,\n Provenance: provenance,\n target: targetVar || label,\n problemType,\n NumericValue: numericScore,\n PredictedClass: predictedClass,\n DisplayValue: displayValue,\n IsProbability: kind === 'probability',\n Band: kind === 'probability' && numericScore != null ? BandFor(numericScore) : null,\n StatusBand: statusBand,\n StatusLabel: statusLabel,\n BadgeColor: badgeColor,\n BadgeIcon: badgeIcon,\n status: detail.Status || 'Succeeded',\n CompletedAt: completedAt,\n FormattedTime: FormatHistoryTimestamp(completedAt),\n Drivers: drivers,\n ErrorMessage: detail.ErrorMessage,\n RawPayload: rawPayload,\n };\n}\n\n/** @deprecated Use {@link ParseHistoryItem}. */\nexport function parseHistoryItem(\n detail: RawProcessRunDetail,\n modelLookup?: Map<string, HistoryModelMetadata>,\n): PredictionHistoryItem {\n return ParseHistoryItem(detail, modelLookup);\n}\n\n/**\n * Filter prediction history by a selected model ID (or return all when null / 'ALL').\n */\nexport function FilterHistoryByModel(\n history: PredictionHistoryItem[],\n selectedModelId: string | null,\n): PredictionHistoryItem[] {\n if (!selectedModelId || selectedModelId === 'ALL') {\n return history;\n }\n return history.filter(item => item.modelId === selectedModelId);\n}\n\n/** @deprecated Use {@link FilterHistoryByModel}. */\nexport function filterHistoryByModel(\n history: PredictionHistoryItem[],\n selectedModelId: string | null,\n): PredictionHistoryItem[] {\n return FilterHistoryByModel(history, selectedModelId);\n}\n\n/**\n * Aggregate unique models from prediction history for multi-model tabs / filters.\n */\nexport function GetDistinctModelsFromHistory(history: PredictionHistoryItem[]): ModelHistorySummary[] {\n const counts = new Map<string, { ModelName: string; count: number }>();\n for (const item of history) {\n const id = item.modelId ?? 'UNKNOWN';\n const existing = counts.get(id);\n if (existing) {\n existing.count += 1;\n } else {\n counts.set(id, { ModelName: item.ModelName, count: 1 });\n }\n }\n return Array.from(counts.entries()).map(([modelId, data]) => ({\n modelId,\n ModelName: data.ModelName,\n count: data.count,\n }));\n}\n\n/** @deprecated Use {@link GetDistinctModelsFromHistory}. */\nexport function getDistinctModelsFromHistory(history: PredictionHistoryItem[]): ModelHistorySummary[] {\n return GetDistinctModelsFromHistory(history);\n}\n"]}
|
|
@@ -37,6 +37,8 @@ export interface PredictionCard {
|
|
|
37
37
|
BadgeIcon: string | null;
|
|
38
38
|
/** Top feature-importance drivers, or empty when unavailable. */
|
|
39
39
|
Drivers: PredictionDriver[];
|
|
40
|
+
/** True when the model has importances that are hidden because of their kind (split / impurity counts). */
|
|
41
|
+
DriversHidden: boolean;
|
|
40
42
|
/** Provenance: "Pipeline Name v3". */
|
|
41
43
|
Provenance: string;
|
|
42
44
|
/** "Last scored" timestamp string, or null when unavailable. */
|
|
@@ -63,6 +65,8 @@ export declare class ModelPredictionPanel extends BaseFormPanel implements OnIni
|
|
|
63
65
|
private cdr;
|
|
64
66
|
/** The resolved cards to render. Empty → panel renders nothing. */
|
|
65
67
|
Cards: PredictionCard[];
|
|
68
|
+
/** The note shown in place of a model's hidden drivers. */
|
|
69
|
+
readonly DriversHiddenNote: string;
|
|
66
70
|
/** True once the binding lookup has completed (success or empty). */
|
|
67
71
|
Loaded: boolean;
|
|
68
72
|
/** Resolved models by ID for lineage and history decoration. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-prediction.panel.d.ts","sourceRoot":"","sources":["../../../../src/lib/panels/model-predictions/model-prediction.panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,MAAM,EAAU,MAAM,eAAe,CAAC;AAE7E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,OAAO,EAAE,eAAe,EAA2D,MAAM,+BAA+B,CAAC;AACzH,OAAO,
|
|
1
|
+
{"version":3,"file":"model-prediction.panel.d.ts","sourceRoot":"","sources":["../../../../src/lib/panels/model-predictions/model-prediction.panel.ts"],"names":[],"mappings":"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"}
|