@memberjunction/ng-core-entity-forms 5.42.0 → 5.44.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.
Files changed (270) hide show
  1. package/dist/__tests__/model-prediction.logic.test.d.ts +2 -0
  2. package/dist/__tests__/model-prediction.logic.test.d.ts.map +1 -0
  3. package/dist/__tests__/model-prediction.logic.test.js +140 -0
  4. package/dist/__tests__/model-prediction.logic.test.js.map +1 -0
  5. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +79 -105
  6. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
  7. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js +7 -10
  8. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js.map +1 -1
  9. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
  10. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +46 -51
  11. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
  12. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +2 -0
  13. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  14. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +300 -378
  15. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  16. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +22 -29
  17. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  18. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +15 -17
  19. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  20. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +27 -34
  21. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  22. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +11 -0
  23. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  24. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +48 -47
  25. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  26. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +438 -454
  27. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  28. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +48 -51
  29. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
  30. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +253 -282
  31. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  32. package/dist/lib/custom/Actions/action-execution-log-form.component.js +24 -33
  33. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  34. package/dist/lib/custom/Actions/action-form.component.js +263 -311
  35. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  36. package/dist/lib/custom/Entities/entity-form.component.d.ts +6 -0
  37. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  38. package/dist/lib/custom/Entities/entity-form.component.js +475 -493
  39. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  40. package/dist/lib/custom/Lists/list-form.component.js +122 -173
  41. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  42. package/dist/lib/custom/Queries/query-form.component.js +190 -248
  43. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  44. package/dist/lib/custom/Queries/query-run-dialog.component.js +19 -23
  45. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  46. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +16 -0
  47. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -0
  48. package/dist/lib/custom/RecordProcesses/record-process-form.component.js +54 -0
  49. package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -0
  50. package/dist/lib/custom/SearchScopes/searchscopeprovider-form.component.js +23 -24
  51. package/dist/lib/custom/SearchScopes/searchscopeprovider-form.component.js.map +1 -1
  52. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
  53. package/dist/lib/custom/Templates/template-param-dialog.component.js +25 -46
  54. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  55. package/dist/lib/custom/Tests/test-form.component.js +100 -130
  56. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  57. package/dist/lib/custom/Tests/test-run-form.component.js +187 -205
  58. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  59. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +8 -0
  60. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  61. package/dist/lib/custom/Tests/test-suite-form.component.js +412 -489
  62. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  63. package/dist/lib/custom/Tests/test-suite-run-form.component.js +100 -126
  64. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  65. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +166 -184
  66. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  67. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +42 -61
  68. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  69. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +8 -17
  70. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  71. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +0 -2
  72. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  73. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +183 -188
  74. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  75. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts +108 -0
  76. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -0
  77. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +665 -0
  78. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -0
  79. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +94 -0
  80. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -0
  81. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +257 -0
  82. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -0
  83. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts +38 -0
  84. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts.map +1 -0
  85. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js +200 -0
  86. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js.map +1 -0
  87. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts +44 -0
  88. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts.map +1 -0
  89. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js +180 -0
  90. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js.map +1 -0
  91. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts +12 -0
  92. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts.map +1 -0
  93. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js +46 -0
  94. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js.map +1 -0
  95. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts +64 -0
  96. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts.map +1 -0
  97. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js +267 -0
  98. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js.map +1 -0
  99. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts +53 -0
  100. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts.map +1 -0
  101. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js +111 -0
  102. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js.map +1 -0
  103. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts +42 -0
  104. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts.map +1 -0
  105. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js +193 -0
  106. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js.map +1 -0
  107. package/dist/lib/custom/custom-forms.module.d.ts +58 -49
  108. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  109. package/dist/lib/custom/custom-forms.module.js +64 -16
  110. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  111. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +2 -0
  112. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  113. package/dist/lib/custom/shared/entity-selector-dialog.component.js +25 -25
  114. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  115. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  116. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +280 -216
  117. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  118. package/dist/lib/generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component.js +25 -21
  119. package/dist/lib/generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component.js.map +1 -1
  120. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
  121. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +68 -14
  122. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  123. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.d.ts.map +1 -1
  124. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +44 -32
  125. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
  126. package/dist/lib/generated/Entities/MJAIAgentSkill/mjaiagentskill.form.component.d.ts +10 -0
  127. package/dist/lib/generated/Entities/MJAIAgentSkill/mjaiagentskill.form.component.d.ts.map +1 -0
  128. package/dist/lib/generated/Entities/MJAIAgentSkill/mjaiagentskill.form.component.js +66 -0
  129. package/dist/lib/generated/Entities/MJAIAgentSkill/mjaiagentskill.form.component.js.map +1 -0
  130. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.d.ts.map +1 -1
  131. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +55 -19
  132. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
  133. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  134. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +28 -10
  135. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  136. package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.d.ts +10 -0
  137. package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.d.ts.map +1 -0
  138. package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.js +167 -0
  139. package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.js.map +1 -0
  140. package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.d.ts +10 -0
  141. package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.d.ts.map +1 -0
  142. package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.js +64 -0
  143. package/dist/lib/generated/Entities/MJAISkillAction/mjaiskillaction.form.component.js.map +1 -0
  144. package/dist/lib/generated/Entities/MJAISkillPermission/mjaiskillpermission.form.component.d.ts +10 -0
  145. package/dist/lib/generated/Entities/MJAISkillPermission/mjaiskillpermission.form.component.d.ts.map +1 -0
  146. package/dist/lib/generated/Entities/MJAISkillPermission/mjaiskillpermission.form.component.js +82 -0
  147. package/dist/lib/generated/Entities/MJAISkillPermission/mjaiskillpermission.form.component.js.map +1 -0
  148. package/dist/lib/generated/Entities/MJAISkillSubAgent/mjaiskillsubagent.form.component.d.ts +10 -0
  149. package/dist/lib/generated/Entities/MJAISkillSubAgent/mjaiskillsubagent.form.component.d.ts.map +1 -0
  150. package/dist/lib/generated/Entities/MJAISkillSubAgent/mjaiskillsubagent.form.component.js +64 -0
  151. package/dist/lib/generated/Entities/MJAISkillSubAgent/mjaiskillsubagent.form.component.js.map +1 -0
  152. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.d.ts.map +1 -1
  153. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +35 -17
  154. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
  155. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.d.ts.map +1 -1
  156. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js +59 -51
  157. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js.map +1 -1
  158. package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.d.ts.map +1 -1
  159. package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.js +25 -7
  160. package/dist/lib/generated/Entities/MJCollection/mjcollection.form.component.js.map +1 -1
  161. package/dist/lib/generated/Entities/MJCollectionArtifact/mjcollectionartifact.form.component.js +11 -7
  162. package/dist/lib/generated/Entities/MJCollectionArtifact/mjcollectionartifact.form.component.js.map +1 -1
  163. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.d.ts.map +1 -1
  164. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +56 -46
  165. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
  166. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.d.ts.map +1 -1
  167. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +73 -59
  168. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
  169. package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.d.ts.map +1 -1
  170. package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js +24 -4
  171. package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js.map +1 -1
  172. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  173. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +137 -87
  174. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  175. package/dist/lib/generated/Entities/MJEntityActionInvocation/mjentityactioninvocation.form.component.js +10 -8
  176. package/dist/lib/generated/Entities/MJEntityActionInvocation/mjentityactioninvocation.form.component.js.map +1 -1
  177. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.d.ts.map +1 -1
  178. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js +47 -29
  179. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js.map +1 -1
  180. package/dist/lib/generated/Entities/MJExperiment/mjexperiment.form.component.d.ts +10 -0
  181. package/dist/lib/generated/Entities/MJExperiment/mjexperiment.form.component.d.ts.map +1 -0
  182. package/dist/lib/generated/Entities/MJExperiment/mjexperiment.form.component.js +99 -0
  183. package/dist/lib/generated/Entities/MJExperiment/mjexperiment.form.component.js.map +1 -0
  184. package/dist/lib/generated/Entities/MJExperimentSession/mjexperimentsession.form.component.d.ts +10 -0
  185. package/dist/lib/generated/Entities/MJExperimentSession/mjexperimentsession.form.component.d.ts.map +1 -0
  186. package/dist/lib/generated/Entities/MJExperimentSession/mjexperimentsession.form.component.js +101 -0
  187. package/dist/lib/generated/Entities/MJExperimentSession/mjexperimentsession.form.component.js.map +1 -0
  188. package/dist/lib/generated/Entities/MJExperimentSessionIteration/mjexperimentsessioniteration.form.component.d.ts +10 -0
  189. package/dist/lib/generated/Entities/MJExperimentSessionIteration/mjexperimentsessioniteration.form.component.d.ts.map +1 -0
  190. package/dist/lib/generated/Entities/MJExperimentSessionIteration/mjexperimentsessioniteration.form.component.js +115 -0
  191. package/dist/lib/generated/Entities/MJExperimentSessionIteration/mjexperimentsessioniteration.form.component.js.map +1 -0
  192. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.d.ts.map +1 -1
  193. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +63 -9
  194. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
  195. package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.d.ts.map +1 -1
  196. package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js +32 -14
  197. package/dist/lib/generated/Entities/MJFileStorageProvider/mjfilestorageprovider.form.component.js.map +1 -1
  198. package/dist/lib/generated/Entities/MJMLAlgorithm/mjmlalgorithm.form.component.d.ts +10 -0
  199. package/dist/lib/generated/Entities/MJMLAlgorithm/mjmlalgorithm.form.component.d.ts.map +1 -0
  200. package/dist/lib/generated/Entities/MJMLAlgorithm/mjmlalgorithm.form.component.js +161 -0
  201. package/dist/lib/generated/Entities/MJMLAlgorithm/mjmlalgorithm.form.component.js.map +1 -0
  202. package/dist/lib/generated/Entities/MJMLAlgorithmUseCase/mjmlalgorithmusecase.form.component.d.ts +10 -0
  203. package/dist/lib/generated/Entities/MJMLAlgorithmUseCase/mjmlalgorithmusecase.form.component.d.ts.map +1 -0
  204. package/dist/lib/generated/Entities/MJMLAlgorithmUseCase/mjmlalgorithmusecase.form.component.js +89 -0
  205. package/dist/lib/generated/Entities/MJMLAlgorithmUseCase/mjmlalgorithmusecase.form.component.js.map +1 -0
  206. package/dist/lib/generated/Entities/MJMLAlgorithmUseCaseRanking/mjmlalgorithmusecaseranking.form.component.d.ts +10 -0
  207. package/dist/lib/generated/Entities/MJMLAlgorithmUseCaseRanking/mjmlalgorithmusecaseranking.form.component.d.ts.map +1 -0
  208. package/dist/lib/generated/Entities/MJMLAlgorithmUseCaseRanking/mjmlalgorithmusecaseranking.form.component.js +76 -0
  209. package/dist/lib/generated/Entities/MJMLAlgorithmUseCaseRanking/mjmlalgorithmusecaseranking.form.component.js.map +1 -0
  210. package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.d.ts +10 -0
  211. package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.d.ts.map +1 -0
  212. package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.js +141 -0
  213. package/dist/lib/generated/Entities/MJMLModel/mjmlmodel.form.component.js.map +1 -0
  214. package/dist/lib/generated/Entities/MJMLModelScoringBinding/mjmlmodelscoringbinding.form.component.d.ts +10 -0
  215. package/dist/lib/generated/Entities/MJMLModelScoringBinding/mjmlmodelscoringbinding.form.component.d.ts.map +1 -0
  216. package/dist/lib/generated/Entities/MJMLModelScoringBinding/mjmlmodelscoringbinding.form.component.js +88 -0
  217. package/dist/lib/generated/Entities/MJMLModelScoringBinding/mjmlmodelscoringbinding.form.component.js.map +1 -0
  218. package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.d.ts +10 -0
  219. package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.d.ts.map +1 -0
  220. package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.js +143 -0
  221. package/dist/lib/generated/Entities/MJMLTrainingPipeline/mjmltrainingpipeline.form.component.js.map +1 -0
  222. package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.d.ts +10 -0
  223. package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.d.ts.map +1 -0
  224. package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.js +110 -0
  225. package/dist/lib/generated/Entities/MJMLTrainingRun/mjmltrainingrun.form.component.js.map +1 -0
  226. package/dist/lib/generated/Entities/MJOpenApp/mjopenapp.form.component.d.ts.map +1 -1
  227. package/dist/lib/generated/Entities/MJOpenApp/mjopenapp.form.component.js +56 -24
  228. package/dist/lib/generated/Entities/MJOpenApp/mjopenapp.form.component.js.map +1 -1
  229. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +19 -17
  230. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
  231. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
  232. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +46 -26
  233. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
  234. package/dist/lib/generated/Entities/MJRemoteOperation/mjremoteoperation.form.component.js +12 -6
  235. package/dist/lib/generated/Entities/MJRemoteOperation/mjremoteoperation.form.component.js.map +1 -1
  236. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.d.ts.map +1 -1
  237. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js +36 -18
  238. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js.map +1 -1
  239. package/dist/lib/generated/Entities/MJSchemaInfo/mjschemainfo.form.component.js +8 -6
  240. package/dist/lib/generated/Entities/MJSchemaInfo/mjschemainfo.form.component.js.map +1 -1
  241. package/dist/lib/generated/Entities/MJScopedPromptPart/mjscopedpromptpart.form.component.d.ts +10 -0
  242. package/dist/lib/generated/Entities/MJScopedPromptPart/mjscopedpromptpart.form.component.d.ts.map +1 -0
  243. package/dist/lib/generated/Entities/MJScopedPromptPart/mjscopedpromptpart.form.component.js +78 -0
  244. package/dist/lib/generated/Entities/MJScopedPromptPart/mjscopedpromptpart.form.component.js.map +1 -0
  245. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  246. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +145 -109
  247. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  248. package/dist/lib/generated/generated-forms.module.d.ts +356 -335
  249. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  250. package/dist/lib/generated/generated-forms.module.js +304 -226
  251. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  252. package/dist/lib/panels/ai-agents/agent-realtime.panel.js +44 -44
  253. package/dist/lib/panels/ai-agents/agent-realtime.panel.js.map +1 -1
  254. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts +43 -0
  255. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts.map +1 -0
  256. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +240 -0
  257. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -0
  258. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +69 -0
  259. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -0
  260. package/dist/lib/panels/model-predictions/model-prediction.logic.js +130 -0
  261. package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -0
  262. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +83 -0
  263. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -0
  264. package/dist/lib/panels/model-predictions/model-prediction.panel.js +293 -0
  265. package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -0
  266. package/package.json +38 -36
  267. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts +0 -82
  268. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts.map +0 -1
  269. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +0 -1033
  270. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-selector-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.ts","../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { Subject, BehaviorSubject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { FormControl } from '@angular/forms';\nimport { RunView } from '@memberjunction/core';\nimport { MJAIPromptEntityExtended } from '@memberjunction/ai-core-plus';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface PromptSelectorConfig {\n /** Title for the dialog */\n title: string;\n /** Whether to show the \"Create New\" option */\n showCreateNew?: boolean;\n /** Filter criteria for prompts */\n extraFilter?: string;\n /** Allow multiple selection */\n multiSelect?: boolean;\n /** Pre-selected prompt IDs */\n selectedPromptIds?: string[];\n /** Already linked prompt IDs (will be grayed out and not selectable) */\n linkedPromptIds?: string[];\n}\n\nexport interface PromptSelectorResult {\n /** Selected prompts */\n selectedPrompts: MJAIPromptEntityExtended[];\n /** Whether user chose to create new */\n createNew?: boolean;\n}\n\n/**\n * Unified prompt selector dialog that can be used for:\n * - Selecting context compression prompts (single select)\n * - Adding general prompts to agents (multi-select)\n * - Any other prompt selection scenario\n */\n@Component({\n standalone: false,\n selector: 'mj-prompt-selector-dialog',\n templateUrl: './prompt-selector-dialog.component.html',\n styleUrls: ['./prompt-selector-dialog.component.css']\n})\nexport class PromptSelectorDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n \n // Input configuration\n config: PromptSelectorConfig = { title: 'Select Prompts' };\n \n // State management\n private destroy$ = new Subject<void>();\n public result = new Subject<PromptSelectorResult | null>();\n \n // Data and UI state\n isLoading$ = new BehaviorSubject<boolean>(false);\n prompts$ = new BehaviorSubject<MJAIPromptEntityExtended[]>([]);\n filteredPrompts$ = new BehaviorSubject<MJAIPromptEntityExtended[]>([]);\n \n // Search and selection\n searchControl = new FormControl('');\n selectedPrompts: Set<string> = new Set();\n linkedPrompts: Set<string> = new Set();\n \n // View mode\n viewMode: 'grid' | 'list' = 'list';\n\n @Output() DialogClose = new EventEmitter<void>();\n\n constructor(\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n this.setupSearch();\n this.loadPrompts();\n \n // Initialize selected prompts if provided\n if (this.config.selectedPromptIds) {\n this.selectedPrompts = new Set(this.config.selectedPromptIds);\n }\n \n // Initialize linked prompts if provided\n if (this.config.linkedPromptIds) {\n this.linkedPrompts = new Set(this.config.linkedPromptIds);\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupSearch() {\n this.searchControl.valueChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(searchTerm => {\n this.filterPrompts(searchTerm || '');\n });\n }\n\n private async loadPrompts() {\n this.isLoading$.next(true);\n \n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n // Build filter - default to active prompts\n let filter = \"Status = 'Active'\";\n if (this.config.extraFilter) {\n filter += ` AND ${this.config.extraFilter}`;\n }\n \n const result = await rv.RunView<MJAIPromptEntityExtended>({\n EntityName: 'MJ: AI Prompts',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const prompts = result.Results || [];\n this.prompts$.next(prompts);\n this.filteredPrompts$.next(prompts);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load prompts');\n }\n } catch (error) {\n console.error('Error loading prompts:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading prompts. Please try again.',\n 'error',\n 3000\n );\n this.prompts$.next([]);\n this.filteredPrompts$.next([]);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private filterPrompts(searchTerm: string) {\n const allPrompts = this.prompts$.value;\n \n if (!searchTerm.trim()) {\n this.filteredPrompts$.next(allPrompts);\n return;\n }\n\n const filtered = allPrompts.filter(prompt => \n prompt.Name?.toLowerCase().includes(searchTerm.toLowerCase()) ||\n prompt.Description?.toLowerCase().includes(searchTerm.toLowerCase())\n );\n \n this.filteredPrompts$.next(filtered);\n }\n\n // === Selection Management ===\n\n togglePromptSelection(prompt: MJAIPromptEntityExtended) {\n // Prevent selection of already linked prompts\n if (this.isPromptLinked(prompt)) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${prompt.Name}\" is already linked to this agent`,\n 'info',\n 2000\n );\n return;\n }\n \n if (this.config.multiSelect) {\n if (this.selectedPrompts.has(prompt.ID)) {\n this.selectedPrompts.delete(prompt.ID);\n } else {\n this.selectedPrompts.add(prompt.ID);\n }\n } else {\n // Single select - replace current selection\n this.selectedPrompts.clear();\n this.selectedPrompts.add(prompt.ID);\n }\n }\n\n isPromptSelected(prompt: MJAIPromptEntityExtended): boolean {\n return this.selectedPrompts.has(prompt.ID);\n }\n\n isPromptLinked(prompt: MJAIPromptEntityExtended): boolean {\n return this.linkedPrompts.has(prompt.ID);\n }\n\n getSelectedPromptObjects(): MJAIPromptEntityExtended[] {\n const allPrompts = this.prompts$.value;\n return allPrompts.filter(prompt => this.selectedPrompts.has(prompt.ID));\n }\n\n // === UI Helpers ===\n\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n }\n\n getPromptStatusColor(prompt: MJAIPromptEntityExtended): string {\n switch (prompt.Status) {\n case 'Active': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Disabled': return 'var(--mj-text-muted)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n getPromptStatusText(prompt: MJAIPromptEntityExtended): string {\n return prompt.Status || 'Unknown';\n }\n\n // === Dialog Actions ===\n\n selectPrompts() {\n const selectedPromptObjects = this.getSelectedPromptObjects();\n \n if (selectedPromptObjects.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select at least one prompt',\n 'warning',\n 2000\n );\n return;\n }\n\n const result: PromptSelectorResult = {\n selectedPrompts: selectedPromptObjects\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n createNew() {\n const result: PromptSelectorResult = {\n selectedPrompts: [],\n createNew: true\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n cancel() {\n this.result.next(null);\n this.DialogClose.emit();\n }\n}","<!-- Prompt Selector Dialog -->\n<div class=\"prompt-selector-dialog\">\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 prompts...</p>\n </div>\n } @else {\n \n <!-- Search and Controls Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search prompts by name or description...\">\n </div>\n \n <div class=\"view-controls\">\n <button mjButton\n variant=\"flat\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"toggleViewMode()\"\n title=\"Toggle between list and grid view\">\n <i class=\"fa-solid\" [class.fa-list]=\"viewMode === 'grid'\" [class.fa-th]=\"viewMode === 'list'\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <span class=\"results-count\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ (filteredPrompts$ | async)?.length || 0 }} prompt(s)\n </span>\n @if (config.multiSelect && selectedPrompts.size > 0) {\n <span class=\"selected-count\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ selectedPrompts.size }} selected\n </span>\n }\n </div>\n\n <!-- Prompts List/Grid -->\n <div class=\"prompts-container\" [class.grid-view]=\"viewMode === 'grid'\" [class.list-view]=\"viewMode === 'list'\">\n @if ((filteredPrompts$ | async)?.length === 0) {\n <div class=\"no-results\">\n <i class=\"fa-solid fa-search fa-2x\"></i>\n <h4>No prompts found</h4>\n <p>Try adjusting your search criteria or check that prompts are properly configured.</p>\n </div>\n } @else {\n @for (prompt of filteredPrompts$ | async; track prompt.ID) {\n <div class=\"prompt-card\" \n [class.selected]=\"isPromptSelected(prompt)\"\n [class.linked]=\"isPromptLinked(prompt)\"\n (click)=\"togglePromptSelection(prompt)\">\n \n <!-- Selection indicator -->\n <div class=\"selection-indicator\">\n @if (isPromptLinked(prompt)) {\n <i class=\"fa-solid fa-link linked-icon\" title=\"Already linked to this agent\"></i>\n } @else if (isPromptSelected(prompt)) {\n <i class=\"fa-solid fa-check-circle selected-icon\"></i>\n } @else {\n <i class=\"fa-regular fa-circle unselected-icon\"></i>\n }\n </div>\n\n <!-- Prompt Content -->\n <div class=\"prompt-content\">\n <div class=\"prompt-header\">\n <h4 class=\"prompt-name\">{{ prompt.Name }}</h4>\n <div class=\"prompt-badges\">\n @if (isPromptLinked(prompt)) {\n <span class=\"linked-badge\">\n <i class=\"fa-solid fa-link\"></i>\n Linked\n </span>\n }\n <span class=\"status-badge\" \n [style.background-color]=\"getPromptStatusColor(prompt)\">\n {{ getPromptStatusText(prompt) }}\n </span>\n </div>\n </div>\n\n @if (prompt.Description) {\n <p class=\"prompt-description\">{{ prompt.Description }}</p>\n }\n\n <!-- Prompt Metadata -->\n <div class=\"prompt-metadata\">\n @if (prompt.__mj_CreatedAt) {\n <span class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n Created {{ prompt.__mj_CreatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.showCreateNew) {\n <button mjButton\n variant=\"flat\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n (click)=\"selectPrompts()\"\n [disabled]=\"selectedPrompts.size === 0\">\n @if (config.multiSelect) {\n <i class=\"fa-solid fa-check\"></i>\n Add {{ selectedPrompts.size }} Prompt{{ selectedPrompts.size === 1 ? '' : 's' }}\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Select Prompt\n }\n </button>\n </div>\n </div>\n</div>"]}
1
+ {"version":3,"file":"prompt-selector-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.ts","../../../../src/lib/custom/AIAgents/prompt-selector-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { Subject, BehaviorSubject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { FormControl } from '@angular/forms';\nimport { RunView } from '@memberjunction/core';\nimport { MJAIPromptEntityExtended } from '@memberjunction/ai-core-plus';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface PromptSelectorConfig {\n /** Title for the dialog */\n title: string;\n /** Whether to show the \"Create New\" option */\n showCreateNew?: boolean;\n /** Filter criteria for prompts */\n extraFilter?: string;\n /** Allow multiple selection */\n multiSelect?: boolean;\n /** Pre-selected prompt IDs */\n selectedPromptIds?: string[];\n /** Already linked prompt IDs (will be grayed out and not selectable) */\n linkedPromptIds?: string[];\n}\n\nexport interface PromptSelectorResult {\n /** Selected prompts */\n selectedPrompts: MJAIPromptEntityExtended[];\n /** Whether user chose to create new */\n createNew?: boolean;\n}\n\n/**\n * Unified prompt selector dialog that can be used for:\n * - Selecting context compression prompts (single select)\n * - Adding general prompts to agents (multi-select)\n * - Any other prompt selection scenario\n */\n@Component({\n standalone: false,\n selector: 'mj-prompt-selector-dialog',\n templateUrl: './prompt-selector-dialog.component.html',\n styleUrls: ['./prompt-selector-dialog.component.css']\n})\nexport class PromptSelectorDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n \n // Input configuration\n config: PromptSelectorConfig = { title: 'Select Prompts' };\n \n // State management\n private destroy$ = new Subject<void>();\n public result = new Subject<PromptSelectorResult | null>();\n \n // Data and UI state\n isLoading$ = new BehaviorSubject<boolean>(false);\n prompts$ = new BehaviorSubject<MJAIPromptEntityExtended[]>([]);\n filteredPrompts$ = new BehaviorSubject<MJAIPromptEntityExtended[]>([]);\n \n // Search and selection\n searchControl = new FormControl('');\n selectedPrompts: Set<string> = new Set();\n linkedPrompts: Set<string> = new Set();\n \n // View mode\n viewMode: 'grid' | 'list' = 'list';\n\n @Output() DialogClose = new EventEmitter<void>();\n\n constructor(\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n this.setupSearch();\n this.loadPrompts();\n \n // Initialize selected prompts if provided\n if (this.config.selectedPromptIds) {\n this.selectedPrompts = new Set(this.config.selectedPromptIds);\n }\n \n // Initialize linked prompts if provided\n if (this.config.linkedPromptIds) {\n this.linkedPrompts = new Set(this.config.linkedPromptIds);\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupSearch() {\n this.searchControl.valueChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(searchTerm => {\n this.filterPrompts(searchTerm || '');\n });\n }\n\n private async loadPrompts() {\n this.isLoading$.next(true);\n \n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n // Build filter - default to active prompts\n let filter = \"Status = 'Active'\";\n if (this.config.extraFilter) {\n filter += ` AND ${this.config.extraFilter}`;\n }\n \n const result = await rv.RunView<MJAIPromptEntityExtended>({\n EntityName: 'MJ: AI Prompts',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const prompts = result.Results || [];\n this.prompts$.next(prompts);\n this.filteredPrompts$.next(prompts);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load prompts');\n }\n } catch (error) {\n console.error('Error loading prompts:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading prompts. Please try again.',\n 'error',\n 3000\n );\n this.prompts$.next([]);\n this.filteredPrompts$.next([]);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private filterPrompts(searchTerm: string) {\n const allPrompts = this.prompts$.value;\n \n if (!searchTerm.trim()) {\n this.filteredPrompts$.next(allPrompts);\n return;\n }\n\n const filtered = allPrompts.filter(prompt => \n prompt.Name?.toLowerCase().includes(searchTerm.toLowerCase()) ||\n prompt.Description?.toLowerCase().includes(searchTerm.toLowerCase())\n );\n \n this.filteredPrompts$.next(filtered);\n }\n\n // === Selection Management ===\n\n togglePromptSelection(prompt: MJAIPromptEntityExtended) {\n // Prevent selection of already linked prompts\n if (this.isPromptLinked(prompt)) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${prompt.Name}\" is already linked to this agent`,\n 'info',\n 2000\n );\n return;\n }\n \n if (this.config.multiSelect) {\n if (this.selectedPrompts.has(prompt.ID)) {\n this.selectedPrompts.delete(prompt.ID);\n } else {\n this.selectedPrompts.add(prompt.ID);\n }\n } else {\n // Single select - replace current selection\n this.selectedPrompts.clear();\n this.selectedPrompts.add(prompt.ID);\n }\n }\n\n isPromptSelected(prompt: MJAIPromptEntityExtended): boolean {\n return this.selectedPrompts.has(prompt.ID);\n }\n\n isPromptLinked(prompt: MJAIPromptEntityExtended): boolean {\n return this.linkedPrompts.has(prompt.ID);\n }\n\n getSelectedPromptObjects(): MJAIPromptEntityExtended[] {\n const allPrompts = this.prompts$.value;\n return allPrompts.filter(prompt => this.selectedPrompts.has(prompt.ID));\n }\n\n // === UI Helpers ===\n\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n }\n\n getPromptStatusColor(prompt: MJAIPromptEntityExtended): string {\n switch (prompt.Status) {\n case 'Active': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Disabled': return 'var(--mj-text-muted)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n getPromptStatusText(prompt: MJAIPromptEntityExtended): string {\n return prompt.Status || 'Unknown';\n }\n\n // === Dialog Actions ===\n\n selectPrompts() {\n const selectedPromptObjects = this.getSelectedPromptObjects();\n \n if (selectedPromptObjects.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select at least one prompt',\n 'warning',\n 2000\n );\n return;\n }\n\n const result: PromptSelectorResult = {\n selectedPrompts: selectedPromptObjects\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n createNew() {\n const result: PromptSelectorResult = {\n selectedPrompts: [],\n createNew: true\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n cancel() {\n this.result.next(null);\n this.DialogClose.emit();\n }\n}","<!-- Prompt Selector Dialog -->\n<div class=\"prompt-selector-dialog\">\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 prompts...</p>\n </div>\n } @else {\n \n <!-- Search and Controls Header -->\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [formControl]=\"searchControl\"\n placeholder=\"Search prompts by name or description...\">\n </div>\n \n <div class=\"view-controls\">\n <button mjButton\n variant=\"flat\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"toggleViewMode()\"\n title=\"Toggle between list and grid view\">\n <i class=\"fa-solid\" [class.fa-list]=\"viewMode === 'grid'\" [class.fa-th]=\"viewMode === 'list'\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <span class=\"results-count\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ (filteredPrompts$ | async)?.length || 0 }} prompt(s)\n </span>\n @if (config.multiSelect && selectedPrompts.size > 0) {\n <span class=\"selected-count\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ selectedPrompts.size }} selected\n </span>\n }\n </div>\n\n <!-- Prompts List/Grid -->\n <div class=\"prompts-container\" [class.grid-view]=\"viewMode === 'grid'\" [class.list-view]=\"viewMode === 'list'\">\n @if ((filteredPrompts$ | async)?.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"No prompts found\"\n Message=\"Try adjusting your search criteria or check that prompts are properly configured.\"\n Size=\"compact\" />\n } @else {\n @for (prompt of filteredPrompts$ | async; track prompt.ID) {\n <div class=\"prompt-card\" \n [class.selected]=\"isPromptSelected(prompt)\"\n [class.linked]=\"isPromptLinked(prompt)\"\n (click)=\"togglePromptSelection(prompt)\">\n \n <!-- Selection indicator -->\n <div class=\"selection-indicator\">\n @if (isPromptLinked(prompt)) {\n <i class=\"fa-solid fa-link linked-icon\" title=\"Already linked to this agent\"></i>\n } @else if (isPromptSelected(prompt)) {\n <i class=\"fa-solid fa-check-circle selected-icon\"></i>\n } @else {\n <i class=\"fa-regular fa-circle unselected-icon\"></i>\n }\n </div>\n\n <!-- Prompt Content -->\n <div class=\"prompt-content\">\n <div class=\"prompt-header\">\n <h4 class=\"prompt-name\">{{ prompt.Name }}</h4>\n <div class=\"prompt-badges\">\n @if (isPromptLinked(prompt)) {\n <span class=\"linked-badge\">\n <i class=\"fa-solid fa-link\"></i>\n Linked\n </span>\n }\n <span class=\"status-badge\" \n [style.background-color]=\"getPromptStatusColor(prompt)\">\n {{ getPromptStatusText(prompt) }}\n </span>\n </div>\n </div>\n\n @if (prompt.Description) {\n <p class=\"prompt-description\">{{ prompt.Description }}</p>\n }\n\n <!-- Prompt Metadata -->\n <div class=\"prompt-metadata\">\n @if (prompt.__mj_CreatedAt) {\n <span class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n Created {{ prompt.__mj_CreatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.showCreateNew) {\n <button mjButton\n variant=\"flat\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n (click)=\"selectPrompts()\"\n [disabled]=\"selectedPrompts.size === 0\">\n @if (config.multiSelect) {\n <i class=\"fa-solid fa-check\"></i>\n Add {{ selectedPrompts.size }} Prompt{{ selectedPrompts.size === 1 ? '' : 's' }}\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Select Prompt\n }\n </button>\n </div>\n </div>\n</div>"]}
@@ -39,6 +39,10 @@ export declare class SubAgentSelectorDialogComponent extends BaseAngularComponen
39
39
  get selectedCount(): number;
