@memberjunction/ng-core-entity-forms 5.11.0 → 5.12.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 (100) hide show
  1. package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js +2 -2
  2. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +2 -2
  3. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +2 -2
  4. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +8 -0
  5. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  6. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +199 -139
  7. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  8. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +2 -2
  9. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +2 -2
  10. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +2 -2
  11. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +6 -6
  12. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  13. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +2 -2
  14. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +6 -6
  15. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  16. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +2 -2
  17. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +2 -2
  18. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +4 -4
  19. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  20. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +2 -2
  21. package/dist/lib/custom/Actions/action-execution-log-form.component.js +4 -4
  22. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  23. package/dist/lib/custom/Actions/action-form.component.js +22 -22
  24. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  25. package/dist/lib/custom/Entities/entity-form.component.d.ts +11 -0
  26. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  27. package/dist/lib/custom/Entities/entity-form.component.js +244 -217
  28. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  29. package/dist/lib/custom/EntityActions/entityaction.form.component.js +2 -2
  30. package/dist/lib/custom/Lists/list-form.component.js +3 -3
  31. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  32. package/dist/lib/custom/Queries/query-category-dialog.component.js +3 -3
  33. package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -1
  34. package/dist/lib/custom/Queries/query-form.component.js +2 -2
  35. package/dist/lib/custom/Queries/query-run-dialog.component.js +3 -3
  36. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  37. package/dist/lib/custom/Templates/template-param-dialog.component.js +107 -111
  38. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  39. package/dist/lib/custom/Templates/template-params-grid.component.js +2 -2
  40. package/dist/lib/custom/Templates/templates-form.component.js +40 -43
  41. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  42. package/dist/lib/custom/Tests/entity-link-pill.component.js +2 -2
  43. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  44. package/dist/lib/custom/Tests/test-form.component.js +2 -2
  45. package/dist/lib/custom/Tests/test-rubric-form.component.js +2 -2
  46. package/dist/lib/custom/Tests/test-rubric-form.component.js.map +1 -1
  47. package/dist/lib/custom/Tests/test-run-feedback-form.component.js +2 -2
  48. package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
  49. package/dist/lib/custom/Tests/test-run-form.component.js +2 -2
  50. package/dist/lib/custom/Tests/test-suite-form.component.js +2 -2
  51. package/dist/lib/custom/Tests/test-suite-run-form.component.js +2 -2
  52. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +2 -2
  53. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +2 -2
  54. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +2 -2
  55. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +2 -2
  56. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts +1 -0
  57. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts.map +1 -1
  58. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +28 -18
  59. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -1
  60. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +2 -2
  61. package/dist/lib/custom/custom-forms.module.d.ts +2 -1
  62. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  63. package/dist/lib/custom/custom-forms.module.js +7 -3
  64. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  65. package/dist/lib/custom/shared/entity-selector-dialog.component.js +2 -2
  66. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  67. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +155 -153
  68. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  69. package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.d.ts +10 -0
  70. package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.d.ts.map +1 -0
  71. package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js +105 -0
  72. package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js.map +1 -0
  73. package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.d.ts.map +1 -1
  74. package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.js +31 -7
  75. package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.js.map +1 -1
  76. package/dist/lib/generated/Entities/MJAIAgentRequestType/mjaiagentrequesttype.form.component.d.ts +10 -0
  77. package/dist/lib/generated/Entities/MJAIAgentRequestType/mjaiagentrequesttype.form.component.d.ts.map +1 -0
  78. package/dist/lib/generated/Entities/MJAIAgentRequestType/mjaiagentrequesttype.form.component.js +89 -0
  79. package/dist/lib/generated/Entities/MJAIAgentRequestType/mjaiagentrequesttype.form.component.js.map +1 -0
  80. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
  81. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +50 -14
  82. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  83. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.d.ts.map +1 -1
  84. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +22 -4
  85. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
  86. package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.js +13 -11
  87. package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.js.map +1 -1
  88. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +83 -81
  89. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
  90. package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js +35 -33
  91. package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js.map +1 -1
  92. package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js +25 -19
  93. package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js.map +1 -1
  94. package/dist/lib/generated/generated-forms.module.d.ts +289 -287
  95. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  96. package/dist/lib/generated/generated-forms.module.js +102 -96
  97. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  98. package/dist/lib/shared/components/template-editor.component.js +85 -89
  99. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  100. package/package.json +31 -31
