@memberjunction/ng-core-entity-forms 6.2.1 → 6.3.0-edge.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -6
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.js +3 -3
- package/dist/lib/custom/AIAgentCategories/ai-agent-category-header.panel.js.map +1 -1
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts +12 -0
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +293 -230
- package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +11 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +862 -812
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +2 -2
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +12 -0
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +821 -763
- 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/AIPrompts/ai-prompt-form.component.d.ts +10 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +700 -605
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +10 -0
- package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +223 -175
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.d.ts +10 -0
- package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +502 -453
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/Companies/company-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/Companies/company-header.panel.js +3 -3
- package/dist/lib/custom/Companies/company-header.panel.js.map +1 -1
- package/dist/lib/custom/Conversations/conversation-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/Conversations/conversation-header.panel.js +3 -3
- package/dist/lib/custom/Conversations/conversation-header.panel.js.map +1 -1
- package/dist/lib/custom/Employees/employee-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/Employees/employee-header.panel.js +3 -3
- package/dist/lib/custom/Employees/employee-header.panel.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +15 -0
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +836 -801
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.js +2 -2
- package/dist/lib/custom/Files/file-form.component.js +2 -2
- package/dist/lib/custom/Lists/list-form.component.d.ts +5 -0
- package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +355 -338
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-form.component.js +3 -3
- package/dist/lib/custom/MLModels/ml-model-form.component.js.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +17 -35
- package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ml-model-view-models.js +55 -54
- package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +7 -99
- package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
- package/dist/lib/custom/MLModels/ps-model-detail.component.js +124 -303
- package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.d.ts +9 -0
- package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +493 -444
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js +2 -2
- package/dist/lib/custom/Templates/template-param-dialog.component.js +2 -2
- package/dist/lib/custom/Templates/templates-form.component.d.ts +9 -0
- package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +118 -74
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.d.ts +5 -0
- package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +471 -451
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.d.ts +5 -0
- package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +312 -289
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts +5 -0
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +697 -677
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +5 -0
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +453 -433
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/custom/Users/user-header.panel.d.ts.map +1 -1
- package/dist/lib/custom/Users/user-header.panel.js +3 -3
- package/dist/lib/custom/Users/user-header.panel.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.d.ts +2 -2
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.js +30 -13
- package/dist/lib/custom/ai-agent-run/agent-run-cost-split.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +23 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +276 -216
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +7 -1
- package/dist/lib/custom/custom-forms.module.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 +32 -14
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.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 +119 -95
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJComment/mjcomment.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJComment/mjcomment.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJComment/mjcomment.form.component.js +124 -0
- package/dist/lib/generated/Entities/MJComment/mjcomment.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJCommentType/mjcommenttype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJCommentType/mjcommenttype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJCommentType/mjcommenttype.form.component.js +99 -0
- package/dist/lib/generated/Entities/MJCommentType/mjcommenttype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +2 -2
- package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationType/mjconversationtype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJConversationType/mjconversationtype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJConversationType/mjconversationtype.form.component.js +95 -0
- package/dist/lib/generated/Entities/MJConversationType/mjconversationtype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJDocumentSequenceCounter/mjdocumentsequencecounter.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJDocumentSequenceCounter/mjdocumentsequencecounter.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJDocumentSequenceCounter/mjdocumentsequencecounter.form.component.js +60 -0
- package/dist/lib/generated/Entities/MJDocumentSequenceCounter/mjdocumentsequencecounter.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +124 -106
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityFieldValue/mjentityfieldvalue.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntityFieldValue/mjentityfieldvalue.form.component.js +12 -4
- package/dist/lib/generated/Entities/MJEntityFieldValue/mjentityfieldvalue.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityOrganicKey/mjentityorganickey.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntityOrganicKey/mjentityorganickey.form.component.js +19 -11
- package/dist/lib/generated/Entities/MJEntityOrganicKey/mjentityorganickey.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntityUniqueKey/mjentityuniquekey.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJEntityUniqueKey/mjentityuniquekey.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJEntityUniqueKey/mjentityuniquekey.form.component.js +62 -0
- package/dist/lib/generated/Entities/MJEntityUniqueKey/mjentityuniquekey.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js +26 -12
- package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFieldSuggestion/mjfieldsuggestion.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJFieldSuggestion/mjfieldsuggestion.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJFieldSuggestion/mjfieldsuggestion.form.component.js +140 -0
- package/dist/lib/generated/Entities/MJFieldSuggestion/mjfieldsuggestion.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +69 -15
- package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js +31 -13
- package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMLEvaluationProtocol/mjmlevaluationprotocol.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLEvaluationProtocol/mjmlevaluationprotocol.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLEvaluationProtocol/mjmlevaluationprotocol.form.component.js +205 -0
- package/dist/lib/generated/Entities/MJMLEvaluationProtocol/mjmlevaluationprotocol.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.js +24 -6
- package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMLPredictionUnit/mjmlpredictionunit.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLPredictionUnit/mjmlpredictionunit.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLPredictionUnit/mjmlpredictionunit.form.component.js +173 -0
- package/dist/lib/generated/Entities/MJMLPredictionUnit/mjmlpredictionunit.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.js +46 -24
- package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.js +22 -14
- package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJMLTrainingSnapshot/mjmltrainingsnapshot.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJMLTrainingSnapshot/mjmltrainingsnapshot.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJMLTrainingSnapshot/mjmltrainingsnapshot.form.component.js +175 -0
- package/dist/lib/generated/Entities/MJMLTrainingSnapshot/mjmltrainingsnapshot.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJQueryField/mjqueryfield.form.component.js +8 -6
- package/dist/lib/generated/Entities/MJQueryField/mjqueryfield.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +44 -36
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTask/mjtask.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js +54 -32
- package/dist/lib/generated/Entities/MJTask/mjtask.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +452 -443
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +27 -0
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/panels/feature-values/feature-values.panel.js +1 -1
- package/dist/lib/panels/feature-values/feature-values.panel.js.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
- package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +2 -2
- package/dist/lib/shared/phone-hero.d.ts +17 -0
- package/dist/lib/shared/phone-hero.d.ts.map +1 -0
- package/dist/lib/shared/phone-hero.js +30 -0
- package/dist/lib/shared/phone-hero.js.map +1 -0
- package/dist/lib/shared/phone-sections-state.d.ts +28 -0
- package/dist/lib/shared/phone-sections-state.d.ts.map +1 -0
- package/dist/lib/shared/phone-sections-state.js +38 -0
- package/dist/lib/shared/phone-sections-state.js.map +1 -0
- package/package.json +50 -50
|
@@ -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'; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n id: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n entityName: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n title: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n subtitle: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n status: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n startedAt: DateLike | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n completedAt: DateLike | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n tokens: number | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n cost: number | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n depth: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n isCoAgentRun: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n/** Channel row decorated with its definition's transport type for display. */\nexport interface SessionChannelDisplayRow {\n row: SessionChannelRow; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n transportType: string | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\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 /** Custom-layout form owns its entire body; suppress auto-filled relationship sections. */\n public override get OwnsEntireFormBody(): boolean { return true; }\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)\"\n class=\"entity-link\"\n [mjRecordLink]=\"record\"\n FieldName=\"AgentID\"\n [HandleClick]=\"false\"\n (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)\"\n class=\"entity-link\"\n mjRecordLink\n [EntityName]=\"'MJ: AI Agents'\"\n [RecordID]=\"TargetAgentID\"\n [DisplayName]=\"TargetAgentName || 'Target agent'\"\n [HandleClick]=\"false\"\n (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)\"\n class=\"entity-link\"\n [mjRecordLink]=\"record\"\n FieldName=\"UserID\"\n [HandleClick]=\"false\"\n (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';\nimport { JoinHeroSummary, CountLabel } from '../../shared/phone-hero';\nimport { SectionPickerItem } from '@memberjunction/ng-ui-components';\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'; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n id: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n entityName: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n title: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n subtitle: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n status: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n startedAt: DateLike | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n completedAt: DateLike | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n tokens: number | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n cost: number | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n depth: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n isCoAgentRun: boolean; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n/** Channel row decorated with its definition's transport type for display. */\nexport interface SessionChannelDisplayRow {\n row: SessionChannelRow; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n transportType: string | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\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', '../../shared/phone-hero.css']\n})\nexport class MJAIAgentSessionFormComponentExtended extends MJAIAgentSessionFormComponent implements OnInit {\n\n /** Phone hero (6A): whether the summary line is expanded to show the rest of the hero. */\n public HeroDetailsOpen = false;\n\n /** Toggles the phone hero between its compact identity row and the full hero. */\n public ToggleHeroDetails(): void {\n this.HeroDetailsOpen = !this.HeroDetailsOpen;\n this.cdr.markForCheck();\n }\n\n /** The phone hero's one-line summary of what the compact hero leaves out. */\n public get HeroSummary(): string {\n const agent = this.TargetAgentName ? `${this.record.Agent} → ${this.TargetAgentName}` : this.record.Agent;\n return JoinHeroSummary([\n agent,\n this.SessionDuration,\n CountLabel(this.Channels.length, 'channel'),\n this.DelegatedRunCount > 0 ? CountLabel(this.DelegatedRunCount, 'delegated run') : null,\n ]);\n }\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 /** Custom-layout form owns its entire body; suppress auto-filled relationship sections. */\n public override get OwnsEntireFormBody(): boolean { return true; }\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 /** The tab strip as `mj-section-picker` items: strip order, a count only where the tab has rows. */\n public get SectionPickerItems(): SectionPickerItem[] {\n const count = (n: number): number | null => (n > 0 ? n : null);\n return [\n { Key: 'runs', Title: 'Runs', Icon: 'fas fa-diagram-project', Count: count(this.RunTree.length) },\n { Key: 'channels', Title: 'Channels', Icon: 'fas fa-plug', Count: count(this.Channels.length) },\n { Key: 'transcript', Title: 'Transcript', Icon: 'fas fa-comments', Count: count(this.Transcript.length) },\n { Key: 'details', Title: 'Details', Icon: 'fas fa-info-circle', Count: null },\n ];\n }\n\n /** A pick from the phone section sheet; goes through ChangeTab. An unknown key is ignored. */\n public OnSectionPicked(key: string): void {\n const tab = MJAIAgentSessionFormComponentExtended.phoneTabs.find((t) => t === key);\n if (tab) this.ChangeTab(tab);\n }\n\n private static readonly phoneTabs: ReadonlyArray<MJAIAgentSessionFormComponentExtended['ActiveTab']> = ['runs', 'channels', 'transcript', 'details'];\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 phone-hero\" [class.hero-view]=\"!EditMode\" [class.hero-compact]=\"!EditMode && !HeroDetailsOpen\">\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 phone-hero-detail\">\n @if (record.AgentID) {\n <span class=\"agent-name\">\n <a href=\"javascript:void(0)\"\n class=\"entity-link\"\n [mjRecordLink]=\"record\"\n FieldName=\"AgentID\"\n [HandleClick]=\"false\"\n (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)\"\n class=\"entity-link\"\n mjRecordLink\n [EntityName]=\"'MJ: AI Agents'\"\n [RecordID]=\"TargetAgentID\"\n [DisplayName]=\"TargetAgentName || 'Target agent'\"\n [HandleClick]=\"false\"\n (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 phone-hero-detail\">\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 phone-hero-detail phone-hero-stats\">\n <div class=\"stat\">\n <span class=\"label\">User</span>\n <span class=\"value\">\n <a href=\"javascript:void(0)\"\n class=\"entity-link\"\n [mjRecordLink]=\"record\"\n FieldName=\"UserID\"\n [HandleClick]=\"false\"\n (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 phone-hero-detail\">\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 @if (!EditMode && HeroSummary) {\n <button type=\"button\" class=\"phone-hero-summary\" [attr.aria-expanded]=\"HeroDetailsOpen\" (click)=\"ToggleHeroDetails()\">\n <span class=\"phone-hero-summary-text\">{{ HeroSummary }}</span>\n <i class=\"fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n\n <!-- Phone: the strip becomes one button that opens the Sections sheet -->\n <mj-section-picker class=\"phone-section-picker\"\n [Items]=\"SectionPickerItems\"\n [ActiveKey]=\"ActiveTab\"\n (ActiveKeyChange)=\"OnSectionPicked($event)\"></mj-section-picker>\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"]}
|
|
@@ -709,11 +709,11 @@ export class AddActionDialogComponent extends BaseAngularComponent {
|
|
|
709
709
|
i0.ɵɵproperty("disabled", ctx.selectedCount === 0);
|
|
710
710
|
i0.ɵɵadvance(2);
|
|
711
711
|
i0.ɵɵtextInterpolate1(" Add Selected (", ctx.selectedCount, ") ");
|
|
712
|
-
} }, 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}"] }); }
|
|
712
|
+
} }, 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.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}"] }); }
|
|
713
713
|
}
|
|
714
714
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AddActionDialogComponent, [{
|
|
715
715
|
type: Component,
|
|
716
|
-
args: [{ standalone: false, selector: 'mj-add-action-dialog', template: "<!-- Add Action Dialog -->\n<div class=\"add-action-dialog\">\n \n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-prefix-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search actions by name, description, or category...\">\n </div>\n </div>\n \n <div class=\"header-actions\">\n <!-- View Toggle -->\n <button mjButton\n variant=\"flat\"\n (click)=\"toggleViewMode()\"\n [title]=\"(viewMode$ | async) === 'grid' ? 'Switch to list view' : 'Switch to grid view'\">\n <i class=\"fa-solid\"\n [class.fa-th]=\"(viewMode$ | async) === 'grid'\"\n [class.fa-list]=\"(viewMode$ | async) === 'list'\"></i>\n </button>\n \n <!-- Stats -->\n <div class=\"stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-bolt\"></i>\n {{ filteredCount }} of {{ totalActionCount }} actions\n </span>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"dialog-content\">\n \n <!-- Category Sidebar -->\n <div class=\"category-sidebar\">\n <div class=\"sidebar-header\">\n <h4><i class=\"fa-solid fa-folder-tree\"></i> Categories</h4>\n </div>\n \n <div class=\"category-list\">\n @for (category of categoryTree$ | async; track category.id) {\n <div class=\"category-item\" \n [class.selected]=\"(selectedCategoryId$ | async) === category.id\"\n (click)=\"selectCategory(category.id)\">\n <i class=\"fa-solid {{ category.icon }} category-icon\"></i>\n <span class=\"category-name\">{{ category.name }}</span>\n <span class=\"category-count\">{{ category.count }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Actions Display -->\n <div class=\"actions-container\">\n \n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n </div>\n <p>Loading actions...</p>\n </div>\n }\n\n <!-- Empty State -->\n @if (!(isLoading$ | async) && filteredCount === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"No actions found\"\n Message=\"Try adjusting your search criteria or selecting a different category\"\n ActionText=\"Clear Filters\"\n ActionVariant=\"flat\"\n (Action)=\"clearSearch()\"\n Size=\"compact\" />\n }\n\n <!-- Grid View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'grid' && filteredCount > 0) {\n <div class=\"actions-grid\">\n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"action-card\" \n [class.selected]=\"action.Selected\"\n [class.existing]=\"existingActionIds.includes(action.ID)\"\n (click)=\"toggleActionSelection(action)\">\n \n <!-- Selection Indicator -->\n <div class=\"selection-indicator\">\n <i class=\"fa-solid\" \n [class.fa-check-circle]=\"action.Selected\" \n [class.fa-circle]=\"!action.Selected\"></i>\n </div>\n \n <!-- Card Content -->\n <div class=\"card-header\">\n <div class=\"action-icon\">\n <i class=\"fa-solid {{ getActionIcon(action) }}\"></i>\n </div>\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n </div>\n \n <div class=\"card-body\">\n <p class=\"action-description\">{{ action.Description || 'No description available' }}</p>\n \n @if (action.CategoryName) {\n <div class=\"category-badge\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ action.CategoryName }}\n </div>\n }\n \n @if (action.Type) {\n <div class=\"type-badge\">\n <i class=\"fa-solid fa-tag\"></i>\n {{ action.Type }}\n </div>\n }\n </div>\n \n <!-- Existing Action Overlay -->\n @if (existingActionIds.includes(action.ID)) {\n <div class=\"existing-overlay\">\n <i class=\"fa-solid fa-check\"></i>\n <span>Already Added</span>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- List View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'list' && filteredCount > 0) {\n <div class=\"actions-list\">\n \n <!-- List Header -->\n <div class=\"list-header\">\n <span class=\"col-select\"></span>\n <span class=\"col-name\">Name</span>\n <span class=\"col-category\">Category</span>\n <span class=\"col-type\">Type</span>\n <span class=\"col-description\">Description</span>\n <span class=\"col-status\">Status</span>\n </div>\n \n <!-- List Items -->\n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"list-item\" \n [class.selected]=\"action.Selected\"\n [class.existing]=\"existingActionIds.includes(action.ID)\"\n (click)=\"toggleActionSelection(action)\">\n \n <span class=\"col-select\">\n <i class=\"fa-solid\" \n [class.fa-check-circle]=\"action.Selected\" \n [class.fa-circle]=\"!action.Selected\"></i>\n </span>\n \n <span class=\"col-name\">\n <i class=\"fa-solid {{ getActionIcon(action) }} action-icon\"></i>\n {{ action.Name }}\n </span>\n \n <span class=\"col-category\">{{ action.CategoryName || '-' }}</span>\n <span class=\"col-type\">{{ action.Type || '-' }}</span>\n <span class=\"col-description\">{{ action.Description || '-' }}</span>\n \n <span class=\"col-status\">\n @if (existingActionIds.includes(action.ID)) {\n <span class=\"status-badge existing\">\n <i class=\"fa-solid fa-check\"></i>\n Added\n </span>\n } @else {\n <span class=\"status-badge available\">\n <i class=\"fa-solid fa-plus\"></i>\n Available\n </span>\n }\n </span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Selected Actions Summary -->\n @if (selectedCount > 0) {\n <div class=\"selection-summary\">\n <div class=\"summary-content\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>{{ selectedCount }} action{{ selectedCount === 1 ? '' : 's' }} selected</span>\n </div>\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n [disabled]=\"selectedCount === 0\"\n (click)=\"addSelectedActions()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Selected ({{ selectedCount }})\n </button>\n </div>\n</div>", styles: [".add-action-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n/* Ensure dialog appears above banner and other elements */\n:host ::ng-deep .k-dialog,\n:host ::ng-deep .k-window {\n z-index: 10000 !important;\n}\n\n:host ::ng-deep .k-overlay {\n z-index: 9999 !important;\n}\n\n/* === Dialog Header === */\n.add-action-dialog .dialog-header {\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 .dialog-header .search-section {\n flex: 1;\n}\n\n.add-action-dialog .dialog-header .search-section .search-input {\n width: 100%;\n max-width: 400px;\n}\n\n.add-action-dialog .dialog-header .header-actions {\n display: flex;\n align-items: center;\n gap: 1rem;\n}\n\n.add-action-dialog .dialog-header .header-actions .stats .stat-item {\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 .dialog-header .header-actions .stats .stat-item i {\n color: var(--mj-status-success);\n}\n\n/* === Main Content === */\n.add-action-dialog .dialog-content {\n display: flex;\n flex: 1;\n overflow: hidden;\n}\n\n/* === Category Sidebar === */\n.add-action-dialog .category-sidebar {\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 .category-sidebar .sidebar-header {\n padding: 1rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.add-action-dialog .category-sidebar .sidebar-header h4 {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 1rem;\n font-weight: 600;\n}\n\n.add-action-dialog .category-sidebar .sidebar-header h4 i {\n margin-right: 0.5rem;\n color: var(--mj-text-muted);\n}\n\n.add-action-dialog .category-sidebar .category-list {\n padding: 0.5rem 0;\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item {\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 .category-sidebar .category-list .category-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item.selected {\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 .category-sidebar .category-list .category-item.selected .category-icon {\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item .category-icon {\n width: 16px;\n text-align: center;\n margin-right: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item .category-name {\n flex: 1;\n font-weight: 500;\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item .category-count {\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 .category-sidebar .category-list .category-item.selected .category-count {\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* === Actions Container === */\n.add-action-dialog .actions-container {\n flex: 1;\n padding: 1.5rem;\n overflow-y: auto;\n background: var(--mj-bg-surface);\n}\n\n/* Loading State */\n.add-action-dialog .actions-container .loading-state {\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 .actions-container .loading-state .loading-spinner {\n margin-bottom: 1rem;\n}\n\n.add-action-dialog .actions-container .loading-state .loading-spinner i {\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog .actions-container .loading-state p {\n margin-top: 1rem;\n font-size: 1.1rem;\n}\n\n/* === Grid View === */\n.add-action-dialog .actions-container .actions-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card {\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 .actions-container .actions-grid .action-card: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 .actions-container .actions-grid .action-card.selected {\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 .actions-container .actions-grid .action-card.selected .selection-indicator i {\n color: var(--mj-status-success);\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card.existing {\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 .actions-container .actions-grid .action-card.existing:hover {\n transform: none;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .selection-indicator {\n position: absolute;\n top: 1rem;\n right: 1rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .selection-indicator i {\n font-size: 1.25rem;\n color: var(--mj-border-default);\n transition: color 0.2s ease;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-header {\n display: flex;\n align-items: center;\n margin-bottom: 1rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-header .action-icon {\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 .actions-container .actions-grid .action-card .card-header .action-icon i {\n font-size: 1.25rem;\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-header .action-name {\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 .actions-container .actions-grid .action-card .card-body .action-description {\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 .actions-container .actions-grid .action-card .card-body .category-badge,\n.add-action-dialog .actions-container .actions-grid .action-card .card-body .type-badge {\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 .actions-container .actions-grid .action-card .card-body .category-badge i,\n.add-action-dialog .actions-container .actions-grid .action-card .card-body .type-badge i {\n font-size: 0.7rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-body .type-badge {\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 .actions-container .actions-grid .action-card .existing-overlay {\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 .actions-container .actions-grid .action-card .existing-overlay i {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .existing-overlay span {\n font-weight: 600;\n}\n\n/* === List View === */\n.add-action-dialog .actions-container .actions-list .list-header {\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 .actions-container .actions-list .list-item {\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 .actions-container .actions-list .list-item:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n}\n\n.add-action-dialog .actions-container .actions-list .list-item.selected {\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 .actions-container .actions-list .list-item.selected .col-select i {\n color: var(--mj-status-success);\n}\n\n.add-action-dialog .actions-container .actions-list .list-item.existing {\n background: var(--mj-bg-surface-card);\n opacity: 0.7;\n cursor: default;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item.existing:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-default);\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .col-select i {\n font-size: 1.25rem;\n color: var(--mj-border-default);\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .col-name {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 500;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .col-name .action-icon {\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .col-description {\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .status-badge {\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 .actions-container .actions-list .list-item .status-badge.existing {\n background: var(--mj-text-muted);\n color: var(--mj-text-inverse);\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .status-badge.available {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n/* === Selection Summary === */\n.add-action-dialog .selection-summary {\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 .selection-summary .summary-content {\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 .selection-summary .summary-content i {\n color: var(--mj-status-success);\n}\n\n/* === Dialog Footer === */\n.add-action-dialog .dialog-footer {\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 .dialog-footer button {\n min-width: 120px;\n}\n\n/* === Responsive Design === */\n@media (max-width: 768px) {\n .add-action-dialog .dialog-content {\n flex-direction: column;\n }\n\n .add-action-dialog .category-sidebar {\n width: 100%;\n max-height: 200px;\n }\n\n .add-action-dialog .actions-container .actions-grid {\n grid-template-columns: 1fr;\n }\n\n .add-action-dialog .actions-container .actions-list .list-header,\n .add-action-dialog .actions-container .actions-list .list-item {\n grid-template-columns: 40px 1fr 80px;\n gap: 0.5rem;\n }\n\n .add-action-dialog .actions-container .actions-list .list-header .col-category,\n .add-action-dialog .actions-container .actions-list .list-header .col-type,\n .add-action-dialog .actions-container .actions-list .list-header .col-description,\n .add-action-dialog .actions-container .actions-list .list-item .col-category,\n .add-action-dialog .actions-container .actions-list .list-item .col-type,\n .add-action-dialog .actions-container .actions-list .list-item .col-description {\n display: none;\n }\n}\n"] }]
|
|
716
|
+
args: [{ standalone: false, selector: 'mj-add-action-dialog', template: "<!-- Add Action Dialog -->\n<div class=\"add-action-dialog\">\n \n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-prefix-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search actions by name, description, or category...\">\n </div>\n </div>\n \n <div class=\"header-actions\">\n <!-- View Toggle -->\n <button mjButton\n variant=\"flat\"\n (click)=\"toggleViewMode()\"\n [title]=\"(viewMode$ | async) === 'grid' ? 'Switch to list view' : 'Switch to grid view'\">\n <i class=\"fa-solid\"\n [class.fa-th]=\"(viewMode$ | async) === 'grid'\"\n [class.fa-list]=\"(viewMode$ | async) === 'list'\"></i>\n </button>\n \n <!-- Stats -->\n <div class=\"stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-bolt\"></i>\n {{ filteredCount }} of {{ totalActionCount }} actions\n </span>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"dialog-content\">\n \n <!-- Category Sidebar -->\n <div class=\"category-sidebar\">\n <div class=\"sidebar-header\">\n <h4><i class=\"fa-solid fa-folder-tree\"></i> Categories</h4>\n </div>\n \n <div class=\"category-list\">\n @for (category of categoryTree$ | async; track category.id) {\n <div class=\"category-item\" \n [class.selected]=\"(selectedCategoryId$ | async) === category.id\"\n (click)=\"selectCategory(category.id)\">\n <i class=\"fa-solid {{ category.icon }} category-icon\"></i>\n <span class=\"category-name\">{{ category.name }}</span>\n <span class=\"category-count\">{{ category.count }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Actions Display -->\n <div class=\"actions-container\">\n \n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n </div>\n <p>Loading actions...</p>\n </div>\n }\n\n <!-- Empty State -->\n @if (!(isLoading$ | async) && filteredCount === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"No actions found\"\n Message=\"Try adjusting your search criteria or selecting a different category\"\n ActionText=\"Clear Filters\"\n ActionVariant=\"flat\"\n (Action)=\"clearSearch()\"\n Size=\"compact\" />\n }\n\n <!-- Grid View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'grid' && filteredCount > 0) {\n <div class=\"actions-grid\">\n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"action-card\" \n [class.selected]=\"action.Selected\"\n [class.existing]=\"existingActionIds.includes(action.ID)\"\n (click)=\"toggleActionSelection(action)\">\n \n <!-- Selection Indicator -->\n <div class=\"selection-indicator\">\n <i class=\"fa-solid\" \n [class.fa-check-circle]=\"action.Selected\" \n [class.fa-circle]=\"!action.Selected\"></i>\n </div>\n \n <!-- Card Content -->\n <div class=\"card-header\">\n <div class=\"action-icon\">\n <i class=\"fa-solid {{ getActionIcon(action) }}\"></i>\n </div>\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n </div>\n \n <div class=\"card-body\">\n <p class=\"action-description\">{{ action.Description || 'No description available' }}</p>\n \n @if (action.CategoryName) {\n <div class=\"category-badge\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ action.CategoryName }}\n </div>\n }\n \n @if (action.Type) {\n <div class=\"type-badge\">\n <i class=\"fa-solid fa-tag\"></i>\n {{ action.Type }}\n </div>\n }\n </div>\n \n <!-- Existing Action Overlay -->\n @if (existingActionIds.includes(action.ID)) {\n <div class=\"existing-overlay\">\n <i class=\"fa-solid fa-check\"></i>\n <span>Already Added</span>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- List View -->\n @if (!(isLoading$ | async) && (viewMode$ | async) === 'list' && filteredCount > 0) {\n <div class=\"actions-list\">\n \n <!-- List Header -->\n <div class=\"list-header\">\n <span class=\"col-select\"></span>\n <span class=\"col-name\">Name</span>\n <span class=\"col-category\">Category</span>\n <span class=\"col-type\">Type</span>\n <span class=\"col-description\">Description</span>\n <span class=\"col-status\">Status</span>\n </div>\n \n <!-- List Items -->\n @for (action of filteredActions$ | async; track action.ID) {\n <div class=\"list-item\" \n [class.selected]=\"action.Selected\"\n [class.existing]=\"existingActionIds.includes(action.ID)\"\n (click)=\"toggleActionSelection(action)\">\n \n <span class=\"col-select\">\n <i class=\"fa-solid\" \n [class.fa-check-circle]=\"action.Selected\" \n [class.fa-circle]=\"!action.Selected\"></i>\n </span>\n \n <span class=\"col-name\">\n <i class=\"fa-solid {{ getActionIcon(action) }} action-icon\"></i>\n {{ action.Name }}\n </span>\n \n <span class=\"col-category\">{{ action.CategoryName || '-' }}</span>\n <span class=\"col-type\">{{ action.Type || '-' }}</span>\n <span class=\"col-description\">{{ action.Description || '-' }}</span>\n \n <span class=\"col-status\">\n @if (existingActionIds.includes(action.ID)) {\n <span class=\"status-badge existing\">\n <i class=\"fa-solid fa-check\"></i>\n Added\n </span>\n } @else {\n <span class=\"status-badge available\">\n <i class=\"fa-solid fa-plus\"></i>\n Available\n </span>\n }\n </span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Selected Actions Summary -->\n @if (selectedCount > 0) {\n <div class=\"selection-summary\">\n <div class=\"summary-content\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>{{ selectedCount }} action{{ selectedCount === 1 ? '' : 's' }} selected</span>\n </div>\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n [disabled]=\"selectedCount === 0\"\n (click)=\"addSelectedActions()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Selected ({{ selectedCount }})\n </button>\n </div>\n</div>", styles: [".add-action-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n/* === Dialog Header === */\n.add-action-dialog .dialog-header {\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 .dialog-header .search-section {\n flex: 1;\n}\n\n.add-action-dialog .dialog-header .search-section .search-input {\n width: 100%;\n max-width: 400px;\n}\n\n.add-action-dialog .dialog-header .header-actions {\n display: flex;\n align-items: center;\n gap: 1rem;\n}\n\n.add-action-dialog .dialog-header .header-actions .stats .stat-item {\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 .dialog-header .header-actions .stats .stat-item i {\n color: var(--mj-status-success);\n}\n\n/* === Main Content === */\n.add-action-dialog .dialog-content {\n display: flex;\n flex: 1;\n overflow: hidden;\n}\n\n/* === Category Sidebar === */\n.add-action-dialog .category-sidebar {\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 .category-sidebar .sidebar-header {\n padding: 1rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.add-action-dialog .category-sidebar .sidebar-header h4 {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 1rem;\n font-weight: 600;\n}\n\n.add-action-dialog .category-sidebar .sidebar-header h4 i {\n margin-right: 0.5rem;\n color: var(--mj-text-muted);\n}\n\n.add-action-dialog .category-sidebar .category-list {\n padding: 0.5rem 0;\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item {\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 .category-sidebar .category-list .category-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item.selected {\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 .category-sidebar .category-list .category-item.selected .category-icon {\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item .category-icon {\n width: 16px;\n text-align: center;\n margin-right: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item .category-name {\n flex: 1;\n font-weight: 500;\n}\n\n.add-action-dialog .category-sidebar .category-list .category-item .category-count {\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 .category-sidebar .category-list .category-item.selected .category-count {\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* === Actions Container === */\n.add-action-dialog .actions-container {\n flex: 1;\n padding: 1.5rem;\n overflow-y: auto;\n background: var(--mj-bg-surface);\n}\n\n/* Loading State */\n.add-action-dialog .actions-container .loading-state {\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 .actions-container .loading-state .loading-spinner {\n margin-bottom: 1rem;\n}\n\n.add-action-dialog .actions-container .loading-state .loading-spinner i {\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog .actions-container .loading-state p {\n margin-top: 1rem;\n font-size: 1.1rem;\n}\n\n/* === Grid View === */\n.add-action-dialog .actions-container .actions-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card {\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 .actions-container .actions-grid .action-card: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 .actions-container .actions-grid .action-card.selected {\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 .actions-container .actions-grid .action-card.selected .selection-indicator i {\n color: var(--mj-status-success);\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card.existing {\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 .actions-container .actions-grid .action-card.existing:hover {\n transform: none;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .selection-indicator {\n position: absolute;\n top: 1rem;\n right: 1rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .selection-indicator i {\n font-size: 1.25rem;\n color: var(--mj-border-default);\n transition: color 0.2s ease;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-header {\n display: flex;\n align-items: center;\n margin-bottom: 1rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-header .action-icon {\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 .actions-container .actions-grid .action-card .card-header .action-icon i {\n font-size: 1.25rem;\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-header .action-name {\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 .actions-container .actions-grid .action-card .card-body .action-description {\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 .actions-container .actions-grid .action-card .card-body .category-badge,\n.add-action-dialog .actions-container .actions-grid .action-card .card-body .type-badge {\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 .actions-container .actions-grid .action-card .card-body .category-badge i,\n.add-action-dialog .actions-container .actions-grid .action-card .card-body .type-badge i {\n font-size: 0.7rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .card-body .type-badge {\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 .actions-container .actions-grid .action-card .existing-overlay {\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 .actions-container .actions-grid .action-card .existing-overlay i {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n}\n\n.add-action-dialog .actions-container .actions-grid .action-card .existing-overlay span {\n font-weight: 600;\n}\n\n/* === List View === */\n.add-action-dialog .actions-container .actions-list .list-header {\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 .actions-container .actions-list .list-item {\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 .actions-container .actions-list .list-item:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n}\n\n.add-action-dialog .actions-container .actions-list .list-item.selected {\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 .actions-container .actions-list .list-item.selected .col-select i {\n color: var(--mj-status-success);\n}\n\n.add-action-dialog .actions-container .actions-list .list-item.existing {\n background: var(--mj-bg-surface-card);\n opacity: 0.7;\n cursor: default;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item.existing:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-default);\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .col-select i {\n font-size: 1.25rem;\n color: var(--mj-border-default);\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .col-name {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 500;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .col-name .action-icon {\n color: var(--mj-brand-primary);\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .col-description {\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .status-badge {\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 .actions-container .actions-list .list-item .status-badge.existing {\n background: var(--mj-text-muted);\n color: var(--mj-text-inverse);\n}\n\n.add-action-dialog .actions-container .actions-list .list-item .status-badge.available {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n/* === Selection Summary === */\n.add-action-dialog .selection-summary {\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 .selection-summary .summary-content {\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 .selection-summary .summary-content i {\n color: var(--mj-status-success);\n}\n\n/* === Dialog Footer === */\n.add-action-dialog .dialog-footer {\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 .dialog-footer button {\n min-width: 120px;\n}\n\n/* === Responsive Design === */\n@media (max-width: 768px) {\n .add-action-dialog .dialog-content {\n flex-direction: column;\n }\n\n .add-action-dialog .category-sidebar {\n width: 100%;\n max-height: 200px;\n }\n\n .add-action-dialog .actions-container .actions-grid {\n grid-template-columns: 1fr;\n }\n\n .add-action-dialog .actions-container .actions-list .list-header,\n .add-action-dialog .actions-container .actions-list .list-item {\n grid-template-columns: 40px 1fr 80px;\n gap: 0.5rem;\n }\n\n .add-action-dialog .actions-container .actions-list .list-header .col-category,\n .add-action-dialog .actions-container .actions-list .list-header .col-type,\n .add-action-dialog .actions-container .actions-list .list-header .col-description,\n .add-action-dialog .actions-container .actions-list .list-item .col-category,\n .add-action-dialog .actions-container .actions-list .list-item .col-type,\n .add-action-dialog .actions-container .actions-list .list-item .col-description {\n display: none;\n }\n}\n"] }]
|
|
717
717
|
}], () => [{ type: i0.ChangeDetectorRef }], { DialogClose: [{
|
|
718
718
|
type: Output
|
|
719
719
|
}] }); })();
|