40
40
  get totalAgentCount(): number;
41
41
  get filteredCount(): number;
42
+ /** True when the empty list is the result of search/type filtering (vs. no eligible agents at all). */
43
+ get IsAgentListNarrowed(): boolean;
44
+ /** Supporting copy for the no-agents empty state. */
45
+ get NoAgentsMessage(): string;
42
46
  DialogClose: EventEmitter<void>;
43
47
  constructor(cdr: ChangeDetectorRef);
44
48
  ngOnInit(): void;
@@ -51,6 +55,13 @@ export declare class SubAgentSelectorDialogComponent extends BaseAngularComponen
51
55
  selectType(typeId: string): void;
52
56
  toggleAgentSelection(agent: AgentDisplayItem): void;
53
57
  clearSearch(): void;
58
+ /**
59
+ * Backs the no-results empty-state "Clear Filters" CTA. Unlike clearSearch (the
60
+ * inline search-box X, which must only clear the search), this resets every
61
+ * dimension the list narrows on — search AND the agent-type filter — so the CTA
62
+ * actually returns results instead of appearing to do nothing.
63
+ */
64
+ clearFilters(): void;
54
65
  getAgentIcon(agent: AgentDisplayItem): string;
55
66
  getAgentStatusColor(agent: AgentDisplayItem): string;