@@ -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 } from '@angular/core';\nimport { WindowRef } from '@progress/kendo-angular-dialog';\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\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 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 constructor(\n private dialogRef: WindowRef,\n private cdr: ChangeDetectorRef\n ) {}\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 = new RunView();\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 '#28a745';\n case 'Pending': return '#ffc107';\n case 'Disabled': return '#6c757d';\n default: return '#6c757d';\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.dialogRef.close();\n }\n\n createNew() {\n const result: PromptSelectorResult = {\n selectedPrompts: [],\n createNew: true\n };\n\n this.result.next(result);\n this.dialogRef.close();\n }\n\n cancel() {\n this.result.next(null);\n this.dialogRef.close();\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 <kendo-textbox \n [formControl]=\"searchControl\"\n placeholder=\"Search prompts by name or description...\"\n class=\"search-input\">\n </kendo-textbox>\n </div>\n \n <div class=\"view-controls\">\n <button kendoButton \n size=\"small\"\n fillMode=\"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 kendoButton \n look=\"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 kendoButton \n look=\"flat\" \n (click)=\"cancel()\">\n Cancel\n </button>\n \n <button kendoButton \n themeColor=\"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 } from '@angular/core';\nimport { WindowRef } from '@progress/kendo-angular-dialog';\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\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 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 constructor(\n private dialogRef: WindowRef,\n private cdr: ChangeDetectorRef\n ) {}\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 = new RunView();\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.dialogRef.close();\n }\n\n createNew() {\n const result: PromptSelectorResult = {\n selectedPrompts: [],\n createNew: true\n };\n\n this.result.next(result);\n this.dialogRef.close();\n }\n\n cancel() {\n this.result.next(null);\n this.dialogRef.close();\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 <kendo-textbox \n [formControl]=\"searchControl\"\n placeholder=\"Search prompts by name or description...\"\n class=\"search-input\">\n </kendo-textbox>\n </div>\n \n <div class=\"view-controls\">\n <button kendoButton \n size=\"small\"\n fillMode=\"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 kendoButton \n look=\"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 kendoButton \n look=\"flat\" \n (click)=\"cancel()\">\n Cancel\n </button>\n \n <button kendoButton \n themeColor=\"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>"]}
@@ -365,11 +365,11 @@ export class SubAgentAdvancedSettingsDialogComponent {
365
365
  i0.ɵɵproperty("disabled", i0.ɵɵpipeBind1(9, 8, ctx.isSaving$) || false || (i0.ɵɵpipeBind1(10, 10, ctx.isLoading$) || false) || ctx.hasExecutionOrderError());
366
366
  i0.ɵɵadvance(3);
367
367
  i0.ɵɵconditional(i0.ɵɵpipeBind1(12, 12, ctx.isSaving$) ? 11 : 13);
368
- } }, dependencies: [i2.ɵNgNoValidate, i2.NgControlStatus, i2.NgControlStatusGroup, i2.FormGroupDirective, i2.FormControlName, i3.NumericTextBoxComponent, i3.CheckBoxComponent, i4.ItemTemplateDirective, i4.DropDownListComponent, i5.ButtonComponent, i6.AsyncPipe], styles: [".sub-agent-advanced-settings-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n\n\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.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: #6c757d;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n margin-bottom: 1rem;\n}\n\n.loading-spinner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n}\n\n.loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin-top: 1rem;\n font-size: 1.1rem;\n}\n\n\n\n.advanced-form[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 1.5rem;\n}\n\n.form-section[_ngcontent-%COMP%] {\n margin-bottom: 2rem;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n overflow: hidden;\n}\n\n.section-title[_ngcontent-%COMP%] {\n margin: 0;\n padding: 1rem 1.5rem;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e0e0;\n color: #495057;\n font-size: 1.1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n}\n\n.form-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.5rem;\n padding: 1.5rem;\n}\n\n.form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n\n\nlabel[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #495057;\n font-size: 0.9rem;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 600;\n color: #495057;\n cursor: pointer;\n}\n\n.checkbox-label.disabled[_ngcontent-%COMP%] {\n color: #6c757d;\n cursor: not-allowed;\n}\n\n.form-control[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.field-hint[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 0.8rem;\n margin-top: 0.25rem;\n line-height: 1.3;\n}\n\n.disabled-hint[_ngcontent-%COMP%] {\n color: #999;\n font-style: italic;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.disabled-hint[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #17a2b8;\n}\n\n.field-error[_ngcontent-%COMP%] {\n color: #dc3545;\n font-size: 0.8rem;\n margin-top: 0.25rem;\n}\n\n\n\n.form-control.ng-invalid.ng-touched[_ngcontent-%COMP%], \n.error-border[_ngcontent-%COMP%] {\n border-color: #dc3545 !important;\n}\n\n.form-control.ng-valid.ng-touched[_ngcontent-%COMP%] {\n border-color: #28a745;\n}\n\n\n\n.execution-mode-option[_ngcontent-%COMP%] {\n padding: 0.5rem 0;\n}\n\n.option-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n}\n\n.option-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n width: 16px;\n}\n\n.option-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #333;\n font-size: 0.9rem;\n}\n\n.option-description[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: #666;\n line-height: 1.3;\n margin-left: 1.5rem;\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-top: 1px solid #e0e0e0;\n background: #f8f9fa;\n}\n\n.dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 120px;\n}\n\n.dialog-footer[_ngcontent-%COMP%] button[themeColor=\"primary\"][_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0.5rem;\n}\n\n\n\n\n\n\n.form-section[_ngcontent-%COMP%]:first-child .section-title[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #e3f2fd, #f8f9fa);\n}\n\n\n\n.form-section[_ngcontent-%COMP%]:nth-child(2) .section-title[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f3e5f5, #f8f9fa);\n}\n\n\n\n.form-section[_ngcontent-%COMP%]:nth-child(3) .section-title[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fff3e0, #f8f9fa);\n}\n\n\n\n@media (max-width: 768px) {\n .form-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 1rem;\n padding: 1rem;\n }\n \n .form-field.full-width[_ngcontent-%COMP%] {\n grid-column: 1;\n }\n \n .advanced-form[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n \n .section-title[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem;\n font-size: 1rem;\n }\n \n .dialog-footer[_ngcontent-%COMP%] {\n padding: 1rem;\n flex-direction: column;\n }\n \n .dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n width: 100%;\n }\n}\n\n\n\n.error-border[_ngcontent-%COMP%] {\n border: 2px solid #dc3545 !important;\n background-color: #fff5f5;\n}"] }); }
368
+ } }, dependencies: [i2.ɵNgNoValidate, i2.NgControlStatus, i2.NgControlStatusGroup, i2.FormGroupDirective, i2.FormControlName, i3.NumericTextBoxComponent, i3.CheckBoxComponent, i4.ItemTemplateDirective, i4.DropDownListComponent, i5.ButtonComponent, i6.AsyncPipe], styles: [".sub-agent-advanced-settings-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n\n\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.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--mj-text-muted);\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n margin-bottom: 1rem;\n}\n\n.loading-spinner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin-top: 1rem;\n font-size: 1.1rem;\n}\n\n\n\n.advanced-form[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 1.5rem;\n}\n\n.form-section[_ngcontent-%COMP%] {\n margin-bottom: 2rem;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n.section-title[_ngcontent-%COMP%] {\n margin: 0;\n padding: 1rem 1.5rem;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n font-size: 1.1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.form-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.5rem;\n padding: 1.5rem;\n}\n\n.form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n\n\nlabel[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.checkbox-label.disabled[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n cursor: not-allowed;\n}\n\n.form-control[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.field-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n margin-top: 0.25rem;\n line-height: 1.3;\n}\n\n.disabled-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-style: italic;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.disabled-hint[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.field-error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n font-size: 0.8rem;\n margin-top: 0.25rem;\n}\n\n\n\n.form-control.ng-invalid.ng-touched[_ngcontent-%COMP%], \n.error-border[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error) !important;\n}\n\n.form-control.ng-valid.ng-touched[_ngcontent-%COMP%] {\n border-color: var(--mj-status-success);\n}\n\n\n\n.execution-mode-option[_ngcontent-%COMP%] {\n padding: 0.5rem 0;\n}\n\n.option-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n}\n\n.option-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n width: 16px;\n}\n\n.option-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 0.9rem;\n}\n\n.option-description[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n line-height: 1.3;\n margin-left: 1.5rem;\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 120px;\n}\n\n.dialog-footer[_ngcontent-%COMP%] button[themeColor=\"primary\"][_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0.5rem;\n}\n\n\n\n\n\n\n.form-section[_ngcontent-%COMP%]:first-child .section-title[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n\n\n.form-section[_ngcontent-%COMP%]:nth-child(2) .section-title[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n\n\n.form-section[_ngcontent-%COMP%]:nth-child(3) .section-title[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface));\n}\n\n\n\n@media (max-width: 768px) {\n .form-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 1rem;\n padding: 1rem;\n }\n\n .form-field.full-width[_ngcontent-%COMP%] {\n grid-column: 1;\n }\n\n .advanced-form[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n\n .section-title[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem;\n font-size: 1rem;\n }\n\n .dialog-footer[_ngcontent-%COMP%] {\n padding: 1rem;\n flex-direction: column;\n }\n\n .dialog-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n width: 100%;\n }\n}\n\n\n\n.error-border[_ngcontent-%COMP%] {\n border: 2px solid var(--mj-status-error) !important;\n background-color: color-mix(in srgb, var(--mj-status-error) 4%, var(--mj-bg-surface));\n}"] }); }
369
369
  }
