@memberjunction/ng-core-entity-forms 6.2.0-edge.0 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.d.ts +1 -1
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js +2 -2
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js.map +1 -1
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +90 -16
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +218 -70
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +80 -16
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +146 -46
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +329 -27
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +794 -262
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +76 -0
- package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js +77 -33
- package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +69 -15
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +182 -74
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +105 -25
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +272 -112
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +32 -6
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +71 -19
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +10 -0
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +27 -7
- package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +65 -15
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +152 -52
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +81 -15
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +145 -45
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +71 -17
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +175 -67
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +173 -27
- 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 +385 -93
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts +64 -4
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +129 -29
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +260 -27
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +686 -238
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +10 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +17 -9
- package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +74 -16
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +174 -58
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +108 -14
- package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +258 -70
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.d.ts +198 -14
- package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +387 -107
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts +12 -6
- package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts.map +1 -1
- package/dist/lib/custom/BridgeProviders/bridge-provider-features.js +41 -29
- package/dist/lib/custom/BridgeProviders/bridge-provider-features.js.map +1 -1
- package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js +14 -14
- package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js.map +1 -1
- package/dist/lib/custom/Companies/company-overview.panel.d.ts +1 -1
- package/dist/lib/custom/Companies/company-overview.panel.js +2 -2
- package/dist/lib/custom/Companies/company-overview.panel.js.map +1 -1
- package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +1 -1
- package/dist/lib/custom/Conversations/conversation-overview.panel.js +2 -2
- package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
- package/dist/lib/custom/Employees/employee-overview.panel.d.ts +1 -1
- package/dist/lib/custom/Employees/employee-overview.panel.js +2 -2
- package/dist/lib/custom/Employees/employee-overview.panel.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +209 -28
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +494 -138
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +5 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.js +10 -2
- package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
- package/dist/lib/custom/Files/file-form.component.d.ts +1 -1
- package/dist/lib/custom/Files/file-form.component.js +2 -2
- package/dist/lib/custom/Files/file-form.component.js.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.d.ts +300 -36
- package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +664 -208
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +31 -0
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.js +52 -16
- package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +107 -10
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.js +291 -101
- package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.d.ts +201 -26
- package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +429 -109
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +107 -14
- package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js +249 -79
- package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +110 -4
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js +858 -86
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js +4 -4
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
- package/dist/lib/custom/SessionBridges/session-bridge-form.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +77 -13
- package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.js +196 -78
- package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.d.ts +49 -7
- package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.js +132 -44
- package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.d.ts +142 -17
- package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +333 -113
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +24 -4
- package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.js +64 -20
- package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.d.ts +217 -27
- package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +549 -169
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-checks.d.ts +2 -0
- package/dist/lib/custom/Tests/test-run-checks.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-checks.js +5 -1
- package/dist/lib/custom/Tests/test-run-checks.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts +2 -0
- package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js +5 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.d.ts +146 -18
- package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +362 -106
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts +390 -47
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +1015 -343
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +214 -26
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +535 -159
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/custom/Users/user-overview.panel.d.ts +1 -1
- package/dist/lib/custom/Users/user-overview.panel.js +2 -2
- package/dist/lib/custom/Users/user-overview.panel.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +208 -29
- 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 +446 -138
- 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-cost.service.d.ts +6 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +16 -4
- package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +50 -6
- 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 +84 -12
- 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 +89 -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 +216 -70
- 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-step-node.component.d.ts +62 -3
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +140 -42
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +81 -10
- 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 +165 -37
- 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 +140 -15
- 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 +326 -100
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts +101 -15
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +281 -97
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +43 -25
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +100 -64
- package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts +14 -2
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.js +71 -53
- package/dist/lib/custom/ai-agent-run/flow/constellation.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts +14 -2
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js +70 -52
- package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts +8 -0
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js +22 -6
- package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts +24 -2
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js +91 -59
- package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts +10 -2
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js +33 -17
- package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts +2 -0
- package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js +34 -30
- package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts +14 -2
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js +69 -51
- package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +38 -12
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.js +103 -51
- package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +59 -51
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js +76 -74
- package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js +27 -25
- package/dist/lib/generated/Entities/MJProject/mjproject.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 +155 -119
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts +5 -1
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts.map +1 -1
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +11 -3
- package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -1
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts +2 -0
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts.map +1 -1
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +16 -12
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js.map +1 -1
- package/dist/lib/panels/content-sources/website-crawler-settings.panel.d.ts +1 -1
- package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +2 -2
- package/dist/lib/panels/content-sources/website-crawler-settings.panel.js.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +45 -19
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.js +95 -43
- package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +20 -16
- package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.panel.js +73 -65
- package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.d.ts +133 -14
- package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +322 -124
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/package.json +43 -42
|
@@ -6,7 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { Component, ViewChild, inject } from '@angular/core';
|
|
8
8
|
import { Subject } from 'rxjs';
|
|
9
|
-
import { BaseEntity, CompositeKey } from '@memberjunction/core';
|
|
9
|
+
import { BaseEntity, CompositeKey, LogError, ResolveEntityEventRow } from '@memberjunction/core';
|
|
10
10
|
import { LoadAgentRunTree, MAX_AGENT_RUN_TREE_DEPTH, WalkAgentRunTree, } from '@memberjunction/ai-core-plus';
|
|
11
11
|
import { BaseFormComponent } from '@memberjunction/ng-base-forms';
|
|
12
12
|
import { MJGlobal, MJEventType, RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
@@ -775,16 +775,16 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
775
775
|
/** Pending re-read of the run tree while a detached workflow is still running. */
|
|
776
776
|
this.workflowPollTimer = null;
|
|
777
777
|
// UI state
|
|
778
|
-
this.
|
|
779
|
-
this.
|
|
780
|
-
this.
|
|
781
|
-
this.
|
|
778
|
+
this.ActiveTab = 'timeline';
|
|
779
|
+
this.SelectedTimelineItem = null;
|
|
780
|
+
this.JsonPanelExpanded = false;
|
|
781
|
+
this.Loading = false;
|
|
782
782
|
this.error = null;
|
|
783
|
-
this.
|
|
784
|
-
this.
|
|
785
|
-
this.
|
|
783
|
+
this.AnalyticsLoaded = false;
|
|
784
|
+
this.VisualizationLoaded = false;
|
|
785
|
+
this.Agent = null;
|
|
786
786
|
// Cost metrics using shared service
|
|
787
|
-
this.
|
|
787
|
+
this.CostMetrics = null;
|
|
788
788
|
// Cached parsed results to prevent redundant JSON parsing
|
|
789
789
|
this._cachedParsedResult = null;
|
|
790
790
|
this._cachedParsedStartingPayload = null;
|
|
@@ -797,7 +797,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
797
797
|
this.costService = inject(AIAgentRunCostService);
|
|
798
798
|
this.appManager = inject(ApplicationManager);
|
|
799
799
|
// Instance of data helper per component
|
|
800
|
-
this.
|
|
800
|
+
this.DataHelper = new AIAgentRunDataHelper();
|
|
801
801
|
/**
|
|
802
802
|
* The run's complete execution tree — loaded ONCE here and shared with every tab.
|
|
803
803
|
*
|
|
@@ -807,11 +807,123 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
807
807
|
* different run than the one beside it. Sharing it also means a refresh updates all three at once
|
|
808
808
|
* rather than whichever one the user happens to open next.
|
|
809
809
|
*/
|
|
810
|
-
this.
|
|
810
|
+
this.RunTree = null;
|
|
811
811
|
/** True while the tree is loading, so a tab can say so rather than render an empty run. */
|
|
812
|
-
this.
|
|
812
|
+
this.RunTreeLoading = false;
|
|
813
813
|
/** Why the tree could not be loaded, or null. Surfaced rather than swallowed. */
|
|
814
|
-
this.
|
|
814
|
+
this.RunTreeError = null;
|
|
815
|
+
}
|
|
816
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
817
|
+
get activeTab() {
|
|
818
|
+
return this.ActiveTab;
|
|
819
|
+
}
|
|
820
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
821
|
+
set activeTab(value) {
|
|
822
|
+
this.ActiveTab = value;
|
|
823
|
+
}
|
|
824
|
+
/** @deprecated Use {@link SelectedTimelineItem}. */
|
|
825
|
+
get selectedTimelineItem() {
|
|
826
|
+
return this.SelectedTimelineItem;
|
|
827
|
+
}
|
|
828
|
+
/** @deprecated Use {@link SelectedTimelineItem}. */
|
|
829
|
+
set selectedTimelineItem(value) {
|
|
830
|
+
this.SelectedTimelineItem = value;
|
|
831
|
+
}
|
|
832
|
+
/** @deprecated Use {@link JsonPanelExpanded}. */
|
|
833
|
+
get jsonPanelExpanded() {
|
|
834
|
+
return this.JsonPanelExpanded;
|
|
835
|
+
}
|
|
836
|
+
/** @deprecated Use {@link JsonPanelExpanded}. */
|
|
837
|
+
set jsonPanelExpanded(value) {
|
|
838
|
+
this.JsonPanelExpanded = value;
|
|
839
|
+
}
|
|
840
|
+
/** @deprecated Use {@link Loading}. */
|
|
841
|
+
get loading() {
|
|
842
|
+
return this.Loading;
|
|
843
|
+
}
|
|
844
|
+
/** @deprecated Use {@link Loading}. */
|
|
845
|
+
set loading(value) {
|
|
846
|
+
this.Loading = value;
|
|
847
|
+
}
|
|
848
|
+
/** @deprecated Use {@link AnalyticsLoaded}. */
|
|
849
|
+
get analyticsLoaded() {
|
|
850
|
+
return this.AnalyticsLoaded;
|
|
851
|
+
}
|
|
852
|
+
/** @deprecated Use {@link AnalyticsLoaded}. */
|
|
853
|
+
set analyticsLoaded(value) {
|
|
854
|
+
this.AnalyticsLoaded = value;
|
|
855
|
+
}
|
|
856
|
+
/** @deprecated Use {@link VisualizationLoaded}. */
|
|
857
|
+
get visualizationLoaded() {
|
|
858
|
+
return this.VisualizationLoaded;
|
|
859
|
+
}
|
|
860
|
+
/** @deprecated Use {@link VisualizationLoaded}. */
|
|
861
|
+
set visualizationLoaded(value) {
|
|
862
|
+
this.VisualizationLoaded = value;
|
|
863
|
+
}
|
|
864
|
+
/** @deprecated Use {@link Agent}. */
|
|
865
|
+
get agent() {
|
|
866
|
+
return this.Agent;
|
|
867
|
+
}
|
|
868
|
+
/** @deprecated Use {@link Agent}. */
|
|
869
|
+
set agent(value) {
|
|
870
|
+
this.Agent = value;
|
|
871
|
+
}
|
|
872
|
+
/** @deprecated Use {@link CostMetrics}. */
|
|
873
|
+
get costMetrics() {
|
|
874
|
+
return this.CostMetrics;
|
|
875
|
+
}
|
|
876
|
+
/** @deprecated Use {@link CostMetrics}. */
|
|
877
|
+
set costMetrics(value) {
|
|
878
|
+
this.CostMetrics = value;
|
|
879
|
+
}
|
|
880
|
+
/** @deprecated Use {@link TimelineComponent}. */
|
|
881
|
+
get timelineComponent() {
|
|
882
|
+
return this.TimelineComponent;
|
|
883
|
+
}
|
|
884
|
+
/** @deprecated Use {@link TimelineComponent}. */
|
|
885
|
+
set timelineComponent(value) {
|
|
886
|
+
this.TimelineComponent = value;
|
|
887
|
+
}
|
|
888
|
+
/** @deprecated Use {@link AnalyticsComponent}. */
|
|
889
|
+
get analyticsComponent() {
|
|
890
|
+
return this.AnalyticsComponent;
|
|
891
|
+
}
|
|
892
|
+
/** @deprecated Use {@link AnalyticsComponent}. */
|
|
893
|
+
set analyticsComponent(value) {
|
|
894
|
+
this.AnalyticsComponent = value;
|
|
895
|
+
}
|
|
896
|
+
/** @deprecated Use {@link DataHelper}. */
|
|
897
|
+
get dataHelper() {
|
|
898
|
+
return this.DataHelper;
|
|
899
|
+
}
|
|
900
|
+
/** @deprecated Use {@link DataHelper}. */
|
|
901
|
+
set dataHelper(value) {
|
|
902
|
+
this.DataHelper = value;
|
|
903
|
+
}
|
|
904
|
+
/** @deprecated Use {@link RunTree}. */
|
|
905
|
+
get runTree() {
|
|
906
|
+
return this.RunTree;
|
|
907
|
+
}
|
|
908
|
+
/** @deprecated Use {@link RunTree}. */
|
|
909
|
+
set runTree(value) {
|
|
910
|
+
this.RunTree = value;
|
|
911
|
+
}
|
|
912
|
+
/** @deprecated Use {@link RunTreeLoading}. */
|
|
913
|
+
get runTreeLoading() {
|
|
914
|
+
return this.RunTreeLoading;
|
|
915
|
+
}
|
|
916
|
+
/** @deprecated Use {@link RunTreeLoading}. */
|
|
917
|
+
set runTreeLoading(value) {
|
|
918
|
+
this.RunTreeLoading = value;
|
|
919
|
+
}
|
|
920
|
+
/** @deprecated Use {@link RunTreeError}. */
|
|
921
|
+
get runTreeError() {
|
|
922
|
+
return this.RunTreeError;
|
|
923
|
+
}
|
|
924
|
+
/** @deprecated Use {@link RunTreeError}. */
|
|
925
|
+
set runTreeError(value) {
|
|
926
|
+
this.RunTreeError = value;
|
|
815
927
|
}
|
|
816
928
|
/**
|
|
817
929
|
* Loads (or reloads) the shared run tree.
|
|
@@ -822,23 +934,23 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
822
934
|
async loadRunTree() {
|
|
823
935
|
if (!this.record?.ID)
|
|
824
936
|
return;
|
|
825
|
-
this.
|
|
826
|
-
this.
|
|
937
|
+
this.RunTreeLoading = true;
|
|
938
|
+
this.RunTreeError = null;
|
|
827
939
|
try {
|
|
828
940
|
const result = await LoadAgentRunTree(this.record.ID, this.RunQueryToUse);
|
|
829
|
-
this.
|
|
830
|
-
this.
|
|
941
|
+
this.RunTree = result.Root;
|
|
942
|
+
this.RunTreeError = result.ErrorMessage;
|
|
831
943
|
if (result.Truncated) {
|
|
832
|
-
this.
|
|
944
|
+
this.RunTreeError =
|
|
833
945
|
`This run nests deeper than ${MAX_AGENT_RUN_TREE_DEPTH} levels; what is shown is truncated.`;
|
|
834
946
|
}
|
|
835
947
|
}
|
|
836
948
|
catch (e) {
|
|
837
|
-
this.
|
|
838
|
-
this.
|
|
949
|
+
this.RunTreeError = e instanceof Error ? e.message : String(e);
|
|
950
|
+
this.RunTree = null;
|
|
839
951
|
}
|
|
840
952
|
finally {
|
|
841
|
-
this.
|
|
953
|
+
this.RunTreeLoading = false;
|
|
842
954
|
this.scheduleWorkflowPoll();
|
|
843
955
|
}
|
|
844
956
|
}
|
|
@@ -855,9 +967,9 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
855
967
|
* snapshot of a moving thing, with nothing saying so.
|
|
856
968
|
*/
|
|
857
969
|
get WorkflowStillRunning() {
|
|
858
|
-
if (!this.
|
|
970
|
+
if (!this.RunTree)
|
|
859
971
|
return false;
|
|
860
|
-
for (const node of WalkAgentRunTree(this.
|
|
972
|
+
for (const node of WalkAgentRunTree(this.RunTree)) {
|
|
861
973
|
if (node.NodeType !== 'Task' && node.NodeType !== 'TaskGraph')
|
|
862
974
|
continue;
|
|
863
975
|
if (!TERMINAL_TASK_STATUSES.has(node.Status))
|
|
@@ -893,7 +1005,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
893
1005
|
async ngOnInit() {
|
|
894
1006
|
await super.ngOnInit();
|
|
895
1007
|
if (this.record && this.record.ID) {
|
|
896
|
-
await this.
|
|
1008
|
+
await this.DataHelper.loadAgentRunData(this.record.ID);
|
|
897
1009
|
await this.loadRunTree();
|
|
898
1010
|
await this.loadAgent();
|
|
899
1011
|
await this.loadCostMetrics();
|
|
@@ -915,9 +1027,9 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
915
1027
|
this.entityEventSubscription?.unsubscribe();
|
|
916
1028
|
this.entityEventSubscription = null;
|
|
917
1029
|
this.clearParsedCache();
|
|
918
|
-
this.
|
|
919
|
-
this.
|
|
920
|
-
this.
|
|
1030
|
+
this.DataHelper.clearData();
|
|
1031
|
+
this.CostMetrics = null;
|
|
1032
|
+
this.Agent = null;
|
|
921
1033
|
}
|
|
922
1034
|
subscribeToRunEvents() {
|
|
923
1035
|
if (this.entityEventSubscription)
|
|
@@ -937,7 +1049,24 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
937
1049
|
* use case here); `remote-invalidate` covers writes from a separate
|
|
938
1050
|
* server process if GraphQL cache-invalidation is wired up.
|
|
939
1051
|
*/
|
|
940
|
-
|
|
1052
|
+
/**
|
|
1053
|
+
* Fire-and-forget: nothing consumes the return, which is what lets this be async. It has to be,
|
|
1054
|
+
* because a remote event no longer carries the row unless the deployment allowlisted the entity
|
|
1055
|
+
* — the fields below come from a keyed re-read instead (see `ResolveEntityEventRow`).
|
|
1056
|
+
*
|
|
1057
|
+
* Because the subscriber in `subscribeToRunEvents` drops the promise, a throw here would surface
|
|
1058
|
+
* as an unhandled rejection; the body is wrapped so it is logged instead, the same way
|
|
1059
|
+
* `FormBuilderResourceComponent.handleEntityEvent` handles it.
|
|
1060
|
+
*/
|
|
1061
|
+
async handleEntityEvent(mjEvent) {
|
|
1062
|
+
try {
|
|
1063
|
+
await this.handleEntityEventUnguarded(mjEvent);
|
|
1064
|
+
}
|
|
1065
|
+
catch (err) {
|
|
1066
|
+
LogError(`AIAgentRunForm.handleEntityEvent: ${err instanceof Error ? err.message : String(err)}`);
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
async handleEntityEventUnguarded(mjEvent) {
|
|
941
1070
|
if (mjEvent.event !== MJEventType.ComponentEvent)
|
|
942
1071
|
return;
|
|
943
1072
|
if (mjEvent.eventCode !== BaseEntity.BaseEventCode)
|
|
@@ -957,19 +1086,26 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
957
1086
|
// Status change on THIS run row.
|
|
958
1087
|
const savedID = this.resolveEventID(evt);
|
|
959
1088
|
if (savedID && UUIDsEqual(savedID, runId)) {
|
|
960
|
-
this.
|
|
1089
|
+
this.RefreshData();
|
|
961
1090
|
// If the run completed, drop the subscription — no further
|
|
962
1091
|
// writes are expected and we don't want to hold the listener.
|
|
963
|
-
|
|
1092
|
+
// Resolved only once the id has matched, so an unrelated run's event costs no read.
|
|
1093
|
+
const row = await this.resolveEventRow(evt);
|
|
1094
|
+
const newStatus = row?.['Status'];
|
|
964
1095
|
if (newStatus && newStatus !== 'Running') {
|
|
965
1096
|
this.unsubscribeFromRunEvents();
|
|
966
1097
|
}
|
|
967
1098
|
}
|
|
968
1099
|
return;
|
|
969
1100
|
}
|
|
970
|
-
// Steps still carry AgentRunID, so a step write can be correlated exactly to this run.
|
|
1101
|
+
// Steps still carry AgentRunID, so a step write can be correlated exactly to this run. Unlike
|
|
1102
|
+
// `Status` above, this read is NOT behind an id match — it cannot be, because AgentRunID is a
|
|
1103
|
+
// foreign key on the step and there is nothing to compare until the row is in hand. So while
|
|
1104
|
+
// this form is open on a Running agent, every step save anywhere in the deployment costs it
|
|
1105
|
+
// one keyed read (or nothing, if the entity is allowlisted for broadcast). It is bounded by
|
|
1106
|
+
// the run's lifetime: `unsubscribeFromRunEvents()` fires once the run leaves 'Running'.
|
|
971
1107
|
if (entityName === 'MJ: AI Agent Run Steps') {
|
|
972
|
-
const childAgentRunId = this.
|
|
1108
|
+
const childAgentRunId = (await this.resolveEventRow(evt))?.['AgentRunID'];
|
|
973
1109
|
if (childAgentRunId && UUIDsEqual(childAgentRunId, runId)) {
|
|
974
1110
|
this.refreshRunDataDebounced();
|
|
975
1111
|
}
|
|
@@ -1023,22 +1159,16 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1023
1159
|
}
|
|
1024
1160
|
return null;
|
|
1025
1161
|
}
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
const v = row?.[fieldName];
|
|
1037
|
-
return (v ?? null);
|
|
1038
|
-
}
|
|
1039
|
-
catch {
|
|
1040
|
-
return null;
|
|
1041
|
-
}
|
|
1162
|
+
/**
|
|
1163
|
+
* The row behind an event, for the two fields this component needs that the primary key cannot
|
|
1164
|
+
* give it (`Status` on the run, `AgentRunID` on a step).
|
|
1165
|
+
*
|
|
1166
|
+
* A remote event carries the row only for entities a deployment has opted into broadcasting;
|
|
1167
|
+
* otherwise this re-reads that one record as the signed-in user, so a session that may not read
|
|
1168
|
+
* it gets nothing rather than someone else's data.
|
|
1169
|
+
*/
|
|
1170
|
+
async resolveEventRow(evt) {
|
|
1171
|
+
return await ResolveEntityEventRow(evt, this.ProviderToUse);
|
|
1042
1172
|
}
|
|
1043
1173
|
/**
|
|
1044
1174
|
* Collapse rapid bursts of step/prompt/action events into a single
|
|
@@ -1052,7 +1182,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1052
1182
|
this.refreshInFlight = false;
|
|
1053
1183
|
if (!this.record?.ID)
|
|
1054
1184
|
return;
|
|
1055
|
-
this.
|
|
1185
|
+
this.DataHelper.loadAgentRunData(this.record.ID, true);
|
|
1056
1186
|
});
|
|
1057
1187
|
}
|
|
1058
1188
|
async loadAgent() {
|
|
@@ -1062,7 +1192,7 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1062
1192
|
const md = this.ProviderToUse;
|
|
1063
1193
|
const agent = await md.GetEntityObject('MJ: AI Agents');
|
|
1064
1194
|
if (agent && await agent.Load(this.record.AgentID)) {
|
|
1065
|
-
this.
|
|
1195
|
+
this.Agent = agent;
|
|
1066
1196
|
this.cdr.detectChanges();
|
|
1067
1197
|
}
|
|
1068
1198
|
}
|
|
@@ -1074,12 +1204,12 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1074
1204
|
if (!this.record?.ID)
|
|
1075
1205
|
return;
|
|
1076
1206
|
try {
|
|
1077
|
-
this.
|
|
1207
|
+
this.CostMetrics = await this.costService.getAgentRunCostMetrics(this.record.ID);
|
|
1078
1208
|
this.cdr.markForCheck();
|
|
1079
1209
|
}
|
|
1080
1210
|
catch (error) {
|
|
1081
1211
|
console.error('Error loading cost metrics:', error);
|
|
1082
|
-
this.
|
|
1212
|
+
this.CostMetrics = {
|
|
1083
1213
|
totalCost: 0,
|
|
1084
1214
|
totalPrompts: 0,
|
|
1085
1215
|
totalTokensInput: 0,
|
|
@@ -1089,20 +1219,24 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1089
1219
|
};
|
|
1090
1220
|
}
|
|
1091
1221
|
}
|
|
1092
|
-
|
|
1093
|
-
this.
|
|
1222
|
+
ChangeTab(tab) {
|
|
1223
|
+
this.ActiveTab = tab;
|
|
1094
1224
|
// Lazy load the Visualization (playable + static flow) view on first access
|
|
1095
|
-
if (tab === 'visualization' && !this.
|
|
1096
|
-
this.
|
|
1225
|
+
if (tab === 'visualization' && !this.VisualizationLoaded) {
|
|
1226
|
+
this.VisualizationLoaded = true;
|
|
1097
1227
|
this.cdr.markForCheck();
|
|
1098
1228
|
}
|
|
1099
1229
|
// Lazy load analytics when the tab is first accessed
|
|
1100
|
-
if (tab === 'analytics' && !this.
|
|
1101
|
-
this.
|
|
1230
|
+
if (tab === 'analytics' && !this.AnalyticsLoaded) {
|
|
1231
|
+
this.AnalyticsLoaded = true;
|
|
1102
1232
|
this.cdr.markForCheck();
|
|
1103
1233
|
}
|
|
1104
1234
|
}
|
|
1105
|
-
|
|
1235
|
+
/** @deprecated Use {@link ChangeTab}. */
|
|
1236
|
+
changeTab(tab) {
|
|
1237
|
+
return this.ChangeTab(tab);
|
|
1238
|
+
}
|
|
1239
|
+
CalculateDuration(start, end) {
|
|
1106
1240
|
if (!end)
|
|
1107
1241
|
return 'Running...';
|
|
1108
1242
|
const ms = end.getTime() - start.getTime();
|
|
@@ -1114,38 +1248,70 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1114
1248
|
return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;
|
|
1115
1249
|
return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;
|
|
1116
1250
|
}
|
|
1251
|
+
/** @deprecated Use {@link CalculateDuration}. */
|
|
1252
|
+
calculateDuration(start, end) {
|
|
1253
|
+
return this.CalculateDuration(start, end);
|
|
1254
|
+
}
|
|
1255
|
+
SelectTimelineItem(item) {
|
|
1256
|
+
this.SelectedTimelineItem = item;
|
|
1257
|
+
this.JsonPanelExpanded = true;
|
|
1258
|
+
this.cdr.markForCheck();
|
|
1259
|
+
}
|
|
1260
|
+
/** @deprecated Use {@link SelectTimelineItem}. */
|
|
1117
1261
|
selectTimelineItem(item) {
|
|
1118
|
-
this.
|
|
1119
|
-
|
|
1262
|
+
return this.SelectTimelineItem(item);
|
|
1263
|
+
}
|
|
1264
|
+
CloseJsonPanel() {
|
|
1265
|
+
this.SelectedTimelineItem = null;
|
|
1120
1266
|
this.cdr.markForCheck();
|
|
1121
1267
|
}
|
|
1268
|
+
/** @deprecated Use {@link CloseJsonPanel}. */
|
|
1122
1269
|
closeJsonPanel() {
|
|
1123
|
-
this.
|
|
1124
|
-
this.cdr.markForCheck();
|
|
1270
|
+
return this.CloseJsonPanel();
|
|
1125
1271
|
}
|
|
1126
|
-
|
|
1272
|
+
NavigateToSubRun(runId) {
|
|
1127
1273
|
SharedService.Instance.OpenEntityRecord("MJ: AI Agent Runs", CompositeKey.FromID(runId));
|
|
1128
1274
|
}
|
|
1129
|
-
|
|
1275
|
+
/** @deprecated Use {@link NavigateToSubRun}. */
|
|
1276
|
+
navigateToSubRun(runId) {
|
|
1277
|
+
return this.NavigateToSubRun(runId);
|
|
1278
|
+
}
|
|
1279
|
+
NavigateToParentRun() {
|
|
1130
1280
|
if (this.record.ParentRunID) {
|
|
1131
1281
|
SharedService.Instance.OpenEntityRecord("MJ: AI Agent Runs", CompositeKey.FromID(this.record.ParentRunID));
|
|
1132
1282
|
}
|
|
1133
1283
|
}
|
|
1134
|
-
|
|
1284
|
+
/** @deprecated Use {@link NavigateToParentRun}. */
|
|
1285
|
+
navigateToParentRun() {
|
|
1286
|
+
return this.NavigateToParentRun();
|
|
1287
|
+
}
|
|
1288
|
+
NavigateToActionLog(logId) {
|
|
1135
1289
|
SharedService.Instance.OpenEntityRecord("MJ: Action Execution Logs", CompositeKey.FromID(logId));
|
|
1136
1290
|
}
|
|
1137
|
-
|
|
1291
|
+
/** @deprecated Use {@link NavigateToActionLog}. */
|
|
1292
|
+
navigateToActionLog(logId) {
|
|
1293
|
+
return this.NavigateToActionLog(logId);
|
|
1294
|
+
}
|
|
1295
|
+
OpenEntityRecord(entityName, recordId) {
|
|
1138
1296
|
if (recordId) {
|
|
1139
1297
|
SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.FromURLSegment(this.ProviderToUse.EntityByName(entityName), recordId));
|
|
1140
1298
|
}
|
|
1141
1299
|
}
|
|
1142
|
-
|
|
1300
|
+
/** @deprecated Use {@link OpenEntityRecord}. */
|
|
1301
|
+
openEntityRecord(entityName, recordId) {
|
|
1302
|
+
return this.OpenEntityRecord(entityName, recordId);
|
|
1303
|
+
}
|
|
1304
|
+
NavigateToEntityRecord(event) {
|
|
1143
1305
|
SharedService.Instance.OpenEntityRecord(event.entityName, CompositeKey.FromURLSegment(this.ProviderToUse.EntityByName(event.entityName), event.recordId));
|
|
1144
1306
|
}
|
|
1307
|
+
/** @deprecated Use {@link NavigateToEntityRecord}. */
|
|
1308
|
+
navigateToEntityRecord(event) {
|
|
1309
|
+
return this.NavigateToEntityRecord(event);
|
|
1310
|
+
}
|
|
1145
1311
|
/**
|
|
1146
1312
|
* Navigate to the conversation in the Chat application
|
|
1147
1313
|
*/
|
|
1148
|
-
|
|
1314
|
+
NavigateToConversation() {
|
|
1149
1315
|
if (!this.record?.ConversationID)
|
|
1150
1316
|
return;
|
|
1151
1317
|
// Find the Chat app
|
|
@@ -1157,7 +1323,11 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1157
1323
|
// Navigate to the Conversations nav item with the conversationId parameter
|
|
1158
1324
|
this.navigationService.OpenNavItemByName('Conversations', { conversationId: this.record.ConversationID }, chatApp.ID);
|
|
1159
1325
|
}
|
|
1160
|
-
|
|
1326
|
+
/** @deprecated Use {@link NavigateToConversation}. */
|
|
1327
|
+
navigateToConversation() {
|
|
1328
|
+
return this.NavigateToConversation();
|
|
1329
|
+
}
|
|
1330
|
+
RefreshData() {
|
|
1161
1331
|
// Reload the agent run record to get latest status
|
|
1162
1332
|
if (this.record?.ID) {
|
|
1163
1333
|
// Clear parsed cache when refreshing data
|
|
@@ -1168,16 +1338,20 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1168
1338
|
this.costService.clearCache(this.record.ID);
|
|
1169
1339
|
this.loadCostMetrics();
|
|
1170
1340
|
// Reload data through helper - this will update all components (force reload for refresh)
|
|
1171
|
-
this.
|
|
1341
|
+
this.DataHelper.loadAgentRunData(this.record.ID, true);
|
|
1172
1342
|
void this.loadRunTree();
|
|
1173
1343
|
// Trigger analytics refresh
|
|
1174
|
-
if (this.
|
|
1175
|
-
this.
|
|
1344
|
+
if (this.AnalyticsComponent) {
|
|
1345
|
+
this.AnalyticsComponent.loadData();
|
|
1176
1346
|
}
|
|
1177
1347
|
});
|
|
1178
1348
|
}
|
|
1179
1349
|
}
|
|
1180
|
-
|
|
1350
|
+
/** @deprecated Use {@link RefreshData}. */
|
|
1351
|
+
refreshData() {
|
|
1352
|
+
return this.RefreshData();
|
|
1353
|
+
}
|
|
1354
|
+
GetStatusIcon(status) {
|
|
1181
1355
|
const iconMap = {
|
|
1182
1356
|
'Running': 'fa-circle-notch fa-spin',
|
|
1183
1357
|
'Completed': 'fa-check-circle',
|
|
@@ -1187,7 +1361,11 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1187
1361
|
};
|
|
1188
1362
|
return iconMap[status] || 'fa-question-circle';
|
|
1189
1363
|
}
|
|
1190
|
-
|
|
1364
|
+
/** @deprecated Use {@link GetStatusIcon}. */
|
|
1365
|
+
getStatusIcon(status) {
|
|
1366
|
+
return this.GetStatusIcon(status);
|
|
1367
|
+
}
|
|
1368
|
+
async CopyToClipboard(text) {
|
|
1191
1369
|
try {
|
|
1192
1370
|
await navigator.clipboard.writeText(text);
|
|
1193
1371
|
// Could show a toast notification here
|
|
@@ -1196,10 +1374,14 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1196
1374
|
console.error('Failed to copy to clipboard:', err);
|
|
1197
1375
|
}
|
|
1198
1376
|
}
|
|
1377
|
+
/** @deprecated Use {@link CopyToClipboard}. */
|
|
1378
|
+
async copyToClipboard(text) {
|
|
1379
|
+
return this.CopyToClipboard(text);
|
|
1380
|
+
}
|
|
1199
1381
|
/**
|
|
1200
1382
|
* Get the Result field with recursive JSON parsing applied
|
|
1201
1383
|
*/
|
|
1202
|
-
get
|
|
1384
|
+
get ParsedResult() {
|
|
1203
1385
|
if (!this.record?.Result) {
|
|
1204
1386
|
return '';
|
|
1205
1387
|
}
|
|
@@ -1236,10 +1418,14 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1236
1418
|
return fallbackResult;
|
|
1237
1419
|
}
|
|
1238
1420
|
}
|
|
1421
|
+
/** @deprecated Use {@link ParsedResult}. */
|
|
1422
|
+
get parsedResult() {
|
|
1423
|
+
return this.ParsedResult;
|
|
1424
|
+
}
|
|
1239
1425
|
/**
|
|
1240
1426
|
* Get the Starting Payload field with recursive JSON parsing applied
|
|
1241
1427
|
*/
|
|
1242
|
-
get
|
|
1428
|
+
get ParsedStartingPayload() {
|
|
1243
1429
|
if (!this.record?.StartingPayload) {
|
|
1244
1430
|
return '';
|
|
1245
1431
|
}
|
|
@@ -1276,10 +1462,14 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1276
1462
|
return fallbackResult;
|
|
1277
1463
|
}
|
|
1278
1464
|
}
|
|
1465
|
+
/** @deprecated Use {@link ParsedStartingPayload}. */
|
|
1466
|
+
get parsedStartingPayload() {
|
|
1467
|
+
return this.ParsedStartingPayload;
|
|
1468
|
+
}
|
|
1279
1469
|
/**
|
|
1280
1470
|
* Get the Final Payload (state) field with recursive JSON parsing applied
|
|
1281
1471
|
*/
|
|
1282
|
-
get
|
|
1472
|
+
get ParsedFinalPayload() {
|
|
1283
1473
|
if (!this.record?.FinalPayload)
|
|
1284
1474
|
return '';
|
|
1285
1475
|
// Return cached result if available
|
|
@@ -1315,10 +1505,14 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1315
1505
|
return fallbackResult;
|
|
1316
1506
|
}
|
|
1317
1507
|
}
|
|
1508
|
+
/** @deprecated Use {@link ParsedFinalPayload}. */
|
|
1509
|
+
get parsedFinalPayload() {
|
|
1510
|
+
return this.ParsedFinalPayload;
|
|
1511
|
+
}
|
|
1318
1512
|
/**
|
|
1319
1513
|
* Get the Data field with recursive JSON parsing applied
|
|
1320
1514
|
*/
|
|
1321
|
-
get
|
|
1515
|
+
get ParsedData() {
|
|
1322
1516
|
if (!this.record?.Data)
|
|
1323
1517
|
return '';
|
|
1324
1518
|
// Return cached result if available
|
|
@@ -1354,10 +1548,14 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1354
1548
|
return fallbackResult;
|
|
1355
1549
|
}
|
|
1356
1550
|
}
|
|
1551
|
+
/** @deprecated Use {@link ParsedData}. */
|
|
1552
|
+
get parsedData() {
|
|
1553
|
+
return this.ParsedData;
|
|
1554
|
+
}
|
|
1357
1555
|
/**
|
|
1358
1556
|
* Get parsed Starting Payload as an object for deep diff
|
|
1359
1557
|
*/
|
|
1360
|
-
get
|
|
1558
|
+
get StartingPayloadObject() {
|
|
1361
1559
|
if (!this.record?.StartingPayload)
|
|
1362
1560
|
return null;
|
|
1363
1561
|
try {
|
|
@@ -1383,10 +1581,14 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1383
1581
|
return null;
|
|
1384
1582
|
}
|
|
1385
1583
|
}
|
|
1584
|
+
/** @deprecated Use {@link StartingPayloadObject}. */
|
|
1585
|
+
get startingPayloadObject() {
|
|
1586
|
+
return this.StartingPayloadObject;
|
|
1587
|
+
}
|
|
1386
1588
|
/**
|
|
1387
1589
|
* Get parsed Final Payload as an object for deep diff
|
|
1388
1590
|
*/
|
|
1389
|
-
get
|
|
1591
|
+
get FinalPayloadObject() {
|
|
1390
1592
|
if (!this.record?.FinalPayload)
|
|
1391
1593
|
return null;
|
|
1392
1594
|
try {
|
|
@@ -1412,6 +1614,10 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1412
1614
|
return null;
|
|
1413
1615
|
}
|
|
1414
1616
|
}
|
|
1617
|
+
/** @deprecated Use {@link FinalPayloadObject}. */
|
|
1618
|
+
get finalPayloadObject() {
|
|
1619
|
+
return this.FinalPayloadObject;
|
|
1620
|
+
}
|
|
1415
1621
|
/**
|
|
1416
1622
|
* Clear all cached parsed results
|
|
1417
1623
|
*/
|
|
@@ -1430,19 +1636,19 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1430
1636
|
let parsedCount = 0;
|
|
1431
1637
|
// Parse all fields that exist
|
|
1432
1638
|
if (this.record?.Result) {
|
|
1433
|
-
this.
|
|
1639
|
+
this.ParsedResult; // Triggers parsing and caching
|
|
1434
1640
|
parsedCount++;
|
|
1435
1641
|
}
|
|
1436
1642
|
if (this.record?.StartingPayload) {
|
|
1437
|
-
this.
|
|
1643
|
+
this.ParsedStartingPayload; // Triggers parsing and caching
|
|
1438
1644
|
parsedCount++;
|
|
1439
1645
|
}
|
|
1440
1646
|
if (this.record?.FinalPayload) {
|
|
1441
|
-
this.
|
|
1647
|
+
this.ParsedFinalPayload; // Triggers parsing and caching
|
|
1442
1648
|
parsedCount++;
|
|
1443
1649
|
}
|
|
1444
1650
|
if (this.record?.Data) {
|
|
1445
|
-
this.
|
|
1651
|
+
this.ParsedData; // Triggers parsing and caching
|
|
1446
1652
|
parsedCount++;
|
|
1447
1653
|
}
|
|
1448
1654
|
this._allParsingComplete = true;
|
|
@@ -1454,23 +1660,31 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1454
1660
|
/**
|
|
1455
1661
|
* Check if all parsing is complete - used by template
|
|
1456
1662
|
*/
|
|
1457
|
-
get
|
|
1663
|
+
get IsParsingComplete() {
|
|
1458
1664
|
return this._allParsingComplete;
|
|
1459
1665
|
}
|
|
1666
|
+
/** @deprecated Use {@link IsParsingComplete}. */
|
|
1667
|
+
get isParsingComplete() {
|
|
1668
|
+
return this.IsParsingComplete;
|
|
1669
|
+
}
|
|
1460
1670
|
/**
|
|
1461
1671
|
* Check if we have both payloads to show diff
|
|
1462
1672
|
*/
|
|
1463
|
-
get
|
|
1673
|
+
get ShowPayloadDiff() {
|
|
1464
1674
|
return !!(this.record?.StartingPayload && this.record?.FinalPayload);
|
|
1465
1675
|
}
|
|
1676
|
+
/** @deprecated Use {@link ShowPayloadDiff}. */
|
|
1677
|
+
get showPayloadDiff() {
|
|
1678
|
+
return this.ShowPayloadDiff;
|
|
1679
|
+
}
|
|
1466
1680
|
/**
|
|
1467
1681
|
* Check if selected timeline item is a step with payload changes
|
|
1468
1682
|
*/
|
|
1469
|
-
get
|
|
1470
|
-
if (!this.
|
|
1683
|
+
get ShowStepPayloadDiff() {
|
|
1684
|
+
if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {
|
|
1471
1685
|
return false;
|
|
1472
1686
|
}
|
|
1473
|
-
const stepData = this.
|
|
1687
|
+
const stepData = this.SelectedTimelineItem.data;
|
|
1474
1688
|
if (stepData && (stepData.PayloadAtStart?.trim().length > 0
|
|
1475
1689
|
|| stepData.PayloadAtEnd?.trim().length > 0)) {
|
|
1476
1690
|
return stepData.PayloadAtStart !== stepData.PayloadAtEnd;
|
|
@@ -1479,14 +1693,18 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1479
1693
|
return false;
|
|
1480
1694
|
}
|
|
1481
1695
|
}
|
|
1696
|
+
/** @deprecated Use {@link ShowStepPayloadDiff}. */
|
|
1697
|
+
get showStepPayloadDiff() {
|
|
1698
|
+
return this.ShowStepPayloadDiff;
|
|
1699
|
+
}
|
|
1482
1700
|
/**
|
|
1483
1701
|
* Get parsed PayloadAtStart for the selected step
|
|
1484
1702
|
*/
|
|
1485
|
-
get
|
|
1486
|
-
if (!this.
|
|
1703
|
+
get StepPayloadAtStartObject() {
|
|
1704
|
+
if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {
|
|
1487
1705
|
return null;
|
|
1488
1706
|
}
|
|
1489
|
-
const stepData = this.
|
|
1707
|
+
const stepData = this.SelectedTimelineItem.data;
|
|
1490
1708
|
if (!stepData || !stepData.PayloadAtStart) {
|
|
1491
1709
|
return null;
|
|
1492
1710
|
}
|
|
@@ -1510,14 +1728,18 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1510
1728
|
return null;
|
|
1511
1729
|
}
|
|
1512
1730
|
}
|
|
1731
|
+
/** @deprecated Use {@link StepPayloadAtStartObject}. */
|
|
1732
|
+
get stepPayloadAtStartObject() {
|
|
1733
|
+
return this.StepPayloadAtStartObject;
|
|
1734
|
+
}
|
|
1513
1735
|
/**
|
|
1514
1736
|
* Get parsed PayloadAtEnd for the selected step
|
|
1515
1737
|
*/
|
|
1516
|
-
get
|
|
1517
|
-
if (!this.
|
|
1738
|
+
get StepPayloadAtEndObject() {
|
|
1739
|
+
if (!this.SelectedTimelineItem || this.SelectedTimelineItem.type !== 'step') {
|
|
1518
1740
|
return null;
|
|
1519
1741
|
}
|
|
1520
|
-
const stepData = this.
|
|
1742
|
+
const stepData = this.SelectedTimelineItem.data;
|
|
1521
1743
|
if (!stepData || !stepData.PayloadAtEnd) {
|
|
1522
1744
|
return null;
|
|
1523
1745
|
}
|
|
@@ -1541,13 +1763,17 @@ let MJAIAgentRunFormComponentExtended = class MJAIAgentRunFormComponentExtended
|
|
|
1541
1763
|
return null;
|
|
1542
1764
|
}
|
|
1543
1765
|
}
|
|
1766
|
+
/** @deprecated Use {@link StepPayloadAtEndObject}. */
|
|
1767
|
+
get stepPayloadAtEndObject() {
|
|
1768
|
+
return this.StepPayloadAtEndObject;
|
|
1769
|
+
}
|
|
1544
1770
|
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵMJAIAgentRunFormComponentExtended_BaseFactory; return function MJAIAgentRunFormComponentExtended_Factory(__ngFactoryType__) { return (ɵMJAIAgentRunFormComponentExtended_BaseFactory || (ɵMJAIAgentRunFormComponentExtended_BaseFactory = i0.ɵɵgetInheritedFactory(MJAIAgentRunFormComponentExtended)))(__ngFactoryType__ || MJAIAgentRunFormComponentExtended); }; })(); }
|
|
1545
1771
|
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJAIAgentRunFormComponentExtended, selectors: [["mj-ai-agent-run-form"]], viewQuery: function MJAIAgentRunFormComponentExtended_Query(rf, ctx) { if (rf & 1) {
|
|
1546
1772
|
i0.ɵɵviewQuery(AIAgentRunTimelineComponent, 5)(AIAgentRunAnalyticsComponent, 5);
|
|
1547
1773
|
} if (rf & 2) {
|
|
1548
1774
|
let _t;
|
|
1549
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
1550
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
1775
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.TimelineComponent = _t.first);
|
|
1776
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.AnalyticsComponent = _t.first);
|
|
1551
1777
|
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 59, vars: 35, consts: [["analyticsComponent", ""], [1, "record-form-container", "ai-agent-run-form"], [1, "record-form"], [1, "header"], [1, "header-content"], [1, "header-left"], [1, "icon-wrapper"], [1, "agent-logo", 3, "src", "alt"], [1, "fas", 3, "ngClass"], [1, "fas", "fa-robot"], [1, "header-info"], [1, "meta-info"], [1, "agent-name"], [1, "run-id"], [1, "parent-run"], ["title", "Open conversation in Chat app", 1, "conversation-pill"], [1, "header-right"], ["title", "This run executed in Plan Mode \u2014 the agent presented a plan for human approval before executing actions or sub-agents", 1, "plan-mode-badge"], [1, "status-badge"], ["title", "This run submitted a workflow that runs on the dispatcher. The run finished when the workflow was submitted; the workflow itself is still going. This view refreshes on its own.", 1, "workflow-running-badge"], [1, "header-actions"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fas", "fa-sync-alt"], [1, "header-stats"], [1, "stat"], [1, "label"], [1, "value"], [1, "configuration-bar"], [1, "tabs"], [1, "tab", 3, "click"], [1, "fas", "fa-stream"], [1, "fas", "fa-diagram-project"], [1, "fas", "fa-chart-line"], [1, "fas", "fa-info-circle"], [1, "content-area"], [1, "tab-content", 2, "height", "100%"], [1, "tab-content"], ["href", "javascript:void(0)", 1, "entity-link", 3, "click"], [1, "fas", "fa-level-up-alt"], [1, "parent-link", 3, "click"], ["title", "Open conversation in Chat app", 1, "conversation-pill", 3, "click"], [1, "fas", "fa-comments"], [1, "fas", "fa-external-link-alt", "pill-action"], [1, "fas", "fa-clipboard-check"], [1, "fas", "fa-circle-notch", "fa-spin"], [1, "value", "loading"], [1, "fas", "fa-spinner", "fa-spin"], [1, "config-item"], [1, "fas", "fa-cog"], [1, "config-content"], [1, "config-label"], [1, "config-value"], ["direction", "horizontal", 2, "height", "100%"], [3, "size"], [3, "itemSelected", "navigateToEntity", "aiAgentRunId", "dataHelper", "RunTree"], [3, "closePanel", "navigateToActionLog", "copyToClipboard", "selectedTimelineItem", "Provider"], [3, "aiAgentRunId", "dataHelper", "agentName", "runStatus", "agentIconClass", "agentLogoUrl", "RunTree"], [3, "agentRunId", "RunTree"], [3, "Expanded"], ["mjAccordionTitle", ""], [1, "details-grid"], [1, "detail-item"], ["href", "javascript:void(0)", 1, "entity-link"], [1, "success"], [1, "error-message"], [1, "detail-item", "full-width"], [1, "fas", "fa-cogs"], [1, "fas", "fa-tasks"], [1, "message"], [1, "fas", "fa-dollar-sign"], [1, "result-viewer"], [2, "height", "300px", "width", "100%", 3, "ngModel", "language", "readonly"], [2, "padding", "20px", "text-align", "center", "color", "var(--mj-text-muted)"], [1, "fas", "fa-code"], [1, "fas", "fa-upload"], [1, "fas", "fa-database"], [1, "fas", "fa-download"], [2, "padding", "20px", "background", "var(--mj-bg-surface-card)"], [3, "oldValue", "newValue", "title", "showSummary", "showUnchanged", "expandAll", "maxDepth", "maxStringLength", "treatNullAsUndefined"], [1, "fas", "fa-code-compare"]], template: function MJAIAgentRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
|
|
1552
1778
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "div", 4)(4, "div", 5)(5, "div", 6);
|
|
1553
1779
|
i0.ɵɵconditionalCreate(6, MJAIAgentRunFormComponentExtended_Conditional_6_Template, 1, 2, "img", 7);
|
|
@@ -1684,10 +1910,10 @@ export { MJAIAgentRunFormComponentExtended };
|
|
|
1684
1910
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJAIAgentRunFormComponentExtended, [{
|
|
1685
1911
|
type: Component,
|
|
1686
1912
|
args: [{ standalone: false, selector: 'mj-ai-agent-run-form', template: "<div class=\"record-form-container ai-agent-run-form\">\n <div class=\"record-form\">\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"icon-wrapper\">\n @if (agent && agent.LogoURL) {\n <img [src]=\"agent.LogoURL\" [alt]=\"agent.Name || 'Agent'\" class=\"agent-logo\" />\n }\n @if (agent && !agent.LogoURL && agent.IconClass) {\n <i class=\"fas\" [ngClass]=\"agent.IconClass\"></i>\n }\n @if (!agent || (!agent.LogoURL && !agent.IconClass)) {\n <i class=\"fas fa-robot\"></i>\n }\n </div>\n <div class=\"header-info\">\n <h2>AI Agent Run</h2>\n <div class=\"meta-info\">\n @if (agent) {\n <span class=\"agent-name\">\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agents', record.AgentID)\">\n {{ agent.Name }}\n </a>\n </span>\n }\n <span class=\"run-id\">{{ record.ID }}</span>\n @if (record.ParentRunID) {\n <span class=\"parent-run\">\n <i class=\"fas fa-level-up-alt\"></i>\n <a (click)=\"navigateToParentRun()\" class=\"parent-link\">Parent Run</a>\n </span>\n }\n <!-- Conversation Link Pill -->\n @if (record.ConversationID) {\n <span class=\"conversation-pill\" (click)=\"navigateToConversation()\" title=\"Open conversation in Chat app\">\n <i class=\"fas fa-comments\"></i>\n <span>Conversation</span>\n <i class=\"fas fa-external-link-alt pill-action\"></i>\n </span>\n }\n </div>\n </div>\n </div>\n <div class=\"header-right\">\n @if (record.PlanMode) {\n <div class=\"plan-mode-badge\" title=\"This run executed in Plan Mode \u2014 the agent presented a plan for human approval before executing actions or sub-agents\">\n <i class=\"fas fa-clipboard-check\"></i>\n Plan Mode\n </div>\n }\n <div class=\"status-badge\" [attr.data-status]=\"record.Status\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon(record.Status || '')\"></i>\n {{ record.Status }}\n </div>\n <!-- A workflow outlives the run that submitted it, so a Completed run can still have work\n in flight. Said beside the status rather than instead of it \u2014 both are true. -->\n @if (WorkflowStillRunning) {\n <div class=\"workflow-running-badge\"\n title=\"This run submitted a workflow that runs on the dispatcher. The run finished when the workflow was submitted; the workflow itself is still going. This view refreshes on its own.\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n Workflow still running\n </div>\n }\n <div class=\"header-actions\">\n <button class=\"btn-icon\" (click)=\"refreshData()\" title=\"Refresh\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"header-stats\">\n <div class=\"stat\">\n <span class=\"label\">Started</span>\n <span class=\"value\">{{ record.StartedAt | date:'medium' }}</span>\n </div>\n @if (record.CompletedAt) {\n <div class=\"stat\">\n <span class=\"label\">Completed</span>\n <span class=\"value\">{{ record.CompletedAt | date:'medium' }}</span>\n </div>\n }\n @if (record.CompletedAt) {\n <div class=\"stat\">\n <span class=\"label\">Duration</span>\n <span class=\"value\">{{ calculateDuration(record.StartedAt, record.CompletedAt) }}</span>\n </div>\n }\n @if (record.Success !== null && record.CompletedAt !== null) {\n <div class=\"stat\">\n <span class=\"label\">Result</span>\n <span class=\"value\" [class.success]=\"record.Success\" [class.error]=\"!record.Success\">\n {{ record.Success ? 'Success' : 'Failed' }}\n </span>\n </div>\n }\n @if (costMetrics && (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) > 0) {\n <div class=\"stat\">\n <span class=\"label\">Tokens</span>\n @if (!costMetrics.isLoading) {\n <span class=\"value\">{{ (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) | number:'1.0-0' }}</span>\n }\n @if (costMetrics.isLoading) {\n <span class=\"value loading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n }\n </div>\n }\n @if (costMetrics && costMetrics.totalCost > 0) {\n <div class=\"stat\">\n <span class=\"label\">Cost</span>\n @if (!costMetrics.isLoading) {\n <span class=\"value\">${{ costMetrics.totalCost | number:'1.2-4' }}</span>\n }\n @if (costMetrics.isLoading) {\n <span class=\"value loading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n }\n </div>\n }\n @if (record.EffortLevel) {\n <div class=\"stat\">\n <span class=\"label\">Effort Level</span>\n <span class=\"value\">{{ record.EffortLevel }}</span>\n </div>\n }\n </div>\n\n <!-- Configuration Bar (shown below header stats when ConfigurationID exists) -->\n @if (record.ConfigurationID) {\n <div class=\"configuration-bar\">\n <div class=\"config-item\">\n <i class=\"fas fa-cog\"></i>\n <div class=\"config-content\">\n <div class=\"config-label\">Configuration</div>\n <div class=\"config-value\">\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Configurations', record.ConfigurationID)\">\n {{ record.Configuration || 'Unknown' }}\n </a>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab\" [class.active]=\"activeTab === 'timeline'\" (click)=\"changeTab('timeline')\">\n <i class=\"fas fa-stream\"></i> Timeline\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'visualization'\" (click)=\"changeTab('visualization')\">\n <i class=\"fas fa-diagram-project\"></i> Visualization\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'analytics'\" (click)=\"changeTab('analytics')\">\n <i class=\"fas fa-chart-line\"></i> Analytics\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'details'\" (click)=\"changeTab('details')\">\n <i class=\"fas fa-info-circle\"></i> Details\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"content-area\">\n <!-- Timeline Tab -->\n @if (activeTab === 'timeline') {\n <div class=\"tab-content\" style=\"height: 100%;\">\n <as-split direction=\"horizontal\" style=\"height: 100%;\">\n <!-- Timeline Pane -->\n <as-split-area [size]=\"selectedTimelineItem ? 55 : 100\">\n <mj-ai-agent-run-timeline\n [aiAgentRunId]=\"record.ID\"\n [dataHelper]=\"dataHelper\"\n [RunTree]=\"runTree\"\n (itemSelected)=\"selectTimelineItem($event)\"\n (navigateToEntity)=\"navigateToEntityRecord($event)\">\n </mj-ai-agent-run-timeline>\n </as-split-area>\n <!-- JSON Detail Pane -->\n @if (selectedTimelineItem) {\n <as-split-area [size]=\"45\">\n <mj-ai-agent-run-step-detail\n [selectedTimelineItem]=\"selectedTimelineItem\"\n [Provider]=\"ProviderToUse\"\n (closePanel)=\"closeJsonPanel()\"\n (navigateToActionLog)=\"navigateToActionLog($event)\"\n (copyToClipboard)=\"copyToClipboard($event)\">\n </mj-ai-agent-run-step-detail>\n </as-split-area>\n }\n </as-split>\n </div>\n }\n\n <!-- Visualization Tab (animated flow views + static flowchart) -->\n @if (activeTab === 'visualization') {\n <div class=\"tab-content\" style=\"height: 100%;\">\n @if (visualizationLoaded) {\n <mj-ai-agent-run-flow\n [aiAgentRunId]=\"record.ID\"\n [dataHelper]=\"dataHelper\"\n [agentName]=\"agent?.Name || null\"\n [runStatus]=\"record.Status || ''\"\n [agentIconClass]=\"agent?.IconClass || null\"\n [agentLogoUrl]=\"agent?.LogoURL || null\"\n [RunTree]=\"runTree\">\n </mj-ai-agent-run-flow>\n }\n </div>\n }\n\n <!-- Analytics Tab -->\n @if (activeTab === 'analytics') {\n <div class=\"tab-content\" style=\"height: 100%;\">\n @if (analyticsLoaded) {\n <mj-ai-agent-run-analytics\n #analyticsComponent\n [agentRunId]=\"record.ID\"\n [RunTree]=\"runTree\"\n >\n </mj-ai-agent-run-analytics>\n }\n </div>\n }\n\n <!-- Details Tab -->\n @if (activeTab === 'details') {\n <div class=\"tab-content\">\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-info-circle\"></i> General Information\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Agent</label>\n <span>\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agents', record.AgentID)\">\n {{ agent?.Name || 'N/A' }}\n </a>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Parent Run ID</label>\n <span>\n @if (record.ParentRunID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.ParentRunID)\">\n {{ record.ParentRunID }}\n </a>\n }\n @if (!record.ParentRunID) {\n <span>None (Root)</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Last Run ID</label>\n <span>\n @if (record.LastRunID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.LastRunID)\">\n {{ record.LastRunID }}\n </a>\n }\n @if (!record.LastRunID) {\n <span>None</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Conversation ID</label>\n <span>\n @if (record.ConversationID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: Conversations', record.ConversationID)\">\n {{ record.ConversationID }}\n </a>\n }\n @if (!record.ConversationID) {\n <span>N/A</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>User</label>\n <span>\n @if (record.UserID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: Users', record.UserID)\">\n {{ record.User || 'N/A' }}\n </a>\n }\n @if (!record.UserID) {\n <span>N/A</span>\n }\n </span>\n </div>\n </div>\n </mj-accordion-panel>\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-cogs\"></i> Execution Settings\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Override Model</label>\n <span>\n @if (record.OverrideModelID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Models', record.OverrideModelID)\">\n {{ record.OverrideModel || 'N/A' }}\n </a>\n }\n @if (!record.OverrideModelID) {\n <span>N/A</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Override Vendor</label>\n <span>\n @if (record.OverrideVendorID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Vendors', record.OverrideVendorID)\">\n {{ record.OverrideVendor || 'N/A' }}\n </a>\n }\n @if (!record.OverrideVendorID) {\n <span>N/A</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Verbose Logging</label>\n <span>{{ record.Verbose ? 'Yes' : 'No' }}</span>\n </div>\n </div>\n </mj-accordion-panel>\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-tasks\"></i> Execution Status\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Status</label>\n <span class=\"status-badge\" [attr.data-status]=\"record.Status\">\n {{ record.Status }}\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Success</label>\n @if (record.Success === null) {\n <span>In Progress</span>\n }\n @else if (record.Success) {\n <span class=\"success\">Yes</span>\n }\n @else {\n <span class=\"error-message\">No</span>\n }\n </div>\n @if (record.Message) {\n <div class=\"detail-item full-width\">\n <label>Message</label>\n <div class=\"message\">{{ record.Message }}</div>\n </div>\n }\n @if (record.ErrorMessage) {\n <div class=\"detail-item full-width\">\n <label>Error Message</label>\n <div class=\"error-message\">{{ record.ErrorMessage }}</div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-dollar-sign\"></i> Usage & Cost\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Total Tokens Used</label>\n <span>{{ record.TotalTokensUsed ? (record.TotalTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Prompt Tokens</label>\n <span>{{ record.TotalPromptTokensUsed ? (record.TotalPromptTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Completion Tokens</label>\n <span>{{ record.TotalCompletionTokensUsed ? (record.TotalCompletionTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Cost</label>\n <span>{{ record.TotalCost != null ? ('$' + (record.TotalCost | number:'1.2-4')) : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Prompt Iterations</label>\n <span>{{ record.TotalPromptIterations != null ? (record.TotalPromptIterations | number:'1.0-0') : 'N/A' }}</span>\n </div>\n </div>\n </mj-accordion-panel>\n @if (record.Result) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-code\"></i> Result\n </ng-template>\n <div class=\"result-viewer\">\n @if (isParsingComplete) {\n <mj-code-editor\n [ngModel]=\"parsedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading result data...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n @if (record.StartingPayload) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-upload\"></i> Starting Payload\n </ng-template>\n <div class=\"result-viewer\">\n @if (isParsingComplete) {\n <mj-code-editor\n [ngModel]=\"parsedStartingPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading payload data...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n @if (record.Data) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-database\"></i> Execution Data\n </ng-template>\n <div class=\"result-viewer\">\n @if (isParsingComplete) {\n <mj-code-editor\n [ngModel]=\"parsedData\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading execution data...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n @if (record.FinalPayload) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-download\"></i> Final Payload\n </ng-template>\n <div class=\"result-viewer\">\n @if (isParsingComplete) {\n <mj-code-editor\n [ngModel]=\"parsedFinalPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading final payload data...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n @if (showPayloadDiff) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-code-compare\"></i> Payload Diff\n </ng-template>\n <div style=\"padding: 20px; background: var(--mj-bg-surface-card);\">\n @if (isParsingComplete) {\n <mj-deep-diff\n [oldValue]=\"startingPayloadObject\"\n [newValue]=\"finalPayloadObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"10\"\n [maxStringLength]=\"200\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n } @else {\n <div style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fas fa-spinner fa-spin\"></i> Loading payload diff...\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n </div>\n }\n</div>\n</div>\n</div>", styles: [".ai-agent-run-form {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.record-form-container.ai-agent-run-form > .record-form,\n.ai-agent-run-form > .record-form {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n/* Header Styles */\n.header {\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 20px;\n box-shadow: var(--mj-shadow-sm);\n flex-shrink: 0;\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper {\n width: 48px;\n height: 48px;\n background: var(--mj-brand-primary);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 20px;\n overflow: hidden;\n}\n\n.agent-logo {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.header-info h2 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.meta-info {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: var(--mj-text-muted);\n}\n\n.parent-run {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.parent-link {\n color: var(--mj-status-error);\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.parent-link:hover {\n color: var(--mj-status-error);\n text-decoration: underline;\n}\n\n.agent-name {\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.run-id {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n/* Conversation Link Pill */\n.conversation-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-brand-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.conversation-pill:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.conversation-pill i:first-child {\n font-size: 11px;\n opacity: 0.9;\n}\n\n.conversation-pill .pill-action {\n font-size: 9px;\n opacity: 0.6;\n transition: opacity 0.2s ease;\n}\n\n.conversation-pill:hover .pill-action {\n opacity: 1;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.status-badge[data-status=\"Running\"] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.status-badge[data-status=\"Completed\"] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge[data-status=\"Failed\"] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge[data-status=\"Cancelled\"] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-badge[data-status=\"Paused\"] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.status-badge.small {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n/* Plan Mode chip \u2014 shown next to the status badge when AIAgentRun.PlanMode = 1 */\n.plan-mode-badge {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon {\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n}\n\n.btn-icon:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.header-stats {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* Configuration Bar */\n.configuration-bar {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n margin-top: 16px;\n}\n\n.config-item {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.config-item > i {\n font-size: 1.2em;\n color: var(--mj-text-muted);\n width: 24px;\n text-align: center;\n}\n\n.config-content {\n display: flex;\n flex-direction: column;\n}\n\n.config-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.config-value {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.config-value .entity-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.config-value .entity-link:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n.stat {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat .label {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat .value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.stat .value.success {\n color: var(--mj-status-success);\n}\n\n.stat .value.error {\n color: var(--mj-status-error);\n}\n\n/* Tabs */\n.tabs {\n display: flex;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n flex-shrink: 0;\n}\n\n.tab {\n padding: 12px 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n border-bottom: 3px solid transparent;\n}\n\n.tab:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface));\n}\n\n.tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n}\n\n/* Content Area */\n.content-area {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--mj-bg-surface);\n}\n\n.tab-content {\n height: 100%;\n min-height: 0;\n overflow: auto;\n}\n\n/* Details tab accordion panels */\n.tab-content mj-accordion-panel {\n display: block;\n margin-bottom: 8px;\n}\n\n/* JSON Detail Pane */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-sunken);\n border-left: 1px solid var(--mj-border-default);\n}\n\n.json-pane-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-pane-header h3 i {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.json-pane-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n padding: 16px;\n}\n\n.json-meta {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta .meta-item label {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n\n.json-meta .meta-item span {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.action-link {\n margin-bottom: 12px;\n}\n\n.action-link .btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 14px;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 4px;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-link .btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.json-viewer {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n overflow: auto;\n padding: 20px;\n gap: 10px;\n min-height: 0;\n margin-bottom: 45px;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n/* Timeline Styles */\n.timeline-container {\n height: 100%;\n overflow-y: auto;\n padding: 20px;\n}\n\n.timeline-container > .timeline {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.timeline {\n position: relative;\n padding-left: 40px;\n}\n\n.timeline::before {\n content: '';\n position: absolute;\n left: 20px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.timeline-item {\n position: relative;\n margin-bottom: 24px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item:hover {\n transform: translateX(4px);\n}\n\n.timeline-item.selected {\n transform: translateX(8px);\n}\n\n.timeline-item.selected .timeline-content {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.timeline-marker {\n position: absolute;\n left: -30px;\n top: 0;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 3px solid var(--mj-border-default);\n z-index: 1;\n transition: all 0.2s ease;\n}\n\n.timeline-marker[data-color=\"success\"] {\n border-color: var(--mj-status-success);\n color: var(--mj-status-success);\n}\n\n.timeline-marker[data-color=\"error\"] {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.timeline-marker[data-color=\"info\"] {\n border-color: var(--mj-status-info);\n color: var(--mj-status-info);\n}\n\n.timeline-marker[data-color=\"warning\"] {\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n}\n\n.timeline-marker[data-color=\"secondary\"] {\n border-color: var(--mj-text-muted);\n color: var(--mj-text-muted);\n}\n\n.timeline-marker.small {\n width: 28px;\n height: 28px;\n font-size: 12px;\n}\n\n.timeline-content {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n margin-left: 20px;\n box-shadow: var(--mj-shadow-sm);\n transition: all 0.2s ease;\n}\n\n.timeline-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.timeline-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.timeline-header h5 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.timeline-time {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-family: monospace;\n}\n\n.timeline-subtitle {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.timeline-meta {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.timeline-meta .status {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.timeline-meta .status[data-status=\"Completed\"] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.timeline-meta .status[data-status=\"Failed\"] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.timeline-meta .status[data-status=\"Running\"] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.timeline-meta .status[data-status=\"Paused\"] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.duration {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.timeline-actions {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.btn-expand {\n width: 24px;\n height: 24px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.btn-expand:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n/* Timeline Children */\n.timeline-children {\n position: relative;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n\n.timeline-children::before {\n content: '';\n position: absolute;\n left: -10px;\n top: -12px;\n bottom: 0;\n width: 2px;\n background: var(--mj-border-default);\n}\n\n.child-item {\n margin-bottom: 12px;\n}\n\n.child-item .timeline-content {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n}\n\n/* Sub-run timeline styles */\n.sub-run-timeline {\n background: color-mix(in srgb, var(--mj-brand-primary) 2%, var(--mj-bg-surface));\n border-left: 2px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n margin-left: 20px;\n padding-left: 20px;\n margin-top: 8px;\n margin-bottom: 8px;\n}\n\n.sub-run-item .timeline-marker {\n border-width: 2px;\n}\n\n.sub-run-item .timeline-content {\n transition: all 0.2s ease;\n}\n\n/* JSON Detail Pane (in splitter) */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n}\n\n.json-pane-header {\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n}\n\n.json-pane-content {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta {\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n flex-shrink: 0;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta label {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.json-meta span {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.action-link {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.action-link .btn-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-size: 14px;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 4px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.action-link .btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n text-decoration: none;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n/* Details Tab */\n.details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-item label {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item span {\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.error-message {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n padding: 12px;\n border-radius: 8px;\n font-size: 13px;\n}\n\n.result-viewer,\n.state-viewer {\n padding: 20px;\n max-height: 450px;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n.result-viewer mj-code-editor,\n.state-viewer mj-code-editor {\n flex: 1;\n min-height: 0;\n}\n\n/* Empty States */\n.empty-state,\n.loading-state,\n.error-state {\n text-align: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n}\n\n.empty-state i,\n.loading-state i,\n.error-state i {\n opacity: 0.3;\n margin-bottom: 16px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .header-content {\n flex-direction: column;\n gap: 16px;\n }\n \n .header-stats {\n flex-wrap: wrap;\n }\n \n .json-detail-pane {\n width: 100%;\n }\n \n .timeline {\n padding-left: 30px;\n }\n \n .timeline-marker {\n left: -25px;\n width: 32px;\n height: 32px;\n }\n \n .timeline-content {\n margin-left: 10px;\n }\n}\n\n/* Entity Link Styles */\n.entity-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n transition: all 0.2s ease;\n border-bottom: 1px solid transparent;\n display: inline-block;\n}\n\n.entity-link:hover {\n color: var(--mj-brand-primary-hover);\n border-bottom-color: var(--mj-brand-primary-hover);\n}\n\n.entity-link:active {\n color: var(--mj-brand-primary-hover);\n}\n\n/* Detail Pane Tabs */\n.detail-pane-tabs {\n display: flex;\n gap: 8px;\n margin: 8px 0 0 0;\n border-bottom: 1px solid var(--mj-border-default);\n padding: 0 16px;\n}\n\n.detail-tab {\n padding: 10px 16px;\n background: none;\n border: none;\n border-bottom: 3px solid transparent;\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab:hover {\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface));\n}\n\n.detail-tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.detail-tab i {\n font-size: 14px;\n}\n\n/* Detail Pane Content */\n.detail-pane-content {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n margin-bottom: 35px;\n}\n\n.detail-pane-content.with-tabs {\n /* When tabs are shown, content starts right after tabs */\n margin-top: 0;\n}\n\n/* Step Payload Diff */\n.step-payload-diff {\n height: 100%;\n overflow-y: auto;\n padding: 16px;\n}\n\n.step-payload-diff mj-deep-diff {\n display: block;\n height: 100%;\n}\n\n/* JSON Viewer adjustments when no tabs */\n.detail-pane-content:not(.with-tabs) .json-viewer {\n margin-top: 16px;\n}\n/* A detached workflow still executing after its run completed. Blue rather than green or amber: it\n is neither finished nor wrong, it is the same \"workflow\" provenance the timeline uses. */\n.workflow-running-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: var(--mj-radius-full, 999px);\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n white-space: nowrap;\n}\n"] }]
|
|
1687
|
-
}], null, {
|
|
1913
|
+
}], null, { TimelineComponent: [{
|
|
1688
1914
|
type: ViewChild,
|
|
1689
1915
|
args: [AIAgentRunTimelineComponent]
|
|
1690
|
-
}],
|
|
1916
|
+
}], AnalyticsComponent: [{
|
|
1691
1917
|
type: ViewChild,
|
|
1692
1918
|
args: [AIAgentRunAnalyticsComponent]
|
|
1693
1919
|
}] }); })();
|