56
67
  cancel(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agent-selector-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/sub-agent-selector-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,eAAe,EAA2E,MAAM,MAAM,CAAC;AAEzH,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAGvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,uBAAuB,EAAE,CAAC;IAC1C,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAiB,SAAQ,uBAAuB;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAMa,+BAAgC,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAoClG,OAAO,CAAC,GAAG;IAjCb,MAAM,EAAG,sBAAsB,CAAC;IAGhC,OAAO,CAAC,QAAQ,CAAuB;IAChC,MAAM,yCAAgD;IAG7D,UAAU,sCAA+C;IACzD,WAAW,yCAAkD;IAC7D,eAAe,sCAA+C;IAC9D,eAAe,+BAA+C;IAC9D,UAAU,2BAAuC;IAGjD,aAAa,6BAAuB;IACpC,eAAe,0BAAsC;IAGrD,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAES,WAAW,qBAA4B;gBAGvC,GAAG,EAAE,iBAAiB;IAIhC,QAAQ;IAMR,WAAW;YAKG,cAAc;YAYd,kBAAkB;IAwChC,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,uBAAuB;IAgB/B,UAAU,CAAC,MAAM,EAAE,MAAM;IAIzB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB;IAqC5C,WAAW;IAIX,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM;IAO7C,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM;IAWpD,MAAM;IAKN,SAAS;IAQH,iBAAiB;yCAxOZ,+BAA+B;2CAA/B,+BAA+B;CAyP3C"}
1
+ {"version":3,"file":"sub-agent-selector-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/sub-agent-selector-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,eAAe,EAA2E,MAAM,MAAM,CAAC;AAEzH,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAGvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,uBAAuB,EAAE,CAAC;IAC1C,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAiB,SAAQ,uBAAuB;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAMa,+BAAgC,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAgDlG,OAAO,CAAC,GAAG;IA7Cb,MAAM,EAAG,sBAAsB,CAAC;IAGhC,OAAO,CAAC,QAAQ,CAAuB;IAChC,MAAM,yCAAgD;IAG7D,UAAU,sCAA+C;IACzD,WAAW,yCAAkD;IAC7D,eAAe,sCAA+C;IAC9D,eAAe,+BAA+C;IAC9D,UAAU,2BAAuC;IAGjD,aAAa,6BAAuB;IACpC,eAAe,0BAAsC;IAGrD,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,uGAAuG;IACvG,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED,qDAAqD;IACrD,IAAI,eAAe,IAAI,MAAM,CAI5B;IAES,WAAW,qBAA4B;gBAGvC,GAAG,EAAE,iBAAiB;IAIhC,QAAQ;IAMR,WAAW;YAKG,cAAc;YAYd,kBAAkB;IAwChC,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,uBAAuB;IAgB/B,UAAU,CAAC,MAAM,EAAE,MAAM;IAIzB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB;IAqC5C,WAAW;IAIX;;;;;OAKG;IACH,YAAY;IAKZ,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM;IAO7C,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM;IAWpD,MAAM;IAKN,SAAS;IAQH,iBAAiB;yCA/PZ,+BAA+B;2CAA/B,+BAA+B;CAgR3C"}
@@ -33,42 +33,23 @@ function SubAgentSelectorDialogComponent_Conditional_24_Template(rf, ctx) { if (
33
33
  i0.ɵɵtext(3, "Loading available agents...");
34
34
  i0.ɵɵelementEnd()();
35
35
  } }
36
- function SubAgentSelectorDialogComponent_Conditional_26_Conditional_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
37
- i0.ɵɵelementStart(0, "p");
38
- i0.ɵɵtext(1, "No eligible root agents are available to become sub-agents.");
39
- i0.ɵɵelementEnd();
40
- } }
41
- function SubAgentSelectorDialogComponent_Conditional_26_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
42
- const _r3 = i0.ɵɵgetCurrentView();
43
- i0.ɵɵelementStart(0, "p");
44
- i0.ɵɵtext(1, "Try adjusting your search criteria or selecting a different agent type.");
45
- i0.ɵɵelementEnd();
46
- i0.ɵɵelementStart(2, "button", 30);
47
- i0.ɵɵlistener("click", function SubAgentSelectorDialogComponent_Conditional_26_Conditional_1_Conditional_5_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.clearSearch()); });
48
- i0.ɵɵtext(3, " Clear Search ");
49
- i0.ɵɵelementEnd();
50
- } }
51
36
  function SubAgentSelectorDialogComponent_Conditional_26_Conditional_1_Template(rf, ctx) { if (rf & 1) {
52
- i0.ɵɵelementStart(0, "div", 27);
53
- i0.ɵɵelement(1, "i", 29);
54
- i0.ɵɵelementStart(2, "h4");
55
- i0.ɵɵtext(3, "No agents found");
56
- i0.ɵɵelementEnd();
57
- i0.ɵɵconditionalCreate(4, SubAgentSelectorDialogComponent_Conditional_26_Conditional_1_Conditional_4_Template, 2, 0, "p")(5, SubAgentSelectorDialogComponent_Conditional_26_Conditional_1_Conditional_5_Template, 4, 0);
37
+ const _r3 = i0.ɵɵgetCurrentView();
38
+ i0.ɵɵelementStart(0, "mj-empty-state", 29);
39
+ i0.ɵɵlistener("Action", function SubAgentSelectorDialogComponent_Conditional_26_Conditional_1_Template_mj_empty_state_Action_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.clearFilters()); });
58
40
  i0.ɵɵelementEnd();