370
370
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SubAgentAdvancedSettingsDialogComponent, [{
371
371
  type: Component,
372
- args: [{ standalone: false, selector: 'mj-sub-agent-advanced-settings-dialog', template: "<!-- Sub-Agent Advanced Settings Dialog -->\n<div class=\"sub-agent-advanced-settings-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 sub-agent settings...</p>\n </div>\n } @else {\n \n <!-- Form Content -->\n <form [formGroup]=\"advancedForm\" class=\"advanced-form\">\n \n <!-- Execution Configuration Section -->\n <div class=\"form-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-play\"></i>\n Execution Configuration\n </h3>\n \n <div class=\"form-grid\">\n <!-- Execution Order -->\n <div class=\"form-field\">\n <label for=\"executionOrder\">Execution Order *</label>\n <kendo-numerictextbox \n formControlName=\"executionOrder\"\n [min]=\"0\"\n [format]=\"'0'\"\n [class.error-border]=\"hasExecutionOrderError()\"\n class=\"form-control\">\n </kendo-numerictextbox>\n @if (isFieldInvalid('executionOrder')) {\n <div class=\"field-error\">{{ getFieldError('executionOrder') }}</div>\n }\n @if (hasExecutionOrderError()) {\n <div class=\"field-error\">{{ executionOrderError }}</div>\n }\n <small class=\"field-hint\">Order in which this sub-agent executes among siblings (0 = first). Must be unique among sibling agents.</small>\n </div>\n \n <!-- Execution Mode -->\n <div class=\"form-field\">\n <label for=\"executionMode\">Execution Mode *</label>\n <kendo-dropdownlist \n formControlName=\"executionMode\"\n [data]=\"executionModeOptions\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n class=\"form-control\">\n <ng-template kendoDropDownListItemTemplate let-dataItem>\n <div class=\"execution-mode-option\">\n <div class=\"option-header\">\n <i class=\"fa-solid {{ dataItem.icon }}\"></i>\n <span class=\"option-title\">{{ dataItem.text }}</span>\n </div>\n <div class=\"option-description\">{{ dataItem.description }}</div>\n </div>\n </ng-template>\n </kendo-dropdownlist>\n @if (isFieldInvalid('executionMode')) {\n <div class=\"field-error\">{{ getFieldError('executionMode') }}</div>\n }\n <small class=\"field-hint\">{{ getExecutionModeDescription(advancedForm.get('executionMode')?.value) }}</small>\n </div>\n </div>\n </div>\n\n <!-- Agent Configuration Section -->\n <div class=\"form-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-robot\"></i>\n Agent Configuration\n </h3>\n \n <div class=\"form-grid\">\n <!-- Agent Type -->\n <div class=\"form-field\">\n <label for=\"typeID\">Agent Type</label>\n <kendo-dropdownlist \n formControlName=\"typeID\"\n [data]=\"agentTypes$ | async\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ Name: 'Default Type', ID: null }\"\n class=\"form-control\">\n </kendo-dropdownlist>\n <small class=\"field-hint\">Specialized agent type that defines behavior and capabilities</small>\n </div>\n \n <!-- Status -->\n <div class=\"form-field\">\n <label for=\"status\">Status *</label>\n <kendo-dropdownlist \n formControlName=\"status\"\n [data]=\"statusOptions\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n class=\"form-control\">\n </kendo-dropdownlist>\n @if (isFieldInvalid('status')) {\n <div class=\"field-error\">{{ getFieldError('status') }}</div>\n }\n <small class=\"field-hint\">Current operational status of this sub-agent</small>\n </div>\n </div>\n </div>\n\n <!-- Capability Restrictions Section -->\n <div class=\"form-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-shield-alt\"></i>\n Capability Restrictions\n </h3>\n \n <div class=\"form-grid\">\n <!-- Expose As Action (Disabled for Sub-Agents) -->\n <div class=\"form-field full-width\">\n <label class=\"checkbox-label disabled\">\n <kendo-checkbox \n formControlName=\"exposeAsAction\"\n [disabled]=\"true\">\n </kendo-checkbox>\n Expose As Action\n </label>\n <small class=\"field-hint disabled-hint\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Sub-agents cannot be exposed as actions. Only root agents (without parents) can be exposed as actions for use by other agents.\n </small>\n </div>\n </div>\n </div>\n </form>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <button kendoButton \n look=\"flat\" \n (click)=\"cancel()\"\n [disabled]=\"(isSaving$ | async) || false\">\n Cancel\n </button>\n \n <button kendoButton \n themeColor=\"primary\" \n (click)=\"save()\"\n [disabled]=\"((isSaving$ | async) || false) || ((isLoading$ | async) || false) || hasExecutionOrderError()\">\n @if (isSaving$ | async) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i>\n Save Settings\n }\n </button>\n </div>\n</div>", styles: [".sub-agent-advanced-settings-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n/* Ensure dialog appears above banner and other elements */\n:host ::ng-deep .k-dialog,\n:host ::ng-deep .k-window {\n z-index: 10000 !important;\n}\n\n:host ::ng-deep .k-overlay {\n z-index: 9999 !important;\n}\n\n/* === 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: #6c757d;\n}\n\n.loading-spinner {\n margin-bottom: 1rem;\n}\n\n.loading-spinner i {\n color: #2196f3;\n}\n\n.loading-state p {\n margin-top: 1rem;\n font-size: 1.1rem;\n}\n\n/* === Form Layout === */\n.advanced-form {\n flex: 1;\n overflow-y: auto;\n padding: 1.5rem;\n}\n\n.form-section {\n margin-bottom: 2rem;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n overflow: hidden;\n}\n\n.section-title {\n margin: 0;\n padding: 1rem 1.5rem;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e0e0;\n color: #495057;\n font-size: 1.1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.section-title i {\n color: #2196f3;\n}\n\n.form-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.5rem;\n padding: 1.5rem;\n}\n\n.form-field {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field.full-width {\n grid-column: 1 / -1;\n}\n\n/* === Form Controls === */\nlabel {\n font-weight: 600;\n color: #495057;\n font-size: 0.9rem;\n}\n\n.checkbox-label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 600;\n color: #495057;\n cursor: pointer;\n}\n\n.checkbox-label.disabled {\n color: #6c757d;\n cursor: not-allowed;\n}\n\n.form-control {\n width: 100%;\n}\n\n.field-hint {\n color: #6c757d;\n font-size: 0.8rem;\n margin-top: 0.25rem;\n line-height: 1.3;\n}\n\n.disabled-hint {\n color: #999;\n font-style: italic;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.disabled-hint i {\n color: #17a2b8;\n}\n\n.field-error {\n color: #dc3545;\n font-size: 0.8rem;\n margin-top: 0.25rem;\n}\n\n/* === Validation States === */\n.form-control.ng-invalid.ng-touched,\n.error-border {\n border-color: #dc3545 !important;\n}\n\n.form-control.ng-valid.ng-touched {\n border-color: #28a745;\n}\n\n/* === Execution Mode Option Template === */\n.execution-mode-option {\n padding: 0.5rem 0;\n}\n\n.option-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n}\n\n.option-header i {\n color: #2196f3;\n width: 16px;\n}\n\n.option-title {\n font-weight: 500;\n color: #333;\n font-size: 0.9rem;\n}\n\n.option-description {\n font-size: 0.8rem;\n color: #666;\n line-height: 1.3;\n margin-left: 1.5rem;\n}\n\n/* === Dialog Footer === */\n.dialog-footer {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-top: 1px solid #e0e0e0;\n background: #f8f9fa;\n}\n\n.dialog-footer button {\n min-width: 120px;\n}\n\n.dialog-footer button[themeColor=\"primary\"] i {\n margin-right: 0.5rem;\n}\n\n/* === Section-Specific Styling === */\n\n/* Execution Configuration */\n.form-section:first-child .section-title {\n background: linear-gradient(135deg, #e3f2fd, #f8f9fa);\n}\n\n/* Agent Configuration */\n.form-section:nth-child(2) .section-title {\n background: linear-gradient(135deg, #f3e5f5, #f8f9fa);\n}\n\n/* Capability Restrictions */\n.form-section:nth-child(3) .section-title {\n background: linear-gradient(135deg, #fff3e0, #f8f9fa);\n}\n\n/* === Responsive Design === */\n@media (max-width: 768px) {\n .form-grid {\n grid-template-columns: 1fr;\n gap: 1rem;\n padding: 1rem;\n }\n \n .form-field.full-width {\n grid-column: 1;\n }\n \n .advanced-form {\n padding: 1rem;\n }\n \n .section-title {\n padding: 0.75rem 1rem;\n font-size: 1rem;\n }\n \n .dialog-footer {\n padding: 1rem;\n flex-direction: column;\n }\n \n .dialog-footer button {\n width: 100%;\n }\n}\n\n/* === Error Highlighting === */\n.error-border {\n border: 2px solid #dc3545 !important;\n background-color: #fff5f5;\n}"] }]
372
+ args: [{ standalone: false, selector: 'mj-sub-agent-advanced-settings-dialog', template: "<!-- Sub-Agent Advanced Settings Dialog -->\n<div class=\"sub-agent-advanced-settings-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 sub-agent settings...</p>\n </div>\n } @else {\n \n <!-- Form Content -->\n <form [formGroup]=\"advancedForm\" class=\"advanced-form\">\n \n <!-- Execution Configuration Section -->\n <div class=\"form-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-play\"></i>\n Execution Configuration\n </h3>\n \n <div class=\"form-grid\">\n <!-- Execution Order -->\n <div class=\"form-field\">\n <label for=\"executionOrder\">Execution Order *</label>\n <kendo-numerictextbox \n formControlName=\"executionOrder\"\n [min]=\"0\"\n [format]=\"'0'\"\n [class.error-border]=\"hasExecutionOrderError()\"\n class=\"form-control\">\n </kendo-numerictextbox>\n @if (isFieldInvalid('executionOrder')) {\n <div class=\"field-error\">{{ getFieldError('executionOrder') }}</div>\n }\n @if (hasExecutionOrderError()) {\n <div class=\"field-error\">{{ executionOrderError }}</div>\n }\n <small class=\"field-hint\">Order in which this sub-agent executes among siblings (0 = first). Must be unique among sibling agents.</small>\n </div>\n \n <!-- Execution Mode -->\n <div class=\"form-field\">\n <label for=\"executionMode\">Execution Mode *</label>\n <kendo-dropdownlist \n formControlName=\"executionMode\"\n [data]=\"executionModeOptions\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n class=\"form-control\">\n <ng-template kendoDropDownListItemTemplate let-dataItem>\n <div class=\"execution-mode-option\">\n <div class=\"option-header\">\n <i class=\"fa-solid {{ dataItem.icon }}\"></i>\n <span class=\"option-title\">{{ dataItem.text }}</span>\n </div>\n <div class=\"option-description\">{{ dataItem.description }}</div>\n </div>\n </ng-template>\n </kendo-dropdownlist>\n @if (isFieldInvalid('executionMode')) {\n <div class=\"field-error\">{{ getFieldError('executionMode') }}</div>\n }\n <small class=\"field-hint\">{{ getExecutionModeDescription(advancedForm.get('executionMode')?.value) }}</small>\n </div>\n </div>\n </div>\n\n <!-- Agent Configuration Section -->\n <div class=\"form-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-robot\"></i>\n Agent Configuration\n </h3>\n \n <div class=\"form-grid\">\n <!-- Agent Type -->\n <div class=\"form-field\">\n <label for=\"typeID\">Agent Type</label>\n <kendo-dropdownlist \n formControlName=\"typeID\"\n [data]=\"agentTypes$ | async\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ Name: 'Default Type', ID: null }\"\n class=\"form-control\">\n </kendo-dropdownlist>\n <small class=\"field-hint\">Specialized agent type that defines behavior and capabilities</small>\n </div>\n \n <!-- Status -->\n <div class=\"form-field\">\n <label for=\"status\">Status *</label>\n <kendo-dropdownlist \n formControlName=\"status\"\n [data]=\"statusOptions\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n class=\"form-control\">\n </kendo-dropdownlist>\n @if (isFieldInvalid('status')) {\n <div class=\"field-error\">{{ getFieldError('status') }}</div>\n }\n <small class=\"field-hint\">Current operational status of this sub-agent</small>\n </div>\n </div>\n </div>\n\n <!-- Capability Restrictions Section -->\n <div class=\"form-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-shield-alt\"></i>\n Capability Restrictions\n </h3>\n \n <div class=\"form-grid\">\n <!-- Expose As Action (Disabled for Sub-Agents) -->\n <div class=\"form-field full-width\">\n <label class=\"checkbox-label disabled\">\n <kendo-checkbox \n formControlName=\"exposeAsAction\"\n [disabled]=\"true\">\n </kendo-checkbox>\n Expose As Action\n </label>\n <small class=\"field-hint disabled-hint\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Sub-agents cannot be exposed as actions. Only root agents (without parents) can be exposed as actions for use by other agents.\n </small>\n </div>\n </div>\n </div>\n </form>\n }\n\n <!-- Dialog Footer -->\n <div class=\"dialog-footer\">\n <button kendoButton \n look=\"flat\" \n (click)=\"cancel()\"\n [disabled]=\"(isSaving$ | async) || false\">\n Cancel\n </button>\n \n <button kendoButton \n themeColor=\"primary\" \n (click)=\"save()\"\n [disabled]=\"((isSaving$ | async) || false) || ((isLoading$ | async) || false) || hasExecutionOrderError()\">\n @if (isSaving$ | async) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i>\n Save Settings\n }\n </button>\n </div>\n</div>", styles: [".sub-agent-advanced-settings-dialog {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n/* Ensure dialog appears above banner and other elements */\n:host ::ng-deep .k-dialog,\n:host ::ng-deep .k-window {\n z-index: 10000 !important;\n}\n\n:host ::ng-deep .k-overlay {\n z-index: 9999 !important;\n}\n\n/* === 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-spinner {\n margin-bottom: 1rem;\n}\n\n.loading-spinner i {\n color: var(--mj-brand-primary);\n}\n\n.loading-state p {\n margin-top: 1rem;\n font-size: 1.1rem;\n}\n\n/* === Form Layout === */\n.advanced-form {\n flex: 1;\n overflow-y: auto;\n padding: 1.5rem;\n}\n\n.form-section {\n margin-bottom: 2rem;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n.section-title {\n margin: 0;\n padding: 1rem 1.5rem;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n font-size: 1.1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.section-title i {\n color: var(--mj-brand-primary);\n}\n\n.form-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.5rem;\n padding: 1.5rem;\n}\n\n.form-field {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field.full-width {\n grid-column: 1 / -1;\n}\n\n/* === Form Controls === */\nlabel {\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n}\n\n.checkbox-label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.checkbox-label.disabled {\n color: var(--mj-text-muted);\n cursor: not-allowed;\n}\n\n.form-control {\n width: 100%;\n}\n\n.field-hint {\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n margin-top: 0.25rem;\n line-height: 1.3;\n}\n\n.disabled-hint {\n color: var(--mj-text-disabled);\n font-style: italic;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.disabled-hint i {\n color: var(--mj-brand-primary);\n}\n\n.field-error {\n color: var(--mj-status-error);\n font-size: 0.8rem;\n margin-top: 0.25rem;\n}\n\n/* === Validation States === */\n.form-control.ng-invalid.ng-touched,\n.error-border {\n border-color: var(--mj-status-error) !important;\n}\n\n.form-control.ng-valid.ng-touched {\n border-color: var(--mj-status-success);\n}\n\n/* === Execution Mode Option Template === */\n.execution-mode-option {\n padding: 0.5rem 0;\n}\n\n.option-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n}\n\n.option-header i {\n color: var(--mj-brand-primary);\n width: 16px;\n}\n\n.option-title {\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 0.9rem;\n}\n\n.option-description {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n line-height: 1.3;\n margin-left: 1.5rem;\n}\n\n/* === Dialog Footer === */\n.dialog-footer {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.dialog-footer button {\n min-width: 120px;\n}\n\n.dialog-footer button[themeColor=\"primary\"] i {\n margin-right: 0.5rem;\n}\n\n/* === Section-Specific Styling === */\n\n/* Execution Configuration */\n.form-section:first-child .section-title {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n/* Agent Configuration */\n.form-section:nth-child(2) .section-title {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n/* Capability Restrictions */\n.form-section:nth-child(3) .section-title {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface));\n}\n\n/* === Responsive Design === */\n@media (max-width: 768px) {\n .form-grid {\n grid-template-columns: 1fr;\n gap: 1rem;\n padding: 1rem;\n }\n\n .form-field.full-width {\n grid-column: 1;\n }\n\n .advanced-form {\n padding: 1rem;\n }\n\n .section-title {\n padding: 0.75rem 1rem;\n font-size: 1rem;\n }\n\n .dialog-footer {\n padding: 1rem;\n flex-direction: column;\n }\n\n .dialog-footer button {\n width: 100%;\n }\n}\n\n/* === Error Highlighting === */\n.error-border {\n border: 2px solid var(--mj-status-error) !important;\n background-color: color-mix(in srgb, var(--mj-status-error) 4%, var(--mj-bg-surface));\n}\n"] }]
373
373
  }], () => [{ type: i1.WindowRef }, { type: i2.FormBuilder }, { type: i0.ChangeDetectorRef }], null); })();
