@memberjunction/ng-core-entity-forms 6.1.0-edge.5 → 6.1.0-edge.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +2 -2
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +1 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +3 -3
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +3 -3
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +2 -2
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +2 -2
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +2 -2
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/BridgeAgentIdentities/bridge-agent-identity-form.component.js +1 -1
- package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +7 -10
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.js +1 -1
- package/dist/lib/custom/Files/file-form.component.js +1 -1
- package/dist/lib/custom/Lists/list-form.component.d.ts +7 -0
- package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +32 -18
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +5 -7
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js +1 -1
- package/dist/lib/custom/SessionBridges/session-bridge-form.component.js +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.js +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.js +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.js +3 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +3 -3
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +6 -6
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +3 -3
- 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.js +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +86 -72
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentAction/mjaiagentaction.form.component.js +10 -8
- package/dist/lib/generated/Entities/MJAIAgentAction/mjaiagentaction.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js +31 -25
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentPersona/mjaiagentpersona.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentPersona/mjaiagentpersona.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentPersona/mjaiagentpersona.form.component.js +78 -0
- package/dist/lib/generated/Entities/MJAIAgentPersona/mjaiagentpersona.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +136 -112
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +29 -21
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +3 -3
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIArchitecture/mjaiarchitecture.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIArchitecture/mjaiarchitecture.form.component.js +27 -21
- package/dist/lib/generated/Entities/MJAIArchitecture/mjaiarchitecture.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIConfiguration/mjaiconfiguration.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIConfiguration/mjaiconfiguration.form.component.js +67 -61
- package/dist/lib/generated/Entities/MJAIConfiguration/mjaiconfiguration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIModality/mjaimodality.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIModality/mjaimodality.form.component.js +29 -11
- package/dist/lib/generated/Entities/MJAIModality/mjaimodality.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +49 -31
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIModelPersona/mjaimodelpersona.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIModelPersona/mjaimodelpersona.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIModelPersona/mjaimodelpersona.form.component.js +74 -0
- package/dist/lib/generated/Entities/MJAIModelPersona/mjaimodelpersona.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js +161 -0
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIPersonaVendor/mjaipersonavendor.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIPersonaVendor/mjaipersonavendor.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIPersonaVendor/mjaipersonavendor.form.component.js +80 -0
- package/dist/lib/generated/Entities/MJAIPersonaVendor/mjaipersonavendor.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +149 -147
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptModel/mjaipromptmodel.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptModel/mjaipromptmodel.form.component.js +8 -12
- package/dist/lib/generated/Entities/MJAIPromptModel/mjaipromptmodel.form.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 +20 -24
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.js +34 -20
- package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.js +8 -6
- package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIUsageType/mjaiusagetype.form.component.js +10 -10
- package/dist/lib/generated/Entities/MJAIUsageType/mjaiusagetype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js +32 -14
- package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAPIScope/mjapiscope.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAPIScope/mjapiscope.form.component.js +31 -25
- package/dist/lib/generated/Entities/MJAPIScope/mjapiscope.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +114 -108
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJActionCategory/mjactioncategory.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJActionCategory/mjactioncategory.form.component.js +31 -25
- package/dist/lib/generated/Entities/MJActionCategory/mjactioncategory.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArtifactType/mjartifacttype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJArtifactType/mjartifacttype.form.component.js +43 -37
- package/dist/lib/generated/Entities/MJArtifactType/mjartifacttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAuditLogType/mjauditlogtype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAuditLogType/mjauditlogtype.form.component.js +25 -19
- package/dist/lib/generated/Entities/MJAuditLogType/mjauditlogtype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAuthorization/mjauthorization.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAuthorization/mjauthorization.form.component.js +45 -39
- package/dist/lib/generated/Entities/MJAuthorization/mjauthorization.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.js +43 -37
- package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js +55 -49
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.js +31 -25
- package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +45 -27
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +71 -65
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationSkill/mjconversationskill.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJConversationSkill/mjconversationskill.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJConversationSkill/mjconversationskill.form.component.js +76 -0
- package/dist/lib/generated/Entities/MJConversationSkill/mjconversationskill.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +419 -415
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js +23 -5
- package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityFieldPermission/mjentityfieldpermission.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJEntityFieldPermission/mjentityfieldpermission.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJEntityFieldPermission/mjentityfieldpermission.form.component.js +76 -0
- package/dist/lib/generated/Entities/MJEntityFieldPermission/mjentityfieldpermission.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJIdentityClaim/mjidentityclaim.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJIdentityClaim/mjidentityclaim.form.component.js +5 -29
- package/dist/lib/generated/Entities/MJIdentityClaim/mjidentityclaim.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIdentityClaimType/mjidentityclaimtype.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJIdentityClaimType/mjidentityclaimtype.form.component.js +12 -24
- package/dist/lib/generated/Entities/MJIdentityClaimType/mjidentityclaimtype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMagicLinkInvite/mjmagiclinkinvite.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJMagicLinkInvite/mjmagiclinkinvite.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJProject/mjproject.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js +33 -27
- package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRole/mjrole.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js +38 -20
- package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJSkill/mjskill.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJSkill/mjskill.form.component.js +25 -19
- package/dist/lib/generated/Entities/MJSkill/mjskill.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js +35 -29
- package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +32 -32
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJVersionLabel/mjversionlabel.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJVersionLabel/mjversionlabel.form.component.js +39 -33
- package/dist/lib/generated/Entities/MJVersionLabel/mjversionlabel.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +474 -408
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +1276 -898
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/panels/ai-agents/agent-realtime.panel.js +1 -1
- package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +1 -1
- package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.panel.js +1 -1
- package/dist/lib/shared/components/template-editor.component.js +1 -1
- package/package.json +48 -48
|
@@ -1118,7 +1118,7 @@ let MJAIAgentSessionFormComponentExtended = class MJAIAgentSessionFormComponentE
|
|
|
1118
1118
|
// ────────────────────────────────────────────────────────────────────
|
|
1119
1119
|
OpenEntityRecord(entityName, recordId) {
|
|
1120
1120
|
if (recordId) {
|
|
1121
|
-
SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.
|
|
1121
|
+
SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.FromURLSegment(this.ProviderToUse.EntityByName(entityName), recordId));
|
|
1122
1122
|
}
|
|
1123
1123
|
}
|
|
1124
1124
|
/** Opens the linked conversation in the Chat app (same pattern as the agent-run form). */
|
|
@@ -1150,7 +1150,7 @@ let MJAIAgentSessionFormComponentExtended = class MJAIAgentSessionFormComponentE
|
|
|
1150
1150
|
i0.ɵɵconditionalCreate(0, MJAIAgentSessionFormComponentExtended_Conditional_0_Template, 99, 37, "mj-record-form-container", 0);
|
|
1151
1151
|
} if (rf & 2) {
|
|
1152
1152
|
i0.ɵɵconditional(ctx.record ? 0 : -1);
|
|
1153
|
-
} }, dependencies: [i1.NgClass, i2.NgControlStatus, i2.NgModel, i3.MJEmptyStateComponent, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective, i4.MjRecordFormContainerComponent, i5.CodeEditorComponent, i6.LoadingComponent, i1.DecimalPipe, i1.DatePipe], styles: [".ai-agent-session-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n\n\n.header[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper[_ngcontent-%COMP%] {\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}\n\n.header-info[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.meta-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: var(--mj-text-muted);\n flex-wrap: wrap;\n}\n\n.agent-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.target-arrow[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n.conversation-pill[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]: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}\n\n.conversation-pill[_ngcontent-%COMP%] .pill-action[_ngcontent-%COMP%] {\n font-size: 9px;\n opacity: 0.6;\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\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=\"Active\"][_ngcontent-%COMP%] {\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=\"Idle\"][_ngcontent-%COMP%] {\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=\"Closed\"][_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.status-badge.small[_ngcontent-%COMP%] {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]: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[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-default);\n flex-wrap: wrap;\n}\n\n.stat[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.stat[_ngcontent-%COMP%] .value.success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.configuration-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n margin-top: 16px;\n flex-wrap: wrap;\n}\n\n.config-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.config-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: var(--mj-text-muted);\n width: 24px;\n text-align: center;\n}\n\n.config-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.config-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.config-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.muted[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-weight: 400;\n}\n\n.mono[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 13px;\n}\n\n\n\n.tabs[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]: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[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n}\n\n.tab-count[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n padding: 1px 7px;\n border-radius: 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n.tab.active[_ngcontent-%COMP%] .tab-count[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n color: var(--mj-brand-primary);\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--mj-bg-surface);\n}\n\n.tab-content[_ngcontent-%COMP%] {\n padding: 20px;\n}\n\n.tab-content[_ngcontent-%COMP%] mj-accordion-panel[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 8px;\n}\n\n\n\n.run-tree[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n max-width: 1000px;\n}\n\n.run-node[_ngcontent-%COMP%] {\n display: flex;\n gap: 14px;\n align-items: flex-start;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 14px 18px;\n box-shadow: var(--mj-shadow-sm);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.run-node[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-border-default));\n transform: translateX(2px);\n}\n\n.run-node--child[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n\n.run-marker[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n flex-shrink: 0;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n font-size: 14px;\n}\n\n.run-marker--coagent[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.run-marker--prompt[_ngcontent-%COMP%] {\n border-color: var(--mj-status-info);\n color: var(--mj-status-info);\n}\n\n.run-body[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-headrow[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n}\n\n.run-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.run-time[_ngcontent-%COMP%] {\n font-size: 12px;\n font-family: monospace;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.run-sub[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.run-foot[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 8px;\n flex-wrap: wrap;\n}\n\n.run-status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.run-status[data-status=\"Completed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.run-status[data-status=\"Failed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.run-status[data-status=\"Running\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.run-status[data-status=\"Cancelled\"][_ngcontent-%COMP%], \n.run-status[data-status=\"AwaitingFeedback\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.run-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 12px;\n padding: 2px 10px;\n}\n\n\n\n.channels-grid-wrap[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: auto;\n}\n\n.channels-grid[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13.5px;\n}\n\n.channels-grid[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n padding: 10px 14px;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n white-space: nowrap;\n}\n\n.channels-grid[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-secondary);\n vertical-align: middle;\n}\n\n.channels-grid[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.channels-grid[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.channels-grid[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.cell-strong[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.cell-strong[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.transport-pill[_ngcontent-%COMP%], \n.channel-status-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n.transport-pill[data-transport=\"WebRTC\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n border-color: color-mix(in srgb, var(--mj-status-info) 25%, transparent);\n}\n\n.transport-pill[data-transport=\"WebSocket\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.channel-status-pill[data-status=\"Connected\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 25%, transparent);\n}\n\n.channel-status-pill[data-status=\"Connecting\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n border-color: color-mix(in srgb, var(--mj-status-info) 25%, transparent);\n}\n\n.channel-status-pill[data-status=\"Paused\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n border-color: color-mix(in srgb, var(--mj-status-warning) 25%, transparent);\n}\n\n.socket-cell[_ngcontent-%COMP%] {\n max-width: 220px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n\n.transcript-thread[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n max-width: 860px;\n margin: 0 auto;\n}\n\n.turn[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n}\n\n.turn--user[_ngcontent-%COMP%] {\n flex-direction: row-reverse;\n}\n\n.turn-avatar[_ngcontent-%COMP%] {\n width: 34px;\n height: 34px;\n flex-shrink: 0;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\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) 25%, transparent);\n}\n\n.turn--user[_ngcontent-%COMP%] .turn-avatar[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n\n.turn--error[_ngcontent-%COMP%] .turn-avatar[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 25%, transparent);\n}\n\n.turn-main[_ngcontent-%COMP%] {\n max-width: 70%;\n min-width: 0;\n}\n\n.turn--user[_ngcontent-%COMP%] .turn-main[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n}\n\n.turn-meta[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.turn-time[_ngcontent-%COMP%] {\n font-weight: 400;\n font-family: monospace;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.turn-bubble[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n border-top-left-radius: 4px;\n padding: 10px 14px;\n font-size: 14px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.turn--user[_ngcontent-%COMP%] .turn-bubble[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 12px;\n border-top-right-radius: 4px;\n}\n\n.turn--error[_ngcontent-%COMP%] .turn-bubble[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 25%, transparent);\n color: var(--mj-status-error-text);\n}\n\n\n\n.details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.config-viewer[_ngcontent-%COMP%] {\n padding: 20px;\n}\n\n\n\n.entity-link[_ngcontent-%COMP%] {\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 cursor: pointer;\n}\n\n.entity-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n border-bottom-color: var(--mj-brand-primary-hover);\n}\n\n\n\n@media (max-width: 768px) {\n .header-content[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n }\n\n .turn-main[_ngcontent-%COMP%] {\n max-width: 90%;\n }\n}"] }); }
|
|
1153
|
+
} }, dependencies: [i1.NgClass, i2.NgControlStatus, i2.NgModel, i3.MJEmptyStateComponent, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective, i4.MjRecordFormContainerComponent, i5.CodeEditorComponent, i6.LoadingComponent, i1.DecimalPipe, i1.DatePipe], styles: [".ai-agent-session-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n\n.header[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper[_ngcontent-%COMP%] {\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}\n\n.header-info[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.meta-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: var(--mj-text-muted);\n flex-wrap: wrap;\n}\n\n.agent-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.target-arrow[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n.conversation-pill[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]: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}\n\n.conversation-pill[_ngcontent-%COMP%] .pill-action[_ngcontent-%COMP%] {\n font-size: 9px;\n opacity: 0.6;\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\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=\"Active\"][_ngcontent-%COMP%] {\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=\"Idle\"][_ngcontent-%COMP%] {\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=\"Closed\"][_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.status-badge.small[_ngcontent-%COMP%] {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]: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[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-default);\n flex-wrap: wrap;\n}\n\n.stat[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.stat[_ngcontent-%COMP%] .value.success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.configuration-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n margin-top: 16px;\n flex-wrap: wrap;\n}\n\n.config-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.config-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: var(--mj-text-muted);\n width: 24px;\n text-align: center;\n}\n\n.config-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.config-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.config-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.muted[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-weight: 400;\n}\n\n.mono[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 13px;\n}\n\n\n.tabs[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]: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[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n}\n\n.tab-count[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n padding: 1px 7px;\n border-radius: 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n.tab.active[_ngcontent-%COMP%] .tab-count[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n color: var(--mj-brand-primary);\n}\n\n\n.content-area[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--mj-bg-surface);\n}\n\n.tab-content[_ngcontent-%COMP%] {\n padding: 20px;\n}\n\n.tab-content[_ngcontent-%COMP%] mj-accordion-panel[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 8px;\n}\n\n\n.run-tree[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n max-width: 1000px;\n}\n\n.run-node[_ngcontent-%COMP%] {\n display: flex;\n gap: 14px;\n align-items: flex-start;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 14px 18px;\n box-shadow: var(--mj-shadow-sm);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.run-node[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-border-default));\n transform: translateX(2px);\n}\n\n.run-node--child[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n\n.run-marker[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n flex-shrink: 0;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n font-size: 14px;\n}\n\n.run-marker--coagent[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.run-marker--prompt[_ngcontent-%COMP%] {\n border-color: var(--mj-status-info);\n color: var(--mj-status-info);\n}\n\n.run-body[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-headrow[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n}\n\n.run-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.run-time[_ngcontent-%COMP%] {\n font-size: 12px;\n font-family: monospace;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.run-sub[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.run-foot[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 8px;\n flex-wrap: wrap;\n}\n\n.run-status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.run-status[data-status=\"Completed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.run-status[data-status=\"Failed\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.run-status[data-status=\"Running\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.run-status[data-status=\"Cancelled\"][_ngcontent-%COMP%], \n.run-status[data-status=\"AwaitingFeedback\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.run-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 12px;\n padding: 2px 10px;\n}\n\n\n.channels-grid-wrap[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: auto;\n}\n\n.channels-grid[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13.5px;\n}\n\n.channels-grid[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n padding: 10px 14px;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n white-space: nowrap;\n}\n\n.channels-grid[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-secondary);\n vertical-align: middle;\n}\n\n.channels-grid[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.channels-grid[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.channels-grid[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.cell-strong[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.cell-strong[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.transport-pill[_ngcontent-%COMP%], \n.channel-status-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n.transport-pill[data-transport=\"WebRTC\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n border-color: color-mix(in srgb, var(--mj-status-info) 25%, transparent);\n}\n\n.transport-pill[data-transport=\"WebSocket\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.channel-status-pill[data-status=\"Connected\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 25%, transparent);\n}\n\n.channel-status-pill[data-status=\"Connecting\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 15%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n border-color: color-mix(in srgb, var(--mj-status-info) 25%, transparent);\n}\n\n.channel-status-pill[data-status=\"Paused\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n border-color: color-mix(in srgb, var(--mj-status-warning) 25%, transparent);\n}\n\n.socket-cell[_ngcontent-%COMP%] {\n max-width: 220px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n.transcript-thread[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n max-width: 860px;\n margin: 0 auto;\n}\n\n.turn[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n}\n\n.turn--user[_ngcontent-%COMP%] {\n flex-direction: row-reverse;\n}\n\n.turn-avatar[_ngcontent-%COMP%] {\n width: 34px;\n height: 34px;\n flex-shrink: 0;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\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) 25%, transparent);\n}\n\n.turn--user[_ngcontent-%COMP%] .turn-avatar[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n\n.turn--error[_ngcontent-%COMP%] .turn-avatar[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 25%, transparent);\n}\n\n.turn-main[_ngcontent-%COMP%] {\n max-width: 70%;\n min-width: 0;\n}\n\n.turn--user[_ngcontent-%COMP%] .turn-main[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n}\n\n.turn-meta[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.turn-time[_ngcontent-%COMP%] {\n font-weight: 400;\n font-family: monospace;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.turn-bubble[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n border-top-left-radius: 4px;\n padding: 10px 14px;\n font-size: 14px;\n line-height: 1.5;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.turn--user[_ngcontent-%COMP%] .turn-bubble[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 12px;\n border-top-right-radius: 4px;\n}\n\n.turn--error[_ngcontent-%COMP%] .turn-bubble[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 25%, transparent);\n color: var(--mj-status-error-text);\n}\n\n\n.details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.config-viewer[_ngcontent-%COMP%] {\n padding: 20px;\n}\n\n\n.entity-link[_ngcontent-%COMP%] {\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 cursor: pointer;\n}\n\n.entity-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n border-bottom-color: var(--mj-brand-primary-hover);\n}\n\n\n@media (max-width: 768px) {\n .header-content[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n }\n\n .turn-main[_ngcontent-%COMP%] {\n max-width: 90%;\n }\n}"] }); }
|
|
1154
1154
|
};
|
|
1155
1155
|
MJAIAgentSessionFormComponentExtended = __decorate([
|
|
1156
1156
|
RegisterClass(BaseFormComponent, 'MJ: AI Agent Sessions')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-agent-session-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgentSessions/ai-agent-session-form.component.ts","../../../../src/lib/custom/AIAgentSessions/ai-agent-session-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, inject } from '@angular/core';\nimport { CompositeKey, RunView } from '@memberjunction/core';\nimport { MJAIAgentSessionEntity } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseFormComponent, CUSTOM_LAYOUT_TOOLBAR_CONFIG } from '@memberjunction/ng-base-forms';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJAIAgentSessionFormComponent } from '../../generated/Entities/MJAIAgentSession/mjaiagentsession.form.component';\n\n/**\n * Authoritative shape persisted in `AIAgentSession.Config` for a client-direct\n * realtime voice session. Mirrors `RealtimeSessionConfig` on the server\n * (MJServer/RealtimeClientSessionResolver). All fields optional — non-voice\n * sessions may carry none of them.\n */\ninterface SessionConfigJson {\n targetAgentID?: string;\n coAgentRunID?: string;\n promptRunID?: string;\n}\n\n/** Date values arrive as ISO strings from `ResultType: 'simple'` RunViews. */\ntype DateLike = Date | string;\n\n/** Narrowed read-only row from 'MJ: AI Agent Runs' for the session run tree. */\ninterface SessionRunRow {\n ID: string;\n AgentID: string;\n Agent: string | null;\n ParentRunID: string | null;\n Status: string;\n StartedAt: DateLike;\n CompletedAt: DateLike | null;\n TotalTokensUsed: number | null;\n TotalCost: number | null;\n TotalTokensUsedRollup: number | null;\n TotalCostRollup: number | null;\n}\n\n/** Narrowed read-only row from 'MJ: AI Agent Session Channels'. */\ninterface SessionChannelRow {\n ID: string;\n ChannelID: string;\n Channel: string;\n Status: 'Connected' | 'Connecting' | 'Disconnected' | 'Paused';\n SocketUrl: string | null;\n __mj_CreatedAt: DateLike;\n LastActiveAt: DateLike;\n DisconnectedAt: DateLike | null;\n}\n\n/** Narrowed read-only row from 'MJ: AI Agent Channels' (definition lookup for transport). */\ninterface ChannelDefinitionRow {\n ID: string;\n Name: string;\n TransportType: string;\n}\n\n/** Narrowed read-only row from 'MJ: Conversation Details' for the transcript. */\ninterface TranscriptRow {\n ID: string;\n Role: 'User' | 'AI' | 'Error';\n Message: string;\n Agent: string | null;\n User: string | null;\n __mj_CreatedAt: DateLike;\n}\n\n/** Narrowed read-only row from 'MJ: AI Prompt Runs' (the co-agent model leg). */\ninterface CoAgentPromptRunRow {\n ID: string;\n Model: string;\n Status: string;\n RunAt: DateLike;\n CompletedAt: DateLike | null;\n TokensUsed: number | null;\n TokensPrompt: number | null;\n TokensCompletion: number | null;\n TotalCost: number | null;\n}\n\n/** A flattened node in the session run tree (depth-first order, indented by depth). */\nexport interface SessionRunTreeItem {\n /** 'run' = AIAgentRun row, 'promptRun' = the co-agent's streaming model leg */\n kind: 'run' | 'promptRun';\n id: string;\n entityName: string;\n title: string;\n subtitle: string;\n status: string;\n startedAt: DateLike | null;\n completedAt: DateLike | null;\n tokens: number | null;\n cost: number | null;\n depth: number;\n isCoAgentRun: boolean;\n}\n\n/** Channel row decorated with its definition's transport type for display. */\nexport interface SessionChannelDisplayRow {\n row: SessionChannelRow;\n transportType: string | null;\n}\n\n/**\n * Custom form for 'MJ: AI Agent Sessions' — the observability surface for\n * long-lived realtime (voice) agent sessions. Mirrors the AI Agent Run form's\n * visual language: header with icon / status badge / stats, config bar, and\n * tabbed panes for the delegated run tree, channels, transcript, and details.\n */\n@RegisterClass(BaseFormComponent, 'MJ: AI Agent Sessions')\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-session-form',\n templateUrl: './ai-agent-session-form.component.html',\n styleUrls: ['./ai-agent-session-form.component.css']\n})\nexport class MJAIAgentSessionFormComponentExtended extends MJAIAgentSessionFormComponent implements OnInit {\n public record!: MJAIAgentSessionEntity;\n\n /** Hide the generated-section controls — this form has a fully custom layout. */\n public readonly ToolbarConfig = CUSTOM_LAYOUT_TOOLBAR_CONFIG;\n\n /** Sessions read best full-width, like the agent-run form. */\n public override getDefaultFormWidthMode(): 'centered' | 'full-width' { return 'full-width'; }\n\n // UI state\n public ActiveTab: 'runs' | 'channels' | 'transcript' | 'details' = 'runs';\n public Loading = false;\n public LoadError: string | null = null;\n\n // Loaded data\n public RunTree: SessionRunTreeItem[] = [];\n public Channels: SessionChannelDisplayRow[] = [];\n public Transcript: TranscriptRow[] = [];\n public DelegatedRunCount = 0;\n public TargetAgentID: string | null = null;\n public TargetAgentName: string | null = null;\n public CoAgentPromptRun: CoAgentPromptRunRow | null = null;\n public SessionTokens: number | null = null;\n public SessionCost: number | null = null;\n\n private sessionConfig: SessionConfigJson = {};\n private cachedPrettyConfig: string | null = null;\n\n private navigationService = inject(NavigationService);\n private appManager = inject(ApplicationManager);\n\n override async ngOnInit(): Promise<void> {\n await super.ngOnInit();\n if (this.record?.ID) {\n this.sessionConfig = this.parseSessionConfig(this.record.Config_);\n await this.loadSessionData();\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Data loading\n // ────────────────────────────────────────────────────────────────────\n\n /** Parses the session's Config JSON; returns an empty config on any error. */\n private parseSessionConfig(raw: string | null): SessionConfigJson {\n if (!raw) return {};\n try {\n const parsed = JSON.parse(raw) as Partial<SessionConfigJson>;\n return {\n targetAgentID: typeof parsed.targetAgentID === 'string' ? parsed.targetAgentID : undefined,\n coAgentRunID: typeof parsed.coAgentRunID === 'string' ? parsed.coAgentRunID : undefined,\n promptRunID: typeof parsed.promptRunID === 'string' ? parsed.promptRunID : undefined\n };\n } catch {\n return {};\n }\n }\n\n /**\n * Loads everything the form shows in a single batched RunViews round trip:\n * the session's run tree, its channel instances (+ channel definitions for\n * transport), the transcript, and — when the Config carries observability\n * ids — the co-agent prompt run and target agent name.\n */\n private async loadSessionData(): Promise<void> {\n this.Loading = true;\n this.LoadError = null;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const sessionId = this.record.ID;\n\n const results = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Runs',\n Fields: ['ID', 'AgentID', 'Agent', 'ParentRunID', 'Status', 'StartedAt', 'CompletedAt',\n 'TotalTokensUsed', 'TotalCost', 'TotalTokensUsedRollup', 'TotalCostRollup'],\n ExtraFilter: `AgentSessionID='${sessionId}'`,\n OrderBy: 'StartedAt ASC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agent Session Channels',\n Fields: ['ID', 'ChannelID', 'Channel', 'Status', 'SocketUrl', '__mj_CreatedAt', 'LastActiveAt', 'DisconnectedAt'],\n ExtraFilter: `AgentSessionID='${sessionId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agent Channels',\n Fields: ['ID', 'Name', 'TransportType'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Conversation Details',\n Fields: ['ID', 'Role', 'Message', 'Agent', 'User', '__mj_CreatedAt'],\n ExtraFilter: `AgentSessionID='${sessionId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n ResultType: 'simple'\n },\n // Co-agent model leg — only meaningful when Config carries promptRunID;\n // an impossible filter keeps the batch shape stable when it doesn't.\n {\n EntityName: 'MJ: AI Prompt Runs',\n Fields: ['ID', 'Model', 'Status', 'RunAt', 'CompletedAt', 'TokensUsed', 'TokensPrompt', 'TokensCompletion', 'TotalCost'],\n ExtraFilter: this.sessionConfig.promptRunID ? `ID='${this.sessionConfig.promptRunID}'` : `1=0`,\n ResultType: 'simple'\n },\n // Target agent name resolution from Config.targetAgentID\n {\n EntityName: 'MJ: AI Agents',\n Fields: ['ID', 'Name'],\n ExtraFilter: this.sessionConfig.targetAgentID ? `ID='${this.sessionConfig.targetAgentID}'` : `1=0`,\n ResultType: 'simple'\n }\n ]);\n\n const runs = (results[0]?.Success ? results[0].Results : []) as SessionRunRow[];\n const channelRows = (results[1]?.Success ? results[1].Results : []) as SessionChannelRow[];\n const channelDefs = (results[2]?.Success ? results[2].Results : []) as ChannelDefinitionRow[];\n this.Transcript = (results[3]?.Success ? results[3].Results : []) as TranscriptRow[];\n const promptRuns = (results[4]?.Success ? results[4].Results : []) as CoAgentPromptRunRow[];\n const targetAgents = (results[5]?.Success ? results[5].Results : []) as { ID: string; Name: string }[];\n\n this.CoAgentPromptRun = promptRuns.length > 0 ? promptRuns[0] : null;\n this.TargetAgentID = this.sessionConfig.targetAgentID ?? null;\n this.TargetAgentName = targetAgents.length > 0 ? targetAgents[0].Name : null;\n\n this.Channels = channelRows.map(row => ({\n row,\n transportType: channelDefs.find(d => UUIDsEqual(d.ID, row.ChannelID))?.TransportType ?? null\n }));\n\n this.RunTree = this.buildRunTree(runs);\n this.DelegatedRunCount = runs.filter(r => r.ParentRunID != null).length;\n this.computeSessionUsage(runs);\n } catch (error) {\n console.error('Error loading agent session data:', error);\n this.LoadError = 'Failed to load session data';\n } finally {\n this.Loading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Flattens the session's runs into a depth-first tree: root runs (no\n * ParentRunID, or parent outside the session) first, children nested by\n * ParentRunID. The co-agent run (Config.coAgentRunID) gets its streaming\n * prompt run inserted directly beneath it as a 'promptRun' leg.\n */\n private buildRunTree(runs: SessionRunRow[]): SessionRunTreeItem[] {\n const items: SessionRunTreeItem[] = [];\n const byParent = new Map<string, SessionRunRow[]>();\n const idSet = new Set(runs.map(r => r.ID.toUpperCase()));\n\n const roots: SessionRunRow[] = [];\n for (const run of runs) {\n if (run.ParentRunID && idSet.has(run.ParentRunID.toUpperCase())) {\n const key = run.ParentRunID.toUpperCase();\n const list = byParent.get(key) ?? [];\n list.push(run);\n byParent.set(key, list);\n } else {\n roots.push(run);\n }\n }\n\n const visit = (run: SessionRunRow, depth: number): void => {\n const isCoAgent = this.sessionConfig.coAgentRunID != null && UUIDsEqual(run.ID, this.sessionConfig.coAgentRunID);\n items.push(this.runToTreeItem(run, depth, isCoAgent));\n if (isCoAgent && this.CoAgentPromptRun) {\n items.push(this.promptRunToTreeItem(this.CoAgentPromptRun, depth + 1));\n }\n for (const child of byParent.get(run.ID.toUpperCase()) ?? []) {\n visit(child, depth + 1);\n }\n };\n for (const root of roots) {\n visit(root, 0);\n }\n return items;\n }\n\n private runToTreeItem(run: SessionRunRow, depth: number, isCoAgent: boolean): SessionRunTreeItem {\n const shortId = run.ID.substring(0, 8);\n return {\n kind: 'run',\n id: run.ID,\n entityName: 'MJ: AI Agent Runs',\n title: isCoAgent\n ? `${run.Agent ?? 'Co-Agent'} · session run`\n : `${run.Agent ?? 'Agent'} · delegated run`,\n subtitle: isCoAgent\n ? `AIAgentRun #${shortId} · one long-lived run for this session`\n : `AIAgentRun #${shortId} · ParentRunID #${run.ParentRunID?.substring(0, 8) ?? '—'} · invoked via target-agent tool`,\n status: run.Status,\n startedAt: run.StartedAt,\n completedAt: run.CompletedAt,\n tokens: run.TotalTokensUsedRollup ?? run.TotalTokensUsed,\n cost: run.TotalCostRollup ?? run.TotalCost,\n depth,\n isCoAgentRun: isCoAgent\n };\n }\n\n private promptRunToTreeItem(pr: CoAgentPromptRunRow, depth: number): SessionRunTreeItem {\n return {\n kind: 'promptRun',\n id: pr.ID,\n entityName: 'MJ: AI Prompt Runs',\n title: `Model leg · ${pr.Model}`,\n subtitle: `AIPromptRun #${pr.ID.substring(0, 8)} · ${pr.TokensPrompt ?? 0} in · ${pr.TokensCompletion ?? 0} out · usage checkpointed incrementally`,\n status: pr.Status,\n startedAt: pr.RunAt,\n completedAt: pr.CompletedAt,\n tokens: pr.TokensUsed,\n cost: pr.TotalCost,\n depth,\n isCoAgentRun: false\n };\n }\n\n /**\n * Session-level tokens/cost for the header stats: prefer the co-agent run's\n * rollups (covers delegated children), fall back to the prompt run's\n * incremental usage when the run rollups haven't been finalized yet.\n */\n private computeSessionUsage(runs: SessionRunRow[]): void {\n const coAgentRun = this.sessionConfig.coAgentRunID\n ? runs.find(r => UUIDsEqual(r.ID, this.sessionConfig.coAgentRunID)) ?? null\n : null;\n const runTokens = coAgentRun ? (coAgentRun.TotalTokensUsedRollup ?? coAgentRun.TotalTokensUsed) : null;\n const runCost = coAgentRun ? (coAgentRun.TotalCostRollup ?? coAgentRun.TotalCost) : null;\n this.SessionTokens = runTokens ?? this.CoAgentPromptRun?.TokensUsed ?? null;\n this.SessionCost = runCost ?? this.CoAgentPromptRun?.TotalCost ?? null;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Display helpers\n // ────────────────────────────────────────────────────────────────────\n\n public ChangeTab(tab: 'runs' | 'channels' | 'transcript' | 'details'): void {\n this.ActiveTab = tab;\n }\n\n public GetStatusIcon(status: string | null): string {\n switch (status) {\n case 'Active': return 'fa-tower-broadcast';\n case 'Idle': return 'fa-moon';\n case 'Closed': return 'fa-circle-stop';\n default: return 'fa-question-circle';\n }\n }\n\n public GetRunStatusIcon(status: string): string {\n switch (status) {\n case 'Running': return 'fa-circle-notch fa-spin';\n case 'Completed': return 'fa-check-circle';\n case 'Failed': return 'fa-times-circle';\n case 'Cancelled': return 'fa-ban';\n case 'Paused': return 'fa-pause-circle';\n case 'AwaitingFeedback': return 'fa-hourglass-half';\n case 'Pending': return 'fa-clock';\n default: return 'fa-question-circle';\n }\n }\n\n public GetChannelIcon(channelName: string | null): string {\n switch (channelName) {\n case 'VoiceAudio': return 'fa-microphone-lines';\n case 'TextChat': return 'fa-comment';\n case 'ClientControl': return 'fa-sliders';\n case 'Whiteboard': return 'fa-chalkboard';\n case 'Video': return 'fa-video';\n default: return 'fa-plug';\n }\n }\n\n /** Short, readable session id (first segment of the UUID). */\n public get ShortSessionId(): string {\n return this.record?.ID ? `sess_${this.record.ID.substring(0, 8).toLowerCase()}` : '';\n }\n\n /** Created → ClosedAt (terminal) or LastActiveAt (still open) duration. */\n public get SessionDuration(): string {\n if (!this.record) return '';\n const start = this.toDate(this.record.__mj_CreatedAt);\n const end = this.toDate(this.record.ClosedAt) ?? this.toDate(this.record.LastActiveAt);\n if (!start || !end) return '—';\n return this.FormatDuration(start, end);\n }\n\n public FormatDuration(start: DateLike | null, end: DateLike | null): string {\n const s = this.toDate(start);\n const e = this.toDate(end);\n if (!s) return '—';\n if (!e) return 'Running...';\n const ms = e.getTime() - s.getTime();\n if (ms < 0) return '—';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;\n return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;\n }\n\n private toDate(value: DateLike | null | undefined): Date | null {\n if (value == null) return null;\n const d = value instanceof Date ? value : new Date(value);\n return isNaN(d.getTime()) ? null : d;\n }\n\n /** Pretty-printed session Config JSON for the Details tab (cached). */\n public get PrettyConfig(): string {\n if (!this.record?.Config_) return '';\n if (this.cachedPrettyConfig !== null) return this.cachedPrettyConfig;\n try {\n this.cachedPrettyConfig = JSON.stringify(JSON.parse(this.record.Config_), null, 2);\n } catch {\n this.cachedPrettyConfig = this.record.Config_;\n }\n return this.cachedPrettyConfig;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Navigation\n // ────────────────────────────────────────────────────────────────────\n\n public OpenEntityRecord(entityName: string, recordId: string | null): void {\n if (recordId) {\n SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.FromID(recordId));\n }\n }\n\n /** Opens the linked conversation in the Chat app (same pattern as the agent-run form). */\n public NavigateToConversation(): void {\n if (!this.record?.ConversationID) return;\n const chatApp = this.appManager.GetAllApps().find(app => app.Name === 'Chat');\n if (!chatApp) {\n // Fall back to the raw conversation record when the Chat app isn't installed\n this.OpenEntityRecord('MJ: Conversations', this.record.ConversationID);\n return;\n }\n this.navigationService.OpenNavItemByName(\n 'Conversations',\n // realtimeSessionId opens the SESSION REVIEW overlay directly on arrival\n // (the chat wrapper consumes it once) — not just the containing chat.\n { conversationId: this.record.ConversationID, realtimeSessionId: this.record.ID },\n chatApp.ID\n );\n }\n\n public RefreshData(): void {\n if (!this.record?.ID) return;\n this.cachedPrettyConfig = null;\n this.record.Load(this.record.ID).then(() => {\n this.sessionConfig = this.parseSessionConfig(this.record.Config_);\n void this.loadSessionData();\n });\n }\n}\n","@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n [ToolbarConfig]=\"ToolbarConfig\"\n [WidthMode]=\"'full-width'\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <div class=\"record-form ai-agent-session-form\">\n <!-- Header (mirrors the AI Agent Run form header) -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"icon-wrapper\">\n <i class=\"fas fa-tower-broadcast\"></i>\n </div>\n <div class=\"header-info\">\n <h2>AI Agent Session</h2>\n <div class=\"meta-info\">\n @if (record.AgentID) {\n <span class=\"agent-name\">\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('AI Agents', record.AgentID)\">\n {{ record.Agent || 'Agent' }}\n </a>\n </span>\n }\n @if (TargetAgentID) {\n <i class=\"fas fa-arrow-right-long target-arrow\"></i>\n <span class=\"agent-name\">\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('AI Agents', TargetAgentID)\">\n {{ TargetAgentName || 'Target agent' }}\n </a>\n </span>\n }\n <span class=\"run-id\">{{ ShortSessionId }}</span>\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>{{ record.Conversation || '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 <div class=\"status-badge\" [attr.data-status]=\"record.Status\">\n <i class=\"fas\" [ngClass]=\"GetStatusIcon(record.Status)\"></i>\n {{ record.Status }}\n </div>\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\n <div class=\"header-stats\">\n <div class=\"stat\">\n <span class=\"label\">User</span>\n <span class=\"value\">\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('Users', record.UserID)\">{{ record.User }}</a>\n </span>\n </div>\n <div class=\"stat\">\n <span class=\"label\">Started</span>\n <span class=\"value\">{{ record.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n @if (record.ClosedAt) {\n <div class=\"stat\">\n <span class=\"label\">Closed</span>\n <span class=\"value\">{{ record.ClosedAt | date:'medium' }}</span>\n </div>\n } @else {\n <div class=\"stat\">\n <span class=\"label\">Last Active</span>\n <span class=\"value\">{{ record.LastActiveAt | date:'medium' }}</span>\n </div>\n }\n <div class=\"stat\">\n <span class=\"label\">Duration</span>\n <span class=\"value\">{{ SessionDuration }}</span>\n </div>\n <div class=\"stat\">\n <span class=\"label\">Channels</span>\n <span class=\"value\">{{ Channels.length }}</span>\n </div>\n <div class=\"stat\">\n <span class=\"label\">Delegated Runs</span>\n <span class=\"value\">{{ DelegatedRunCount }}</span>\n </div>\n @if (SessionTokens != null && SessionTokens > 0) {\n <div class=\"stat\">\n <span class=\"label\">Tokens</span>\n <span class=\"value\">{{ SessionTokens | number:'1.0-0' }}</span>\n </div>\n }\n @if (SessionCost != null && SessionCost > 0) {\n <div class=\"stat\">\n <span class=\"label\">Cost</span>\n <span class=\"value success\">${{ SessionCost | number:'1.2-4' }}</span>\n </div>\n }\n </div>\n\n <!-- Config bar: target agent / host instance / continuation -->\n <div class=\"configuration-bar\">\n <div class=\"config-item\">\n <i class=\"fas fa-bullseye\"></i>\n <div class=\"config-content\">\n <div class=\"config-label\">Target Agent</div>\n <div class=\"config-value\">\n @if (TargetAgentID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('AI Agents', TargetAgentID)\">\n {{ TargetAgentName || 'Unknown' }}\n </a>\n } @else {\n <span class=\"muted\">None</span>\n }\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <i class=\"fas fa-server\"></i>\n <div class=\"config-content\">\n <div class=\"config-label\">Host Instance</div>\n <div class=\"config-value mono\">{{ record.HostInstanceID || '—' }}</div>\n </div>\n </div>\n <div class=\"config-item\">\n <i class=\"fas fa-link\"></i>\n <div class=\"config-content\">\n <div class=\"config-label\">Continuation</div>\n <div class=\"config-value\">\n @if (record.LastSessionID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('MJ: AI Agent Sessions', record.LastSessionID)\">\n Resumed from prior session\n </a>\n } @else {\n <span class=\"muted\">None (new session)</span>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab\" [class.active]=\"ActiveTab === 'runs'\" (click)=\"ChangeTab('runs')\">\n <i class=\"fas fa-diagram-project\"></i> Runs\n @if (RunTree.length > 0) { <span class=\"tab-count\">{{ RunTree.length }}</span> }\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'channels'\" (click)=\"ChangeTab('channels')\">\n <i class=\"fas fa-plug\"></i> Channels\n @if (Channels.length > 0) { <span class=\"tab-count\">{{ Channels.length }}</span> }\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'transcript'\" (click)=\"ChangeTab('transcript')\">\n <i class=\"fas fa-comments\"></i> Transcript\n @if (Transcript.length > 0) { <span class=\"tab-count\">{{ Transcript.length }}</span> }\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 @if (Loading) {\n <mj-loading text=\"Loading session data...\" size=\"medium\"></mj-loading>\n } @else if (LoadError) {\n <mj-empty-state\n Variant=\"error\"\n [Message]=\"LoadError\" />\n } @else {\n\n <!-- Runs tab: the session's delegated run tree -->\n @if (ActiveTab === 'runs') {\n <div class=\"tab-content\">\n @if (RunTree.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-diagram-project\"\n Title=\"No Runs\"\n Message=\"No agent runs have been recorded for this session yet.\" />\n } @else {\n <div class=\"run-tree\">\n @for (node of RunTree; track node.id) {\n <div class=\"run-node\"\n [class.run-node--child]=\"node.depth > 0\"\n [style.margin-left.px]=\"node.depth * 36\"\n (click)=\"OpenEntityRecord(node.entityName, node.id)\"\n title=\"Open record\">\n <div class=\"run-marker\"\n [class.run-marker--coagent]=\"node.isCoAgentRun\"\n [class.run-marker--prompt]=\"node.kind === 'promptRun'\">\n @if (node.kind === 'promptRun') {\n <i class=\"fas fa-microchip\"></i>\n } @else if (node.isCoAgentRun) {\n <i class=\"fas fa-tower-broadcast\"></i>\n } @else {\n <i class=\"fas fa-robot\"></i>\n }\n </div>\n <div class=\"run-body\">\n <div class=\"run-headrow\">\n <h4 class=\"run-title\">{{ node.title }}</h4>\n <span class=\"run-time\">{{ node.startedAt | date:'h:mm:ss a' }}</span>\n </div>\n <div class=\"run-sub\">{{ node.subtitle }}</div>\n <div class=\"run-foot\">\n <span class=\"run-status\" [attr.data-status]=\"node.status\">\n <i class=\"fas\" [ngClass]=\"GetRunStatusIcon(node.status)\"></i> {{ node.status }}\n </span>\n <span class=\"run-chip\">\n <i class=\"fas fa-clock\"></i> {{ FormatDuration(node.startedAt, node.completedAt) }}\n </span>\n @if (node.tokens != null && node.tokens > 0) {\n <span class=\"run-chip\"><i class=\"fas fa-coins\"></i> {{ node.tokens | number:'1.0-0' }} tok</span>\n }\n @if (node.cost != null && node.cost > 0) {\n <span class=\"run-chip\"><i class=\"fas fa-dollar-sign\"></i> {{ node.cost | number:'1.2-4' }}</span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Channels tab -->\n @if (ActiveTab === 'channels') {\n <div class=\"tab-content\">\n @if (Channels.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-plug\"\n Title=\"No Channels\"\n Message=\"No channel instances were attached to this session.\" />\n } @else {\n <div class=\"channels-grid-wrap\">\n <table class=\"channels-grid\">\n <thead>\n <tr>\n <th>Channel</th>\n <th>Transport</th>\n <th>Status</th>\n <th>Connected</th>\n <th>Last Active</th>\n <th>Disconnected</th>\n <th>Socket</th>\n </tr>\n </thead>\n <tbody>\n @for (channel of Channels; track channel.row.ID) {\n <tr (click)=\"OpenEntityRecord('MJ: AI Agent Session Channels', channel.row.ID)\" title=\"Open record\">\n <td>\n <span class=\"cell-strong\">\n <i class=\"fas\" [ngClass]=\"GetChannelIcon(channel.row.Channel)\"></i>\n {{ channel.row.Channel }}\n </span>\n </td>\n <td>\n @if (channel.transportType) {\n <span class=\"transport-pill\" [attr.data-transport]=\"channel.transportType\">{{ channel.transportType }}</span>\n } @else {\n <span class=\"muted\">—</span>\n }\n </td>\n <td>\n <span class=\"channel-status-pill\" [attr.data-status]=\"channel.row.Status\">{{ channel.row.Status }}</span>\n </td>\n <td class=\"mono\">{{ channel.row.__mj_CreatedAt | date:'h:mm:ss a' }}</td>\n <td class=\"mono\">{{ channel.row.LastActiveAt | date:'h:mm:ss a' }}</td>\n <td class=\"mono\">\n @if (channel.row.DisconnectedAt) {\n {{ channel.row.DisconnectedAt | date:'h:mm:ss a' }}\n } @else {\n <span class=\"muted\">—</span>\n }\n </td>\n <td class=\"mono socket-cell\" [title]=\"channel.row.SocketUrl || ''\">\n {{ channel.row.SocketUrl || '—' }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n <!-- Transcript tab -->\n @if (ActiveTab === 'transcript') {\n <div class=\"tab-content\">\n @if (Transcript.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-comments\"\n Title=\"No Transcript\"\n Message=\"No conversation messages were stamped with this session.\" />\n } @else {\n <div class=\"transcript-thread\">\n @for (turn of Transcript; track turn.ID) {\n <div class=\"turn\" [class.turn--user]=\"turn.Role === 'User'\" [class.turn--error]=\"turn.Role === 'Error'\">\n <div class=\"turn-avatar\">\n @if (turn.Role === 'User') {\n <i class=\"fas fa-user\"></i>\n } @else if (turn.Role === 'Error') {\n <i class=\"fas fa-triangle-exclamation\"></i>\n } @else {\n <i class=\"fas fa-robot\"></i>\n }\n </div>\n <div class=\"turn-main\">\n <div class=\"turn-meta\">\n @if (turn.Role === 'User') {\n {{ turn.User || 'User' }}\n } @else {\n {{ turn.Agent || 'Agent' }}\n }\n <span class=\"turn-time\">{{ turn.__mj_CreatedAt | date:'h:mm:ss a' }}</span>\n </div>\n <div class=\"turn-bubble\">{{ turn.Message }}</div>\n </div>\n </div>\n }\n </div>\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> Session Record\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>ID</label>\n <span class=\"mono\">{{ record.ID }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Agent (Co-Agent)</label>\n <span>\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('AI Agents', record.AgentID)\">\n {{ record.Agent || 'N/A' }}\n </a>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>User</label>\n <span>\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('Users', record.UserID)\">\n {{ record.User }}\n </a>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Conversation</label>\n <span>\n @if (record.ConversationID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('MJ: Conversations', record.ConversationID)\">\n {{ record.Conversation || record.ConversationID }}\n </a>\n } @else {\n <span>N/A</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Status</label>\n <span class=\"status-badge small\" [attr.data-status]=\"record.Status\">{{ record.Status }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Prior Session</label>\n <span>\n @if (record.LastSessionID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('MJ: AI Agent Sessions', record.LastSessionID)\">\n {{ record.LastSessionID }}\n </a>\n } @else {\n <span>None (root)</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Host Instance</label>\n <span class=\"mono\">{{ record.HostInstanceID || 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Last Active At</label>\n <span>{{ record.LastActiveAt | date:'medium' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Closed At</label>\n <span>{{ record.ClosedAt ? (record.ClosedAt | date:'medium') : 'Still open' }}</span>\n </div>\n </div>\n </mj-accordion-panel>\n\n @if (record.Config_) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-code\"></i> Config (Session State JSON)\n </ng-template>\n <div class=\"config-viewer\">\n <mj-code-editor\n [ngModel]=\"PrettyConfig\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </mj-accordion-panel>\n }\n </div>\n }\n }\n </div>\n </div>\n</mj-record-form-container>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ai-agent-session-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgentSessions/ai-agent-session-form.component.ts","../../../../src/lib/custom/AIAgentSessions/ai-agent-session-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, inject } from '@angular/core';\nimport { CompositeKey, RunView } from '@memberjunction/core';\nimport { MJAIAgentSessionEntity } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseFormComponent, CUSTOM_LAYOUT_TOOLBAR_CONFIG } from '@memberjunction/ng-base-forms';\nimport { SharedService, NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJAIAgentSessionFormComponent } from '../../generated/Entities/MJAIAgentSession/mjaiagentsession.form.component';\n\n/**\n * Authoritative shape persisted in `AIAgentSession.Config` for a client-direct\n * realtime voice session. Mirrors `RealtimeSessionConfig` on the server\n * (MJServer/RealtimeClientSessionResolver). All fields optional — non-voice\n * sessions may carry none of them.\n */\ninterface SessionConfigJson {\n targetAgentID?: string;\n coAgentRunID?: string;\n promptRunID?: string;\n}\n\n/** Date values arrive as ISO strings from `ResultType: 'simple'` RunViews. */\ntype DateLike = Date | string;\n\n/** Narrowed read-only row from 'MJ: AI Agent Runs' for the session run tree. */\ninterface SessionRunRow {\n ID: string;\n AgentID: string;\n Agent: string | null;\n ParentRunID: string | null;\n Status: string;\n StartedAt: DateLike;\n CompletedAt: DateLike | null;\n TotalTokensUsed: number | null;\n TotalCost: number | null;\n TotalTokensUsedRollup: number | null;\n TotalCostRollup: number | null;\n}\n\n/** Narrowed read-only row from 'MJ: AI Agent Session Channels'. */\ninterface SessionChannelRow {\n ID: string;\n ChannelID: string;\n Channel: string;\n Status: 'Connected' | 'Connecting' | 'Disconnected' | 'Paused';\n SocketUrl: string | null;\n __mj_CreatedAt: DateLike;\n LastActiveAt: DateLike;\n DisconnectedAt: DateLike | null;\n}\n\n/** Narrowed read-only row from 'MJ: AI Agent Channels' (definition lookup for transport). */\ninterface ChannelDefinitionRow {\n ID: string;\n Name: string;\n TransportType: string;\n}\n\n/** Narrowed read-only row from 'MJ: Conversation Details' for the transcript. */\ninterface TranscriptRow {\n ID: string;\n Role: 'User' | 'AI' | 'Error';\n Message: string;\n Agent: string | null;\n User: string | null;\n __mj_CreatedAt: DateLike;\n}\n\n/** Narrowed read-only row from 'MJ: AI Prompt Runs' (the co-agent model leg). */\ninterface CoAgentPromptRunRow {\n ID: string;\n Model: string;\n Status: string;\n RunAt: DateLike;\n CompletedAt: DateLike | null;\n TokensUsed: number | null;\n TokensPrompt: number | null;\n TokensCompletion: number | null;\n TotalCost: number | null;\n}\n\n/** A flattened node in the session run tree (depth-first order, indented by depth). */\nexport interface SessionRunTreeItem {\n /** 'run' = AIAgentRun row, 'promptRun' = the co-agent's streaming model leg */\n kind: 'run' | 'promptRun';\n id: string;\n entityName: string;\n title: string;\n subtitle: string;\n status: string;\n startedAt: DateLike | null;\n completedAt: DateLike | null;\n tokens: number | null;\n cost: number | null;\n depth: number;\n isCoAgentRun: boolean;\n}\n\n/** Channel row decorated with its definition's transport type for display. */\nexport interface SessionChannelDisplayRow {\n row: SessionChannelRow;\n transportType: string | null;\n}\n\n/**\n * Custom form for 'MJ: AI Agent Sessions' — the observability surface for\n * long-lived realtime (voice) agent sessions. Mirrors the AI Agent Run form's\n * visual language: header with icon / status badge / stats, config bar, and\n * tabbed panes for the delegated run tree, channels, transcript, and details.\n */\n@RegisterClass(BaseFormComponent, 'MJ: AI Agent Sessions')\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-session-form',\n templateUrl: './ai-agent-session-form.component.html',\n styleUrls: ['./ai-agent-session-form.component.css']\n})\nexport class MJAIAgentSessionFormComponentExtended extends MJAIAgentSessionFormComponent implements OnInit {\n public record!: MJAIAgentSessionEntity;\n\n /** Hide the generated-section controls — this form has a fully custom layout. */\n public readonly ToolbarConfig = CUSTOM_LAYOUT_TOOLBAR_CONFIG;\n\n /** Sessions read best full-width, like the agent-run form. */\n public override getDefaultFormWidthMode(): 'centered' | 'full-width' { return 'full-width'; }\n\n // UI state\n public ActiveTab: 'runs' | 'channels' | 'transcript' | 'details' = 'runs';\n public Loading = false;\n public LoadError: string | null = null;\n\n // Loaded data\n public RunTree: SessionRunTreeItem[] = [];\n public Channels: SessionChannelDisplayRow[] = [];\n public Transcript: TranscriptRow[] = [];\n public DelegatedRunCount = 0;\n public TargetAgentID: string | null = null;\n public TargetAgentName: string | null = null;\n public CoAgentPromptRun: CoAgentPromptRunRow | null = null;\n public SessionTokens: number | null = null;\n public SessionCost: number | null = null;\n\n private sessionConfig: SessionConfigJson = {};\n private cachedPrettyConfig: string | null = null;\n\n private navigationService = inject(NavigationService);\n private appManager = inject(ApplicationManager);\n\n override async ngOnInit(): Promise<void> {\n await super.ngOnInit();\n if (this.record?.ID) {\n this.sessionConfig = this.parseSessionConfig(this.record.Config_);\n await this.loadSessionData();\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Data loading\n // ────────────────────────────────────────────────────────────────────\n\n /** Parses the session's Config JSON; returns an empty config on any error. */\n private parseSessionConfig(raw: string | null): SessionConfigJson {\n if (!raw) return {};\n try {\n const parsed = JSON.parse(raw) as Partial<SessionConfigJson>;\n return {\n targetAgentID: typeof parsed.targetAgentID === 'string' ? parsed.targetAgentID : undefined,\n coAgentRunID: typeof parsed.coAgentRunID === 'string' ? parsed.coAgentRunID : undefined,\n promptRunID: typeof parsed.promptRunID === 'string' ? parsed.promptRunID : undefined\n };\n } catch {\n return {};\n }\n }\n\n /**\n * Loads everything the form shows in a single batched RunViews round trip:\n * the session's run tree, its channel instances (+ channel definitions for\n * transport), the transcript, and — when the Config carries observability\n * ids — the co-agent prompt run and target agent name.\n */\n private async loadSessionData(): Promise<void> {\n this.Loading = true;\n this.LoadError = null;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const sessionId = this.record.ID;\n\n const results = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Runs',\n Fields: ['ID', 'AgentID', 'Agent', 'ParentRunID', 'Status', 'StartedAt', 'CompletedAt',\n 'TotalTokensUsed', 'TotalCost', 'TotalTokensUsedRollup', 'TotalCostRollup'],\n ExtraFilter: `AgentSessionID='${sessionId}'`,\n OrderBy: 'StartedAt ASC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agent Session Channels',\n Fields: ['ID', 'ChannelID', 'Channel', 'Status', 'SocketUrl', '__mj_CreatedAt', 'LastActiveAt', 'DisconnectedAt'],\n ExtraFilter: `AgentSessionID='${sessionId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agent Channels',\n Fields: ['ID', 'Name', 'TransportType'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Conversation Details',\n Fields: ['ID', 'Role', 'Message', 'Agent', 'User', '__mj_CreatedAt'],\n ExtraFilter: `AgentSessionID='${sessionId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n ResultType: 'simple'\n },\n // Co-agent model leg — only meaningful when Config carries promptRunID;\n // an impossible filter keeps the batch shape stable when it doesn't.\n {\n EntityName: 'MJ: AI Prompt Runs',\n Fields: ['ID', 'Model', 'Status', 'RunAt', 'CompletedAt', 'TokensUsed', 'TokensPrompt', 'TokensCompletion', 'TotalCost'],\n ExtraFilter: this.sessionConfig.promptRunID ? `ID='${this.sessionConfig.promptRunID}'` : `1=0`,\n ResultType: 'simple'\n },\n // Target agent name resolution from Config.targetAgentID\n {\n EntityName: 'MJ: AI Agents',\n Fields: ['ID', 'Name'],\n ExtraFilter: this.sessionConfig.targetAgentID ? `ID='${this.sessionConfig.targetAgentID}'` : `1=0`,\n ResultType: 'simple'\n }\n ]);\n\n const runs = (results[0]?.Success ? results[0].Results : []) as SessionRunRow[];\n const channelRows = (results[1]?.Success ? results[1].Results : []) as SessionChannelRow[];\n const channelDefs = (results[2]?.Success ? results[2].Results : []) as ChannelDefinitionRow[];\n this.Transcript = (results[3]?.Success ? results[3].Results : []) as TranscriptRow[];\n const promptRuns = (results[4]?.Success ? results[4].Results : []) as CoAgentPromptRunRow[];\n const targetAgents = (results[5]?.Success ? results[5].Results : []) as { ID: string; Name: string }[];\n\n this.CoAgentPromptRun = promptRuns.length > 0 ? promptRuns[0] : null;\n this.TargetAgentID = this.sessionConfig.targetAgentID ?? null;\n this.TargetAgentName = targetAgents.length > 0 ? targetAgents[0].Name : null;\n\n this.Channels = channelRows.map(row => ({\n row,\n transportType: channelDefs.find(d => UUIDsEqual(d.ID, row.ChannelID))?.TransportType ?? null\n }));\n\n this.RunTree = this.buildRunTree(runs);\n this.DelegatedRunCount = runs.filter(r => r.ParentRunID != null).length;\n this.computeSessionUsage(runs);\n } catch (error) {\n console.error('Error loading agent session data:', error);\n this.LoadError = 'Failed to load session data';\n } finally {\n this.Loading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Flattens the session's runs into a depth-first tree: root runs (no\n * ParentRunID, or parent outside the session) first, children nested by\n * ParentRunID. The co-agent run (Config.coAgentRunID) gets its streaming\n * prompt run inserted directly beneath it as a 'promptRun' leg.\n */\n private buildRunTree(runs: SessionRunRow[]): SessionRunTreeItem[] {\n const items: SessionRunTreeItem[] = [];\n const byParent = new Map<string, SessionRunRow[]>();\n const idSet = new Set(runs.map(r => r.ID.toUpperCase()));\n\n const roots: SessionRunRow[] = [];\n for (const run of runs) {\n if (run.ParentRunID && idSet.has(run.ParentRunID.toUpperCase())) {\n const key = run.ParentRunID.toUpperCase();\n const list = byParent.get(key) ?? [];\n list.push(run);\n byParent.set(key, list);\n } else {\n roots.push(run);\n }\n }\n\n const visit = (run: SessionRunRow, depth: number): void => {\n const isCoAgent = this.sessionConfig.coAgentRunID != null && UUIDsEqual(run.ID, this.sessionConfig.coAgentRunID);\n items.push(this.runToTreeItem(run, depth, isCoAgent));\n if (isCoAgent && this.CoAgentPromptRun) {\n items.push(this.promptRunToTreeItem(this.CoAgentPromptRun, depth + 1));\n }\n for (const child of byParent.get(run.ID.toUpperCase()) ?? []) {\n visit(child, depth + 1);\n }\n };\n for (const root of roots) {\n visit(root, 0);\n }\n return items;\n }\n\n private runToTreeItem(run: SessionRunRow, depth: number, isCoAgent: boolean): SessionRunTreeItem {\n const shortId = run.ID.substring(0, 8);\n return {\n kind: 'run',\n id: run.ID,\n entityName: 'MJ: AI Agent Runs',\n title: isCoAgent\n ? `${run.Agent ?? 'Co-Agent'} · session run`\n : `${run.Agent ?? 'Agent'} · delegated run`,\n subtitle: isCoAgent\n ? `AIAgentRun #${shortId} · one long-lived run for this session`\n : `AIAgentRun #${shortId} · ParentRunID #${run.ParentRunID?.substring(0, 8) ?? '—'} · invoked via target-agent tool`,\n status: run.Status,\n startedAt: run.StartedAt,\n completedAt: run.CompletedAt,\n tokens: run.TotalTokensUsedRollup ?? run.TotalTokensUsed,\n cost: run.TotalCostRollup ?? run.TotalCost,\n depth,\n isCoAgentRun: isCoAgent\n };\n }\n\n private promptRunToTreeItem(pr: CoAgentPromptRunRow, depth: number): SessionRunTreeItem {\n return {\n kind: 'promptRun',\n id: pr.ID,\n entityName: 'MJ: AI Prompt Runs',\n title: `Model leg · ${pr.Model}`,\n subtitle: `AIPromptRun #${pr.ID.substring(0, 8)} · ${pr.TokensPrompt ?? 0} in · ${pr.TokensCompletion ?? 0} out · usage checkpointed incrementally`,\n status: pr.Status,\n startedAt: pr.RunAt,\n completedAt: pr.CompletedAt,\n tokens: pr.TokensUsed,\n cost: pr.TotalCost,\n depth,\n isCoAgentRun: false\n };\n }\n\n /**\n * Session-level tokens/cost for the header stats: prefer the co-agent run's\n * rollups (covers delegated children), fall back to the prompt run's\n * incremental usage when the run rollups haven't been finalized yet.\n */\n private computeSessionUsage(runs: SessionRunRow[]): void {\n const coAgentRun = this.sessionConfig.coAgentRunID\n ? runs.find(r => UUIDsEqual(r.ID, this.sessionConfig.coAgentRunID)) ?? null\n : null;\n const runTokens = coAgentRun ? (coAgentRun.TotalTokensUsedRollup ?? coAgentRun.TotalTokensUsed) : null;\n const runCost = coAgentRun ? (coAgentRun.TotalCostRollup ?? coAgentRun.TotalCost) : null;\n this.SessionTokens = runTokens ?? this.CoAgentPromptRun?.TokensUsed ?? null;\n this.SessionCost = runCost ?? this.CoAgentPromptRun?.TotalCost ?? null;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Display helpers\n // ────────────────────────────────────────────────────────────────────\n\n public ChangeTab(tab: 'runs' | 'channels' | 'transcript' | 'details'): void {\n this.ActiveTab = tab;\n }\n\n public GetStatusIcon(status: string | null): string {\n switch (status) {\n case 'Active': return 'fa-tower-broadcast';\n case 'Idle': return 'fa-moon';\n case 'Closed': return 'fa-circle-stop';\n default: return 'fa-question-circle';\n }\n }\n\n public GetRunStatusIcon(status: string): string {\n switch (status) {\n case 'Running': return 'fa-circle-notch fa-spin';\n case 'Completed': return 'fa-check-circle';\n case 'Failed': return 'fa-times-circle';\n case 'Cancelled': return 'fa-ban';\n case 'Paused': return 'fa-pause-circle';\n case 'AwaitingFeedback': return 'fa-hourglass-half';\n case 'Pending': return 'fa-clock';\n default: return 'fa-question-circle';\n }\n }\n\n public GetChannelIcon(channelName: string | null): string {\n switch (channelName) {\n case 'VoiceAudio': return 'fa-microphone-lines';\n case 'TextChat': return 'fa-comment';\n case 'ClientControl': return 'fa-sliders';\n case 'Whiteboard': return 'fa-chalkboard';\n case 'Video': return 'fa-video';\n default: return 'fa-plug';\n }\n }\n\n /** Short, readable session id (first segment of the UUID). */\n public get ShortSessionId(): string {\n return this.record?.ID ? `sess_${this.record.ID.substring(0, 8).toLowerCase()}` : '';\n }\n\n /** Created → ClosedAt (terminal) or LastActiveAt (still open) duration. */\n public get SessionDuration(): string {\n if (!this.record) return '';\n const start = this.toDate(this.record.__mj_CreatedAt);\n const end = this.toDate(this.record.ClosedAt) ?? this.toDate(this.record.LastActiveAt);\n if (!start || !end) return '—';\n return this.FormatDuration(start, end);\n }\n\n public FormatDuration(start: DateLike | null, end: DateLike | null): string {\n const s = this.toDate(start);\n const e = this.toDate(end);\n if (!s) return '—';\n if (!e) return 'Running...';\n const ms = e.getTime() - s.getTime();\n if (ms < 0) return '—';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;\n return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;\n }\n\n private toDate(value: DateLike | null | undefined): Date | null {\n if (value == null) return null;\n const d = value instanceof Date ? value : new Date(value);\n return isNaN(d.getTime()) ? null : d;\n }\n\n /** Pretty-printed session Config JSON for the Details tab (cached). */\n public get PrettyConfig(): string {\n if (!this.record?.Config_) return '';\n if (this.cachedPrettyConfig !== null) return this.cachedPrettyConfig;\n try {\n this.cachedPrettyConfig = JSON.stringify(JSON.parse(this.record.Config_), null, 2);\n } catch {\n this.cachedPrettyConfig = this.record.Config_;\n }\n return this.cachedPrettyConfig;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Navigation\n // ────────────────────────────────────────────────────────────────────\n\n public OpenEntityRecord(entityName: string, recordId: string | null): void {\n if (recordId) {\n SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.FromURLSegment(this.ProviderToUse.EntityByName(entityName), recordId));\n }\n }\n\n /** Opens the linked conversation in the Chat app (same pattern as the agent-run form). */\n public NavigateToConversation(): void {\n if (!this.record?.ConversationID) return;\n const chatApp = this.appManager.GetAllApps().find(app => app.Name === 'Chat');\n if (!chatApp) {\n // Fall back to the raw conversation record when the Chat app isn't installed\n this.OpenEntityRecord('MJ: Conversations', this.record.ConversationID);\n return;\n }\n this.navigationService.OpenNavItemByName(\n 'Conversations',\n // realtimeSessionId opens the SESSION REVIEW overlay directly on arrival\n // (the chat wrapper consumes it once) — not just the containing chat.\n { conversationId: this.record.ConversationID, realtimeSessionId: this.record.ID },\n chatApp.ID\n );\n }\n\n public RefreshData(): void {\n if (!this.record?.ID) return;\n this.cachedPrettyConfig = null;\n this.record.Load(this.record.ID).then(() => {\n this.sessionConfig = this.parseSessionConfig(this.record.Config_);\n void this.loadSessionData();\n });\n }\n}\n","@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n [ToolbarConfig]=\"ToolbarConfig\"\n [WidthMode]=\"'full-width'\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <div class=\"record-form ai-agent-session-form\">\n <!-- Header (mirrors the AI Agent Run form header) -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"icon-wrapper\">\n <i class=\"fas fa-tower-broadcast\"></i>\n </div>\n <div class=\"header-info\">\n <h2>AI Agent Session</h2>\n <div class=\"meta-info\">\n @if (record.AgentID) {\n <span class=\"agent-name\">\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('AI Agents', record.AgentID)\">\n {{ record.Agent || 'Agent' }}\n </a>\n </span>\n }\n @if (TargetAgentID) {\n <i class=\"fas fa-arrow-right-long target-arrow\"></i>\n <span class=\"agent-name\">\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('AI Agents', TargetAgentID)\">\n {{ TargetAgentName || 'Target agent' }}\n </a>\n </span>\n }\n <span class=\"run-id\">{{ ShortSessionId }}</span>\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>{{ record.Conversation || '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 <div class=\"status-badge\" [attr.data-status]=\"record.Status\">\n <i class=\"fas\" [ngClass]=\"GetStatusIcon(record.Status)\"></i>\n {{ record.Status }}\n </div>\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\n <div class=\"header-stats\">\n <div class=\"stat\">\n <span class=\"label\">User</span>\n <span class=\"value\">\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('Users', record.UserID)\">{{ record.User }}</a>\n </span>\n </div>\n <div class=\"stat\">\n <span class=\"label\">Started</span>\n <span class=\"value\">{{ record.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n @if (record.ClosedAt) {\n <div class=\"stat\">\n <span class=\"label\">Closed</span>\n <span class=\"value\">{{ record.ClosedAt | date:'medium' }}</span>\n </div>\n } @else {\n <div class=\"stat\">\n <span class=\"label\">Last Active</span>\n <span class=\"value\">{{ record.LastActiveAt | date:'medium' }}</span>\n </div>\n }\n <div class=\"stat\">\n <span class=\"label\">Duration</span>\n <span class=\"value\">{{ SessionDuration }}</span>\n </div>\n <div class=\"stat\">\n <span class=\"label\">Channels</span>\n <span class=\"value\">{{ Channels.length }}</span>\n </div>\n <div class=\"stat\">\n <span class=\"label\">Delegated Runs</span>\n <span class=\"value\">{{ DelegatedRunCount }}</span>\n </div>\n @if (SessionTokens != null && SessionTokens > 0) {\n <div class=\"stat\">\n <span class=\"label\">Tokens</span>\n <span class=\"value\">{{ SessionTokens | number:'1.0-0' }}</span>\n </div>\n }\n @if (SessionCost != null && SessionCost > 0) {\n <div class=\"stat\">\n <span class=\"label\">Cost</span>\n <span class=\"value success\">${{ SessionCost | number:'1.2-4' }}</span>\n </div>\n }\n </div>\n\n <!-- Config bar: target agent / host instance / continuation -->\n <div class=\"configuration-bar\">\n <div class=\"config-item\">\n <i class=\"fas fa-bullseye\"></i>\n <div class=\"config-content\">\n <div class=\"config-label\">Target Agent</div>\n <div class=\"config-value\">\n @if (TargetAgentID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('AI Agents', TargetAgentID)\">\n {{ TargetAgentName || 'Unknown' }}\n </a>\n } @else {\n <span class=\"muted\">None</span>\n }\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <i class=\"fas fa-server\"></i>\n <div class=\"config-content\">\n <div class=\"config-label\">Host Instance</div>\n <div class=\"config-value mono\">{{ record.HostInstanceID || '—' }}</div>\n </div>\n </div>\n <div class=\"config-item\">\n <i class=\"fas fa-link\"></i>\n <div class=\"config-content\">\n <div class=\"config-label\">Continuation</div>\n <div class=\"config-value\">\n @if (record.LastSessionID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('MJ: AI Agent Sessions', record.LastSessionID)\">\n Resumed from prior session\n </a>\n } @else {\n <span class=\"muted\">None (new session)</span>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab\" [class.active]=\"ActiveTab === 'runs'\" (click)=\"ChangeTab('runs')\">\n <i class=\"fas fa-diagram-project\"></i> Runs\n @if (RunTree.length > 0) { <span class=\"tab-count\">{{ RunTree.length }}</span> }\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'channels'\" (click)=\"ChangeTab('channels')\">\n <i class=\"fas fa-plug\"></i> Channels\n @if (Channels.length > 0) { <span class=\"tab-count\">{{ Channels.length }}</span> }\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'transcript'\" (click)=\"ChangeTab('transcript')\">\n <i class=\"fas fa-comments\"></i> Transcript\n @if (Transcript.length > 0) { <span class=\"tab-count\">{{ Transcript.length }}</span> }\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 @if (Loading) {\n <mj-loading text=\"Loading session data...\" size=\"medium\"></mj-loading>\n } @else if (LoadError) {\n <mj-empty-state\n Variant=\"error\"\n [Message]=\"LoadError\" />\n } @else {\n\n <!-- Runs tab: the session's delegated run tree -->\n @if (ActiveTab === 'runs') {\n <div class=\"tab-content\">\n @if (RunTree.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-diagram-project\"\n Title=\"No Runs\"\n Message=\"No agent runs have been recorded for this session yet.\" />\n } @else {\n <div class=\"run-tree\">\n @for (node of RunTree; track node.id) {\n <div class=\"run-node\"\n [class.run-node--child]=\"node.depth > 0\"\n [style.margin-left.px]=\"node.depth * 36\"\n (click)=\"OpenEntityRecord(node.entityName, node.id)\"\n title=\"Open record\">\n <div class=\"run-marker\"\n [class.run-marker--coagent]=\"node.isCoAgentRun\"\n [class.run-marker--prompt]=\"node.kind === 'promptRun'\">\n @if (node.kind === 'promptRun') {\n <i class=\"fas fa-microchip\"></i>\n } @else if (node.isCoAgentRun) {\n <i class=\"fas fa-tower-broadcast\"></i>\n } @else {\n <i class=\"fas fa-robot\"></i>\n }\n </div>\n <div class=\"run-body\">\n <div class=\"run-headrow\">\n <h4 class=\"run-title\">{{ node.title }}</h4>\n <span class=\"run-time\">{{ node.startedAt | date:'h:mm:ss a' }}</span>\n </div>\n <div class=\"run-sub\">{{ node.subtitle }}</div>\n <div class=\"run-foot\">\n <span class=\"run-status\" [attr.data-status]=\"node.status\">\n <i class=\"fas\" [ngClass]=\"GetRunStatusIcon(node.status)\"></i> {{ node.status }}\n </span>\n <span class=\"run-chip\">\n <i class=\"fas fa-clock\"></i> {{ FormatDuration(node.startedAt, node.completedAt) }}\n </span>\n @if (node.tokens != null && node.tokens > 0) {\n <span class=\"run-chip\"><i class=\"fas fa-coins\"></i> {{ node.tokens | number:'1.0-0' }} tok</span>\n }\n @if (node.cost != null && node.cost > 0) {\n <span class=\"run-chip\"><i class=\"fas fa-dollar-sign\"></i> {{ node.cost | number:'1.2-4' }}</span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Channels tab -->\n @if (ActiveTab === 'channels') {\n <div class=\"tab-content\">\n @if (Channels.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-plug\"\n Title=\"No Channels\"\n Message=\"No channel instances were attached to this session.\" />\n } @else {\n <div class=\"channels-grid-wrap\">\n <table class=\"channels-grid\">\n <thead>\n <tr>\n <th>Channel</th>\n <th>Transport</th>\n <th>Status</th>\n <th>Connected</th>\n <th>Last Active</th>\n <th>Disconnected</th>\n <th>Socket</th>\n </tr>\n </thead>\n <tbody>\n @for (channel of Channels; track channel.row.ID) {\n <tr (click)=\"OpenEntityRecord('MJ: AI Agent Session Channels', channel.row.ID)\" title=\"Open record\">\n <td>\n <span class=\"cell-strong\">\n <i class=\"fas\" [ngClass]=\"GetChannelIcon(channel.row.Channel)\"></i>\n {{ channel.row.Channel }}\n </span>\n </td>\n <td>\n @if (channel.transportType) {\n <span class=\"transport-pill\" [attr.data-transport]=\"channel.transportType\">{{ channel.transportType }}</span>\n } @else {\n <span class=\"muted\">—</span>\n }\n </td>\n <td>\n <span class=\"channel-status-pill\" [attr.data-status]=\"channel.row.Status\">{{ channel.row.Status }}</span>\n </td>\n <td class=\"mono\">{{ channel.row.__mj_CreatedAt | date:'h:mm:ss a' }}</td>\n <td class=\"mono\">{{ channel.row.LastActiveAt | date:'h:mm:ss a' }}</td>\n <td class=\"mono\">\n @if (channel.row.DisconnectedAt) {\n {{ channel.row.DisconnectedAt | date:'h:mm:ss a' }}\n } @else {\n <span class=\"muted\">—</span>\n }\n </td>\n <td class=\"mono socket-cell\" [title]=\"channel.row.SocketUrl || ''\">\n {{ channel.row.SocketUrl || '—' }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n <!-- Transcript tab -->\n @if (ActiveTab === 'transcript') {\n <div class=\"tab-content\">\n @if (Transcript.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-comments\"\n Title=\"No Transcript\"\n Message=\"No conversation messages were stamped with this session.\" />\n } @else {\n <div class=\"transcript-thread\">\n @for (turn of Transcript; track turn.ID) {\n <div class=\"turn\" [class.turn--user]=\"turn.Role === 'User'\" [class.turn--error]=\"turn.Role === 'Error'\">\n <div class=\"turn-avatar\">\n @if (turn.Role === 'User') {\n <i class=\"fas fa-user\"></i>\n } @else if (turn.Role === 'Error') {\n <i class=\"fas fa-triangle-exclamation\"></i>\n } @else {\n <i class=\"fas fa-robot\"></i>\n }\n </div>\n <div class=\"turn-main\">\n <div class=\"turn-meta\">\n @if (turn.Role === 'User') {\n {{ turn.User || 'User' }}\n } @else {\n {{ turn.Agent || 'Agent' }}\n }\n <span class=\"turn-time\">{{ turn.__mj_CreatedAt | date:'h:mm:ss a' }}</span>\n </div>\n <div class=\"turn-bubble\">{{ turn.Message }}</div>\n </div>\n </div>\n }\n </div>\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> Session Record\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>ID</label>\n <span class=\"mono\">{{ record.ID }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Agent (Co-Agent)</label>\n <span>\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('AI Agents', record.AgentID)\">\n {{ record.Agent || 'N/A' }}\n </a>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>User</label>\n <span>\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('Users', record.UserID)\">\n {{ record.User }}\n </a>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Conversation</label>\n <span>\n @if (record.ConversationID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('MJ: Conversations', record.ConversationID)\">\n {{ record.Conversation || record.ConversationID }}\n </a>\n } @else {\n <span>N/A</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Status</label>\n <span class=\"status-badge small\" [attr.data-status]=\"record.Status\">{{ record.Status }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Prior Session</label>\n <span>\n @if (record.LastSessionID) {\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"OpenEntityRecord('MJ: AI Agent Sessions', record.LastSessionID)\">\n {{ record.LastSessionID }}\n </a>\n } @else {\n <span>None (root)</span>\n }\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Host Instance</label>\n <span class=\"mono\">{{ record.HostInstanceID || 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Last Active At</label>\n <span>{{ record.LastActiveAt | date:'medium' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Closed At</label>\n <span>{{ record.ClosedAt ? (record.ClosedAt | date:'medium') : 'Still open' }}</span>\n </div>\n </div>\n </mj-accordion-panel>\n\n @if (record.Config_) {\n <mj-accordion-panel [Expanded]=\"false\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-code\"></i> Config (Session State JSON)\n </ng-template>\n <div class=\"config-viewer\">\n <mj-code-editor\n [ngModel]=\"PrettyConfig\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </mj-accordion-panel>\n }\n </div>\n }\n }\n </div>\n </div>\n</mj-record-form-container>\n}\n"]}
|
|
@@ -88,7 +88,7 @@ let FlowAgentFormSectionComponent = class FlowAgentFormSectionComponent extends
|
|
|
88
88
|
i0.ɵɵconditionalCreate(0, FlowAgentFormSectionComponent_Conditional_0_Template, 1, 4, "mj-flow-agent-editor", 0)(1, FlowAgentFormSectionComponent_Conditional_1_Template, 1, 0, "mj-empty-state", 1);
|
|
89
89
|
} if (rf & 2) {
|
|
90
90
|
i0.ɵɵconditional(ctx.AgentID ? 0 : 1);
|
|
91
|
-
} }, dependencies: [i1.MJEmptyStateComponent, i2.FlowAgentEditorComponent], styles: ["\n
|
|
91
|
+
} }, dependencies: [i1.MJEmptyStateComponent, i2.FlowAgentEditorComponent], styles: ["\n[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\nmj-flow-agent-editor[_ngcontent-%COMP%] {\n display: block;\n width: 100%;\n \n\n\n\n height: calc(100vh - 300px);\n min-height: 400px;\n}\n\n\n.flow-empty-state[_ngcontent-%COMP%] {\n display: block;\n min-height: 400px;\n}"] }); }
|
|
92
92
|
};
|
|
93
93
|
FlowAgentFormSectionComponent = __decorate([
|
|
94
94
|
RegisterClass(BaseFormSectionComponent, 'AI Agents.FlowAgentSection')
|
|
@@ -561,7 +561,7 @@ export class AddActionDialogComponent extends BaseAngularComponent {
|
|
|
561
561
|
i0.ɵɵproperty("disabled", ctx.selectedCount === 0);
|
|
562
562
|
i0.ɵɵadvance(2);
|
|
563
563
|
i0.ɵɵtextInterpolate1(" Add Selected (", ctx.selectedCount, ") ");
|
|
564
|
-
} }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.FormControlDirective, i2.MJEmptyStateComponent, i2.MJButtonDirective, i3.AsyncPipe], styles: [".add-action-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n\n\n[_nghost-%COMP%] .k-dialog, \n[_nghost-%COMP%] .k-window {\n z-index: 10000 !important;\n}\n\n[_nghost-%COMP%] .k-overlay {\n z-index: 9999 !important;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .search-section[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .search-section[_ngcontent-%COMP%] .search-input[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 400px;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .header-actions[_ngcontent-%COMP%] .stats[_ngcontent-%COMP%] .stat-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .header-actions[_ngcontent-%COMP%] .stats[_ngcontent-%COMP%] .stat-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-content[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n overflow: hidden;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] {\n width: 250px;\n background: var(--mj-bg-surface-card);\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .sidebar-header[_ngcontent-%COMP%] {\n padding: 1rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .sidebar-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 1rem;\n font-weight: 600;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .sidebar-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0.5rem;\n color: var(--mj-text-muted);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] {\n padding: 0.5rem 0;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 0.75rem 1rem;\n cursor: pointer;\n transition: all 0.2s ease;\n border-left: 3px solid transparent;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-left-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item.selected[_ngcontent-%COMP%] .category-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%] .category-icon[_ngcontent-%COMP%] {\n width: 16px;\n text-align: center;\n margin-right: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%] .category-name[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%] .category-count[_ngcontent-%COMP%] {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n padding: 0.25rem 0.5rem;\n border-radius: 12px;\n font-size: 0.8rem;\n font-weight: 600;\n min-width: 24px;\n text-align: center;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item.selected[_ngcontent-%COMP%] .category-count[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] {\n flex: 1;\n padding: 1.5rem;\n overflow-y: auto;\n background: var(--mj-bg-surface);\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: var(--mj-text-muted);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .loading-state[_ngcontent-%COMP%] .loading-spinner[_ngcontent-%COMP%] {\n margin-bottom: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .loading-state[_ngcontent-%COMP%] .loading-spinner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin-top: 1rem;\n font-size: 1.1rem;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] {\n position: relative;\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 1.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n transform: translateY(-2px);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 4%, var(--mj-bg-surface));\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-status-success) 15%, transparent);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card.selected[_ngcontent-%COMP%] .selection-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card.existing[_ngcontent-%COMP%] {\n border-color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n cursor: default;\n opacity: 0.7;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card.existing[_ngcontent-%COMP%]:hover {\n transform: none;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .selection-indicator[_ngcontent-%COMP%] {\n position: absolute;\n top: 1rem;\n right: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .selection-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: var(--mj-border-default);\n transition: color 0.2s ease;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n margin-bottom: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%] .action-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%] .action-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%] .action-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n line-height: 1.2;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .action-description[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n color: var(--mj-text-muted);\n line-height: 1.4;\n font-size: 0.9rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .category-badge[_ngcontent-%COMP%], \n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.8rem;\n font-weight: 500;\n margin-right: 0.5rem;\n margin-bottom: 0.5rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .category-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .type-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .type-badge[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .existing-overlay[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-text-muted) 90%, transparent);\n color: var(--mj-text-inverse);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .existing-overlay[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .existing-overlay[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 40px 1fr 150px 100px 2fr 120px;\n gap: 1rem;\n padding: 1rem;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 0.5rem;\n font-size: 0.9rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 40px 1fr 150px 100px 2fr 120px;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n margin-bottom: 0.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n align-items: center;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 4%, var(--mj-bg-surface));\n border-color: var(--mj-status-success);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item.selected[_ngcontent-%COMP%] .col-select[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item.existing[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n opacity: 0.7;\n cursor: default;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item.existing[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-default);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-select[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: var(--mj-border-default);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-name[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 500;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-name[_ngcontent-%COMP%] .action-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-description[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.8rem;\n font-weight: 500;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .status-badge.existing[_ngcontent-%COMP%] {\n background: var(--mj-text-muted);\n color: var(--mj-text-inverse);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .status-badge.available[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .selection-summary[_ngcontent-%COMP%] {\n padding: 1rem 1.5rem;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-top: 1px solid color-mix(in srgb, var(--mj-status-success) 25%, var(--mj-bg-surface));\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .selection-summary[_ngcontent-%COMP%] .summary-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: var(--mj-status-success);\n font-weight: 500;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .selection-summary[_ngcontent-%COMP%] .summary-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 120px;\n}\n\n\n\n@media (max-width: 768px) {\n .add-action-dialog[_ngcontent-%COMP%] .dialog-content[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] {\n width: 100%;\n max-height: 200px;\n }\n\n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] {\n grid-template-columns: 40px 1fr 80px;\n gap: 0.5rem;\n }\n\n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] .col-category[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] .col-type[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] .col-description[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-category[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-type[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-description[_ngcontent-%COMP%] {\n display: none;\n }\n}"] }); }
|
|
564
|
+
} }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.FormControlDirective, i2.MJEmptyStateComponent, i2.MJButtonDirective, i3.AsyncPipe], styles: [".add-action-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n\n[_nghost-%COMP%] .k-dialog, \n[_nghost-%COMP%] .k-window {\n z-index: 10000 !important;\n}\n\n[_nghost-%COMP%] .k-overlay {\n z-index: 9999 !important;\n}\n\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .search-section[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .search-section[_ngcontent-%COMP%] .search-input[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 400px;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .header-actions[_ngcontent-%COMP%] .stats[_ngcontent-%COMP%] .stat-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-header[_ngcontent-%COMP%] .header-actions[_ngcontent-%COMP%] .stats[_ngcontent-%COMP%] .stat-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-content[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n overflow: hidden;\n}\n\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] {\n width: 250px;\n background: var(--mj-bg-surface-card);\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .sidebar-header[_ngcontent-%COMP%] {\n padding: 1rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .sidebar-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 1rem;\n font-weight: 600;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .sidebar-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0.5rem;\n color: var(--mj-text-muted);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] {\n padding: 0.5rem 0;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 0.75rem 1rem;\n cursor: pointer;\n transition: all 0.2s ease;\n border-left: 3px solid transparent;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-left-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item.selected[_ngcontent-%COMP%] .category-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%] .category-icon[_ngcontent-%COMP%] {\n width: 16px;\n text-align: center;\n margin-right: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%] .category-name[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item[_ngcontent-%COMP%] .category-count[_ngcontent-%COMP%] {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n padding: 0.25rem 0.5rem;\n border-radius: 12px;\n font-size: 0.8rem;\n font-weight: 600;\n min-width: 24px;\n text-align: center;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] .category-list[_ngcontent-%COMP%] .category-item.selected[_ngcontent-%COMP%] .category-count[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] {\n flex: 1;\n padding: 1.5rem;\n overflow-y: auto;\n background: var(--mj-bg-surface);\n}\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: var(--mj-text-muted);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .loading-state[_ngcontent-%COMP%] .loading-spinner[_ngcontent-%COMP%] {\n margin-bottom: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .loading-state[_ngcontent-%COMP%] .loading-spinner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin-top: 1rem;\n font-size: 1.1rem;\n}\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] {\n position: relative;\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 1.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n transform: translateY(-2px);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 4%, var(--mj-bg-surface));\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-status-success) 15%, transparent);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card.selected[_ngcontent-%COMP%] .selection-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card.existing[_ngcontent-%COMP%] {\n border-color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n cursor: default;\n opacity: 0.7;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card.existing[_ngcontent-%COMP%]:hover {\n transform: none;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .selection-indicator[_ngcontent-%COMP%] {\n position: absolute;\n top: 1rem;\n right: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .selection-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: var(--mj-border-default);\n transition: color 0.2s ease;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n margin-bottom: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%] .action-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 1rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%] .action-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%] .action-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n line-height: 1.2;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .action-description[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n color: var(--mj-text-muted);\n line-height: 1.4;\n font-size: 0.9rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .category-badge[_ngcontent-%COMP%], \n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.8rem;\n font-weight: 500;\n margin-right: 0.5rem;\n margin-bottom: 0.5rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .category-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .type-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .card-body[_ngcontent-%COMP%] .type-badge[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .existing-overlay[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-text-muted) 90%, transparent);\n color: var(--mj-text-inverse);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .existing-overlay[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] .action-card[_ngcontent-%COMP%] .existing-overlay[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 40px 1fr 150px 100px 2fr 120px;\n gap: 1rem;\n padding: 1rem;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 0.5rem;\n font-size: 0.9rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 40px 1fr 150px 100px 2fr 120px;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n margin-bottom: 0.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n align-items: center;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 4%, var(--mj-bg-surface));\n border-color: var(--mj-status-success);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item.selected[_ngcontent-%COMP%] .col-select[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item.existing[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n opacity: 0.7;\n cursor: default;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item.existing[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-default);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-select[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n color: var(--mj-border-default);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-name[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 500;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-name[_ngcontent-%COMP%] .action-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-description[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.8rem;\n font-weight: 500;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .status-badge.existing[_ngcontent-%COMP%] {\n background: var(--mj-text-muted);\n color: var(--mj-text-inverse);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .status-badge.available[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n\n.add-action-dialog[_ngcontent-%COMP%] .selection-summary[_ngcontent-%COMP%] {\n padding: 1rem 1.5rem;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-top: 1px solid color-mix(in srgb, var(--mj-status-success) 25%, var(--mj-bg-surface));\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .selection-summary[_ngcontent-%COMP%] .summary-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: var(--mj-status-success);\n font-weight: 500;\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .selection-summary[_ngcontent-%COMP%] .summary-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.add-action-dialog[_ngcontent-%COMP%] .dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 120px;\n}\n\n\n@media (max-width: 768px) {\n .add-action-dialog[_ngcontent-%COMP%] .dialog-content[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .add-action-dialog[_ngcontent-%COMP%] .category-sidebar[_ngcontent-%COMP%] {\n width: 100%;\n max-height: 200px;\n }\n\n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] {\n grid-template-columns: 40px 1fr 80px;\n gap: 0.5rem;\n }\n\n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] .col-category[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] .col-type[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-header[_ngcontent-%COMP%] .col-description[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-category[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-type[_ngcontent-%COMP%], \n .add-action-dialog[_ngcontent-%COMP%] .actions-container[_ngcontent-%COMP%] .actions-list[_ngcontent-%COMP%] .list-item[_ngcontent-%COMP%] .col-description[_ngcontent-%COMP%] {\n display: none;\n }\n}"] }); }
|
|
565
565
|
}
|
|
566
566
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AddActionDialogComponent, [{
|
|
567
567
|
type: Component,
|
|
@@ -375,7 +375,7 @@ export class AgentPromptAdvancedSettingsDialogComponent extends BaseAngularCompo
|
|
|
375
375
|
i0.ɵɵproperty("disabled", i0.ɵɵpipeBind1(9, 8, ctx.isSaving$) || false || (i0.ɵɵpipeBind1(10, 10, ctx.isLoading$) || false) || ctx.hasExecutionOrderError());
|
|
376
376
|
i0.ɵɵadvance(3);
|
|
377
377
|
i0.ɵɵconditional(i0.ɵɵpipeBind1(12, 12, ctx.isSaving$) ? 11 : 13);
|
|
378
|
-
} }, dependencies: [i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.FormGroupDirective, i1.FormControlName, i2.MJButtonDirective, i2.MJDropdownComponent, i2.MJNumericInputComponent, i3.AsyncPipe], styles: [".prompt-advanced-settings-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n\n
|
|
378
|
+
} }, dependencies: [i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.FormGroupDirective, i1.FormControlName, i2.MJButtonDirective, i2.MJDropdownComponent, i2.MJNumericInputComponent, i3.AsyncPipe], styles: [".prompt-advanced-settings-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n\n[_nghost-%COMP%] .k-dialog, \n[_nghost-%COMP%] .k-window {\n z-index: 10000 !important;\n}\n\n[_nghost-%COMP%] .k-overlay {\n z-index: 9999 !important;\n}\n\n\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n margin-bottom: 1rem;\n}\n\n.loading-spinner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin-top: 1rem;\n font-size: 1.1rem;\n}\n\n\n.advanced-form[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 1.5rem;\n}\n\n.form-section[_ngcontent-%COMP%] {\n margin-bottom: 2rem;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n.section-title[_ngcontent-%COMP%] {\n margin: 0;\n padding: 1rem 1.5rem;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n font-size: 1.1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.form-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.5rem;\n padding: 1.5rem;\n}\n\n.form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n\nlabel[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n}\n\n.form-control[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.field-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n margin-top: 0.25rem;\n line-height: 1.3;\n}\n\n.field-error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n font-size: 0.8rem;\n margin-top: 0.25rem;\n}\n\n\n.form-control.ng-invalid.ng-touched[_ngcontent-%COMP%], \n.error-border[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error) !important;\n}\n\n.form-control.ng-valid.ng-touched[_ngcontent-%COMP%] {\n border-color: var(--mj-status-success);\n}\n\n\n.context-behavior-option[_ngcontent-%COMP%] {\n padding: 0.5rem 0;\n}\n\n.option-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 0.9rem;\n}\n\n.option-description[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n margin-top: 0.25rem;\n line-height: 1.3;\n}\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 120px;\n}\n\n.dialog-footer[_ngcontent-%COMP%] button[themeColor=\"primary\"][_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0.5rem;\n}\n\n\n\n\n.form-section[_ngcontent-%COMP%]:first-child .section-title[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n\n.form-section[_ngcontent-%COMP%]:nth-child(2) .section-title[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n\n.form-section[_ngcontent-%COMP%]:nth-child(3) .section-title[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n}\n\n\n@media (max-width: 768px) {\n .form-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 1rem;\n padding: 1rem;\n }\n\n .form-field.full-width[_ngcontent-%COMP%] {\n grid-column: 1;\n }\n\n .advanced-form[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n\n .section-title[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem;\n font-size: 1rem;\n }\n\n .dialog-footer[_ngcontent-%COMP%] {\n padding: 1rem;\n flex-direction: column;\n }\n\n .dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n width: 100%;\n }\n}\n\n\n.error-border[_ngcontent-%COMP%] {\n border: 2px solid var(--mj-status-error) !important;\n background-color: color-mix(in srgb, var(--mj-status-error) 4%, var(--mj-bg-surface));\n}"] }); }
|
|
379
379
|
}
|
|
380
380
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AgentPromptAdvancedSettingsDialogComponent, [{
|
|
381
381
|
type: Component,
|