59
41
  } if (rf & 2) {
60
42
  const ctx_r0 = i0.ɵɵnextContext(2);
61
- i0.ɵɵadvance(4);
62
- i0.ɵɵconditional(ctx_r0.totalAgentCount === 0 ? 4 : 5);
43
+ i0.ɵɵproperty("Variant", ctx_r0.IsAgentListNarrowed ? "no-results" : "empty")("Message", ctx_r0.NoAgentsMessage)("ActionText", ctx_r0.IsAgentListNarrowed ? "Clear Filters" : "");
63
44
  } }
64
45
  function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
65
- i0.ɵɵelement(0, "i", 34);
46
+ i0.ɵɵelement(0, "i", 33);
66
47
  } }
67
48
  function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
68
- i0.ɵɵelement(0, "i", 35);
49
+ i0.ɵɵelement(0, "i", 34);
69
50
  } }
70
51
  function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
71
- i0.ɵɵelement(0, "img", 37);
52
+ i0.ɵɵelement(0, "img", 36);
72
53
  } if (rf & 2) {
73
54
  const agent_r5 = i0.ɵɵnextContext().$implicit;
74
55
  i0.ɵɵproperty("src", agent_r5.LogoURL, i0.ɵɵsanitizeUrl)("alt", agent_r5.Name + " logo");
@@ -81,7 +62,7 @@ function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Cond
81
62
  i0.ɵɵclassMap(ctx_r0.getAgentIcon(agent_r5));
82
63
  } }
83
64
  function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
84
- i0.ɵɵelementStart(0, "div", 41);
65
+ i0.ɵɵelementStart(0, "div", 40);
85
66
  i0.ɵɵtext(1);
86
67
  i0.ɵɵelementEnd();
87
68
  } if (rf & 2) {
@@ -90,7 +71,7 @@ function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Cond
90
71
  i0.ɵɵtextInterpolate(agent_r5.Description);
91
72
  } }
92
73
  function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
93
- i0.ɵɵelementStart(0, "span", 46);
74
+ i0.ɵɵelementStart(0, "span", 45);
94
75
  i0.ɵɵtext(1);
95
76
  i0.ɵɵelementEnd();
96
77
  } if (rf & 2) {
@@ -101,7 +82,7 @@ function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Cond
101
82
  i0.ɵɵtextInterpolate1(" ", agent_r5.Status, " ");
102
83
  } }
103
84
  function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_13_Template(rf, ctx) { if (rf & 1) {
104
- i0.ɵɵelementStart(0, "span", 44);
85
+ i0.ɵɵelementStart(0, "span", 43);
105
86
  i0.ɵɵtext(1);
106
87
  i0.ɵɵelementEnd();
107
88
  } if (rf & 2) {
@@ -110,7 +91,7 @@ function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Cond
110
91
  i0.ɵɵtextInterpolate(agent_r5.typeName);
111
92
  } }
112
93
  function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
113
- i0.ɵɵelementStart(0, "span", 45);
94
+ i0.ɵɵelementStart(0, "span", 44);
114
95
  i0.ɵɵtext(1);
115
96
  i0.ɵɵelementEnd();
116
97
  } if (rf & 2) {
@@ -120,22 +101,22 @@ function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Cond
120
101
  } }
121
102
  function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Template(rf, ctx) { if (rf & 1) {
122
103
  const _r4 = i0.ɵɵgetCurrentView();
123
- i0.ɵɵelementStart(0, "div", 32);
104
+ i0.ɵɵelementStart(0, "div", 31);
124
105
  i0.ɵɵlistener("click", function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Template_div_click_0_listener() { const agent_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.toggleAgentSelection(agent_r5)); });
125
- i0.ɵɵelementStart(1, "div", 33);
126
- i0.ɵɵconditionalCreate(2, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_2_Template, 1, 0, "i", 34)(3, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_3_Template, 1, 0, "i", 35);
106
+ i0.ɵɵelementStart(1, "div", 32);
107
+ i0.ɵɵconditionalCreate(2, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_2_Template, 1, 0, "i", 33)(3, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_3_Template, 1, 0, "i", 34);
127
108
  i0.ɵɵelementEnd();
128
- i0.ɵɵelementStart(4, "div", 36);
129
- i0.ɵɵconditionalCreate(5, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_5_Template, 1, 2, "img", 37)(6, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_6_Template, 1, 2, "i", 38);
109
+ i0.ɵɵelementStart(4, "div", 35);
110
+ i0.ɵɵconditionalCreate(5, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_5_Template, 1, 2, "img", 36)(6, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_6_Template, 1, 2, "i", 37);
130
111
  i0.ɵɵelementEnd();
131
- i0.ɵɵelementStart(7, "div", 39)(8, "div", 40);
112
+ i0.ɵɵelementStart(7, "div", 38)(8, "div", 39);
132
113
  i0.ɵɵtext(9);
133
114
  i0.ɵɵelementEnd();
134
- i0.ɵɵconditionalCreate(10, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_10_Template, 2, 1, "div", 41);
135
- i0.ɵɵelementStart(11, "div", 42);
136
- i0.ɵɵconditionalCreate(12, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_12_Template, 2, 3, "span", 43);
137
- i0.ɵɵconditionalCreate(13, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_13_Template, 2, 1, "span", 44);
138
- i0.ɵɵconditionalCreate(14, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_14_Template, 2, 1, "span", 45);
115
+ i0.ɵɵconditionalCreate(10, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_10_Template, 2, 1, "div", 40);
116
+ i0.ɵɵelementStart(11, "div", 41);
117
+ i0.ɵɵconditionalCreate(12, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_12_Template, 2, 3, "span", 42);
118
+ i0.ɵɵconditionalCreate(13, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_13_Template, 2, 1, "span", 43);
119
+ i0.ɵɵconditionalCreate(14, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Conditional_14_Template, 2, 1, "span", 44);
139
120
  i0.ɵɵelementEnd()()();
140
121
  } if (rf & 2) {
141
122
  const agent_r5 = ctx.$implicit;
@@ -157,7 +138,7 @@ function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Temp
157
138
  } }
158
139
  function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_Template(rf, ctx) { if (rf & 1) {
159
140
  i0.ɵɵelementStart(0, "div", 28);
160
- i0.ɵɵrepeaterCreate(1, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Template, 15, 9, "div", 31, _forTrack0);
141
+ i0.ɵɵrepeaterCreate(1, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_For_2_Template, 15, 9, "div", 30, _forTrack0);
161
142
  i0.ɵɵpipe(3, "async");
162
143
  i0.ɵɵelementEnd();
163
144
  } if (rf & 2) {
@@ -167,7 +148,7 @@ function SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_Template(r
167
148
  } }
168
149
  function SubAgentSelectorDialogComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
169
150
  i0.ɵɵelementStart(0, "div", 17);
170
- i0.ɵɵconditionalCreate(1, SubAgentSelectorDialogComponent_Conditional_26_Conditional_1_Template, 6, 1, "div", 27)(2, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_Template, 4, 2, "div", 28);
151
+ i0.ɵɵconditionalCreate(1, SubAgentSelectorDialogComponent_Conditional_26_Conditional_1_Template, 1, 3, "mj-empty-state", 27)(2, SubAgentSelectorDialogComponent_Conditional_26_Conditional_2_Template, 4, 2, "div", 28);
171
152
  i0.ɵɵelementEnd();
172
153
  } if (rf & 2) {
173
154
  const ctx_r0 = i0.ɵɵnextContext();
@@ -176,7 +157,7 @@ function SubAgentSelectorDialogComponent_Conditional_26_Template(rf, ctx) { if (
176
157
  } }
177
158
  function SubAgentSelectorDialogComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
178
159
  const _r6 = i0.ɵɵgetCurrentView();
179
- i0.ɵɵelementStart(0, "button", 30);
160
+ i0.ɵɵelementStart(0, "button", 46);
180
161
  i0.ɵɵlistener("click", function SubAgentSelectorDialogComponent_Conditional_29_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.createNew()); });
181
162
  i0.ɵɵelement(1, "i", 47);
182
163
  i0.ɵɵtext(2, " Create Sub-Agent ");
