@memberjunction/ng-core-entity-forms 6.2.0-edge.3 → 6.2.0-edge.5
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/AIAgents/ai-agent-form.component.d.ts +12 -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 +43 -26
- 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 +7 -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 +191 -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.js +324 -322
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +16 -3
- package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts.map +1 -1
- package/dist/lib/custom/Conversations/conversation-overview.panel.js +103 -43
- package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +8 -0
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +18 -4
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/Files/file-form.component.d.ts +5 -5
- package/dist/lib/custom/Files/file-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Files/file-form.component.js +227 -157
- package/dist/lib/custom/Files/file-form.component.js.map +1 -1
- package/dist/lib/custom/Files/file-form.logic.d.ts +24 -0
- package/dist/lib/custom/Files/file-form.logic.d.ts.map +1 -0
- package/dist/lib/custom/Files/file-form.logic.js +57 -0
- package/dist/lib/custom/Files/file-form.logic.js.map +1 -0
- package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +3 -2
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +2 -2
- 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.js +2 -2
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.d.ts +34 -0
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.d.ts.map +1 -0
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.js +33 -0
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.js.map +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +3 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +261 -242
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.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 +164 -43
- 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 -79
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +16 -2
- 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 +115 -117
- 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/MJCommunicationProvider/mjcommunicationprovider.form.component.js +30 -20
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +32 -14
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationBranch/mjconversationbranch.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJConversationBranch/mjconversationbranch.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJConversationBranch/mjconversationbranch.form.component.js +111 -0
- package/dist/lib/generated/Entities/MJConversationBranch/mjconversationbranch.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +59 -67
- 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/MJEntity/mjentity.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +112 -94
- package/dist/lib/generated/Entities/MJEntity/mjentity.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/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/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/MJScopedNotificationConfig/mjscopednotificationconfig.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJScopedNotificationConfig/mjscopednotificationconfig.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJScopedNotificationConfig/mjscopednotificationconfig.form.component.js +106 -0
- package/dist/lib/generated/Entities/MJScopedNotificationConfig/mjscopednotificationconfig.form.component.js.map +1 -0
- 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 +788 -714
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUserNotificationType/mjusernotificationtype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUserNotificationType/mjusernotificationtype.form.component.js +24 -6
- package/dist/lib/generated/Entities/MJUserNotificationType/mjusernotificationtype.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/generated-forms.module.d.ts +286 -281
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +15 -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/shared/components/template-editor.component.js +2 -2
- 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 -47
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-agent-run-step-detail.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAqB,MAAM,eAAe,CAAC;AAE1F,OAAO,EAAE,sBAAsB,EAA+C,MAAM,+BAA+B,CAAC;AACpH,OAAO,EAAE,yBAAyB,EAAsB,MAAM,8BAA8B,CAAC;AAE7F,OAAO,EAAE,kBAAkB,EAAoB,MAAM,wBAAwB,CAAC;;;;;;;;;;;;IC0BtE,+BAAyB;IACvB,+BAA6F;IAC/F,iBAAM;;;IADM,cAA8B;IAAW,AAAzC,mDAA8B,sCAAyC;;;;IAMjF,AADF,+BAAyB,iBACgE;IAA9D,iNAAS,iEAAmD,KAAC;IACpF,wBAAwC;IAAC,2CAC3C;IACF,AADE,iBAAS,EACL;;;;IAMF,kCAGoC;IAAlC,sPAAyB,OAAO,KAAC;IACjC,wBAA2C;IAC3C,0BACF;IAAA,iBAAS;;;IAJP,0DAA0C;;;;IAO5C,kCAGmC;IAAjC,sPAAyB,MAAM,KAAC;IAChC,wBAAuC;IACvC,iCACF;IAAA,iBAAS;;;IAJP,yDAAyC;;;;IAO3C,kCAGqC;IAAnC,sPAAyB,QAAQ,KAAC;IAClC,wBAA+C;IAC/C,wBACA;IAAA,gCAAwB;IAAA,YAAiC;IAC3D,AAD2D,iBAAO,EACzD;;;IALP,2DAA2C;IAInB,eAAiC;IAAjC,wDAAiC;;;IAWvD,gCAAwB;IAAA,YAA+B;IAAA,iBAAO;;;IAAtC,cAA+B;IAA/B,sDAA+B;;;;IAP3D,kCAGyC;IAAvC,sPAAyB,YAAY,KAAC;IACtC,wBAA0C;IAC1C,4BACA;IAAA,4IAAqC;IAGvC,iBAAS;;;IAPP,+DAA+C;IAI/C,eAEC;IAFD,+DAEC;;;;IAtCP,+BAA8B;IAC5B,gIAAoB;IASpB,gIAA2B;IAS3B,gIAAqB;IAUrB,gIAAyB;IAYzB,kCAGmC;IAAjC,wOAAyB,MAAM,KAAC;IAChC,wBAAgC;IAChC,2BACF;IACF,AADE,iBAAS,EACL;;;IA/CJ,cAQC;IARD,8CAQC;IACD,cAQC;IARD,qDAQC;IACD,cASC;IATD,+CASC;IACD,cAWC;IAXD,mDAWC;IAGC,cAAyC;IAAzC,yDAAyC;;;IAgBrC,+BAEW;;;IAUb,6CAMyB;;;IAFvB,AADA,AADA,0CAAqB,qBACQ,yGAC6B;;;IAM5D,2CAOuB;;;IADrB,AADA,AADA,AADA,AADA,2CAAsB,gDACkB,kBACvB,sBACI,qBACD;;;;IAhCxB,AADF,+BAA0B,cACW;IACjC,kIAA8B;IAO9B,kCAA+E;IAAlC,iNAAS,8BAAuB,KAAC;IAC5E,wBAAuC;IAAC,kCAC1C;IACF,AADE,iBAAS,EACL;IAYJ,AAXF,gJAAkD,wHAWzC;IAYX,iBAAM;;;;IAlCF,eAMC;IAND,wDAMC;IAKH,eAsBC;IAtBD,+EAsBC;;;IAiBK,+BAAqC;IACnC,wBAAsC;IACtC,YACF;IAAA,iBAAM;;;IADJ,eACF;IADE,+CACF;;;IAZA,AADF,AADF,+BAA+E,cACxC,eACC;IAClC,wBAA+C;IAC/C,YACF;IAAA,iBAAO;IACP,gCAAgF;IAC9E,YACF;IACF,AADE,iBAAO,EACH;IACN,mIAAkB;IAOhB,AADF,+BAAyC,cACT;IAAA,wCAAuB;IAAA,iBAAM;IAEzD,AADF,gCAA4B,gBACK;IAAA,6BAAY;IAAA,iBAAO;IAClD,iCAA+B;IAAA,aAAgG;IACjI,AADiI,iBAAO,EAClI;IAEJ,AADF,gCAA4B,gBACK;IAAA,oCAAmB;IAAA,iBAAO;IACzD,iCAA+B;IAAA,aAAuC;IACxE,AADwE,iBAAO,EACzE;IAEJ,AADF,gCAA4B,gBACK;IAAA,qCAAoB;IAAA,iBAAO;IAC1D,iCAA+B;IAAA,aAAwC;IACzE,AADyE,iBAAO,EAC1E;IAEJ,AADF,gCAA4B,gBACK;IAAA,0CAAyB;IAAA,iBAAO;IAC/D,iCAA+B;IAAA,aAA6C;IAC9E,AAD8E,iBAAO,EAC/E;IAEJ,AADF,gCAA4B,gBACK;IAAA,yBAAQ;IAAA,iBAAO;IAC9C,iCAA6C;IAAA,aAAiB;IAGpE,AADE,AADE,AADgE,iBAAO,EACjE,EACF,EACF;;;;;IAnCA,eACF;IADE,kDACF;IACoC,cAA2C;;IAC7E,cACF;IADE,uEACF;IAEF,cAKC;IALD,yCAKC;IAKkC,eAAgG;IAAhG,oHAAgG;IAIhG,eAAuC;IAAvC,2DAAuC;IAIvC,eAAwC;IAAxC,4DAAwC;IAIxC,eAA6C;IAA7C,iEAA6C;IAI/B,eAAiB;IAAjB,qCAAiB;;;IAtCxE,+BAA4B;IAC1B,gIAyCC;IACH,iBAAM;;;IA1CJ,cAyCC;IAzCD,0CAyCC;;;IAKH,+BAA+B;IAC7B,mCAUe;IACjB,iBAAM;;;IAVF,cAAqC;IAQrC,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,0DAAqC,2CACF,aACvB,qBACQ,wBACG,oBACJ,eACL,wBACS,8BACM;;;IA+BzB,mCAUe;;;IADb,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,qDAAgC,yCACC,aACrB,qBACQ,wBACG,mBACL,eACJ,wBACS,8BACM;;;IAQ7B,wBAAqH;;;IALvH,qCAG6D;IAC7D,+BAAiC;IAC/B,2JAAsG;IACxG,iBAAM;;;;IADW,eAAyC;IAAA,AAAzC,4DAAyC,oFAA4C;;;IAGtG,qCAG+C;;;IAzBnD,+BAAkC;IAqB9B,AARA,AAZF,qJAAmD,2GAYhB,iIAQ1B;IAMX,iBAAM;;;IA1BJ,cAyBC;IAzBD,qHAyBC;;;IAOC,wBAAoH;;;IAApH,2JAAqG;;;;IAA7C,AAAzC,4DAAyC,mFAA2C;;;IAEnG,qCAG8C;;;IAPlD,+BAAsC;IAGlC,AAFF,iJAA2B,iIAElB;IAMX,iBAAM;;;IARJ,cAOC;IAPD,oDAOC;;;IAOC,wBAAqH;;;IAArH,2JAAsG;;;;IAA9C,AAAzC,4DAAyC,oFAA4C;;;IAEpG,qCAG+C;;;IAPnD,+BAAsC;IAGlC,AAFF,iJAA4B,iIAEnB;IAMX,iBAAM;;;IARJ,cAOC;IAPD,qDAOC;;;;IAzEH,AADF,AADF,+BAAgC,cACG,iBAIO;IAApC,4OAA4B,MAAM,KAAC;IACnC,wBAAwC;IAAC,sBAC3C;IAAA,iBAAS;IACT,kCAGuC;IAArC,4OAA4B,OAAO,KAAC;IACpC,wBAAkD;IAAC,uBACrD;IAAA,iBAAS;IACT,kCAGwC;IAAtC,4OAA4B,QAAQ,KAAC;IACrC,wBAAoD;IAAC,yBACvD;IACF,AADE,iBAAS,EACL;IAEN,+HAAmC;IA+BnC,+HAAoC;IAapC,+HAAqC;IAYvC,iBAAM;;;IA1EA,eAA4C;IAA5C,4DAA4C;IAM5C,eAA6C;IAA7C,6DAA6C;IAM7C,eAA8C;IAA9C,8DAA8C;IAMlD,eA6BC;IA7BD,8DA6BC;IAED,cAWC;IAXD,+DAWC;IAED,cAWC;IAXD,gEAWC;;;;IAOC,AADF,AADF,+BAAyB,cACG,iBACiD;IAA9B,kNAAS,0BAAmB,KAAC;IACtE,wBAA2B;IAE/B,AADE,iBAAS,EACL;IACN,0CAIuB;IAHrB,2WAAoC;IAKxC,AADE,iBAAiB,EACb;;;IALF,eAAoC;IAApC,6DAAoC;IAEpC,AADA,iCAAmB,kBACF;;;;IAjSzB,AADF,AADF,8BAA8B,aACE,SACxB;IACF,uBAAyD;IACzD,YACF;IAAA,iBAAK;IACL,iCAAgE;IAAvC,iMAAS,qBAAc,KAAC;IAC/C,uBAA4B;IAEhC,AADE,iBAAS,EACL;IAIA,AADF,AADF,AADF,8BAA+B,aACN,aACE,aACd;IAAA,qBAAI;IAAA,iBAAQ;IACnB,6BAAM;IAAA,aAA+B;IACvC,AADuC,iBAAO,EACxC;IAEJ,AADF,+BAAuB,aACd;IAAA,uBAAM;IAAA,iBAAQ;IACrB,gCAAkF;IAChF,aACF;IACF,AADE,iBAAO,EACH;IAEJ,AADF,+BAAuB,aACd;IAAA,yBAAQ;IAAA,iBAAQ;IACvB,6BAAM;IAAA,aAA4C;IAEtD,AADE,AADoD,iBAAO,EACrD,EACF;IAGN,gHAAkB;IAMlB,gHAA+E;IAQ/E,gHAAiF;IAoDjF,gCAA+H;IAE7H,gHAAiD;IAuCjD,gHAAmD;IA+CnD,gHAAuD;IAgBvD,iHAA2D;IAkF3D,gHAAgF;IAiBtF,AADE,AADE,iBAAM,EACF,EACF;;;IAvSe,eAAqC;IAArC,0DAAqC;IACpD,cACF;IADE,kEACF;IASU,eAA+B;IAA/B,sDAA+B;IAIJ,eAAgD;;IAC/E,cACF;IADE,mEACF;IAIM,eAA4C;IAA5C,mEAA4C;IAKtD,cAIC;IAJD,6CAIC;IAED,cAMC;IAND,oKAMC;IAED,cAkDC;IAlDD,iIAkDC;IAEgC,cAA6F;IAA7F,kIAA6F;IAE5H,cAsCC;IAtCD,mFAsCC;IACD,cA6CC;IA7CD,qFA6CC;IAED,cAcC;IAdD,yFAcC;IAED,cAgFC;IAhFD,6FAgFC;IAED,cAcC;IAdD,uHAcC;;;IAWD,AADF,+BAAsC,SAChC;IAAA,wBAAuC;IAAC,sBAAK;IAAA,iBAAK;IACtD,+BAAsC;IAAA,YAAoB;IAC5D,AAD4D,iBAAM,EAC5D;;;IADkC,eAAoB;IAApB,wCAAoB;;;IAW1B,wBAAwC;;;IACtC,wBAAmC;;;IACvC,wBAAwC;;;IACjD,wBAAoC;;;IAO/C,gCAAyB;IAAA,YAAgB;IAAA,iBAAO;;;IAAvB,cAAgB;IAAhB,oCAAgB;;;IAZ7C,AADF,+BAAmE,eACI;IAKjE,AADA,AADA,AADA,yHAAqB,mGACE,mGACJ,mGACT;IAEd,iBAAO;IAEL,AADF,+BAA0B,eACF;IAAA,YAAa;IAAA,iBAAO;IAC1C,gCAAyB;IAAA,aAAgB;IAAA,iBAAO;IAChD,qIAAkB;IAGpB,iBAAM;IACN,iCAAiE;IAAA,aAAiB;IACpF,AADoF,iBAAO,EACrF;;;;;IAhBgC,cAAgC;;IAClE,cAKC;IALD,kDAAA,WAAW,oBAAX,aAAa,oBAAb,SAAS,SAKR;IAGqB,eAAa;IAAb,iCAAa;IACV,eAAgB;IAAhB,oCAAgB;IACzC,cAEC;IAFD,0CAEC;IAE6B,cAAgC;;IAAC,cAAiB;IAAjB,qCAAiB;;;IAnBxF,AADF,+BAAsC,SAChC;IAAA,wBAAsC;IAAC,YAAmC;IAAA,iBAAK;IACnF,+BAAkC;IAChC,8HAmBC;IAEL,AADE,iBAAM,EACF;;;IAvBuC,eAAmC;IAAnC,iEAAmC;IAE5E,eAmBC;IAnBD,iCAmBC;;;IAKL,qCAG6B;;;IAtCjC,+BAAiC;IAC/B,8GAAsB;IAMtB,8GAAkC;IA2BlC,yHAA2E;IAM7E,iBAAM;;;IAvCJ,cAKC;IALD,6CAKC;IACD,cA0BC;IA1BD,8FA0BC;IACD,cAKC;IALD,0GAKC;;AD/TL,MAAM,OAAO,6BAA6B;IAGxC,oDAAoD;IACpD,IAAa,oBAAoB,CAAC,KAA0B;QAC1D,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;IACpC,CAAC;IACD,oDAAoD;IACpD,IAAI,oBAAoB;QACtB,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAqDD,sDAAsD;IACtD,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IACD,sDAAsD;IACtD,IAAI,sBAAsB,CAAC,KAAK;QAC9B,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACtC,CAAC;IAGD,6CAA6C;IAC7C,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,6CAA6C;IAC7C,IAAI,aAAa,CAAC,KAA0D;QAC1E,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAGD,gDAAgD;IAChD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IACD,gDAAgD;IAChD,IAAI,gBAAgB,CAAC,KAAkC;QACrD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAED,YAAoB,GAAsB;QAAtB,QAAG,GAAH,GAAG,CAAmB;QA3FjC,yBAAoB,GAAwB,IAAI,CAAC;QAU1D,gFAAgF;QACvE,aAAQ,GAA6B,IAAI,CAAC;QACzC,eAAU,GAAG,IAAI,YAAY,EAAQ,CAAC;QAEhD;;;;;;WAMG;QACO,eAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAC7B,wBAAmB,GAAG,IAAI,YAAY,EAAU,CAAC;QAE3D;;;;;;WAMG;QACO,wBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAC/C,oBAAe,GAAG,IAAI,YAAY,EAAU,CAAC;QAEvD;;;;;;WAMG;QACO,oBAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QACjD;;;;;;WAMG;QACO,4BAAuB,GAAG,IAAI,YAAY,EAAiB,CAAC;QAEtE;;;;;;WAMG;QACO,4BAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC;QAEjE,2BAAsB,GAAG,IAAI,CAAC;QAU9B,kBAAa,GAAwD,MAAM,CAAC;QAU5E,qBAAgB,GAAgC,MAAM,CAAC;IAWV,CAAC;IAE9C,WAAW;QACT,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzD,0FAA0F;YAC1F,4DAA4D;YAC5D,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC7B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;YAC9B,CAAC;iBAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC7B,wFAAwF;gBACxF,iCAAiC;gBACjC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC/B,CAAC;iBAAM,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACtF,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;YAChC,CAAC;iBAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAClC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;YACpC,CAAC;iBAAM,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC9B,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;YAC9B,CAAC;YACD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,IAAI,UAAU;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc;YAAE,OAAO,IAAI,CAAC;QAE7C,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,SAAS;gBACZ,OAAO;oBACL,OAAO,EAAE,MAAM;oBACf,OAAO,EAAE,gFAAgF;wBAChF,oFAAoF;wBACpF,uDAAuD;iBACjE,CAAC;YACJ,KAAK,SAAS;gBACZ,OAAO;oBACL,OAAO,EAAE,OAAO;oBAChB,OAAO,EAAE,iFAAiF;wBACjF,0EAA0E;iBACpF,CAAC;YACJ,KAAK,SAAS;gBACZ,OAAO;oBACL,OAAO,EAAE,SAAS;oBAClB,OAAO,EAAE,oFAAoF;wBACpF,kFAAkF;wBAClF,sBAAsB;iBAChC,CAAC;YACJ;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAAE,OAAO,IAAI,CAAC;QAE5C,mCAAmC;QACnC,IAAI,IAAI,CAAC;QACT,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,YAAY,sBAAsB,EAAE,CAAC;YACrE,0DAA0D;YAC1D,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QACxC,CAAC;QAED,yDAAyD;QACzD,MAAM,YAAY,GAAqB;YACrC,iBAAiB,EAAE,IAAI;YACvB,QAAQ,EAAE,GAAG;YACb,KAAK,EAAE,KAAK;SACb,CAAC;QACF,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAE1D,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,mDAAmD;IACnD,mBAAmB;QACjB,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,IAAI,mBAAmB;QACrB,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAChD,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;eAC3C,QAAQ,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YAC1D,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ,CAAC,YAAY,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAI,wBAAwB;QAC1B,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,cAAc;YAAE,OAAO,IAAI,CAAC;QAE3C,IAAI,CAAC;YACH,0EAA0E;YAC1E,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC;YAC1C,IAAI,CAAC;gBACH,qDAAqD;gBACrD,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,uCAAuC;gBACvC,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC;YACxC,CAAC;YAED,MAAM,YAAY,GAAqB;gBACrC,iBAAiB,EAAE,IAAI;gBACvB,QAAQ,EAAE,GAAG;gBACb,KAAK,EAAE,KAAK;aACb,CAAC;YACF,OAAO,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,wBAAwB;QAC1B,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,IAAI,sBAAsB;QACxB,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,YAAY;YAAE,OAAO,IAAI,CAAC;QAEzC,IAAI,CAAC;YACH,wEAAwE;YACxE,IAAI,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC;YACxC,IAAI,CAAC;gBACH,mDAAmD;gBACnD,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,uCAAuC;gBACvC,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC;YACtC,CAAC;YAED,MAAM,YAAY,GAAqB;gBACrC,iBAAiB,EAAE,IAAI;gBACvB,QAAQ,EAAE,GAAG;gBACb,KAAK,EAAE,KAAK;aACb,CAAC;YACF,OAAO,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED,YAAY;QACV,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,4CAA4C;IAC5C,YAAY;QACV,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAED,qBAAqB,CAAC,KAAa;QACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,qDAAqD;IACrD,qBAAqB,CAAC,KAAa;QACjC,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,iDAAiD;IACjD,iBAAiB;QACf,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,6CAA6C;IAC7C,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAI,oBAAoB;QACtB,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5E,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/D,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,IAAI,oBAAoB;QACtB,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED,gEAAgE;IACzD,sBAAsB,CAAC,GAAgD;QAC5E,OAAO,GAAG,CAAC,cAAc,KAAK,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IACxF,CAAC;IAED;;;;;;OAMG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;IACrC,CAAC;IAED,4CAA4C;IAC5C,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,IAAI,aAAa;QACf,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QACzF,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAE1E,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;YAC1G,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC/D,MAAM,IAAI,GAAI,MAAmC,EAAE,IAAI,CAAC;gBACxD,IAAI,IAAI,EAAE,KAAK,EAAE,MAAM;oBAAE,OAAO,IAAI,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,sFAAsF;gBACtF,iCAAiC;YACnC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6CAA6C;IAC7C,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;;;;;;OAQG;IACH,IAAI,sBAAsB;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;QAChC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,sDAAsD;IACtD,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,IAAI,yBAAyB;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,UAAU,CAAC;QACxD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/D,MAAM,EAAE,GAAI,MAAqC,EAAE,YAAY,CAAC;YAChE,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,IAAI,yBAAyB;QAC3B,OAAO,IAAI,CAAC,yBAAyB,CAAC;IACxC,CAAC;IAED,oFAAoF;IACpF,IAAI,sBAAsB;QACxB,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAAE,OAAO,KAAK,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC;QACtD,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/D,OAAQ,MAA+B,EAAE,MAAM,KAAK,IAAI,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED,qEAAqE;IAC9D,qBAAqB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;QAChC,IAAI,IAAI;YAAE,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,IAAI,iBAAiB;QACnB,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,mBAAmB,KAAK,IAAI,IAAI,IAAI,CAAC,oBAAoB,KAAK,IAAI,CAAC;IACjF,CAAC;IAED,iDAAiD;IACjD,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;IAED,mDAAmD;IACnD,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAI,oBAAoB;QACtB,OAAO,IAAI,CAAC,0BAA0B,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,oDAAoD;IACpD,IAAI,oBAAoB;QACtB,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAI,yBAAyB;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACzC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;QAEzF,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5D,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnG,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,EAAE,CAAC,CAAC,gBAAgB;QACrD,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QAC5C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,yDAAyD;IACzD,IAAI,yBAAyB;QAC3B,OAAO,IAAI,CAAC,yBAAyB,CAAC;IACxC,CAAC;IAEO,0BAA0B,CAAC,SAAqC;QACtE,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAChD,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,IAAI,CAAC;YACH,IAAI,MAAM,GAAG,QAAQ,CAAC;YACtB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,CAAC;YACtC,IAAI,CAAC,UAAU;gBAAE,OAAO,IAAI,CAAC;YAC7B,OAAO;gBACL,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC7B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;aAC/D,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;8HA3jBU,6BAA6B;oEAA7B,6BAA6B;YCxB1C,iGAA4B;YA+S5B,+HAAiD;;YA/SjD,mDA4SC;;;iFDpRY,6BAA6B;cANzC,SAAS;6BACI,KAAK,YACP,6BAA6B;;kBAKtC,KAAK;;kBAGL,KAAK;;kBAQL,KAAK;;kBACL,MAAM;;kBASN,MAAM;;kBACN,MAAM;;kBASN,MAAM;;kBACN,MAAM;;kBASN,MAAM;;kBAQN,MAAM;;kBASN,MAAM;;kFA3DI,6BAA6B","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';\nimport { TimelineItem } from './ai-agent-run-timeline.component';\nimport { MJAIAgentRunStepEntity, MJAIAgentRunStepEntity_AgentSkillInvocation } from '@memberjunction/core-entities';\nimport { ResolveTaskGraphPositions, type TaskGraphSpec } from '@memberjunction/ai-core-plus';\nimport type { FlowPosition } from '@memberjunction/ng-flow-editor';\nimport { ParseJSONRecursive, ParseJSONOptions } from '@memberjunction/global';\nimport type { IMetadataProvider } from '@memberjunction/core';\n\ninterface ScratchpadSnapshotView {\n notes: string;\n tasks: Array<{\n id: string;\n title: string;\n status: string;\n notes?: string;\n }>;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-step-detail',\n templateUrl: './ai-agent-run-step-detail.component.html',\n styleUrls: ['./ai-agent-run-step-detail.component.css']\n})\nexport class AIAgentRunStepDetailComponent {\n @Input() SelectedTimelineItem: TimelineItem | null = null;\n\n /** @deprecated Use {@link SelectedTimelineItem}. */\n @Input() set selectedTimelineItem(value: TimelineItem | null) {\n this.SelectedTimelineItem = value;\n }\n /** @deprecated Use {@link SelectedTimelineItem}. */\n get selectedTimelineItem(): TimelineItem | null {\n return this.SelectedTimelineItem;\n }\n /** The provider the host is on, so the run view reads through the right one. */\n @Input() Provider: IMetadataProvider | null = null;\n @Output() ClosePanel = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link ClosePanel}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (closePanel) keeps working. Must stay AFTER ClosePanel: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() closePanel = this.ClosePanel;\n @Output() NavigateToActionLog = new EventEmitter<string>();\n\n /**\n * @deprecated Use {@link NavigateToActionLog}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (navigateToActionLog) keeps working. Must stay AFTER NavigateToActionLog: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() navigateToActionLog = this.NavigateToActionLog;\n @Output() CopyToClipboard = new EventEmitter<string>();\n\n /**\n * @deprecated Use {@link CopyToClipboard}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (copyToClipboard) keeps working. Must stay AFTER CopyToClipboard: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() copyToClipboard = this.CopyToClipboard;\n /**\n * The user asked to promote this run's graph into a reusable workflow (D17).\n *\n * Intent only — this component renders a run, it does not persist agents. The host performs the\n * conversion and the `AgentSpecSync` write, which keeps the one place that writes an agent the\n * one place that writes an agent.\n */\n @Output() SaveAsWorkflowRequested = new EventEmitter<TaskGraphSpec>();\n\n /**\n * @deprecated Use {@link SaveAsWorkflowRequested}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (saveAsWorkflowRequested) keeps working. Must stay AFTER SaveAsWorkflowRequested: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() saveAsWorkflowRequested = this.SaveAsWorkflowRequested;\n\n SelectedItemJsonString = '{}';\n\n /** @deprecated Use {@link SelectedItemJsonString}. */\n get selectedItemJsonString() {\n return this.SelectedItemJsonString;\n }\n /** @deprecated Use {@link SelectedItemJsonString}. */\n set selectedItemJsonString(value) {\n this.SelectedItemJsonString = value;\n }\n DetailPaneTab: 'json' | 'diff' | 'scratchpad' | 'skills' | 'graph' = 'diff';\n\n /** @deprecated Use {@link DetailPaneTab}. */\n get detailPaneTab(): 'json' | 'diff' | 'scratchpad' | 'skills' | 'graph' {\n return this.DetailPaneTab;\n }\n /** @deprecated Use {@link DetailPaneTab}. */\n set detailPaneTab(value: 'json' | 'diff' | 'scratchpad' | 'skills' | 'graph') {\n this.DetailPaneTab = value;\n }\n ScratchpadSubTab: 'input' | 'output' | 'diff' = 'diff';\n\n /** @deprecated Use {@link ScratchpadSubTab}. */\n get scratchpadSubTab(): 'input' | 'output' | 'diff' {\n return this.ScratchpadSubTab;\n }\n /** @deprecated Use {@link ScratchpadSubTab}. */\n set scratchpadSubTab(value: 'input' | 'output' | 'diff') {\n this.ScratchpadSubTab = value;\n }\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnChanges() {\n if (this.SelectedTimelineItem) {\n this.SelectedItemJsonString = this.GetSelectedItemJson();\n // Default to diff tab if step has payload diff, skills for Skill steps (the activation IS\n // the story there), scratchpad if available, otherwise json\n if (this.ShowStepPayloadDiff) {\n this.DetailPaneTab = 'diff';\n } else if (this.ShowGraphTab) {\n // A TaskGraph step's whole content IS the graph; opening on the JSON would bury the one\n // thing the step exists to show.\n this.DetailPaneTab = 'graph';\n } else if (this.ShowSkillsTab && this.SelectedTimelineItem.data?.StepType === 'Skill') {\n this.DetailPaneTab = 'skills';\n } else if (this.ShowScratchpadTab) {\n this.DetailPaneTab = 'scratchpad';\n } else if (this.ShowSkillsTab) {\n this.DetailPaneTab = 'skills';\n } else {\n this.DetailPaneTab = 'json';\n }\n this.ScratchpadSubTab = 'diff';\n this.cdr.detectChanges();\n }\n }\n\n /**\n * What to say about a step that never executed, or null when it ran.\n *\n * **Why this needs saying at all.** A workflow persists every step at submission, before anything\n * runs — the rows are the dispatcher's work queue, and the skip cascade is computed from the graph\n * they form. So a branch the workflow did not take still has a row, and opening it shows a\n * perfectly normal record with empty payloads. Without a word of explanation the reader is left to\n * work out whether that emptiness is a branch that was not chosen, work still queued, or a step\n * that broke silently — three very different situations that look identical in JSON.\n *\n * The distinction between Skipped and Blocked is load-bearing and deliberately preserved here:\n * `Skipped` means the workflow chose another route, `Blocked` means something upstream failed. The\n * dispatcher separated them precisely because conflating them made every conditional workflow look\n * half-broken.\n */\n get StepNotice(): { Variant: 'info' | 'warning' | 'error'; Message: string } | null {\n const item = this.SelectedTimelineItem;\n if (!item?.data?.IsWorkflowStep) return null;\n\n switch (item.status) {\n case 'Skipped':\n return {\n Variant: 'info',\n Message: 'This step never ran — the workflow took another route. Its row exists because ' +\n 'every step is created when the workflow is submitted, so the record of the branch ' +\n 'that was not taken survives. Nothing went wrong here.',\n };\n case 'Blocked':\n return {\n Variant: 'error',\n Message: 'This step could not run: something it depended on failed, so no path to it was ' +\n 'left. It is not a branch that lost — it is work that became unreachable.',\n };\n case 'Pending':\n return {\n Variant: 'warning',\n Message: 'This step has not started yet. A workflow runs on the dispatcher and outlives the ' +\n 'agent run that submitted it, so a finished run can still contain steps that are ' +\n 'queued or in flight.',\n };\n default:\n return null;\n }\n }\n\n GetSelectedItemJson(): string {\n if (!this.SelectedTimelineItem) return '{}';\n \n // Get all the data from the entity\n let data;\n if (this.SelectedTimelineItem.data instanceof MJAIAgentRunStepEntity) {\n // If it's a step entity, we need to get the full run data\n data = this.SelectedTimelineItem.data.GetAll();\n } else {\n data = this.SelectedTimelineItem.data;\n }\n \n // Apply recursive JSON parsing to the entire data object\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsedData = ParseJSONRecursive(data, parseOptions);\n \n return JSON.stringify(parsedData, null, 2);\n }\n\n /** @deprecated Use {@link GetSelectedItemJson}. */\n getSelectedItemJson(): string {\n return this.GetSelectedItemJson();\n }\n\n /**\n * Check if selected timeline item is a step with payload changes\n */\n get ShowStepPayloadDiff(): boolean {\n if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {\n return false;\n }\n \n const stepData = this.SelectedTimelineItem.data;\n if (stepData && (stepData.PayloadAtStart?.trim().length > 0 \n || stepData.PayloadAtEnd?.trim().length > 0)) {\n return stepData.PayloadAtStart !== stepData.PayloadAtEnd;\n } else {\n return false;\n }\n }\n\n /** @deprecated Use {@link ShowStepPayloadDiff}. */\n get showStepPayloadDiff(): boolean {\n return this.ShowStepPayloadDiff;\n }\n\n /**\n * Get parsed PayloadAtStart for the selected step\n */\n get StepPayloadAtStartObject(): any {\n if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {\n return null;\n }\n \n const stepData = this.SelectedTimelineItem.data;\n if (!stepData?.PayloadAtStart) return null;\n \n try {\n // First, check if PayloadAtStart is a JSON string that needs to be parsed\n let payloadData = stepData.PayloadAtStart;\n try {\n // If PayloadAtStart is a JSON string, parse it first\n payloadData = JSON.parse(stepData.PayloadAtStart);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = stepData.PayloadAtStart;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n\n /** @deprecated Use {@link StepPayloadAtStartObject}. */\n get stepPayloadAtStartObject(): any {\n return this.StepPayloadAtStartObject;\n }\n\n /**\n * Get parsed PayloadAtEnd for the selected step\n */\n get StepPayloadAtEndObject(): any {\n if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {\n return null;\n }\n \n const stepData = this.SelectedTimelineItem.data;\n if (!stepData?.PayloadAtEnd) return null;\n \n try {\n // First, check if PayloadAtEnd is a JSON string that needs to be parsed\n let payloadData = stepData.PayloadAtEnd;\n try {\n // If PayloadAtEnd is a JSON string, parse it first\n payloadData = JSON.parse(stepData.PayloadAtEnd);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = stepData.PayloadAtEnd;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n\n /** @deprecated Use {@link StepPayloadAtEndObject}. */\n get stepPayloadAtEndObject(): any {\n return this.StepPayloadAtEndObject;\n }\n\n OnClosePanel() {\n this.ClosePanel.emit();\n }\n\n /** @deprecated Use {@link OnClosePanel}. */\n onClosePanel() {\n return this.OnClosePanel();\n }\n\n OnNavigateToActionLog(logId: string) {\n this.NavigateToActionLog.emit(logId);\n }\n\n /** @deprecated Use {@link OnNavigateToActionLog}. */\n onNavigateToActionLog(logId: string) {\n return this.OnNavigateToActionLog(logId);\n }\n\n OnCopyToClipboard() {\n this.CopyToClipboard.emit(this.GetSelectedItemJson());\n }\n\n /** @deprecated Use {@link OnCopyToClipboard}. */\n onCopyToClipboard() {\n return this.OnCopyToClipboard();\n }\n\n /**\n * Whether the Skills tab should be shown — true when the step has skill-invocation records\n * on its `Skills` column (Skill steps, Prompt steps with skills in effect, and Actions/\n * Sub-Agent steps whose tool was granted through a skill).\n */\n get ShowSkillsTab(): boolean {\n return this.StepSkillInvocations.length > 0;\n }\n\n /** @deprecated Use {@link ShowSkillsTab}. */\n get showSkillsTab(): boolean {\n return this.ShowSkillsTab;\n }\n\n /**\n * Parsed {@link MJAIAgentRunStepEntity_AgentSkillInvocation} records from the step's `Skills`\n * JSON column. Empty array when the step has no skill linkage or the JSON is malformed.\n */\n get StepSkillInvocations(): MJAIAgentRunStepEntity_AgentSkillInvocation[] {\n if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {\n return [];\n }\n const raw = this.SelectedTimelineItem.data?.Skills;\n if (!raw) return [];\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n /** @deprecated Use {@link StepSkillInvocations}. */\n get stepSkillInvocations(): MJAIAgentRunStepEntity_AgentSkillInvocation[] {\n return this.StepSkillInvocations;\n }\n\n /** Human-readable label for an invocation's activation type. */\n public GetActivationTypeLabel(inv: MJAIAgentRunStepEntity_AgentSkillInvocation): string {\n return inv.ActivationType === 'requested' ? 'User Requested' : 'Agent Self-Activated';\n }\n\n /**\n * Whether the Workflow tab should be shown — true for a `TaskGraph` step that carries a spec.\n *\n * Phase 3 writes this step for EVERY emitted graph, dispatched or constant-folded, so a folded\n * single-node graph is just as promotable as a dispatched one. That was the point of recording\n * the fold rather than letting it vanish.\n */\n get ShowGraphTab(): boolean {\n return this.StepTaskGraph !== null;\n }\n\n /** @deprecated Use {@link ShowGraphTab}. */\n get showGraphTab(): boolean {\n return this.ShowGraphTab;\n }\n\n /**\n * The `TaskGraphSpec` recorded on a `TaskGraph` step, or null.\n *\n * Read from InputData, falling back to OutputData: the step records the spec on the way in, and\n * a malformed or absent payload simply means no tab rather than a broken panel.\n */\n get StepTaskGraph(): TaskGraphSpec | null {\n if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') return null;\n if (this.SelectedTimelineItem.data?.StepType !== 'TaskGraph') return null;\n\n for (const raw of [this.SelectedTimelineItem.data?.InputData, this.SelectedTimelineItem.data?.OutputData]) {\n if (!raw) continue;\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n const spec = (parsed as { spec?: TaskGraphSpec })?.spec;\n if (spec?.tasks?.length) return spec;\n } catch {\n // A step whose payload cannot be parsed shows no tab, which is honest — better than a\n // canvas rendering half a graph.\n }\n }\n return null;\n }\n\n /** @deprecated Use {@link StepTaskGraph}. */\n get stepTaskGraph(): TaskGraphSpec | null {\n return this.StepTaskGraph;\n }\n\n /**\n * Where the recorded graph's nodes go on the canvas.\n *\n * Without this the editor receives a spec and no geometry, so every node projects to the origin —\n * all of them, in one place. The canvas then rescues it with a deferred layout pass whose\n * zoom-to-fit measures a bounding box one node wide, and a four-step workflow renders as a single\n * enormous box at 265%. The positions exist the whole time: a workflow compiled from a Flow agent\n * carries the arrangement its author dragged into place, on every node.\n */\n get StepTaskGraphPositions(): Map<string, FlowPosition> | null {\n const spec = this.StepTaskGraph;\n if (!spec) return null;\n return ResolveTaskGraphPositions(spec);\n }\n\n /** @deprecated Use {@link StepTaskGraphPositions}. */\n get stepTaskGraphPositions(): Map<string, FlowPosition> | null {\n return this.StepTaskGraphPositions;\n }\n\n /**\n * The graph's parent `MJ: Tasks` row, when this step actually dispatched one.\n *\n * **This is what turns the panel from a picture of the plan into a picture of the run.** With it,\n * the same `mj-task-graph-run-view` the Workflows app uses reads the Task rows and draws what\n * happened — declined branches hatched, untravelled edges absent, the toolbar available and the\n * legend off. Without it the panel had only the SPEC, so it rendered in design mode: every branch\n * drawn as though it had run, on a canvas that could not know otherwise.\n *\n * Null for a graph that was constant-folded (D9) — it never reached the dispatcher, so there are no\n * rows and no run to show. The spec view is the honest rendering there: it is a plan, and it is\n * drawn as one.\n */\n get StepTaskGraphParentTaskID(): string | null {\n const raw = this.SelectedTimelineItem?.data?.OutputData;\n if (!raw) return null;\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n const id = (parsed as { parentTaskID?: unknown })?.parentTaskID;\n return typeof id === 'string' && id.length > 0 ? id : null;\n } catch {\n return null;\n }\n }\n\n /** @deprecated Use {@link StepTaskGraphParentTaskID}. */\n get stepTaskGraphParentTaskID(): string | null {\n return this.StepTaskGraphParentTaskID;\n }\n\n /** True when the recorded graph was constant-folded rather than dispatched (D9). */\n get StepTaskGraphWasFolded(): boolean {\n if (!this.SelectedTimelineItem) return false;\n const raw = this.SelectedTimelineItem.data?.InputData;\n if (!raw) return false;\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n return (parsed as { folded?: boolean })?.folded === true;\n } catch {\n return false;\n }\n }\n\n /** @deprecated Use {@link StepTaskGraphWasFolded}. */\n get stepTaskGraphWasFolded(): boolean {\n return this.StepTaskGraphWasFolded;\n }\n\n /** Asks the host to save this run's graph as a reusable workflow. */\n public RequestSaveAsWorkflow(): void {\n const spec = this.StepTaskGraph;\n if (spec) this.SaveAsWorkflowRequested.emit(spec);\n }\n\n /**\n * Whether the scratchpad tab should be shown (step has scratchpad data in InputData or OutputData)\n */\n get ShowScratchpadTab(): boolean {\n if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {\n return false;\n }\n return this.StepScratchpadInput !== null || this.StepScratchpadOutput !== null;\n }\n\n /** @deprecated Use {@link ShowScratchpadTab}. */\n get showScratchpadTab(): boolean {\n return this.ShowScratchpadTab;\n }\n\n /**\n * Parse scratchpad snapshot from InputData JSON\n */\n get StepScratchpadInput(): ScratchpadSnapshotView | null {\n return this.extractScratchpadFromField('InputData');\n }\n\n /** @deprecated Use {@link StepScratchpadInput}. */\n get stepScratchpadInput(): ScratchpadSnapshotView | null {\n return this.StepScratchpadInput;\n }\n\n /**\n * Parse scratchpad snapshot from OutputData JSON\n */\n get StepScratchpadOutput(): ScratchpadSnapshotView | null {\n return this.extractScratchpadFromField('OutputData');\n }\n\n /** @deprecated Use {@link StepScratchpadOutput}. */\n get stepScratchpadOutput(): ScratchpadSnapshotView | null {\n return this.StepScratchpadOutput;\n }\n\n /**\n * Number of tasks that changed between input and output scratchpad snapshots\n */\n get ScratchpadTaskChangeCount(): number {\n const input = this.StepScratchpadInput;\n const output = this.StepScratchpadOutput;\n if (!input && !output) return 0;\n if (!input || !output) return (output?.tasks?.length ?? 0) + (input?.tasks?.length ?? 0);\n\n let changes = 0;\n const inputMap = new Map(input.tasks.map(t => [t.id, t]));\n const outputMap = new Map(output.tasks.map(t => [t.id, t]));\n\n for (const [id, task] of outputMap) {\n const prev = inputMap.get(id);\n if (!prev || prev.status !== task.status || prev.title !== task.title || prev.notes !== task.notes) {\n changes++;\n }\n }\n for (const id of inputMap.keys()) {\n if (!outputMap.has(id)) changes++; // removed tasks\n }\n if (input.notes !== output.notes) changes++;\n return changes;\n }\n\n /** @deprecated Use {@link ScratchpadTaskChangeCount}. */\n get scratchpadTaskChangeCount(): number {\n return this.ScratchpadTaskChangeCount;\n }\n\n private extractScratchpadFromField(fieldName: 'InputData' | 'OutputData'): ScratchpadSnapshotView | null {\n if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {\n return null;\n }\n\n const stepData = this.SelectedTimelineItem.data;\n const rawValue = stepData?.[fieldName];\n if (!rawValue) return null;\n\n try {\n let parsed = rawValue;\n if (typeof parsed === 'string') {\n parsed = JSON.parse(parsed);\n }\n const scratchpad = parsed?.scratchpad;\n if (!scratchpad) return null;\n return {\n notes: scratchpad.notes ?? '',\n tasks: Array.isArray(scratchpad.tasks) ? scratchpad.tasks : []\n };\n } catch {\n return null;\n }\n }\n}","@if (selectedTimelineItem) {\n <div class=\"json-detail-pane\">\n <div class=\"json-pane-header\">\n <h3>\n <i class=\"fas\" [ngClass]=\"selectedTimelineItem.icon\"></i>\n {{ selectedTimelineItem.title }}\n </h3>\n <button class=\"btn-icon\" (click)=\"onClosePanel()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"json-pane-content\">\n <div class=\"json-meta\">\n <div class=\"meta-item\">\n <label>Type</label>\n <span>{{ selectedTimelineItem.type }}</span>\n </div>\n <div class=\"meta-item\">\n <label>Status</label>\n <span class=\"status-badge small\" [attr.data-status]=\"selectedTimelineItem.status\">\n {{ selectedTimelineItem.status }}\n </span>\n </div>\n <div class=\"meta-item\">\n <label>Duration</label>\n <span>{{ selectedTimelineItem.duration || 'N/A' }}</span>\n </div>\n </div>\n <!-- Why a workflow step has nothing to show: it never ran. Above the tabs, because it explains\n the emptiness the reader is about to look at. -->\n @if (StepNotice) {\n <div class=\"step-notice\">\n <mj-alert [Variant]=\"StepNotice.Variant\" Size=\"sm\" [Message]=\"StepNotice.Message\"></mj-alert>\n </div>\n }\n <!-- Action-specific link -->\n @if (selectedTimelineItem.type === 'action' && selectedTimelineItem.data?.ID) {\n <div class=\"action-link\">\n <button class=\"btn-link\" (click)=\"onNavigateToActionLog(selectedTimelineItem.data.ID)\">\n <i class=\"fas fa-external-link-alt\"></i> View Action Execution Log\n </button>\n </div>\n }\n <!-- Tab Navigation - Show when we have payload diff or scratchpad data -->\n @if (showStepPayloadDiff || showScratchpadTab || showSkillsTab || showGraphTab) {\n <div class=\"detail-pane-tabs\">\n @if (showGraphTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'graph'\"\n (click)=\"detailPaneTab = 'graph'\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n Workflow\n </button>\n }\n @if (showStepPayloadDiff) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'diff'\"\n (click)=\"detailPaneTab = 'diff'\">\n <i class=\"fa-solid fa-code-branch\"></i>\n Payload Changes\n </button>\n }\n @if (showSkillsTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'skills'\"\n (click)=\"detailPaneTab = 'skills'\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n Skills\n <span class=\"tab-badge\">{{ stepSkillInvocations.length }}</span>\n </button>\n }\n @if (showScratchpadTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'scratchpad'\"\n (click)=\"detailPaneTab = 'scratchpad'\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n Scratchpad\n @if (scratchpadTaskChangeCount > 0) {\n <span class=\"tab-badge\">{{ scratchpadTaskChangeCount }}</span>\n }\n </button>\n }\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'json'\"\n (click)=\"detailPaneTab = 'json'\">\n <i class=\"fa-solid fa-code\"></i>\n Full JSON\n </button>\n </div>\n }\n <!-- Tab Content -->\n <div class=\"detail-pane-content\" [class.with-tabs]=\"showStepPayloadDiff || showScratchpadTab || showSkillsTab || showGraphTab\">\n <!-- Skills Tab — skill-invocation observability (activation type, provenance of authority, reason) -->\n @if (detailPaneTab === 'graph' && showGraphTab) {\n <div class=\"detail-graph\">\n <div class=\"detail-graph__actions\">\n @if (stepTaskGraphWasFolded) {\n <!-- The fold is recorded rather than silent (D9), so the reader can see WHY this\n graph never reached the dispatcher instead of inferring it. -->\n <mj-alert Variant=\"info\" Size=\"sm\"\n Message=\"This ran inline as a single step — a workflow of one needs no scheduling. You can still save it.\">\n </mj-alert>\n }\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"RequestSaveAsWorkflow()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Workflow\n </button>\n </div>\n @if (stepTaskGraphParentTaskID; as parentTaskID) {\n <!-- The RUN, not the plan. Same component the Workflows app uses, so a workflow is\n drawn identically wherever it is opened from — declined branches hatched,\n untravelled edges absent, toolbar on, legend off. -->\n <mj-task-graph-run-view\n class=\"detail-graph__canvas\"\n [Provider]=\"Provider\"\n [ParentTaskID]=\"parentTaskID\"\n [WorkflowName]=\"stepTaskGraph?.workflowName || 'Workflow'\"\n Height=\"100%\">\n </mj-task-graph-run-view>\n } @else {\n <!-- No dispatcher rows to read: a folded graph never ran. Drawing the spec is the\n honest rendering — it is a plan, and it is drawn as one. -->\n <mj-task-graph-editor\n class=\"detail-graph__canvas\"\n [Spec]=\"stepTaskGraph\"\n [NodePositions]=\"stepTaskGraphPositions\"\n [ReadOnly]=\"true\"\n [ShowPalette]=\"false\"\n [ShowLegend]=\"false\">\n </mj-task-graph-editor>\n }\n </div>\n }\n @if (detailPaneTab === 'skills' && showSkillsTab) {\n <div class=\"skills-content\">\n @for (inv of stepSkillInvocations; track inv.SkillID) {\n <div class=\"skill-invocation-card\" [attr.data-activation]=\"inv.ActivationType\">\n <div class=\"skill-invocation-header\">\n <span class=\"skill-invocation-name\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n {{ inv.SkillName }}\n </span>\n <span class=\"skill-invocation-type\" [attr.data-activation]=\"inv.ActivationType\">\n {{ GetActivationTypeLabel(inv) }}\n </span>\n </div>\n @if (inv.Reason) {\n <div class=\"skill-invocation-reason\">\n <i class=\"fa-solid fa-quote-left\"></i>\n {{ inv.Reason }}\n </div>\n }\n <div class=\"skill-invocation-provenance\">\n <div class=\"provenance-title\">Provenance of Authority</div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Requested By</span>\n <span class=\"provenance-value\">{{ inv.Provenance.RequestedBy === 'user-request' ? 'User (/skill mention)' : 'Agent decision' }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Agent AcceptsSkills</span>\n <span class=\"provenance-value\">{{ inv.Provenance.AgentAcceptsSkills }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Skill ActivationMode</span>\n <span class=\"provenance-value\">{{ inv.Provenance.SkillActivationMode }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Agent SkillActivationMode</span>\n <span class=\"provenance-value\">{{ inv.Provenance.AgentSkillActivationMode }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Skill ID</span>\n <span class=\"provenance-value provenance-id\">{{ inv.SkillID }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n <!-- Payload Diff Tab -->\n @if (detailPaneTab === 'diff' && showStepPayloadDiff) {\n <div class=\"step-payload-diff\">\n <mj-deep-diff\n [oldValue]=\"stepPayloadAtStartObject\"\n [newValue]=\"stepPayloadAtEndObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"8\"\n [maxStringLength]=\"150\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n </div>\n }\n <!-- Scratchpad Tab -->\n @if (detailPaneTab === 'scratchpad' && showScratchpadTab) {\n <div class=\"scratchpad-content\">\n <div class=\"scratchpad-sub-tabs\">\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'diff'\"\n (click)=\"scratchpadSubTab = 'diff'\">\n <i class=\"fa-solid fa-code-compare\"></i> Diff\n </button>\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'input'\"\n (click)=\"scratchpadSubTab = 'input'\">\n <i class=\"fa-solid fa-arrow-right-to-bracket\"></i> Input\n </button>\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'output'\"\n (click)=\"scratchpadSubTab = 'output'\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i> Output\n </button>\n </div>\n <!-- Scratchpad Diff Sub-Tab -->\n @if (scratchpadSubTab === 'diff') {\n <div class=\"scratchpad-diff-view\">\n @if (stepScratchpadInput && stepScratchpadOutput) {\n <mj-deep-diff\n [oldValue]=\"stepScratchpadInput\"\n [newValue]=\"stepScratchpadOutput\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"true\"\n [maxDepth]=\"6\"\n [maxStringLength]=\"300\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n } @else if (stepScratchpadOutput) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-plus\"\n Title=\"Scratchpad created in this step (no prior state)\" />\n <div class=\"scratchpad-snapshot\">\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadOutput }\"></ng-container>\n </div>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad changes in this step\" />\n }\n </div>\n }\n <!-- Scratchpad Input Sub-Tab -->\n @if (scratchpadSubTab === 'input') {\n <div class=\"scratchpad-snapshot-view\">\n @if (stepScratchpadInput) {\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadInput }\"></ng-container>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad input for this step\" />\n }\n </div>\n }\n <!-- Scratchpad Output Sub-Tab -->\n @if (scratchpadSubTab === 'output') {\n <div class=\"scratchpad-snapshot-view\">\n @if (stepScratchpadOutput) {\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadOutput }\"></ng-container>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad output for this step\" />\n }\n </div>\n }\n </div>\n }\n <!-- Full JSON Tab -->\n @if (detailPaneTab === 'json' || (!showStepPayloadDiff && !showScratchpadTab)) {\n <div class=\"json-viewer\">\n <div class=\"json-toolbar\">\n <button class=\"btn-icon\" title=\"Copy JSON\" (click)=\"onCopyToClipboard()\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n <mj-code-editor\n [(ngModel)]=\"selectedItemJsonString\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Reusable scratchpad snapshot template -->\n<ng-template #scratchpadSnapshotTpl let-snapshot>\n <div class=\"scratchpad-snapshot\">\n @if (snapshot.notes) {\n <div class=\"scratchpad-notes-section\">\n <h4><i class=\"fa-solid fa-note-sticky\"></i> Notes</h4>\n <div class=\"scratchpad-notes-content\">{{ snapshot.notes }}</div>\n </div>\n }\n @if (snapshot.tasks?.length > 0) {\n <div class=\"scratchpad-tasks-section\">\n <h4><i class=\"fa-solid fa-list-check\"></i> Tasks ({{ snapshot.tasks.length }})</h4>\n <div class=\"scratchpad-task-list\">\n @for (task of snapshot.tasks; track task.id) {\n <div class=\"scratchpad-task-item\" [attr.data-status]=\"task.status\">\n <span class=\"task-status-indicator\" [attr.data-status]=\"task.status\">\n @switch (task.status) {\n @case ('completed') { <i class=\"fa-solid fa-circle-check\"></i> }\n @case ('in_progress') { <i class=\"fa-solid fa-spinner\"></i> }\n @case ('blocked') { <i class=\"fa-solid fa-circle-xmark\"></i> }\n @default { <i class=\"fa-regular fa-circle\"></i> }\n }\n </span>\n <div class=\"task-content\">\n <span class=\"task-id\">{{ task.id }}</span>\n <span class=\"task-title\">{{ task.title }}</span>\n @if (task.notes) {\n <span class=\"task-notes\">{{ task.notes }}</span>\n }\n </div>\n <span class=\"task-status-badge\" [attr.data-status]=\"task.status\">{{ task.status }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (!snapshot.notes && (!snapshot.tasks || snapshot.tasks.length === 0)) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"Empty scratchpad\" />\n }\n </div>\n</ng-template>"]}
|
|
1
|
+
{"version":3,"file":"ai-agent-run-step-detail.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectorRef, ViewChild } from '@angular/core';\nimport { TimelineItem } from './ai-agent-run-timeline.component';\nimport { MJAIAgentRunStepEntity, MJAIAgentRunStepEntity_AgentSkillInvocation } from '@memberjunction/core-entities';\nimport { ResolveTaskGraphPositions, type TaskGraphSpec } from '@memberjunction/ai-core-plus';\nimport type { FlowPosition } from '@memberjunction/ng-flow-editor';\nimport { TaskGraphRunViewComponent } from '@memberjunction/ng-task-graph-editor';\nimport { ParseJSONRecursive, ParseJSONOptions } from '@memberjunction/global';\nimport type { IMetadataProvider } from '@memberjunction/core';\n\ninterface ScratchpadSnapshotView {\n notes: string;\n tasks: Array<{\n id: string;\n title: string;\n status: string;\n notes?: string;\n }>;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-step-detail',\n templateUrl: './ai-agent-run-step-detail.component.html',\n styleUrls: ['./ai-agent-run-step-detail.component.css']\n})\nexport class AIAgentRunStepDetailComponent {\n @Input() SelectedTimelineItem: TimelineItem | null = null;\n\n /** @deprecated Use {@link SelectedTimelineItem}. */\n @Input() set selectedTimelineItem(value: TimelineItem | null) {\n this.SelectedTimelineItem = value;\n }\n /** @deprecated Use {@link SelectedTimelineItem}. */\n get selectedTimelineItem(): TimelineItem | null {\n return this.SelectedTimelineItem;\n }\n /** The provider the host is on, so the run view reads through the right one. */\n @Input() Provider: IMetadataProvider | null = null;\n /** True while the host is persisting the workflow via WorkflowSaveOperation. */\n @Input() SavingWorkflow = false;\n @Output() ClosePanel = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link ClosePanel}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (closePanel) keeps working. Must stay AFTER ClosePanel: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() closePanel = this.ClosePanel;\n @Output() NavigateToActionLog = new EventEmitter<string>();\n\n /**\n * @deprecated Use {@link NavigateToActionLog}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (navigateToActionLog) keeps working. Must stay AFTER NavigateToActionLog: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() navigateToActionLog = this.NavigateToActionLog;\n @Output() CopyToClipboard = new EventEmitter<string>();\n\n /**\n * @deprecated Use {@link CopyToClipboard}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (copyToClipboard) keeps working. Must stay AFTER CopyToClipboard: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() copyToClipboard = this.CopyToClipboard;\n /**\n * The user asked to promote this run's graph into a reusable workflow (D17).\n *\n * Intent only — this component renders a run, it does not persist agents. The host performs the\n * conversion and the `AgentSpecSync` write, which keeps the one place that writes an agent the\n * one place that writes an agent.\n */\n @Output() SaveAsWorkflowRequested = new EventEmitter<TaskGraphSpec>();\n\n /**\n * @deprecated Use {@link SaveAsWorkflowRequested}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (saveAsWorkflowRequested) keeps working. Must stay AFTER SaveAsWorkflowRequested: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() saveAsWorkflowRequested = this.SaveAsWorkflowRequested;\n\n SelectedItemJsonString = '{}';\n\n /** @deprecated Use {@link SelectedItemJsonString}. */\n get selectedItemJsonString() {\n return this.SelectedItemJsonString;\n }\n /** @deprecated Use {@link SelectedItemJsonString}. */\n set selectedItemJsonString(value) {\n this.SelectedItemJsonString = value;\n }\n DetailPaneTab: 'json' | 'diff' | 'scratchpad' | 'skills' | 'graph' = 'diff';\n\n /** @deprecated Use {@link DetailPaneTab}. */\n get detailPaneTab(): 'json' | 'diff' | 'scratchpad' | 'skills' | 'graph' {\n return this.DetailPaneTab;\n }\n /** @deprecated Use {@link DetailPaneTab}. */\n set detailPaneTab(value: 'json' | 'diff' | 'scratchpad' | 'skills' | 'graph') {\n this.DetailPaneTab = value;\n }\n ScratchpadSubTab: 'input' | 'output' | 'diff' = 'diff';\n\n /** @deprecated Use {@link ScratchpadSubTab}. */\n get scratchpadSubTab(): 'input' | 'output' | 'diff' {\n return this.ScratchpadSubTab;\n }\n /** @deprecated Use {@link ScratchpadSubTab}. */\n set scratchpadSubTab(value: 'input' | 'output' | 'diff') {\n this.ScratchpadSubTab = value;\n }\n\n private static readonly EMPTY_SKILL_INVOCATIONS: MJAIAgentRunStepEntity_AgentSkillInvocation[] = [];\n private _cacheFingerprint: string | null = null;\n private _cachedSelectedItem: TimelineItem | null = null;\n private _stepNoticeCache: { Variant: 'info' | 'warning' | 'error'; Message: string } | null = null;\n private _selectedItemJsonCache = '{}';\n private _showStepPayloadDiffCache = false;\n private _stepPayloadAtStartObjectCache: ReturnType<typeof ParseJSONRecursive> | null = null;\n private _stepPayloadAtEndObjectCache: ReturnType<typeof ParseJSONRecursive> | null = null;\n private _stepSkillInvocationsCache: MJAIAgentRunStepEntity_AgentSkillInvocation[] =\n AIAgentRunStepDetailComponent.EMPTY_SKILL_INVOCATIONS;\n private _stepTaskGraphCache: TaskGraphSpec | null = null;\n private _stepTaskGraphPositionsCache: Map<string, FlowPosition> | null = null;\n private _stepTaskGraphParentTaskIdCache: string | null = null;\n private _stepTaskGraphWasFoldedCache = false;\n private _stepScratchpadInputCache: ScratchpadSnapshotView | null = null;\n private _stepScratchpadOutputCache: ScratchpadSnapshotView | null = null;\n private _scratchpadTaskChangeCountCache = 0;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n private computeCacheFingerprint(item: TimelineItem | null): string {\n if (!item) {\n return '';\n }\n const d = item.data ?? {};\n return `${item.id ?? ''}|${item.type ?? ''}|${item.status ?? ''}|${d.StepType ?? ''}|${Boolean(d.IsWorkflowStep)}|${d.PayloadAtStart ?? ''}|${d.PayloadAtEnd ?? ''}|${typeof d.Skills === 'string' ? d.Skills : JSON.stringify(d.Skills ?? '')}|${typeof d.InputData === 'string' ? d.InputData : JSON.stringify(d.InputData ?? '')}|${typeof d.OutputData === 'string' ? d.OutputData : JSON.stringify(d.OutputData ?? '')}`;\n }\n\n private ensureStepDetailCache(): void {\n const item = this.SelectedTimelineItem;\n const fp = this.computeCacheFingerprint(item);\n if (this._cachedSelectedItem === item && this._cacheFingerprint === fp) {\n return;\n }\n this._cachedSelectedItem = item;\n this._cacheFingerprint = fp;\n\n this._stepNoticeCache = this.computeStepNotice(item);\n this._selectedItemJsonCache = this.computeSelectedItemJson(item);\n this._showStepPayloadDiffCache = this.computeShowStepPayloadDiff(item);\n this._stepPayloadAtStartObjectCache = this.computeStepPayloadObject(item, 'PayloadAtStart');\n this._stepPayloadAtEndObjectCache = this.computeStepPayloadObject(item, 'PayloadAtEnd');\n this._stepSkillInvocationsCache = this.computeStepSkillInvocations(item);\n this._stepTaskGraphCache = this.computeStepTaskGraph(item);\n this._stepTaskGraphPositionsCache = this._stepTaskGraphCache\n ? ResolveTaskGraphPositions(this._stepTaskGraphCache)\n : null;\n this._stepTaskGraphParentTaskIdCache = this.computeStepTaskGraphParentTaskID(item);\n this._stepTaskGraphWasFoldedCache = this.computeStepTaskGraphWasFolded(item);\n this._stepScratchpadInputCache = this.extractScratchpadFromField('InputData');\n this._stepScratchpadOutputCache = this.extractScratchpadFromField('OutputData');\n this._scratchpadTaskChangeCountCache = this.computeScratchpadTaskChangeCount(\n this._stepScratchpadInputCache,\n this._stepScratchpadOutputCache\n );\n this.SelectedItemJsonString = this._selectedItemJsonCache;\n }\n\n ngOnChanges() {\n this._cacheFingerprint = null;\n this.ensureStepDetailCache();\n if (this.SelectedTimelineItem) {\n // Default to diff tab if step has payload diff, skills for Skill steps (the activation IS\n // the story there), scratchpad if available, otherwise json\n if (this.ShowStepPayloadDiff) {\n this.DetailPaneTab = 'diff';\n } else if (this.ShowGraphTab) {\n // A TaskGraph step's whole content IS the graph; opening on the JSON would bury the one\n // thing the step exists to show.\n this.DetailPaneTab = 'graph';\n } else if (this.ShowSkillsTab && this.SelectedTimelineItem.data?.StepType === 'Skill') {\n this.DetailPaneTab = 'skills';\n } else if (this.ShowScratchpadTab) {\n this.DetailPaneTab = 'scratchpad';\n } else if (this.ShowSkillsTab) {\n this.DetailPaneTab = 'skills';\n } else {\n this.DetailPaneTab = 'json';\n }\n this.ScratchpadSubTab = 'diff';\n this.cdr.detectChanges();\n }\n }\n\n /**\n * What to say about a step that never executed, or null when it ran.\n *\n * **Why this needs saying at all.** A workflow persists every step at submission, before anything\n * runs — the rows are the dispatcher's work queue, and the skip cascade is computed from the graph\n * they form. So a branch the workflow did not take still has a row, and opening it shows a\n * perfectly normal record with empty payloads. Without a word of explanation the reader is left to\n * work out whether that emptiness is a branch that was not chosen, work still queued, or a step\n * that broke silently — three very different situations that look identical in JSON.\n *\n * The distinction between Skipped and Blocked is load-bearing and deliberately preserved here:\n * `Skipped` means the workflow chose another route, `Blocked` means something upstream failed. The\n * dispatcher separated them precisely because conflating them made every conditional workflow look\n * half-broken.\n */\n get StepNotice(): { Variant: 'info' | 'warning' | 'error'; Message: string } | null {\n this.ensureStepDetailCache();\n return this._stepNoticeCache;\n }\n\n private computeStepNotice(\n item: TimelineItem | null\n ): { Variant: 'info' | 'warning' | 'error'; Message: string } | null {\n if (!item?.data?.IsWorkflowStep) return null;\n\n switch (item.status) {\n case 'Skipped':\n return {\n Variant: 'info',\n Message: 'This step never ran — the workflow took another route. Its row exists because ' +\n 'every step is created when the workflow is submitted, so the record of the branch ' +\n 'that was not taken survives. Nothing went wrong here.',\n };\n case 'Blocked':\n return {\n Variant: 'error',\n Message: 'This step could not run: something it depended on failed, so no path to it was ' +\n 'left. It is not a branch that lost — it is work that became unreachable.',\n };\n case 'Pending':\n return {\n Variant: 'warning',\n Message: 'This step has not started yet. A workflow runs on the dispatcher and outlives the ' +\n 'agent run that submitted it, so a finished run can still contain steps that are ' +\n 'queued or in flight.',\n };\n default:\n return null;\n }\n }\n\n GetSelectedItemJson(): string {\n this.ensureStepDetailCache();\n return this._selectedItemJsonCache;\n }\n\n private computeSelectedItemJson(item: TimelineItem | null): string {\n if (!item) return '{}';\n \n // Get all the data from the entity\n let data: unknown;\n if (item.data instanceof MJAIAgentRunStepEntity) {\n // If it's a step entity, we need to get the full run data\n data = item.data.GetAll();\n } else {\n data = item.data;\n }\n \n // Apply recursive JSON parsing to the entire data object\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsedData = ParseJSONRecursive(data, parseOptions);\n \n return JSON.stringify(parsedData, null, 2);\n }\n\n /** @deprecated Use {@link GetSelectedItemJson}. */\n getSelectedItemJson(): string {\n return this.GetSelectedItemJson();\n }\n\n /**\n * Check if selected timeline item is a step with payload changes\n */\n get ShowStepPayloadDiff(): boolean {\n this.ensureStepDetailCache();\n return this._showStepPayloadDiffCache;\n }\n\n private computeShowStepPayloadDiff(item: TimelineItem | null): boolean {\n if (!item || item.type !== 'step') {\n return false;\n }\n \n const stepData = item.data;\n if (stepData && (stepData.PayloadAtStart?.trim().length > 0 \n || stepData.PayloadAtEnd?.trim().length > 0)) {\n return stepData.PayloadAtStart !== stepData.PayloadAtEnd;\n } else {\n return false;\n }\n }\n\n /** @deprecated Use {@link ShowStepPayloadDiff}. */\n get showStepPayloadDiff(): boolean {\n return this.ShowStepPayloadDiff;\n }\n\n /**\n * Get parsed PayloadAtStart for the selected step\n */\n get StepPayloadAtStartObject(): ReturnType<typeof ParseJSONRecursive> | null {\n this.ensureStepDetailCache();\n return this._stepPayloadAtStartObjectCache;\n }\n\n /** @deprecated Use {@link StepPayloadAtStartObject}. */\n get stepPayloadAtStartObject(): ReturnType<typeof ParseJSONRecursive> | null {\n return this.StepPayloadAtStartObject;\n }\n\n /**\n * Get parsed PayloadAtEnd for the selected step\n */\n get StepPayloadAtEndObject(): ReturnType<typeof ParseJSONRecursive> | null {\n this.ensureStepDetailCache();\n return this._stepPayloadAtEndObjectCache;\n }\n\n /** @deprecated Use {@link StepPayloadAtEndObject}. */\n get stepPayloadAtEndObject(): ReturnType<typeof ParseJSONRecursive> | null {\n return this.StepPayloadAtEndObject;\n }\n\n private computeStepPayloadObject(\n item: TimelineItem | null,\n field: 'PayloadAtStart' | 'PayloadAtEnd'\n ): ReturnType<typeof ParseJSONRecursive> | null {\n if (!item || item.type !== 'step') {\n return null;\n }\n \n const stepData = item.data;\n const rawPayload = stepData?.[field];\n if (!rawPayload) return null;\n \n try {\n let payloadData: unknown = rawPayload;\n try {\n payloadData = JSON.parse(rawPayload);\n } catch {\n payloadData = rawPayload;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch {\n return null;\n }\n }\n\n OnClosePanel() {\n this.ClosePanel.emit();\n }\n\n /** @deprecated Use {@link OnClosePanel}. */\n onClosePanel() {\n return this.OnClosePanel();\n }\n\n OnNavigateToActionLog(logId: string) {\n this.NavigateToActionLog.emit(logId);\n }\n\n /** @deprecated Use {@link OnNavigateToActionLog}. */\n onNavigateToActionLog(logId: string) {\n return this.OnNavigateToActionLog(logId);\n }\n\n OnCopyToClipboard() {\n this.CopyToClipboard.emit(this.GetSelectedItemJson());\n }\n\n /** @deprecated Use {@link OnCopyToClipboard}. */\n onCopyToClipboard() {\n return this.OnCopyToClipboard();\n }\n\n /**\n * Whether the Skills tab should be shown — true when the step has skill-invocation records\n * on its `Skills` column (Skill steps, Prompt steps with skills in effect, and Actions/\n * Sub-Agent steps whose tool was granted through a skill).\n */\n get ShowSkillsTab(): boolean {\n return this.StepSkillInvocations.length > 0;\n }\n\n /** @deprecated Use {@link ShowSkillsTab}. */\n get showSkillsTab(): boolean {\n return this.ShowSkillsTab;\n }\n\n /**\n * Parsed {@link MJAIAgentRunStepEntity_AgentSkillInvocation} records from the step's `Skills`\n * JSON column. Empty array when the step has no skill linkage or the JSON is malformed.\n */\n get StepSkillInvocations(): MJAIAgentRunStepEntity_AgentSkillInvocation[] {\n this.ensureStepDetailCache();\n return this._stepSkillInvocationsCache;\n }\n\n private computeStepSkillInvocations(\n item: TimelineItem | null\n ): MJAIAgentRunStepEntity_AgentSkillInvocation[] {\n if (!item || item.type !== 'step') {\n return AIAgentRunStepDetailComponent.EMPTY_SKILL_INVOCATIONS;\n }\n const raw = item.data?.Skills;\n if (!raw) return AIAgentRunStepDetailComponent.EMPTY_SKILL_INVOCATIONS;\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n return Array.isArray(parsed)\n ? (parsed as MJAIAgentRunStepEntity_AgentSkillInvocation[])\n : AIAgentRunStepDetailComponent.EMPTY_SKILL_INVOCATIONS;\n } catch {\n return AIAgentRunStepDetailComponent.EMPTY_SKILL_INVOCATIONS;\n }\n }\n\n /** @deprecated Use {@link StepSkillInvocations}. */\n get stepSkillInvocations(): MJAIAgentRunStepEntity_AgentSkillInvocation[] {\n return this.StepSkillInvocations;\n }\n\n /** Human-readable label for an invocation's activation type. */\n public GetActivationTypeLabel(inv: MJAIAgentRunStepEntity_AgentSkillInvocation): string {\n return inv.ActivationType === 'requested' ? 'User Requested' : 'Agent Self-Activated';\n }\n\n /**\n * Whether the Workflow tab should be shown — true for a `TaskGraph` step that carries a spec.\n *\n * Phase 3 writes this step for EVERY emitted graph, dispatched or constant-folded, so a folded\n * single-node graph is just as promotable as a dispatched one. That was the point of recording\n * the fold rather than letting it vanish.\n */\n get ShowGraphTab(): boolean {\n return this.StepTaskGraph !== null;\n }\n\n /** @deprecated Use {@link ShowGraphTab}. */\n get showGraphTab(): boolean {\n return this.ShowGraphTab;\n }\n\n /**\n * The `TaskGraphSpec` recorded on a `TaskGraph` step, or null.\n *\n * Read from InputData, falling back to OutputData: the step records the spec on the way in, and\n * a malformed or absent payload simply means no tab rather than a broken panel.\n */\n get StepTaskGraph(): TaskGraphSpec | null {\n this.ensureStepDetailCache();\n return this._stepTaskGraphCache;\n }\n\n private computeStepTaskGraph(item: TimelineItem | null): TaskGraphSpec | null {\n if (!item || item.type !== 'step') return null;\n if (item.data?.StepType !== 'TaskGraph') return null;\n\n for (const raw of [item.data?.InputData, item.data?.OutputData]) {\n if (!raw) continue;\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n const spec = (parsed as { spec?: TaskGraphSpec })?.spec;\n if (spec?.tasks?.length) return spec;\n } catch {\n // A step whose payload cannot be parsed shows no tab, which is honest — better than a\n // canvas rendering half a graph.\n }\n }\n return null;\n }\n\n /** @deprecated Use {@link StepTaskGraph}. */\n get stepTaskGraph(): TaskGraphSpec | null {\n return this.StepTaskGraph;\n }\n\n /**\n * Where the recorded graph's nodes go on the canvas.\n *\n * Without this the editor receives a spec and no geometry, so every node projects to the origin —\n * all of them, in one place. The canvas then rescues it with a deferred layout pass whose\n * zoom-to-fit measures a bounding box one node wide, and a four-step workflow renders as a single\n * enormous box at 265%. The positions exist the whole time: a workflow compiled from a Flow agent\n * carries the arrangement its author dragged into place, on every node.\n */\n get StepTaskGraphPositions(): Map<string, FlowPosition> | null {\n this.ensureStepDetailCache();\n return this._stepTaskGraphPositionsCache;\n }\n\n /** @deprecated Use {@link StepTaskGraphPositions}. */\n get stepTaskGraphPositions(): Map<string, FlowPosition> | null {\n return this.StepTaskGraphPositions;\n }\n\n /**\n * The graph's parent `MJ: Tasks` row, when this step actually dispatched one.\n *\n * **This is what turns the panel from a picture of the plan into a picture of the run.** With it,\n * the same `mj-task-graph-run-view` the Workflows app uses reads the Task rows and draws what\n * happened — declined branches hatched, untravelled edges absent, the toolbar available and the\n * legend off. Without it the panel had only the SPEC, so it rendered in design mode: every branch\n * drawn as though it had run, on a canvas that could not know otherwise.\n *\n * Null for a graph that was constant-folded (D9) — it never reached the dispatcher, so there are no\n * rows and no run to show. The spec view is the honest rendering there: it is a plan, and it is\n * drawn as one.\n */\n get StepTaskGraphParentTaskID(): string | null {\n this.ensureStepDetailCache();\n return this._stepTaskGraphParentTaskIdCache;\n }\n\n private computeStepTaskGraphParentTaskID(item: TimelineItem | null): string | null {\n const raw = item?.data?.OutputData;\n if (!raw) return null;\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n const id = (parsed as { parentTaskID?: unknown })?.parentTaskID;\n return typeof id === 'string' && id.length > 0 ? id : null;\n } catch {\n return null;\n }\n }\n\n /** @deprecated Use {@link StepTaskGraphParentTaskID}. */\n get stepTaskGraphParentTaskID(): string | null {\n return this.StepTaskGraphParentTaskID;\n }\n\n /** True when the recorded graph was constant-folded rather than dispatched (D9). */\n get StepTaskGraphWasFolded(): boolean {\n this.ensureStepDetailCache();\n return this._stepTaskGraphWasFoldedCache;\n }\n\n private computeStepTaskGraphWasFolded(item: TimelineItem | null): boolean {\n if (!item) return false;\n const raw = item.data?.InputData;\n if (!raw) return false;\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n return (parsed as { folded?: boolean })?.folded === true;\n } catch {\n return false;\n }\n }\n\n /** @deprecated Use {@link StepTaskGraphWasFolded}. */\n get stepTaskGraphWasFolded(): boolean {\n return this.StepTaskGraphWasFolded;\n }\n\n @ViewChild(TaskGraphRunViewComponent)\n public TaskGraphRunView?: TaskGraphRunViewComponent;\n\n /** Asks the host to save this run's graph as a reusable workflow. */\n public RequestSaveAsWorkflow(): void {\n const spec = this.StepTaskGraph ?? this.TaskGraphRunView?.Spec ?? null;\n if (spec) this.SaveAsWorkflowRequested.emit(spec);\n }\n\n /**\n * Whether the scratchpad tab should be shown (step has scratchpad data in InputData or OutputData)\n */\n get ShowScratchpadTab(): boolean {\n if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {\n return false;\n }\n return this.StepScratchpadInput !== null || this.StepScratchpadOutput !== null;\n }\n\n /** @deprecated Use {@link ShowScratchpadTab}. */\n get showScratchpadTab(): boolean {\n return this.ShowScratchpadTab;\n }\n\n /**\n * Parse scratchpad snapshot from InputData JSON\n */\n get StepScratchpadInput(): ScratchpadSnapshotView | null {\n this.ensureStepDetailCache();\n return this._stepScratchpadInputCache;\n }\n\n /** @deprecated Use {@link StepScratchpadInput}. */\n get stepScratchpadInput(): ScratchpadSnapshotView | null {\n return this.StepScratchpadInput;\n }\n\n /**\n * Parse scratchpad snapshot from OutputData JSON\n */\n get StepScratchpadOutput(): ScratchpadSnapshotView | null {\n this.ensureStepDetailCache();\n return this._stepScratchpadOutputCache;\n }\n\n /** @deprecated Use {@link StepScratchpadOutput}. */\n get stepScratchpadOutput(): ScratchpadSnapshotView | null {\n return this.StepScratchpadOutput;\n }\n\n /**\n * Number of tasks that changed between input and output scratchpad snapshots\n */\n get ScratchpadTaskChangeCount(): number {\n this.ensureStepDetailCache();\n return this._scratchpadTaskChangeCountCache;\n }\n\n private computeScratchpadTaskChangeCount(\n input: ScratchpadSnapshotView | null,\n output: ScratchpadSnapshotView | null\n ): number {\n if (!input && !output) return 0;\n if (!input || !output) return (output?.tasks?.length ?? 0) + (input?.tasks?.length ?? 0);\n\n let changes = 0;\n const inputMap = new Map(input.tasks.map(t => [t.id, t]));\n const outputMap = new Map(output.tasks.map(t => [t.id, t]));\n\n for (const [id, task] of outputMap) {\n const prev = inputMap.get(id);\n if (!prev || prev.status !== task.status || prev.title !== task.title || prev.notes !== task.notes) {\n changes++;\n }\n }\n for (const id of inputMap.keys()) {\n if (!outputMap.has(id)) changes++; // removed tasks\n }\n if (input.notes !== output.notes) changes++;\n return changes;\n }\n\n /** @deprecated Use {@link ScratchpadTaskChangeCount}. */\n get scratchpadTaskChangeCount(): number {\n return this.ScratchpadTaskChangeCount;\n }\n\n private extractScratchpadFromField(fieldName: 'InputData' | 'OutputData'): ScratchpadSnapshotView | null {\n if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {\n return null;\n }\n\n const stepData = this.SelectedTimelineItem.data;\n const rawValue = stepData?.[fieldName];\n if (!rawValue) return null;\n\n try {\n let parsed = rawValue;\n if (typeof parsed === 'string') {\n parsed = JSON.parse(parsed);\n }\n const scratchpad = parsed?.scratchpad;\n if (!scratchpad) return null;\n return {\n notes: scratchpad.notes ?? '',\n tasks: Array.isArray(scratchpad.tasks) ? scratchpad.tasks : []\n };\n } catch {\n return null;\n }\n }\n}","@if (selectedTimelineItem) {\n <div class=\"json-detail-pane\">\n <div class=\"json-pane-header\">\n <h3>\n <i class=\"fas\" [ngClass]=\"selectedTimelineItem.icon\"></i>\n {{ selectedTimelineItem.title }}\n </h3>\n <button class=\"btn-icon\" (click)=\"onClosePanel()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"json-pane-content\">\n <div class=\"json-meta\">\n <div class=\"meta-item\">\n <label>Type</label>\n <span>{{ selectedTimelineItem.type }}</span>\n </div>\n <div class=\"meta-item\">\n <label>Status</label>\n <span class=\"status-badge small\" [attr.data-status]=\"selectedTimelineItem.status\">\n {{ selectedTimelineItem.status }}\n </span>\n </div>\n <div class=\"meta-item\">\n <label>Duration</label>\n <span>{{ selectedTimelineItem.duration || 'N/A' }}</span>\n </div>\n </div>\n <!-- Why a workflow step has nothing to show: it never ran. Above the tabs, because it explains\n the emptiness the reader is about to look at. -->\n @if (StepNotice) {\n <div class=\"step-notice\">\n <mj-alert [Variant]=\"StepNotice.Variant\" Size=\"sm\" [Message]=\"StepNotice.Message\"></mj-alert>\n </div>\n }\n <!-- Action-specific link -->\n @if (selectedTimelineItem.type === 'action' && selectedTimelineItem.data?.ID) {\n <div class=\"action-link\">\n <button class=\"btn-link\" (click)=\"onNavigateToActionLog(selectedTimelineItem.data.ID)\">\n <i class=\"fas fa-external-link-alt\"></i> View Action Execution Log\n </button>\n </div>\n }\n <!-- Tab Navigation - Show when we have payload diff or scratchpad data -->\n @if (showStepPayloadDiff || showScratchpadTab || showSkillsTab || showGraphTab) {\n <div class=\"detail-pane-tabs\">\n @if (showGraphTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'graph'\"\n (click)=\"detailPaneTab = 'graph'\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n Workflow\n </button>\n }\n @if (showStepPayloadDiff) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'diff'\"\n (click)=\"detailPaneTab = 'diff'\">\n <i class=\"fa-solid fa-code-branch\"></i>\n Payload Changes\n </button>\n }\n @if (showSkillsTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'skills'\"\n (click)=\"detailPaneTab = 'skills'\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n Skills\n <span class=\"tab-badge\">{{ stepSkillInvocations.length }}</span>\n </button>\n }\n @if (showScratchpadTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'scratchpad'\"\n (click)=\"detailPaneTab = 'scratchpad'\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n Scratchpad\n @if (scratchpadTaskChangeCount > 0) {\n <span class=\"tab-badge\">{{ scratchpadTaskChangeCount }}</span>\n }\n </button>\n }\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'json'\"\n (click)=\"detailPaneTab = 'json'\">\n <i class=\"fa-solid fa-code\"></i>\n Full JSON\n </button>\n </div>\n }\n <!-- Tab Content -->\n <div class=\"detail-pane-content\" [class.with-tabs]=\"showStepPayloadDiff || showScratchpadTab || showSkillsTab || showGraphTab\">\n <!-- Skills Tab — skill-invocation observability (activation type, provenance of authority, reason) -->\n @if (detailPaneTab === 'graph' && showGraphTab) {\n <div class=\"detail-graph\">\n <div class=\"detail-graph__actions\">\n @if (stepTaskGraphWasFolded) {\n <!-- The fold is recorded rather than silent (D9), so the reader can see WHY this\n graph never reached the dispatcher instead of inferring it. -->\n <mj-alert Variant=\"info\" Size=\"sm\"\n Message=\"This ran inline as a single step — a workflow of one needs no scheduling. You can still save it.\">\n </mj-alert>\n }\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"SavingWorkflow\" (click)=\"RequestSaveAsWorkflow()\">\n <i class=\"fa-solid\" [ngClass]=\"SavingWorkflow ? 'fa-spinner fa-spin' : 'fa-floppy-disk'\"></i>\n {{ SavingWorkflow ? 'Saving Workflow…' : 'Save as Workflow' }}\n </button>\n </div>\n @if (stepTaskGraphParentTaskID; as parentTaskID) {\n <!-- The RUN, not the plan. Same component the Workflows app uses, so a workflow is\n drawn identically wherever it is opened from — declined branches hatched,\n untravelled edges absent, toolbar on, legend off. -->\n <mj-task-graph-run-view\n class=\"detail-graph__canvas\"\n [Provider]=\"Provider\"\n [ParentTaskID]=\"parentTaskID\"\n [WorkflowName]=\"stepTaskGraph?.workflowName || 'Workflow'\"\n Height=\"100%\">\n </mj-task-graph-run-view>\n } @else {\n <!-- No dispatcher rows to read: a folded graph never ran. Drawing the spec is the\n honest rendering — it is a plan, and it is drawn as one. -->\n <mj-task-graph-editor\n class=\"detail-graph__canvas\"\n [Spec]=\"stepTaskGraph\"\n [NodePositions]=\"stepTaskGraphPositions\"\n [ReadOnly]=\"true\"\n [ShowPalette]=\"false\"\n [ShowLegend]=\"false\">\n </mj-task-graph-editor>\n }\n </div>\n }\n @if (detailPaneTab === 'skills' && showSkillsTab) {\n <div class=\"skills-content\">\n @for (inv of stepSkillInvocations; track inv.SkillID) {\n <div class=\"skill-invocation-card\" [attr.data-activation]=\"inv.ActivationType\">\n <div class=\"skill-invocation-header\">\n <span class=\"skill-invocation-name\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n {{ inv.SkillName }}\n </span>\n <span class=\"skill-invocation-type\" [attr.data-activation]=\"inv.ActivationType\">\n {{ GetActivationTypeLabel(inv) }}\n </span>\n </div>\n @if (inv.Reason) {\n <div class=\"skill-invocation-reason\">\n <i class=\"fa-solid fa-quote-left\"></i>\n {{ inv.Reason }}\n </div>\n }\n <div class=\"skill-invocation-provenance\">\n <div class=\"provenance-title\">Provenance of Authority</div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Requested By</span>\n <span class=\"provenance-value\">{{ inv.Provenance.RequestedBy === 'user-request' ? 'User (/skill mention)' : 'Agent decision' }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Agent AcceptsSkills</span>\n <span class=\"provenance-value\">{{ inv.Provenance.AgentAcceptsSkills }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Skill ActivationMode</span>\n <span class=\"provenance-value\">{{ inv.Provenance.SkillActivationMode }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Agent SkillActivationMode</span>\n <span class=\"provenance-value\">{{ inv.Provenance.AgentSkillActivationMode }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Skill ID</span>\n <span class=\"provenance-value provenance-id\">{{ inv.SkillID }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n <!-- Payload Diff Tab -->\n @if (detailPaneTab === 'diff' && showStepPayloadDiff) {\n <div class=\"step-payload-diff\">\n <mj-deep-diff\n [oldValue]=\"stepPayloadAtStartObject\"\n [newValue]=\"stepPayloadAtEndObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"8\"\n [maxStringLength]=\"150\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n </div>\n }\n <!-- Scratchpad Tab -->\n @if (detailPaneTab === 'scratchpad' && showScratchpadTab) {\n <div class=\"scratchpad-content\">\n <div class=\"scratchpad-sub-tabs\">\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'diff'\"\n (click)=\"scratchpadSubTab = 'diff'\">\n <i class=\"fa-solid fa-code-compare\"></i> Diff\n </button>\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'input'\"\n (click)=\"scratchpadSubTab = 'input'\">\n <i class=\"fa-solid fa-arrow-right-to-bracket\"></i> Input\n </button>\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'output'\"\n (click)=\"scratchpadSubTab = 'output'\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i> Output\n </button>\n </div>\n <!-- Scratchpad Diff Sub-Tab -->\n @if (scratchpadSubTab === 'diff') {\n <div class=\"scratchpad-diff-view\">\n @if (stepScratchpadInput && stepScratchpadOutput) {\n <mj-deep-diff\n [oldValue]=\"stepScratchpadInput\"\n [newValue]=\"stepScratchpadOutput\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"true\"\n [maxDepth]=\"6\"\n [maxStringLength]=\"300\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n } @else if (stepScratchpadOutput) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-plus\"\n Title=\"Scratchpad created in this step (no prior state)\" />\n <div class=\"scratchpad-snapshot\">\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadOutput }\"></ng-container>\n </div>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad changes in this step\" />\n }\n </div>\n }\n <!-- Scratchpad Input Sub-Tab -->\n @if (scratchpadSubTab === 'input') {\n <div class=\"scratchpad-snapshot-view\">\n @if (stepScratchpadInput) {\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadInput }\"></ng-container>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad input for this step\" />\n }\n </div>\n }\n <!-- Scratchpad Output Sub-Tab -->\n @if (scratchpadSubTab === 'output') {\n <div class=\"scratchpad-snapshot-view\">\n @if (stepScratchpadOutput) {\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadOutput }\"></ng-container>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad output for this step\" />\n }\n </div>\n }\n </div>\n }\n <!-- Full JSON Tab -->\n @if (detailPaneTab === 'json' || (!showStepPayloadDiff && !showScratchpadTab)) {\n <div class=\"json-viewer\">\n <div class=\"json-toolbar\">\n <button class=\"btn-icon\" title=\"Copy JSON\" (click)=\"onCopyToClipboard()\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n <mj-code-editor\n [(ngModel)]=\"selectedItemJsonString\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Reusable scratchpad snapshot template -->\n<ng-template #scratchpadSnapshotTpl let-snapshot>\n <div class=\"scratchpad-snapshot\">\n @if (snapshot.notes) {\n <div class=\"scratchpad-notes-section\">\n <h4><i class=\"fa-solid fa-note-sticky\"></i> Notes</h4>\n <div class=\"scratchpad-notes-content\">{{ snapshot.notes }}</div>\n </div>\n }\n @if (snapshot.tasks?.length > 0) {\n <div class=\"scratchpad-tasks-section\">\n <h4><i class=\"fa-solid fa-list-check\"></i> Tasks ({{ snapshot.tasks.length }})</h4>\n <div class=\"scratchpad-task-list\">\n @for (task of snapshot.tasks; track task.id) {\n <div class=\"scratchpad-task-item\" [attr.data-status]=\"task.status\">\n <span class=\"task-status-indicator\" [attr.data-status]=\"task.status\">\n @switch (task.status) {\n @case ('completed') { <i class=\"fa-solid fa-circle-check\"></i> }\n @case ('in_progress') { <i class=\"fa-solid fa-spinner\"></i> }\n @case ('blocked') { <i class=\"fa-solid fa-circle-xmark\"></i> }\n @default { <i class=\"fa-regular fa-circle\"></i> }\n }\n </span>\n <div class=\"task-content\">\n <span class=\"task-id\">{{ task.id }}</span>\n <span class=\"task-title\">{{ task.title }}</span>\n @if (task.notes) {\n <span class=\"task-notes\">{{ task.notes }}</span>\n }\n </div>\n <span class=\"task-status-badge\" [attr.data-status]=\"task.status\">{{ task.status }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (!snapshot.notes && (!snapshot.tasks || snapshot.tasks.length === 0)) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"Empty scratchpad\" />\n }\n </div>\n</ng-template>"]}
|
|
@@ -150,6 +150,13 @@ export declare class AIAgentRunTimelineComponent extends BaseAngularComponent im
|
|
|
150
150
|
set selectedItem(value: TimelineItem | null);
|
|
151
151
|
/** Graph steps currently being expanded, so a second click cannot start a second load. */
|
|
152
152
|
private expandingGraphIDs;
|
|
153
|
+
/**
|
|
154
|
+
* Tracks user-expanded timeline node IDs (lowercased) across `runTree$` poll cycles so
|
|
155
|
+
* live workflow refreshes do not collapse an open TaskGraph or its expanded child tasks.
|
|
156
|
+
*/
|
|
157
|
+
private expandedItemIds;
|
|
158
|
+
/** Cached children for expanded Sub-Agent steps so they survive `runTree$` poll rebuilds. */
|
|
159
|
+
private loadedSubAgentChildren;
|
|
153
160
|
constructor(cdr: ChangeDetectorRef);
|
|
154
161
|
ngOnInit(): Promise<void>;
|
|
155
162
|
ngOnDestroy(): void;
|
|
@@ -195,6 +202,7 @@ export declare class AIAgentRunTimelineComponent extends BaseAngularComponent im
|
|
|
195
202
|
ToggleItemExpansion(item: TimelineItem, event: Event): Promise<void>;
|
|
196
203
|
/** @deprecated Use {@link ToggleItemExpansion}. */
|
|
197
204
|
toggleItemExpansion(item: TimelineItem, event: Event): Promise<void>;
|
|
205
|
+
private restoreExpansionState;
|
|
198
206
|
private loadSubAgentChildren;
|
|
199
207
|
NavigateToSubRun(runId: string, event: Event): void;
|
|
200
208
|
/** @deprecated Use {@link NavigateToSubRun}. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-agent-run-timeline.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-timeline.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAA2B,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACtI,OAAO,EAAW,UAAU,EAAkC,MAAM,MAAM,CAAC;AAE3E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC1J,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAInE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;;AAa5F,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX;;;;;;OAMG;IACH,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;IACrE;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,CAAC;IACV,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAOa,2BAA4B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"ai-agent-run-timeline.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-timeline.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -310,6 +310,13 @@ export class AIAgentRunTimelineComponent extends BaseAngularComponent {
|
|
|
310
310
|
this.SelectedItem = null;
|
|
311
311
|
/** Graph steps currently being expanded, so a second click cannot start a second load. */
|
|
312
312
|
this.expandingGraphIDs = new Set();
|
|
313
|
+
/**
|
|
314
|
+
* Tracks user-expanded timeline node IDs (lowercased) across `runTree$` poll cycles so
|
|
315
|
+
* live workflow refreshes do not collapse an open TaskGraph or its expanded child tasks.
|
|
316
|
+
*/
|
|
317
|
+
this.expandedItemIds = new Set();
|
|
318
|
+
/** Cached children for expanded Sub-Agent steps so they survive `runTree$` poll rebuilds. */
|
|
319
|
+
this.loadedSubAgentChildren = new Map();
|
|
313
320
|
}
|
|
314
321
|
async ngOnInit() {
|
|
315
322
|
// AIEngineBase is deferred at startup; ensure it's loaded before timeline
|
|
@@ -484,6 +491,28 @@ export class AIAgentRunTimelineComponent extends BaseAngularComponent {
|
|
|
484
491
|
if (graph) {
|
|
485
492
|
subtitle = `${subtitle} · dispatched in ${this.CalculateDuration(step.StartedAt, step.CompletedAt)}`;
|
|
486
493
|
}
|
|
494
|
+
const isExpanded = this.expandedItemIds.has(step.ID.toLowerCase());
|
|
495
|
+
let children = [];
|
|
496
|
+
let childrenLoaded = undefined;
|
|
497
|
+
let hasNoChildren = undefined;
|
|
498
|
+
if (step.StepType === 'TaskGraph' && isExpanded && this.RunTree) {
|
|
499
|
+
const stepNode = FindAgentRunTreeNodes(this.RunTree, (n) => UUIDsEqual(n.NodeID, step.ID))[0] ?? null;
|
|
500
|
+
if (stepNode) {
|
|
501
|
+
children = ProjectRunTreeToTimeline(stepNode, level + 1, true, (n) => this.resolveActionIcon(n));
|
|
502
|
+
this.restoreExpansionState(children);
|
|
503
|
+
childrenLoaded = true;
|
|
504
|
+
hasNoChildren = children.length === 0;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
else if (step.StepType === 'Sub-Agent') {
|
|
508
|
+
const cachedChildren = this.loadedSubAgentChildren.get(step.ID.toLowerCase());
|
|
509
|
+
if (cachedChildren) {
|
|
510
|
+
children = cachedChildren;
|
|
511
|
+
this.restoreExpansionState(children);
|
|
512
|
+
childrenLoaded = true;
|
|
513
|
+
hasNoChildren = children.length === 0;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
487
516
|
return {
|
|
488
517
|
id: step.ID,
|
|
489
518
|
type: 'step',
|
|
@@ -501,9 +530,11 @@ export class AIAgentRunTimelineComponent extends BaseAngularComponent {
|
|
|
501
530
|
logoUrl: iconInfo.logoUrl,
|
|
502
531
|
color: this.getStatusColor(graph ? NormalizeStatus(graph.Status) : step.Status),
|
|
503
532
|
data: step,
|
|
504
|
-
children
|
|
533
|
+
children,
|
|
505
534
|
level,
|
|
506
|
-
isExpanded
|
|
535
|
+
isExpanded,
|
|
536
|
+
childrenLoaded,
|
|
537
|
+
hasNoChildren
|
|
507
538
|
};
|
|
508
539
|
}
|
|
509
540
|
getStepIconInfo(step) {
|
|
@@ -554,7 +585,8 @@ export class AIAgentRunTimelineComponent extends BaseAngularComponent {
|
|
|
554
585
|
'ForEach': 'fa-repeat',
|
|
555
586
|
'While': 'fa-rotate',
|
|
556
587
|
'Skill': 'fa-wand-magic-sparkles',
|
|
557
|
-
'Plan': 'fa-clipboard-check'
|
|
588
|
+
'Plan': 'fa-clipboard-check',
|
|
589
|
+
'TaskGraph': 'fa-diagram-project'
|
|
558
590
|
};
|
|
559
591
|
return iconMap[stepType] || 'fa-circle';
|
|
560
592
|
}
|
|
@@ -596,8 +628,15 @@ export class AIAgentRunTimelineComponent extends BaseAngularComponent {
|
|
|
596
628
|
}
|
|
597
629
|
async ToggleItemExpansion(item, event) {
|
|
598
630
|
event.stopPropagation();
|
|
599
|
-
// Toggle expansion state
|
|
631
|
+
// Toggle expansion state and persist in expandedItemIds so live runTree$ polls preserve it
|
|
600
632
|
item.isExpanded = !item.isExpanded;
|
|
633
|
+
const key = item.id.toLowerCase();
|
|
634
|
+
if (item.isExpanded) {
|
|
635
|
+
this.expandedItemIds.add(key);
|
|
636
|
+
}
|
|
637
|
+
else {
|
|
638
|
+
this.expandedItemIds.delete(key);
|
|
639
|
+
}
|
|
601
640
|
// For Sub-Agent steps, load their run data on demand (requires DB query)
|
|
602
641
|
if (item.isExpanded && !item.childrenLoaded && item.type === 'step' && item.data?.StepType === 'Sub-Agent') {
|
|
603
642
|
await this.loadSubAgentChildren(item);
|
|
@@ -607,14 +646,24 @@ export class AIAgentRunTimelineComponent extends BaseAngularComponent {
|
|
|
607
646
|
if (item.isExpanded && item.type === 'step' && item.data?.StepType === 'TaskGraph') {
|
|
608
647
|
await this.ExpandTaskGraph(item);
|
|
609
648
|
}
|
|
610
|
-
// For parent steps (loop containers like ForEach/While)
|
|
611
|
-
//
|
|
612
|
-
|
|
649
|
+
// For parent steps (loop containers like ForEach/While) and projected workflow tasks,
|
|
650
|
+
// children are already attached — trigger OnPush change detection immediately.
|
|
651
|
+
this.cdr.markForCheck();
|
|
613
652
|
}
|
|
614
653
|
/** @deprecated Use {@link ToggleItemExpansion}. */
|
|
615
654
|
async toggleItemExpansion(item, event) {
|
|
616
655
|
return this.ToggleItemExpansion(item, event);
|
|
617
656
|
}
|
|
657
|
+
restoreExpansionState(items) {
|
|
658
|
+
if (!items)
|
|
659
|
+
return;
|
|
660
|
+
for (const item of items) {
|
|
661
|
+
item.isExpanded = this.expandedItemIds.has(item.id.toLowerCase());
|
|
662
|
+
if (item.children && item.children.length > 0) {
|
|
663
|
+
this.restoreExpansionState(item.children);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
618
667
|
async loadSubAgentChildren(item) {
|
|
619
668
|
try {
|
|
620
669
|
const subAgentRunId = item.data?.TargetLogID;
|
|
@@ -635,6 +684,7 @@ export class AIAgentRunTimelineComponent extends BaseAngularComponent {
|
|
|
635
684
|
// Build hierarchical timeline items with ParentID relationships
|
|
636
685
|
// This ensures that loop steps (ForEach/While) within sub-agents also show their children
|
|
637
686
|
item.children = this.buildHierarchicalItems(data.steps, item.level + 1, data.promptRuns);
|
|
687
|
+
this.loadedSubAgentChildren.set(item.id.toLowerCase(), item.children);
|
|
638
688
|
item.childrenLoaded = true;
|
|
639
689
|
// Trigger change detection after updating the data
|
|
640
690
|
this.cdr.markForCheck();
|
|
@@ -736,8 +786,9 @@ export class AIAgentRunTimelineComponent extends BaseAngularComponent {
|
|
|
736
786
|
}
|
|
737
787
|
// The graph hangs off THIS step in the tree, so the subtree to splice in is the node whose id
|
|
738
788
|
// matches the step — not the whole run, which is already on screen above it.
|
|
739
|
-
const stepNode = FindAgentRunTreeNodes(this.RunTree, (n) => n.NodeID
|
|
789
|
+
const stepNode = FindAgentRunTreeNodes(this.RunTree, (n) => UUIDsEqual(n.NodeID, item.id))[0] ?? null;
|
|
740
790
|
item.children = ProjectRunTreeToTimeline(stepNode, item.level + 1, true, (n) => this.resolveActionIcon(n));
|
|
791
|
+
this.restoreExpansionState(item.children);
|
|
741
792
|
item.childrenLoaded = true;
|
|
742
793
|
item.hasNoChildren = item.children.length === 0;
|
|
743
794
|
}
|