374
374
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SubAgentAdvancedSettingsDialogComponent, { className: "SubAgentAdvancedSettingsDialogComponent", filePath: "src/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.ts", lineNumber: 29 }); })();
375
375
  //# sourceMappingURL=sub-agent-advanced-settings-dialog.component.js.map
@@ -364,10 +364,10 @@ export class SubAgentSelectorDialogComponent {
364
364
  }
365
365
  getAgentStatusColor(agent) {
366
366
  switch (agent.Status) {
367
- case 'Active': return '#28a745';
368
- case 'Disabled': return '#6c757d';
369
- case 'Pending': return '#ffc107';
370
- default: return '#6c757d';
367
+ case 'Active': return 'var(--mj-status-success)';
368
+ case 'Disabled': return 'var(--mj-text-muted)';
369
+ case 'Pending': return 'var(--mj-status-warning)';
370
+ default: return 'var(--mj-text-muted)';
371
371
  }
372
372
  }
373
373
  // === Dialog Actions ===
@@ -456,11 +456,11 @@ export class SubAgentSelectorDialogComponent {
456
456
  i0.ɵɵproperty("disabled", ctx.selectedCount === 0);
457
457
  i0.ɵɵadvance();
458
458
  i0.ɵɵconditional(ctx.config.multiSelect ? 34 : 35);
459
- } }, dependencies: [i2.NgControlStatus, i2.FormControlDirective, i3.TextBoxComponent, i4.DropDownListComponent, i5.ButtonComponent, i6.AsyncPipe], styles: [".sub-agent-selector-dialog[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #f8f9fa;\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: white;\n border-bottom: 1px solid #e9ecef;\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: #212529;\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n.header-description[_ngcontent-%COMP%] {\n margin: 0;\n color: #6c757d;\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: #0d6efd;\n font-weight: 600;\n}\n\n.total-count[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n\n\n.controls-section[_ngcontent-%COMP%] {\n padding: 1rem 1.5rem;\n background: white;\n border-bottom: 1px solid #e9ecef;\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: #6c757d;\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: #495057;\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: #6c757d;\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #0d6efd;\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: #6c757d;\n text-align: center;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: #dee2e6;\n margin-bottom: 1rem;\n}\n\n.empty-state[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 0.5rem 0;\n color: #495057;\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: white;\n border: 2px solid #e9ecef;\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: #0d6efd;\n box-shadow: 0 2px 8px rgba(13, 110, 253, 0.15);\n}\n\n.agent-card.selected[_ngcontent-%COMP%] {\n border-color: #0d6efd;\n background: #f8f9ff;\n box-shadow: 0 2px 8px rgba(13, 110, 253, 0.2);\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: #198754;\n}\n\n.selection-indicator[_ngcontent-%COMP%] .fa-circle[_ngcontent-%COMP%] {\n color: #dee2e6;\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: #f8f9fa;\n border: 1px solid #e9ecef;\n}\n\n.agent-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n color: #0d6efd;\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: #212529;\n margin-bottom: 0.5rem;\n word-wrap: break-word;\n}\n\n.agent-description[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n color: #6c757d;\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: white;\n}\n\n\n\n\n.type-badge[_ngcontent-%COMP%] {\n background: #6f42c1;\n}\n\n.execution-badge[_ngcontent-%COMP%] {\n background: #fd7e14;\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n padding: 1rem 1.5rem;\n background: white;\n border-top: 1px solid #e9ecef;\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: [i2.NgControlStatus, i2.FormControlDirective, i3.TextBoxComponent, i4.DropDownListComponent, i5.ButtonComponent, i6.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}"] }); }
460
460
  }