@@ -206,6 +187,16 @@ export class SubAgentSelectorDialogComponent extends BaseAngularComponent {
206
187
  get filteredCount() {
207
188
  return this.filteredAgents$.value.length;
208
189
  }
190
+ /** True when the empty list is the result of search/type filtering (vs. no eligible agents at all). */
191
+ get IsAgentListNarrowed() {
192
+ return this.totalAgentCount > 0;
193
+ }
194
+ /** Supporting copy for the no-agents empty state. */
195
+ get NoAgentsMessage() {
196
+ return this.IsAgentListNarrowed
197
+ ? 'Try adjusting your search criteria or selecting a different agent type.'
198
+ : 'No eligible root agents are available to become sub-agents.';
199
+ }
209
200
  constructor(cdr) {
210
201
  super();
211
202
  this.cdr = cdr;
@@ -355,6 +346,16 @@ export class SubAgentSelectorDialogComponent extends BaseAngularComponent {
355
346
  clearSearch() {
356
347
  this.searchControl.reset();
357
348
  }
349
+ /**
350
+ * Backs the no-results empty-state "Clear Filters" CTA. Unlike clearSearch (the
351
+ * inline search-box X, which must only clear the search), this resets every
352
+ * dimension the list narrows on — search AND the agent-type filter — so the CTA
353
+ * actually returns results instead of appearing to do nothing.
354
+ */
355
+ clearFilters() {
356
+ this.searchControl.reset();
357
+ this.selectedTypeId$.next('all');
358
+ }
358
359
  getAgentIcon(agent) {
359
360
  if (agent.IconClass) {
360
361
  return agent.IconClass;
@@ -396,7 +397,7 @@ export class SubAgentSelectorDialogComponent extends BaseAngularComponent {
396
397
  this.DialogClose.emit();
397
398
  }
398
399
  static { this.ɵfac = function SubAgentSelectorDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SubAgentSelectorDialogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
399
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SubAgentSelectorDialogComponent, selectors: [["mj-sub-agent-selector-dialog"]], outputs: { DialogClose: "DialogClose" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 36, vars: 21, consts: [[1, "sub-agent-selector-dialog"], [1, "dialog-header"], [1, "header-info"], [1, "header-description"], [1, "header-stats"], [1, "selection-count"], [1, "total-count"], [1, "controls-section"], [1, "search-controls"], [1, "search-input"], [1, "fa-solid", "fa-search", "search-icon"], ["placeholder", "Search agents by name, description, or type...", 1, "mj-input", "search-field", 3, "formControl"], ["mjButton", "", "variant", "flat", 1, "clear-search"], [1, "filter-controls"], [1, "type-filter"], ["TextField", "Name", "ValueField", "ID", 1, "type-dropdown", 3, "ngModelChange", "ngModel", "ValuePrimitive", "DefaultItem", "Data"], [1, "loading-state"], [1, "content-area"], [1, "dialog-footer"], [1, "footer-left"], ["mjButton", "", "variant", "primary"], [1, "footer-right"], ["mjButton", "", "variant", "flat", 3, "click"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["mjButton", "", "variant", "flat", 1, "clear-search", 3, "click"], [1, "fa-solid", "fa-times"], [1, "fa-solid", "fa-spinner", "fa-spin", "fa-2x"], [1, "empty-state"], [1, "agents-grid"], [1, "fa-solid", "fa-robot"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "agent-card", 3, "selected"], [1, "agent-card", 3, "click"], [1, "selection-indicator"], [1, "fa-solid", "fa-check-circle"], [1, "fa-regular", "fa-circle"], [1, "agent-icon"], [1, "agent-logo", 3, "src", "alt"], [3, "class"], [1, "agent-info"], [1, "agent-name"], [1, "agent-description"], [1, "agent-meta"], [1, "status-badge", 3, "background-color"], [1, "type-badge"], [1, "execution-badge"], [1, "status-badge"], [1, "fa-solid", "fa-plus"]], template: function SubAgentSelectorDialogComponent_Template(rf, ctx) { if (rf & 1) {
400
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SubAgentSelectorDialogComponent, selectors: [["mj-sub-agent-selector-dialog"]], outputs: { DialogClose: "DialogClose" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 36, vars: 21, consts: [[1, "sub-agent-selector-dialog"], [1, "dialog-header"], [1, "header-info"], [1, "header-description"], [1, "header-stats"], [1, "selection-count"], [1, "total-count"], [1, "controls-section"], [1, "search-controls"], [1, "search-input"], [1, "fa-solid", "fa-search", "search-icon"], ["placeholder", "Search agents by name, description, or type...", 1, "mj-input", "search-field", 3, "formControl"], ["mjButton", "", "variant", "flat", 1, "clear-search"], [1, "filter-controls"], [1, "type-filter"], ["TextField", "Name", "ValueField", "ID", 1, "type-dropdown", 3, "ngModelChange", "ngModel", "ValuePrimitive", "DefaultItem", "Data"], [1, "loading-state"], [1, "content-area"], [1, "dialog-footer"], [1, "footer-left"], ["mjButton", "", "variant", "primary"], [1, "footer-right"], ["mjButton", "", "variant", "flat", 3, "click"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["mjButton", "", "variant", "flat", 1, "clear-search", 3, "click"], [1, "fa-solid", "fa-times"], [1, "fa-solid", "fa-spinner", "fa-spin", "fa-2x"], ["Icon", "fa-solid fa-robot", "Title", "No agents found", "Size", "compact", 3, "Variant", "Message", "ActionText"], [1, "agents-grid"], ["Icon", "fa-solid fa-robot", "Title", "No agents found", "Size", "compact", 3, "Action", "Variant", "Message", "ActionText"], [1, "agent-card", 3, "selected"], [1, "agent-card", 3, "click"], [1, "selection-indicator"], [1, "fa-solid", "fa-check-circle"], [1, "fa-regular", "fa-circle"], [1, "agent-icon"], [1, "agent-logo", 3, "src", "alt"], [3, "class"], [1, "agent-info"], [1, "agent-name"], [1, "agent-description"], [1, "agent-meta"], [1, "status-badge", 3, "background-color"], [1, "type-badge"], [1, "execution-badge"], [1, "status-badge"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-plus"]], template: function SubAgentSelectorDialogComponent_Template(rf, ctx) { if (rf & 1) {
400
401
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h3");
401
402
  i0.ɵɵtext(4);
402
403
  i0.ɵɵelementEnd();
@@ -455,11 +456,11 @@ export class SubAgentSelectorDialogComponent extends BaseAngularComponent {
455
456
  i0.ɵɵproperty("disabled", ctx.selectedCount === 0);
456
457
  i0.ɵɵadvance();
457
458
  i0.ɵɵconditional(ctx.config.multiSelect ? 34 : 35);
458
- } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, i1.FormControlDirective, i2.MJButtonDirective, i2.MJDropdownComponent, i3.AsyncPipe], styles: [".sub-agent-selector-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-card);\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n\n\n[_nghost-%COMP%] .k-dialog, \n[_nghost-%COMP%] .k-window {\n z-index: 10000 !important;\n}\n\n[_nghost-%COMP%] .k-overlay {\n z-index: 9999 !important;\n}\n\n\n\n.dialog-header[_ngcontent-%COMP%] {\n padding: 1.5rem;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n}\n\n.header-info[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-primary);\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n.header-description[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n line-height: 1.4;\n}\n\n.header-stats[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 0.25rem;\n font-size: 0.85rem;\n}\n\n.selection-count[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.total-count[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.controls-section[_ngcontent-%COMP%] {\n padding: 1rem 1.5rem;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n gap: 1rem;\n align-items: flex-end;\n}\n\n.search-controls[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.search-input[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n z-index: 1;\n}\n\n.search-field[_ngcontent-%COMP%] {\n width: 100%;\n padding-left: 40px;\n}\n\n.clear-search[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n z-index: 1;\n}\n\n.filter-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 1rem;\n align-items: flex-end;\n}\n\n.type-filter[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.type-filter[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.type-dropdown[_ngcontent-%COMP%] {\n min-width: 150px;\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n margin-bottom: 1rem;\n}\n\n.loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n text-align: center;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: var(--mj-border-default);\n margin-bottom: 1rem;\n}\n\n.empty-state[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-secondary);\n font-size: 1.1rem;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n max-width: 400px;\n line-height: 1.5;\n}\n\n\n\n.agents-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1rem;\n}\n\n.agent-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 1rem;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n gap: 1rem;\n position: relative;\n}\n\n.agent-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.agent-card.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.selection-indicator[_ngcontent-%COMP%] {\n position: absolute;\n top: 0.75rem;\n right: 0.75rem;\n font-size: 1.1rem;\n}\n\n.selection-indicator[_ngcontent-%COMP%] .fa-check-circle[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.selection-indicator[_ngcontent-%COMP%] .fa-circle[_ngcontent-%COMP%] {\n color: var(--mj-border-default);\n}\n\n.agent-icon[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.agent-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n color: var(--mj-brand-primary);\n}\n\n.agent-logo[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 6px;\n}\n\n.agent-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.agent-name[_ngcontent-%COMP%] {\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 0.5rem;\n word-wrap: break-word;\n}\n\n.agent-description[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n margin-bottom: 0.75rem;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.agent-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n\n.status-badge[_ngcontent-%COMP%], \n.type-badge[_ngcontent-%COMP%], \n.execution-badge[_ngcontent-%COMP%] {\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-inverse);\n}\n\n\n\n\n.type-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n.execution-badge[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n padding: 1rem 1.5rem;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.footer-left[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n}\n\n.footer-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.75rem;\n}\n\n.dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 100px;\n}\n\n.dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0.5rem;\n}\n\n\n\n@media (max-width: 768px) {\n .agents-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .dialog-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 1rem;\n }\n\n .header-stats[_ngcontent-%COMP%] {\n align-items: flex-start;\n }\n\n .controls-section[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .filter-controls[_ngcontent-%COMP%] {\n justify-content: flex-start;\n }\n\n .dialog-footer[_ngcontent-%COMP%] {\n flex-direction: column-reverse;\n gap: 1rem;\n }\n\n .footer-left[_ngcontent-%COMP%], \n .footer-right[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n }\n}"] }); }
459
+ } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, i1.FormControlDirective, i2.MJEmptyStateComponent, i2.MJButtonDirective, i2.MJDropdownComponent, i3.AsyncPipe], styles: [".sub-agent-selector-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-card);\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n\n\n[_nghost-%COMP%] .k-dialog, \n[_nghost-%COMP%] .k-window {\n z-index: 10000 !important;\n}\n\n[_nghost-%COMP%] .k-overlay {\n z-index: 9999 !important;\n}\n\n\n\n.dialog-header[_ngcontent-%COMP%] {\n padding: 1.5rem;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n}\n\n.header-info[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-primary);\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n.header-description[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n line-height: 1.4;\n}\n\n.header-stats[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 0.25rem;\n font-size: 0.85rem;\n}\n\n.selection-count[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.total-count[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.controls-section[_ngcontent-%COMP%] {\n padding: 1rem 1.5rem;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n gap: 1rem;\n align-items: flex-end;\n}\n\n.search-controls[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.search-input[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n z-index: 1;\n}\n\n.search-field[_ngcontent-%COMP%] {\n width: 100%;\n padding-left: 40px;\n}\n\n.clear-search[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n z-index: 1;\n}\n\n.filter-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 1rem;\n align-items: flex-end;\n}\n\n.type-filter[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.type-filter[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.type-dropdown[_ngcontent-%COMP%] {\n min-width: 150px;\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n margin-bottom: 1rem;\n}\n\n.loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1rem;\n}\n\n\n\n.agents-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1rem;\n}\n\n.agent-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 1rem;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n gap: 1rem;\n position: relative;\n}\n\n.agent-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.agent-card.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.selection-indicator[_ngcontent-%COMP%] {\n position: absolute;\n top: 0.75rem;\n right: 0.75rem;\n font-size: 1.1rem;\n}\n\n.selection-indicator[_ngcontent-%COMP%] .fa-check-circle[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.selection-indicator[_ngcontent-%COMP%] .fa-circle[_ngcontent-%COMP%] {\n color: var(--mj-border-default);\n}\n\n.agent-icon[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.agent-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n color: var(--mj-brand-primary);\n}\n\n.agent-logo[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 6px;\n}\n\n.agent-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.agent-name[_ngcontent-%COMP%] {\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 0.5rem;\n word-wrap: break-word;\n}\n\n.agent-description[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n margin-bottom: 0.75rem;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.agent-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n\n.status-badge[_ngcontent-%COMP%], \n.type-badge[_ngcontent-%COMP%], \n.execution-badge[_ngcontent-%COMP%] {\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-inverse);\n}\n\n\n\n\n.type-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n.execution-badge[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n padding: 1rem 1.5rem;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.footer-left[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n}\n\n.footer-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.75rem;\n}\n\n.dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 100px;\n}\n\n.dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0.5rem;\n}\n\n\n\n@media (max-width: 768px) {\n .agents-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .dialog-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 1rem;\n }\n\n .header-stats[_ngcontent-%COMP%] {\n align-items: flex-start;\n }\n\n .controls-section[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .filter-controls[_ngcontent-%COMP%] {\n justify-content: flex-start;\n }\n\n .dialog-footer[_ngcontent-%COMP%] {\n flex-direction: column-reverse;\n gap: 1rem;\n }\n\n .footer-left[_ngcontent-%COMP%], \n .footer-right[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n }\n}"] }); }
459
460
  }
460
461
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SubAgentSelectorDialogComponent, [{
461
462
  type: Component,
462
- args: [{ standalone: false, selector: 'mj-sub-agent-selector-dialog', template: "<!-- Sub-Agent Selector Dialog -->\n<div class=\"sub-agent-selector-dialog\">\n \n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <div class=\"header-info\">\n <h3>{{ config.title || 'Select Sub-Agents' }}</h3>\n <p class=\"header-description\">\n Choose existing root agents to convert into sub-agents. Only active agents without parents and not exposed as actions can be selected.\n </p>\n </div>\n <div class=\"header-stats\">\n @if (selectedCount > 0) {\n <span class=\"selection-count\">{{ selectedCount }} selected</span>\n }\n <span class=\"total-count\">{{ filteredCount }} of {{ totalAgentCount }} agents</span>\n </div>\n </div>\n\n <!-- Search and Filter Controls -->\n <div class=\"controls-section\">\n <div class=\"search-controls\">\n <div class=\"search-input\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n class=\"mj-input search-field\"\n [formControl]=\"searchControl\"\n placeholder=\"Search agents by name, description, or type...\">\n @if (searchControl.value) {\n <button mjButton\n variant=\"flat\"\n (click)=\"clearSearch()\"\n class=\"clear-search\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"filter-controls\">\n <div class=\"type-filter\">\n <label>Agent Type:</label>\n <mj-dropdown\n [ngModel]=\"selectedTypeId$ | async\"\n (ngModelChange)=\"selectType($any($event))\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [DefaultItem]=\"{ Name: 'All Types', ID: 'all' }\"\n [Data]=\"agentTypes$ | async\"\n class=\"type-dropdown\">\n </mj-dropdown>\n </div>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n <p>Loading available agents...</p>\n </div>\n } @else {\n \n <!-- Content Area -->\n <div class=\"content-area\">\n @if (filteredCount === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-robot\"></i>\n <h4>No agents found</h4>\n @if (totalAgentCount === 0) {\n <p>No eligible root agents are available to become sub-agents.</p>\n } @else {\n <p>Try adjusting your search criteria or selecting a different agent type.</p>\n <button mjButton (click)=\"clearSearch()\" variant=\"primary\">\n Clear Search\n </button>\n }\n </div>\n } @else {\n \n <!-- Agents Grid -->\n <div class=\"agents-grid\">\n @for (agent of (filteredAgents$ | async); track agent.ID) {\n <div class=\"agent-card\" \n [class.selected]=\"agent.selected\"\n (click)=\"toggleAgentSelection(agent)\">\n \n <!-- Selection Indicator -->\n <div class=\"selection-indicator\">\n @if (agent.selected) {\n <i class=\"fa-solid fa-check-circle\"></i>\n } @else {\n <i class=\"fa-regular fa-circle\"></i>\n }\n </div>\n \n <!-- Agent Icon/Logo -->\n <div class=\"agent-icon\">\n @if (agent.LogoURL) {\n <img [src]=\"agent.LogoURL\" [alt]=\"agent.Name + ' logo'\" class=\"agent-logo\">\n } @else {\n <i [class]=\"getAgentIcon(agent)\"></i>\n }\n </div>\n \n <!-- Agent Info -->\n <div class=\"agent-info\">\n <div class=\"agent-name\">{{ agent.Name }}</div>\n @if (agent.Description) {\n <div class=\"agent-description\">{{ agent.Description }}</div>\n }\n <div class=\"agent-meta\">\n @if (agent.Status) {\n <span class=\"status-badge\" [style.background-color]=\"getAgentStatusColor(agent)\">\n {{ agent.Status }}\n </span>\n }\n @if (agent.typeName) {\n <span class=\"type-badge\">{{ agent.typeName }}</span>\n }\n @if (agent.ExecutionMode) {\n <span class=\"execution-badge\">{{ agent.ExecutionMode }}</span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.showCreateNew) {\n <button mjButton\n variant=\"primary\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Sub-Agent\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n (click)=\"addSelectedAgents()\"\n [disabled]=\"selectedCount === 0\">\n @if (config.multiSelect) {\n Add {{ selectedCount > 0 ? selectedCount + ' ' : '' }}Sub-Agent{{ selectedCount !== 1 ? 's' : '' }}\n } @else {\n Add Sub-Agent\n }\n </button>\n </div>\n </div>\n</div>", styles: [".sub-agent-selector-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-card);\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.dialog-header {\n padding: 1.5rem;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n}\n\n.header-info h3 {\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-primary);\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n.header-description {\n margin: 0;\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n line-height: 1.4;\n}\n\n.header-stats {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 0.25rem;\n font-size: 0.85rem;\n}\n\n.selection-count {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.total-count {\n color: var(--mj-text-muted);\n}\n\n/* === Controls Section === */\n.controls-section {\n padding: 1rem 1.5rem;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n gap: 1rem;\n align-items: flex-end;\n}\n\n.search-controls {\n flex: 1;\n}\n\n.search-input {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-icon {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n z-index: 1;\n}\n\n.search-field {\n width: 100%;\n padding-left: 40px;\n}\n\n.clear-search {\n position: absolute;\n right: 8px;\n z-index: 1;\n}\n\n.filter-controls {\n display: flex;\n gap: 1rem;\n align-items: flex-end;\n}\n\n.type-filter {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.type-filter label {\n font-size: 0.85rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.type-dropdown {\n min-width: 150px;\n}\n\n/* === Content Area === */\n.content-area {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n}\n\n/* === Loading State === */\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state i {\n color: var(--mj-brand-primary);\n margin-bottom: 1rem;\n}\n\n.loading-state p {\n margin: 0;\n font-size: 1rem;\n}\n\n/* === Empty State === */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n text-align: center;\n}\n\n.empty-state i {\n font-size: 3rem;\n color: var(--mj-border-default);\n margin-bottom: 1rem;\n}\n\n.empty-state h4 {\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-secondary);\n font-size: 1.1rem;\n}\n\n.empty-state p {\n margin: 0 0 1rem 0;\n max-width: 400px;\n line-height: 1.5;\n}\n\n/* === Agents Grid === */\n.agents-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1rem;\n}\n\n.agent-card {\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 1rem;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n gap: 1rem;\n position: relative;\n}\n\n.agent-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.agent-card.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.selection-indicator {\n position: absolute;\n top: 0.75rem;\n right: 0.75rem;\n font-size: 1.1rem;\n}\n\n.selection-indicator .fa-check-circle {\n color: var(--mj-status-success);\n}\n\n.selection-indicator .fa-circle {\n color: var(--mj-border-default);\n}\n\n.agent-icon {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.agent-icon i {\n font-size: 1.5rem;\n color: var(--mj-brand-primary);\n}\n\n.agent-logo {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 6px;\n}\n\n.agent-info {\n flex: 1;\n min-width: 0;\n}\n\n.agent-name {\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 0.5rem;\n word-wrap: break-word;\n}\n\n.agent-description {\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n margin-bottom: 0.75rem;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.agent-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n\n.status-badge,\n.type-badge,\n.execution-badge {\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-inverse);\n}\n\n/* Status badge color set dynamically via style binding */\n\n.type-badge {\n background: var(--mj-brand-primary);\n}\n\n.execution-badge {\n background: var(--mj-status-warning);\n}\n\n/* === Dialog Footer === */\n.dialog-footer {\n padding: 1rem 1.5rem;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.footer-left {\n display: flex;\n gap: 0.5rem;\n}\n\n.footer-right {\n display: flex;\n gap: 0.75rem;\n}\n\n.dialog-footer button {\n min-width: 100px;\n}\n\n.dialog-footer button i {\n margin-right: 0.5rem;\n}\n\n/* === Responsive Design === */\n@media (max-width: 768px) {\n .agents-grid {\n grid-template-columns: 1fr;\n }\n\n .dialog-header {\n flex-direction: column;\n gap: 1rem;\n }\n\n .header-stats {\n align-items: flex-start;\n }\n\n .controls-section {\n flex-direction: column;\n align-items: stretch;\n }\n\n .filter-controls {\n justify-content: flex-start;\n }\n\n .dialog-footer {\n flex-direction: column-reverse;\n gap: 1rem;\n }\n\n .footer-left,\n .footer-right {\n width: 100%;\n justify-content: center;\n }\n}\n"] }]
463
+ args: [{ standalone: false, selector: 'mj-sub-agent-selector-dialog', template: "<!-- Sub-Agent Selector Dialog -->\n<div class=\"sub-agent-selector-dialog\">\n \n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <div class=\"header-info\">\n <h3>{{ config.title || 'Select Sub-Agents' }}</h3>\n <p class=\"header-description\">\n Choose existing root agents to convert into sub-agents. Only active agents without parents and not exposed as actions can be selected.\n </p>\n </div>\n <div class=\"header-stats\">\n @if (selectedCount > 0) {\n <span class=\"selection-count\">{{ selectedCount }} selected</span>\n }\n <span class=\"total-count\">{{ filteredCount }} of {{ totalAgentCount }} agents</span>\n </div>\n </div>\n\n <!-- Search and Filter Controls -->\n <div class=\"controls-section\">\n <div class=\"search-controls\">\n <div class=\"search-input\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n class=\"mj-input search-field\"\n [formControl]=\"searchControl\"\n placeholder=\"Search agents by name, description, or type...\">\n @if (searchControl.value) {\n <button mjButton\n variant=\"flat\"\n (click)=\"clearSearch()\"\n class=\"clear-search\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"filter-controls\">\n <div class=\"type-filter\">\n <label>Agent Type:</label>\n <mj-dropdown\n [ngModel]=\"selectedTypeId$ | async\"\n (ngModelChange)=\"selectType($any($event))\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [DefaultItem]=\"{ Name: 'All Types', ID: 'all' }\"\n [Data]=\"agentTypes$ | async\"\n class=\"type-dropdown\">\n </mj-dropdown>\n </div>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n <p>Loading available agents...</p>\n </div>\n } @else {\n \n <!-- Content Area -->\n <div class=\"content-area\">\n @if (filteredCount === 0) {\n <mj-empty-state\n [Variant]=\"IsAgentListNarrowed ? 'no-results' : 'empty'\"\n Icon=\"fa-solid fa-robot\"\n Title=\"No agents found\"\n [Message]=\"NoAgentsMessage\"\n [ActionText]=\"IsAgentListNarrowed ? 'Clear Filters' : ''\"\n (Action)=\"clearFilters()\"\n Size=\"compact\" />\n } @else {\n \n <!-- Agents Grid -->\n <div class=\"agents-grid\">\n @for (agent of (filteredAgents$ | async); track agent.ID) {\n <div class=\"agent-card\" \n [class.selected]=\"agent.selected\"\n (click)=\"toggleAgentSelection(agent)\">\n \n <!-- Selection Indicator -->\n <div class=\"selection-indicator\">\n @if (agent.selected) {\n <i class=\"fa-solid fa-check-circle\"></i>\n } @else {\n <i class=\"fa-regular fa-circle\"></i>\n }\n </div>\n \n <!-- Agent Icon/Logo -->\n <div class=\"agent-icon\">\n @if (agent.LogoURL) {\n <img [src]=\"agent.LogoURL\" [alt]=\"agent.Name + ' logo'\" class=\"agent-logo\">\n } @else {\n <i [class]=\"getAgentIcon(agent)\"></i>\n }\n </div>\n \n <!-- Agent Info -->\n <div class=\"agent-info\">\n <div class=\"agent-name\">{{ agent.Name }}</div>\n @if (agent.Description) {\n <div class=\"agent-description\">{{ agent.Description }}</div>\n }\n <div class=\"agent-meta\">\n @if (agent.Status) {\n <span class=\"status-badge\" [style.background-color]=\"getAgentStatusColor(agent)\">\n {{ agent.Status }}\n </span>\n }\n @if (agent.typeName) {\n <span class=\"type-badge\">{{ agent.typeName }}</span>\n }\n @if (agent.ExecutionMode) {\n <span class=\"execution-badge\">{{ agent.ExecutionMode }}</span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.showCreateNew) {\n <button mjButton\n variant=\"primary\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Sub-Agent\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n (click)=\"addSelectedAgents()\"\n [disabled]=\"selectedCount === 0\">\n @if (config.multiSelect) {\n Add {{ selectedCount > 0 ? selectedCount + ' ' : '' }}Sub-Agent{{ selectedCount !== 1 ? 's' : '' }}\n } @else {\n Add Sub-Agent\n }\n </button>\n </div>\n </div>\n</div>", styles: [".sub-agent-selector-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-card);\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.dialog-header {\n padding: 1.5rem;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n}\n\n.header-info h3 {\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-primary);\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n.header-description {\n margin: 0;\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n line-height: 1.4;\n}\n\n.header-stats {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 0.25rem;\n font-size: 0.85rem;\n}\n\n.selection-count {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.total-count {\n color: var(--mj-text-muted);\n}\n\n/* === Controls Section === */\n.controls-section {\n padding: 1rem 1.5rem;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n gap: 1rem;\n align-items: flex-end;\n}\n\n.search-controls {\n flex: 1;\n}\n\n.search-input {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-icon {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n z-index: 1;\n}\n\n.search-field {\n width: 100%;\n padding-left: 40px;\n}\n\n.clear-search {\n position: absolute;\n right: 8px;\n z-index: 1;\n}\n\n.filter-controls {\n display: flex;\n gap: 1rem;\n align-items: flex-end;\n}\n\n.type-filter {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.type-filter label {\n font-size: 0.85rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.type-dropdown {\n min-width: 150px;\n}\n\n/* === Content Area === */\n.content-area {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n}\n\n/* === Loading State === */\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-state i {\n color: var(--mj-brand-primary);\n margin-bottom: 1rem;\n}\n\n.loading-state p {\n margin: 0;\n font-size: 1rem;\n}\n\n/* === Agents Grid === */\n.agents-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1rem;\n}\n\n.agent-card {\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 1rem;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n gap: 1rem;\n position: relative;\n}\n\n.agent-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.agent-card.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.selection-indicator {\n position: absolute;\n top: 0.75rem;\n right: 0.75rem;\n font-size: 1.1rem;\n}\n\n.selection-indicator .fa-check-circle {\n color: var(--mj-status-success);\n}\n\n.selection-indicator .fa-circle {\n color: var(--mj-border-default);\n}\n\n.agent-icon {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.agent-icon i {\n font-size: 1.5rem;\n color: var(--mj-brand-primary);\n}\n\n.agent-logo {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 6px;\n}\n\n.agent-info {\n flex: 1;\n min-width: 0;\n}\n\n.agent-name {\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 0.5rem;\n word-wrap: break-word;\n}\n\n.agent-description {\n font-size: 0.85rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n margin-bottom: 0.75rem;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.agent-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n\n.status-badge,\n.type-badge,\n.execution-badge {\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n font-weight: 500;\n color: var(--mj-text-inverse);\n}\n\n/* Status badge color set dynamically via style binding */\n\n.type-badge {\n background: var(--mj-brand-primary);\n}\n\n.execution-badge {\n background: var(--mj-status-warning);\n}\n\n/* === Dialog Footer === */\n.dialog-footer {\n padding: 1rem 1.5rem;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.footer-left {\n display: flex;\n gap: 0.5rem;\n}\n\n.footer-right {\n display: flex;\n gap: 0.75rem;\n}\n\n.dialog-footer button {\n min-width: 100px;\n}\n\n.dialog-footer button i {\n margin-right: 0.5rem;\n}\n\n/* === Responsive Design === */\n@media (max-width: 768px) {\n .agents-grid {\n grid-template-columns: 1fr;\n }\n\n .dialog-header {\n flex-direction: column;\n gap: 1rem;\n }\n\n .header-stats {\n align-items: flex-start;\n }\n\n .controls-section {\n flex-direction: column;\n align-items: stretch;\n }\n\n .filter-controls {\n justify-content: flex-start;\n }\n\n .dialog-footer {\n flex-direction: column-reverse;\n gap: 1rem;\n }\n\n .footer-left,\n .footer-right {\n width: 100%;\n justify-content: center;\n }\n}\n"] }]
463
464
  }], () => [{ type: i0.ChangeDetectorRef }], { DialogClose: [{
464
465
  type: Output
465
466
  }] }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agent-selector-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/sub-agent-selector-dialog.component.ts","../../../../src/lib/custom/AIAgents/sub-agent-selector-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { Subject, BehaviorSubject, combineLatest, debounceTime, distinctUntilChanged, takeUntil, startWith } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { MJAIAgentTypeEntity } from '@memberjunction/core-entities';\nimport { MJAIAgentEntityExtended } from \"@memberjunction/ai-core-plus\";\nimport { UUIDsEqual } from '@memberjunction/global';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface SubAgentSelectorResult {\n selectedAgents: MJAIAgentEntityExtended[];\n createNew: boolean;\n}\n\nexport interface SubAgentSelectorConfig {\n title: string;\n multiSelect: boolean;\n selectedAgentIds: string[];\n showCreateNew: boolean;\n parentAgentId: string; // To exclude from selection\n}\n\nexport interface AgentDisplayItem extends MJAIAgentEntityExtended {\n selected: boolean;\n typeName?: string;\n}\n\n/**\n * Sub-Agent Selector Dialog for selecting agents to convert to sub-agents.\n * Only shows agents with NULL ParentID (root agents) that can become sub-agents.\n */\n@Component({\n standalone: false,\n selector: 'mj-sub-agent-selector-dialog',\n templateUrl: './sub-agent-selector-dialog.component.html',\n styleUrls: ['./sub-agent-selector-dialog.component.css']\n})\nexport class SubAgentSelectorDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n \n // Input properties set by service\n config!: SubAgentSelectorConfig;\n \n // Reactive state management\n private destroy$ = new Subject<void>();\n public result = new Subject<SubAgentSelectorResult | null>();\n \n // Data streams\n allAgents$ = new BehaviorSubject<AgentDisplayItem[]>([]);\n agentTypes$ = new BehaviorSubject<MJAIAgentTypeEntity[]>([]);\n filteredAgents$ = new BehaviorSubject<AgentDisplayItem[]>([]);\n selectedAgents$ = new BehaviorSubject<Set<string>>(new Set());\n isLoading$ = new BehaviorSubject<boolean>(false);\n \n // UI state\n searchControl = new FormControl('');\n selectedTypeId$ = new BehaviorSubject<string>('all');\n \n // Computed values\n get selectedCount(): number {\n return this.selectedAgents$.value.size;\n }\n\n get totalAgentCount(): number {\n return this.allAgents$.value.length;\n }\n\n get filteredCount(): number {\n return this.filteredAgents$.value.length;\n }\n\n @Output() DialogClose = new EventEmitter<void>();\n\n constructor(\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n this.initializeData();\n this.setupFiltering();\n this.preselectExistingAgents();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private async initializeData() {\n this.isLoading$.next(true);\n \n try {\n await this.loadAgentsAndTypes();\n } catch (error) {\n console.error('Error loading dialog data:', error);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private async loadAgentsAndTypes() {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n // Load both agents and types in a single batch for better performance\n const results = await rv.RunViews([\n // Root agents (index 0)\n {\n EntityName: 'MJ: AI Agents',\n ExtraFilter: `ParentID IS NULL AND ID != '${this.config.parentAgentId}' AND Status = 'Active' AND (ExposeAsAction = 0 OR ExposeAsAction IS NULL)`,\n OrderBy: 'Name',\n ResultType: 'entity_object',\n MaxRows: 1000\n },\n // Agent types (index 1)\n {\n EntityName: 'MJ: AI Agent Types',\n ExtraFilter: 'IsActive = 1',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n MaxRows: 1000\n }\n ]);\n\n // Process root agents (index 0)\n if (results[0].Success) {\n const agents: AgentDisplayItem[] = (results[0].Results || []).map(agent => ({\n ...agent.GetAll(),\n selected: false,\n typeName: agent.Type || 'Default'\n } as AgentDisplayItem));\n \n this.allAgents$.next(agents);\n }\n\n // Process agent types (index 1)\n if (results[1].Success) {\n this.agentTypes$.next(results[1].Results || []);\n }\n }\n\n private setupFiltering() {\n combineLatest([\n this.allAgents$,\n this.searchControl.valueChanges.pipe(\n debounceTime(300),\n distinctUntilChanged(),\n startWith('')\n ),\n this.selectedTypeId$\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(([agents, searchTerm, typeId]) => {\n this.filterAgents(agents, searchTerm || '', typeId);\n });\n }\n\n private filterAgents(agents: AgentDisplayItem[], searchTerm: string, typeId: string) {\n let filtered = [...agents];\n\n // Type filter\n if (typeId !== 'all') {\n filtered = filtered.filter(agent => UUIDsEqual(agent.TypeID, typeId));\n }\n\n // Search filter\n if (searchTerm) {\n const term = searchTerm.toLowerCase();\n filtered = filtered.filter(agent =>\n (agent.Name && agent.Name.toLowerCase().includes(term)) ||\n (agent.Description && agent.Description.toLowerCase().includes(term)) ||\n (agent.typeName && agent.typeName.toLowerCase().includes(term))\n );\n }\n\n this.filteredAgents$.next(filtered);\n }\n\n private preselectExistingAgents() {\n if (this.config.selectedAgentIds.length > 0) {\n const selected = new Set(this.config.selectedAgentIds);\n this.selectedAgents$.next(selected);\n \n // Update agent selection state\n const agents = this.allAgents$.value;\n agents.forEach(agent => {\n agent.selected = selected.has(agent.ID);\n });\n this.allAgents$.next(agents);\n }\n }\n\n // === UI Event Handlers ===\n\n selectType(typeId: string) {\n this.selectedTypeId$.next(typeId);\n }\n\n toggleAgentSelection(agent: AgentDisplayItem) {\n const selected = this.selectedAgents$.value;\n const agents = this.allAgents$.value;\n \n // Find the agent and toggle its selection\n const agentToUpdate = agents.find(a => UUIDsEqual(a.ID, agent.ID));\n if (agentToUpdate) {\n agentToUpdate.selected = !agentToUpdate.selected;\n \n if (agentToUpdate.selected) {\n if (!this.config.multiSelect) {\n // Single select mode - clear other selections\n selected.clear();\n agents.forEach(a => {\n if (!UUIDsEqual(a.ID, agent.ID)) {\n a.selected = false;\n }\n });\n }\n selected.add(agent.ID);\n } else {\n selected.delete(agent.ID);\n }\n \n this.selectedAgents$.next(new Set(selected));\n this.allAgents$.next(agents);\n \n // Update filtered agents to reflect selection state\n const filtered = this.filteredAgents$.value;\n const filteredAgent = filtered.find(a => UUIDsEqual(a.ID, agent.ID));\n if (filteredAgent) {\n filteredAgent.selected = agentToUpdate.selected;\n this.filteredAgents$.next(filtered);\n }\n }\n }\n\n clearSearch() {\n this.searchControl.reset();\n }\n\n getAgentIcon(agent: AgentDisplayItem): string {\n if (agent.IconClass) {\n return agent.IconClass;\n }\n return 'fa-solid fa-robot';\n }\n\n getAgentStatusColor(agent: AgentDisplayItem): string {\n switch (agent.Status) {\n case 'Active': return 'var(--mj-status-success)';\n case 'Disabled': return 'var(--mj-text-muted)';\n case 'Pending': return 'var(--mj-status-warning)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n // === Dialog Actions ===\n\n cancel() {\n this.result.next(null);\n this.DialogClose.emit();\n }\n\n createNew() {\n this.result.next({\n selectedAgents: [],\n createNew: true\n });\n this.DialogClose.emit();\n }\n\n async addSelectedAgents() {\n const selectedIds = this.selectedAgents$.value;\n const allAgents = this.allAgents$.value;\n \n // Get the selected agent display items\n const selectedDisplayItems = allAgents\n .filter(agent => selectedIds.has(agent.ID));\n \n // Convert AgentDisplayItem to MJAIAgentEntityExtended by casting (they have the same structure)\n const selectedAgents: MJAIAgentEntityExtended[] = selectedDisplayItems.map(item => item as MJAIAgentEntityExtended);\n \n this.result.next({\n selectedAgents,\n createNew: false\n });\n this.DialogClose.emit();\n }\n}","<!-- Sub-Agent Selector Dialog -->\n<div class=\"sub-agent-selector-dialog\">\n \n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <div class=\"header-info\">\n <h3>{{ config.title || 'Select Sub-Agents' }}</h3>\n <p class=\"header-description\">\n Choose existing root agents to convert into sub-agents. Only active agents without parents and not exposed as actions can be selected.\n </p>\n </div>\n <div class=\"header-stats\">\n @if (selectedCount > 0) {\n <span class=\"selection-count\">{{ selectedCount }} selected</span>\n }\n <span class=\"total-count\">{{ filteredCount }} of {{ totalAgentCount }} agents</span>\n </div>\n </div>\n\n <!-- Search and Filter Controls -->\n <div class=\"controls-section\">\n <div class=\"search-controls\">\n <div class=\"search-input\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n class=\"mj-input search-field\"\n [formControl]=\"searchControl\"\n placeholder=\"Search agents by name, description, or type...\">\n @if (searchControl.value) {\n <button mjButton\n variant=\"flat\"\n (click)=\"clearSearch()\"\n class=\"clear-search\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"filter-controls\">\n <div class=\"type-filter\">\n <label>Agent Type:</label>\n <mj-dropdown\n [ngModel]=\"selectedTypeId$ | async\"\n (ngModelChange)=\"selectType($any($event))\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [DefaultItem]=\"{ Name: 'All Types', ID: 'all' }\"\n [Data]=\"agentTypes$ | async\"\n class=\"type-dropdown\">\n </mj-dropdown>\n </div>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n <p>Loading available agents...</p>\n </div>\n } @else {\n \n <!-- Content Area -->\n <div class=\"content-area\">\n @if (filteredCount === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-robot\"></i>\n <h4>No agents found</h4>\n @if (totalAgentCount === 0) {\n <p>No eligible root agents are available to become sub-agents.</p>\n } @else {\n <p>Try adjusting your search criteria or selecting a different agent type.</p>\n <button mjButton (click)=\"clearSearch()\" variant=\"primary\">\n Clear Search\n </button>\n }\n </div>\n } @else {\n \n <!-- Agents Grid -->\n <div class=\"agents-grid\">\n @for (agent of (filteredAgents$ | async); track agent.ID) {\n <div class=\"agent-card\" \n [class.selected]=\"agent.selected\"\n (click)=\"toggleAgentSelection(agent)\">\n \n <!-- Selection Indicator -->\n <div class=\"selection-indicator\">\n @if (agent.selected) {\n <i class=\"fa-solid fa-check-circle\"></i>\n } @else {\n <i class=\"fa-regular fa-circle\"></i>\n }\n </div>\n \n <!-- Agent Icon/Logo -->\n <div class=\"agent-icon\">\n @if (agent.LogoURL) {\n <img [src]=\"agent.LogoURL\" [alt]=\"agent.Name + ' logo'\" class=\"agent-logo\">\n } @else {\n <i [class]=\"getAgentIcon(agent)\"></i>\n }\n </div>\n \n <!-- Agent Info -->\n <div class=\"agent-info\">\n <div class=\"agent-name\">{{ agent.Name }}</div>\n @if (agent.Description) {\n <div class=\"agent-description\">{{ agent.Description }}</div>\n }\n <div class=\"agent-meta\">\n @if (agent.Status) {\n <span class=\"status-badge\" [style.background-color]=\"getAgentStatusColor(agent)\">\n {{ agent.Status }}\n </span>\n }\n @if (agent.typeName) {\n <span class=\"type-badge\">{{ agent.typeName }}</span>\n }\n @if (agent.ExecutionMode) {\n <span class=\"execution-badge\">{{ agent.ExecutionMode }}</span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.showCreateNew) {\n <button mjButton\n variant=\"primary\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Sub-Agent\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n (click)=\"addSelectedAgents()\"\n [disabled]=\"selectedCount === 0\">\n @if (config.multiSelect) {\n Add {{ selectedCount > 0 ? selectedCount + ' ' : '' }}Sub-Agent{{ selectedCount !== 1 ? 's' : '' }}\n } @else {\n Add Sub-Agent\n }\n </button>\n </div>\n </div>\n</div>"]}
1
+ {"version":3,"file":"sub-agent-selector-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgents/sub-agent-selector-dialog.component.ts","../../../../src/lib/custom/AIAgents/sub-agent-selector-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { Subject, BehaviorSubject, combineLatest, debounceTime, distinctUntilChanged, takeUntil, startWith } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { MJAIAgentTypeEntity } from '@memberjunction/core-entities';\nimport { MJAIAgentEntityExtended } from \"@memberjunction/ai-core-plus\";\nimport { UUIDsEqual } from '@memberjunction/global';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface SubAgentSelectorResult {\n selectedAgents: MJAIAgentEntityExtended[];\n createNew: boolean;\n}\n\nexport interface SubAgentSelectorConfig {\n title: string;\n multiSelect: boolean;\n selectedAgentIds: string[];\n showCreateNew: boolean;\n parentAgentId: string; // To exclude from selection\n}\n\nexport interface AgentDisplayItem extends MJAIAgentEntityExtended {\n selected: boolean;\n typeName?: string;\n}\n\n/**\n * Sub-Agent Selector Dialog for selecting agents to convert to sub-agents.\n * Only shows agents with NULL ParentID (root agents) that can become sub-agents.\n */\n@Component({\n standalone: false,\n selector: 'mj-sub-agent-selector-dialog',\n templateUrl: './sub-agent-selector-dialog.component.html',\n styleUrls: ['./sub-agent-selector-dialog.component.css']\n})\nexport class SubAgentSelectorDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n \n // Input properties set by service\n config!: SubAgentSelectorConfig;\n \n // Reactive state management\n private destroy$ = new Subject<void>();\n public result = new Subject<SubAgentSelectorResult | null>();\n \n // Data streams\n allAgents$ = new BehaviorSubject<AgentDisplayItem[]>([]);\n agentTypes$ = new BehaviorSubject<MJAIAgentTypeEntity[]>([]);\n filteredAgents$ = new BehaviorSubject<AgentDisplayItem[]>([]);\n selectedAgents$ = new BehaviorSubject<Set<string>>(new Set());\n isLoading$ = new BehaviorSubject<boolean>(false);\n \n // UI state\n searchControl = new FormControl('');\n selectedTypeId$ = new BehaviorSubject<string>('all');\n \n // Computed values\n get selectedCount(): number {\n return this.selectedAgents$.value.size;\n }\n\n get totalAgentCount(): number {\n return this.allAgents$.value.length;\n }\n\n get filteredCount(): number {\n return this.filteredAgents$.value.length;\n }\n\n /** True when the empty list is the result of search/type filtering (vs. no eligible agents at all). */\n get IsAgentListNarrowed(): boolean {\n return this.totalAgentCount > 0;\n }\n\n /** Supporting copy for the no-agents empty state. */\n get NoAgentsMessage(): string {\n return this.IsAgentListNarrowed\n ? 'Try adjusting your search criteria or selecting a different agent type.'\n : 'No eligible root agents are available to become sub-agents.';\n }\n\n @Output() DialogClose = new EventEmitter<void>();\n\n constructor(\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n this.initializeData();\n this.setupFiltering();\n this.preselectExistingAgents();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private async initializeData() {\n this.isLoading$.next(true);\n \n try {\n await this.loadAgentsAndTypes();\n } catch (error) {\n console.error('Error loading dialog data:', error);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private async loadAgentsAndTypes() {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n // Load both agents and types in a single batch for better performance\n const results = await rv.RunViews([\n // Root agents (index 0)\n {\n EntityName: 'MJ: AI Agents',\n ExtraFilter: `ParentID IS NULL AND ID != '${this.config.parentAgentId}' AND Status = 'Active' AND (ExposeAsAction = 0 OR ExposeAsAction IS NULL)`,\n OrderBy: 'Name',\n ResultType: 'entity_object',\n MaxRows: 1000\n },\n // Agent types (index 1)\n {\n EntityName: 'MJ: AI Agent Types',\n ExtraFilter: 'IsActive = 1',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n MaxRows: 1000\n }\n ]);\n\n // Process root agents (index 0)\n if (results[0].Success) {\n const agents: AgentDisplayItem[] = (results[0].Results || []).map(agent => ({\n ...agent.GetAll(),\n selected: false,\n typeName: agent.Type || 'Default'\n } as AgentDisplayItem));\n \n this.allAgents$.next(agents);\n }\n\n // Process agent types (index 1)\n if (results[1].Success) {\n this.agentTypes$.next(results[1].Results || []);\n }\n }\n\n private setupFiltering() {\n combineLatest([\n this.allAgents$,\n this.searchControl.valueChanges.pipe(\n debounceTime(300),\n distinctUntilChanged(),\n startWith('')\n ),\n this.selectedTypeId$\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(([agents, searchTerm, typeId]) => {\n this.filterAgents(agents, searchTerm || '', typeId);\n });\n }\n\n private filterAgents(agents: AgentDisplayItem[], searchTerm: string, typeId: string) {\n let filtered = [...agents];\n\n // Type filter\n if (typeId !== 'all') {\n filtered = filtered.filter(agent => UUIDsEqual(agent.TypeID, typeId));\n }\n\n // Search filter\n if (searchTerm) {\n const term = searchTerm.toLowerCase();\n filtered = filtered.filter(agent =>\n (agent.Name && agent.Name.toLowerCase().includes(term)) ||\n (agent.Description && agent.Description.toLowerCase().includes(term)) ||\n (agent.typeName && agent.typeName.toLowerCase().includes(term))\n );\n }\n\n this.filteredAgents$.next(filtered);\n }\n\n private preselectExistingAgents() {\n if (this.config.selectedAgentIds.length > 0) {\n const selected = new Set(this.config.selectedAgentIds);\n this.selectedAgents$.next(selected);\n \n // Update agent selection state\n const agents = this.allAgents$.value;\n agents.forEach(agent => {\n agent.selected = selected.has(agent.ID);\n });\n this.allAgents$.next(agents);\n }\n }\n\n // === UI Event Handlers ===\n\n selectType(typeId: string) {\n this.selectedTypeId$.next(typeId);\n }\n\n toggleAgentSelection(agent: AgentDisplayItem) {\n const selected = this.selectedAgents$.value;\n const agents = this.allAgents$.value;\n \n // Find the agent and toggle its selection\n const agentToUpdate = agents.find(a => UUIDsEqual(a.ID, agent.ID));\n if (agentToUpdate) {\n agentToUpdate.selected = !agentToUpdate.selected;\n \n if (agentToUpdate.selected) {\n if (!this.config.multiSelect) {\n // Single select mode - clear other selections\n selected.clear();\n agents.forEach(a => {\n if (!UUIDsEqual(a.ID, agent.ID)) {\n a.selected = false;\n }\n });\n }\n selected.add(agent.ID);\n } else {\n selected.delete(agent.ID);\n }\n \n this.selectedAgents$.next(new Set(selected));\n this.allAgents$.next(agents);\n \n // Update filtered agents to reflect selection state\n const filtered = this.filteredAgents$.value;\n const filteredAgent = filtered.find(a => UUIDsEqual(a.ID, agent.ID));\n if (filteredAgent) {\n filteredAgent.selected = agentToUpdate.selected;\n this.filteredAgents$.next(filtered);\n }\n }\n }\n\n clearSearch() {\n this.searchControl.reset();\n }\n\n /**\n * Backs the no-results empty-state \"Clear Filters\" CTA. Unlike clearSearch (the\n * inline search-box X, which must only clear the search), this resets every\n * dimension the list narrows on — search AND the agent-type filter — so the CTA\n * actually returns results instead of appearing to do nothing.\n */\n clearFilters() {\n this.searchControl.reset();\n this.selectedTypeId$.next('all');\n }\n\n getAgentIcon(agent: AgentDisplayItem): string {\n if (agent.IconClass) {\n return agent.IconClass;\n }\n return 'fa-solid fa-robot';\n }\n\n getAgentStatusColor(agent: AgentDisplayItem): string {\n switch (agent.Status) {\n case 'Active': return 'var(--mj-status-success)';\n case 'Disabled': return 'var(--mj-text-muted)';\n case 'Pending': return 'var(--mj-status-warning)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n // === Dialog Actions ===\n\n cancel() {\n this.result.next(null);\n this.DialogClose.emit();\n }\n\n createNew() {\n this.result.next({\n selectedAgents: [],\n createNew: true\n });\n this.DialogClose.emit();\n }\n\n async addSelectedAgents() {\n const selectedIds = this.selectedAgents$.value;\n const allAgents = this.allAgents$.value;\n \n // Get the selected agent display items\n const selectedDisplayItems = allAgents\n .filter(agent => selectedIds.has(agent.ID));\n \n // Convert AgentDisplayItem to MJAIAgentEntityExtended by casting (they have the same structure)\n const selectedAgents: MJAIAgentEntityExtended[] = selectedDisplayItems.map(item => item as MJAIAgentEntityExtended);\n \n this.result.next({\n selectedAgents,\n createNew: false\n });\n this.DialogClose.emit();\n }\n}","<!-- Sub-Agent Selector Dialog -->\n<div class=\"sub-agent-selector-dialog\">\n \n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <div class=\"header-info\">\n <h3>{{ config.title || 'Select Sub-Agents' }}</h3>\n <p class=\"header-description\">\n Choose existing root agents to convert into sub-agents. Only active agents without parents and not exposed as actions can be selected.\n </p>\n </div>\n <div class=\"header-stats\">\n @if (selectedCount > 0) {\n <span class=\"selection-count\">{{ selectedCount }} selected</span>\n }\n <span class=\"total-count\">{{ filteredCount }} of {{ totalAgentCount }} agents</span>\n </div>\n </div>\n\n <!-- Search and Filter Controls -->\n <div class=\"controls-section\">\n <div class=\"search-controls\">\n <div class=\"search-input\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n class=\"mj-input search-field\"\n [formControl]=\"searchControl\"\n placeholder=\"Search agents by name, description, or type...\">\n @if (searchControl.value) {\n <button mjButton\n variant=\"flat\"\n (click)=\"clearSearch()\"\n class=\"clear-search\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"filter-controls\">\n <div class=\"type-filter\">\n <label>Agent Type:</label>\n <mj-dropdown\n [ngModel]=\"selectedTypeId$ | async\"\n (ngModelChange)=\"selectType($any($event))\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [DefaultItem]=\"{ Name: 'All Types', ID: 'all' }\"\n [Data]=\"agentTypes$ | async\"\n class=\"type-dropdown\">\n </mj-dropdown>\n </div>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin fa-2x\"></i>\n <p>Loading available agents...</p>\n </div>\n } @else {\n \n <!-- Content Area -->\n <div class=\"content-area\">\n @if (filteredCount === 0) {\n <mj-empty-state\n [Variant]=\"IsAgentListNarrowed ? 'no-results' : 'empty'\"\n Icon=\"fa-solid fa-robot\"\n Title=\"No agents found\"\n [Message]=\"NoAgentsMessage\"\n [ActionText]=\"IsAgentListNarrowed ? 'Clear Filters' : ''\"\n (Action)=\"clearFilters()\"\n Size=\"compact\" />\n } @else {\n \n <!-- Agents Grid -->\n <div class=\"agents-grid\">\n @for (agent of (filteredAgents$ | async); track agent.ID) {\n <div class=\"agent-card\" \n [class.selected]=\"agent.selected\"\n (click)=\"toggleAgentSelection(agent)\">\n \n <!-- Selection Indicator -->\n <div class=\"selection-indicator\">\n @if (agent.selected) {\n <i class=\"fa-solid fa-check-circle\"></i>\n } @else {\n <i class=\"fa-regular fa-circle\"></i>\n }\n </div>\n \n <!-- Agent Icon/Logo -->\n <div class=\"agent-icon\">\n @if (agent.LogoURL) {\n <img [src]=\"agent.LogoURL\" [alt]=\"agent.Name + ' logo'\" class=\"agent-logo\">\n } @else {\n <i [class]=\"getAgentIcon(agent)\"></i>\n }\n </div>\n \n <!-- Agent Info -->\n <div class=\"agent-info\">\n <div class=\"agent-name\">{{ agent.Name }}</div>\n @if (agent.Description) {\n <div class=\"agent-description\">{{ agent.Description }}</div>\n }\n <div class=\"agent-meta\">\n @if (agent.Status) {\n <span class=\"status-badge\" [style.background-color]=\"getAgentStatusColor(agent)\">\n {{ agent.Status }}\n </span>\n }\n @if (agent.typeName) {\n <span class=\"type-badge\">{{ agent.typeName }}</span>\n }\n @if (agent.ExecutionMode) {\n <span class=\"execution-badge\">{{ agent.ExecutionMode }}</span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (config.showCreateNew) {\n <button mjButton\n variant=\"primary\"\n (click)=\"createNew()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Sub-Agent\n </button>\n }\n </div>\n \n <div class=\"footer-right\">\n <button mjButton\n variant=\"flat\"\n (click)=\"cancel()\">\n Cancel\n </button>\n\n <button mjButton\n variant=\"primary\"\n (click)=\"addSelectedAgents()\"\n [disabled]=\"selectedCount === 0\">\n @if (config.multiSelect) {\n Add {{ selectedCount > 0 ? selectedCount + ' ' : '' }}Sub-Agent{{ selectedCount !== 1 ? 's' : '' }}\n } @else {\n Add Sub-Agent\n }\n </button>\n </div>\n </div>\n</div>"]}