461
461
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SubAgentSelectorDialogComponent, [{
462
462
  type: Component,
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 <kendo-textbox \n [formControl]=\"searchControl\"\n placeholder=\"Search agents by name, description, or type...\"\n class=\"search-field\">\n </kendo-textbox>\n @if (searchControl.value) {\n <button kendoButton \n fillMode=\"flat\" \n size=\"small\"\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 <kendo-dropdownlist \n [value]=\"selectedTypeId$ | async\"\n (valueChange)=\"selectType($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 </kendo-dropdownlist>\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 kendoButton (click)=\"clearSearch()\" themeColor=\"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 kendoButton \n look=\"outline\"\n themeColor=\"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 kendoButton \n look=\"flat\" \n (click)=\"cancel()\">\n Cancel\n </button>\n \n <button kendoButton \n themeColor=\"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: #f8f9fa;\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: white;\n border-bottom: 1px solid #e9ecef;\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: #212529;\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n.header-description {\n margin: 0;\n color: #6c757d;\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: #0d6efd;\n font-weight: 600;\n}\n\n.total-count {\n color: #6c757d;\n}\n\n/* === Controls Section === */\n.controls-section {\n padding: 1rem 1.5rem;\n background: white;\n border-bottom: 1px solid #e9ecef;\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: #6c757d;\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: #495057;\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: #6c757d;\n}\n\n.loading-state i {\n color: #0d6efd;\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: #6c757d;\n text-align: center;\n}\n\n.empty-state i {\n font-size: 3rem;\n color: #dee2e6;\n margin-bottom: 1rem;\n}\n\n.empty-state h4 {\n margin: 0 0 0.5rem 0;\n color: #495057;\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: white;\n border: 2px solid #e9ecef;\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: #0d6efd;\n box-shadow: 0 2px 8px rgba(13, 110, 253, 0.15);\n}\n\n.agent-card.selected {\n border-color: #0d6efd;\n background: #f8f9ff;\n box-shadow: 0 2px 8px rgba(13, 110, 253, 0.2);\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: #198754;\n}\n\n.selection-indicator .fa-circle {\n color: #dee2e6;\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: #f8f9fa;\n border: 1px solid #e9ecef;\n}\n\n.agent-icon i {\n font-size: 1.5rem;\n color: #0d6efd;\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: #212529;\n margin-bottom: 0.5rem;\n word-wrap: break-word;\n}\n\n.agent-description {\n font-size: 0.85rem;\n color: #6c757d;\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: white;\n}\n\n/* Status badge color set dynamically via style binding */\n\n.type-badge {\n background: #6f42c1;\n}\n\n.execution-badge {\n background: #fd7e14;\n}\n\n/* === Dialog Footer === */\n.dialog-footer {\n padding: 1rem 1.5rem;\n background: white;\n border-top: 1px solid #e9ecef;\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}"] }]
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 <kendo-textbox \n [formControl]=\"searchControl\"\n placeholder=\"Search agents by name, description, or type...\"\n class=\"search-field\">\n </kendo-textbox>\n @if (searchControl.value) {\n <button kendoButton \n fillMode=\"flat\" \n size=\"small\"\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 <kendo-dropdownlist \n [value]=\"selectedTypeId$ | async\"\n (valueChange)=\"selectType($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 </kendo-dropdownlist>\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 kendoButton (click)=\"clearSearch()\" themeColor=\"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 kendoButton \n look=\"outline\"\n themeColor=\"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 kendoButton \n look=\"flat\" \n (click)=\"cancel()\">\n Cancel\n </button>\n \n <button kendoButton \n themeColor=\"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"] }]
464
464
  }], () => [{ type: i1.WindowRef }, { type: i0.ChangeDetectorRef }], null); })();
465
465
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SubAgentSelectorDialogComponent, { className: "SubAgentSelectorDialogComponent", filePath: "src/lib/custom/AIAgents/sub-agent-selector-dialog.component.ts", lineNumber: 38 }); })();
466
466
  //# sourceMappingURL=sub-agent-selector-dialog.component.js.map
@@ -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 } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { WindowRef } from '@progress/kendo-angular-dialog';\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\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 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 constructor(\n private dialogRef: WindowRef,\n private cdr: ChangeDetectorRef\n ) {}\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 = new RunView();\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 '#28a745';\n case 'Disabled': return '#6c757d';\n case 'Pending': return '#ffc107';\n default: return '#6c757d';\n }\n }\n\n // === Dialog Actions ===\n\n cancel() {\n this.result.next(null);\n this.dialogRef.close();\n }\n\n createNew() {\n this.result.next({\n selectedAgents: [],\n createNew: true\n });\n this.dialogRef.close();\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.dialogRef.close();\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 <kendo-textbox \n [formControl]=\"searchControl\"\n placeholder=\"Search agents by name, description, or type...\"\n class=\"search-field\">\n </kendo-textbox>\n @if (searchControl.value) {\n <button kendoButton \n fillMode=\"flat\" \n size=\"small\"\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 <kendo-dropdownlist \n [value]=\"selectedTypeId$ | async\"\n (valueChange)=\"selectType($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 </kendo-dropdownlist>\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 kendoButton (click)=\"clearSearch()\" themeColor=\"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 kendoButton \n look=\"outline\"\n themeColor=\"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 kendoButton \n look=\"flat\" \n (click)=\"cancel()\">\n Cancel\n </button>\n \n <button kendoButton \n themeColor=\"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 } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { WindowRef } from '@progress/kendo-angular-dialog';\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\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 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 constructor(\n private dialogRef: WindowRef,\n private cdr: ChangeDetectorRef\n ) {}\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 = new RunView();\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.dialogRef.close();\n }\n\n createNew() {\n this.result.next({\n selectedAgents: [],\n createNew: true\n });\n this.dialogRef.close();\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.dialogRef.close();\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 <kendo-textbox \n [formControl]=\"searchControl\"\n placeholder=\"Search agents by name, description, or type...\"\n class=\"search-field\">\n </kendo-textbox>\n @if (searchControl.value) {\n <button kendoButton \n fillMode=\"flat\" \n size=\"small\"\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 <kendo-dropdownlist \n [value]=\"selectedTypeId$ | async\"\n (valueChange)=\"selectType($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 </kendo-dropdownlist>\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 kendoButton (click)=\"clearSearch()\" themeColor=\"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 kendoButton \n look=\"outline\"\n themeColor=\"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 kendoButton \n look=\"flat\" \n (click)=\"cancel()\">\n Cancel\n </button>\n \n <button kendoButton \n themeColor=\"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>"]}