@memberjunction/ng-conversations 6.2.0-edge.4 → 6.2.0-edge.6

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 (144) hide show
  1. package/README.md +29 -0
  2. package/dist/lib/components/attachment/image-viewer.component.d.ts +3 -1
  3. package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
  4. package/dist/lib/components/attachment/image-viewer.component.js +5 -1
  5. package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
  6. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +1 -1
  7. package/dist/lib/components/conversation/conversation-agent-picker.component.js +3 -3
  8. package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
  9. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +88 -20
  10. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  11. package/dist/lib/components/conversation/conversation-chat-area.component.js +785 -387
  12. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  13. package/dist/lib/components/message/message-input.component.d.ts +60 -20
  14. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  15. package/dist/lib/components/message/message-input.component.js +290 -389
  16. package/dist/lib/components/message/message-input.component.js.map +1 -1
  17. package/dist/lib/components/message/message-item.component.d.ts +153 -17
  18. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  19. package/dist/lib/components/message/message-item.component.js +1400 -299
  20. package/dist/lib/components/message/message-item.component.js.map +1 -1
  21. package/dist/lib/components/message/message-list.component.d.ts +25 -2
  22. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  23. package/dist/lib/components/message/message-list.component.js +79 -40
  24. package/dist/lib/components/message/message-list.component.js.map +1 -1
  25. package/dist/lib/components/overlay/chat-overlay.component.d.ts +19 -0
  26. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  27. package/dist/lib/components/overlay/chat-overlay.component.js +125 -13
  28. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  29. package/dist/lib/components/project/project-form-modal.component.js +2 -2
  30. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  31. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +6 -1
  32. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  33. package/dist/lib/components/realtime/realtime-agent-banner.component.js +110 -82
  34. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  35. package/dist/lib/components/realtime/realtime-call-failure-notice.d.ts +13 -0
  36. package/dist/lib/components/realtime/realtime-call-failure-notice.d.ts.map +1 -0
  37. package/dist/lib/components/realtime/realtime-call-failure-notice.js +21 -0
  38. package/dist/lib/components/realtime/realtime-call-failure-notice.js.map +1 -0
  39. package/dist/lib/components/realtime/realtime-composer.component.js +114 -102
  40. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  41. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +21 -2
  42. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  43. package/dist/lib/components/realtime/realtime-session-overlay.component.js +113 -76
  44. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  45. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
  46. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +7 -1
  47. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
  48. package/dist/lib/components/sidebar/routines-section.component.js +1 -1
  49. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
  50. package/dist/lib/components/task/tasks-full-view.component.d.ts +152 -31
  51. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  52. package/dist/lib/components/task/tasks-full-view.component.js +2227 -214
  53. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  54. package/dist/lib/components/tasks/tasks-dropdown.component.js +4 -4
  55. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  56. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +11 -1
  57. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  58. package/dist/lib/components/workspace/conversation-workspace.component.js +25 -28
  59. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  60. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  61. package/dist/lib/services/agent-state.service.js +8 -8
  62. package/dist/lib/services/agent-state.service.js.map +1 -1
  63. package/dist/lib/services/browser-realtime-media-host.d.ts +7 -7
  64. package/dist/lib/services/browser-realtime-media-host.js +8 -78
  65. package/dist/lib/services/browser-realtime-media-host.js.map +1 -1
  66. package/dist/lib/services/conversation-agent.service.d.ts +53 -20
  67. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  68. package/dist/lib/services/conversation-agent.service.js +108 -54
  69. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  70. package/dist/lib/services/conversation-detail-window.store.d.ts +5 -0
  71. package/dist/lib/services/conversation-detail-window.store.d.ts.map +1 -1
  72. package/dist/lib/services/conversation-detail-window.store.js +52 -5
  73. package/dist/lib/services/conversation-detail-window.store.js.map +1 -1
  74. package/dist/lib/services/conversation-naming.d.ts.map +1 -1
  75. package/dist/lib/services/conversation-naming.js +9 -2
  76. package/dist/lib/services/conversation-naming.js.map +1 -1
  77. package/dist/lib/services/conversation-tasks-filter.d.ts +15 -0
  78. package/dist/lib/services/conversation-tasks-filter.d.ts.map +1 -0
  79. package/dist/lib/services/conversation-tasks-filter.js +69 -0
  80. package/dist/lib/services/conversation-tasks-filter.js.map +1 -0
  81. package/dist/lib/services/realtime-audio-recorder.d.ts +94 -86
  82. package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -1
  83. package/dist/lib/services/realtime-audio-recorder.js +222 -195
  84. package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
  85. package/dist/lib/services/realtime-session.service.d.ts +30 -2
  86. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  87. package/dist/lib/services/realtime-session.service.js +35 -7
  88. package/dist/lib/services/realtime-session.service.js.map +1 -1
  89. package/dist/lib/services/recording/libopus-wasm-binary.d.ts +3 -0
  90. package/dist/lib/services/recording/libopus-wasm-binary.d.ts.map +1 -0
  91. package/dist/lib/services/recording/libopus-wasm-binary.js +489 -0
  92. package/dist/lib/services/recording/libopus-wasm-binary.js.map +1 -0
  93. package/dist/lib/services/recording/libopus-worker-source.d.ts +48 -0
  94. package/dist/lib/services/recording/libopus-worker-source.d.ts.map +1 -0
  95. package/dist/lib/services/recording/libopus-worker-source.js +170 -0
  96. package/dist/lib/services/recording/libopus-worker-source.js.map +1 -0
  97. package/dist/lib/services/recording/linear-resampler.d.ts +45 -0
  98. package/dist/lib/services/recording/linear-resampler.d.ts.map +1 -0
  99. package/dist/lib/services/recording/linear-resampler.js +85 -0
  100. package/dist/lib/services/recording/linear-resampler.js.map +1 -0
  101. package/dist/lib/services/recording/opus-packet-encoder.d.ts +50 -0
  102. package/dist/lib/services/recording/opus-packet-encoder.d.ts.map +1 -0
  103. package/dist/lib/services/recording/opus-packet-encoder.js +41 -0
  104. package/dist/lib/services/recording/opus-packet-encoder.js.map +1 -0
  105. package/dist/lib/services/recording/wasm-opus-encoder.d.ts +86 -0
  106. package/dist/lib/services/recording/wasm-opus-encoder.d.ts.map +1 -0
  107. package/dist/lib/services/recording/wasm-opus-encoder.js +232 -0
  108. package/dist/lib/services/recording/wasm-opus-encoder.js.map +1 -0
  109. package/dist/lib/services/recording/webcodecs-opus-encoder.d.ts +39 -0
  110. package/dist/lib/services/recording/webcodecs-opus-encoder.d.ts.map +1 -0
  111. package/dist/lib/services/recording/webcodecs-opus-encoder.js +101 -0
  112. package/dist/lib/services/recording/webcodecs-opus-encoder.js.map +1 -0
  113. package/dist/lib/services/search.service.d.ts.map +1 -1
  114. package/dist/lib/services/search.service.js +3 -16
  115. package/dist/lib/services/search.service.js.map +1 -1
  116. package/dist/lib/utils/agent-failure-display.d.ts +14 -0
  117. package/dist/lib/utils/agent-failure-display.d.ts.map +1 -0
  118. package/dist/lib/utils/agent-failure-display.js +26 -0
  119. package/dist/lib/utils/agent-failure-display.js.map +1 -0
  120. package/dist/lib/utils/distinct-artifacts.d.ts +9 -3
  121. package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
  122. package/dist/lib/utils/distinct-artifacts.js +24 -5
  123. package/dist/lib/utils/distinct-artifacts.js.map +1 -1
  124. package/dist/lib/utils/message-list-order.d.ts +13 -0
  125. package/dist/lib/utils/message-list-order.d.ts.map +1 -0
  126. package/dist/lib/utils/message-list-order.js +31 -0
  127. package/dist/lib/utils/message-list-order.js.map +1 -0
  128. package/dist/lib/utils/pin-state.d.ts +11 -0
  129. package/dist/lib/utils/pin-state.d.ts.map +1 -0
  130. package/dist/lib/utils/pin-state.js +9 -0
  131. package/dist/lib/utils/pin-state.js.map +1 -0
  132. package/dist/public-api.d.ts +1 -0
  133. package/dist/public-api.d.ts.map +1 -1
  134. package/dist/public-api.js +1 -0
  135. package/dist/public-api.js.map +1 -1
  136. package/package.json +36 -36
  137. package/dist/lib/services/browser-recording-unload-guard.d.ts +0 -30
  138. package/dist/lib/services/browser-recording-unload-guard.d.ts.map +0 -1
  139. package/dist/lib/services/browser-recording-unload-guard.js +0 -43
  140. package/dist/lib/services/browser-recording-unload-guard.js.map +0 -1
  141. package/dist/lib/services/realtime-pcm-wav.d.ts +0 -79
  142. package/dist/lib/services/realtime-pcm-wav.d.ts.map +0 -1
  143. package/dist/lib/services/realtime-pcm-wav.js +0 -213
  144. package/dist/lib/services/realtime-pcm-wav.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tasks-full-view.component.js","sourceRoot":"","sources":["../../../../src/lib/components/task/tasks-full-view.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\nimport { UserInfo, RunView } from '@memberjunction/core';\nimport { MJTaskEntity, MJTaskDependencyEntity, MJAIAgentRunEntity } from '@memberjunction/core-entities';\nimport { TaskComponent } from '@memberjunction/ng-tasks';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Full-page tasks view with task list and Gantt chart\n * Generic component that displays tasks based on provided filter\n * Supports drilling into individual tasks to see sub-tasks\n */\n@Component({\n selector: 'mj-tasks-full-view',\n standalone: true,\n imports: [TaskComponent],\n template: `\n <div class=\"tasks-full-view\">\n @if (!selectedTask) {\n <!-- Task List View -->\n <mj-task\n [tasks]=\"filteredTasks\"\n [title]=\"'Tasks'\"\n [description]=\"getDescription()\"\n [showHeader]=\"true\"\n [showViewToggle]=\"false\"\n [viewMode]=\"'simple'\"\n (taskClicked)=\"onTaskClick($event)\">\n </mj-task>\n } @else {\n <!-- Task Detail View with Sub-tasks -->\n <div class=\"task-detail-view\" [class.swoosh-in]=\"showDetailAnimation\">\n <!-- Breadcrumb -->\n <div class=\"breadcrumb-nav\">\n <button class=\"breadcrumb-back\" (click)=\"backToTaskList()\">\n <i class=\"fas fa-arrow-left\"></i>\n <span>Back to Tasks</span>\n </button>\n <div class=\"breadcrumb-divider\">/</div>\n <span class=\"breadcrumb-current\">{{ selectedTask.Name }}</span>\n </div>\n\n <!-- Task Details & Sub-tasks with Gantt Toggle -->\n <mj-task\n [tasks]=\"subTasks\"\n [ganttTasks]=\"subTasksWithParent\"\n [taskDependencies]=\"taskDependencies\"\n [agentRunMap]=\"agentRunMap\"\n [title]=\"selectedTask.Name\"\n [description]=\"getTaskDetailDescription()\"\n [showHeader]=\"true\"\n [showViewToggle]=\"true\"\n [viewMode]=\"'gantt'\"\n (taskClicked)=\"onSubTaskClick($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-task>\n </div>\n }\n </div>\n `,\n styles: [`\n .tasks-full-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n }\n\n .task-detail-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n }\n\n .swoosh-in {\n animation: swooshIn 0.3s ease-out;\n }\n\n @keyframes swooshIn {\n from {\n opacity: 0;\n transform: translateX(50px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n .breadcrumb-nav {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .breadcrumb-back {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .breadcrumb-back:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .breadcrumb-back i {\n font-size: 12px;\n }\n\n .breadcrumb-divider {\n color: var(--mj-text-disabled);\n font-size: 14px;\n }\n\n .breadcrumb-current {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n `]\n})\nexport class TasksFullViewComponent extends BaseAngularComponent implements OnInit, OnChanges {\n @Input() EnvironmentId!: string;\n\n /** @deprecated Use {@link EnvironmentId}. */\n @Input() set environmentId(value: string) {\n this.EnvironmentId = value;\n }\n /** @deprecated Use {@link EnvironmentId}. */\n get environmentId(): string {\n return this.EnvironmentId;\n }\n @Input() CurrentUser!: UserInfo;\n\n /** @deprecated Use {@link CurrentUser}. */\n @Input() set currentUser(value: UserInfo) {\n this.CurrentUser = value;\n }\n /** @deprecated Use {@link CurrentUser}. */\n get currentUser(): UserInfo {\n return this.CurrentUser;\n }\n @Input() BaseFilter: string = '1=1';\n\n /** @deprecated Use {@link BaseFilter}. */\n @Input() set baseFilter(value: string) {\n this.BaseFilter = value;\n }\n /** @deprecated Use {@link BaseFilter}. */\n get baseFilter(): string {\n return this.BaseFilter;\n } // SQL filter for tasks (default: show all)\n @Input() ActiveTaskId?: string;\n\n /** @deprecated Use {@link ActiveTaskId}. */\n @Input() set activeTaskId(value: string | undefined) {\n this.ActiveTaskId = value;\n }\n /** @deprecated Use {@link ActiveTaskId}. */\n get activeTaskId(): string | undefined {\n return this.ActiveTaskId;\n } // Task ID to auto-select and drill into\n @Output() OpenEntityRecord = new EventEmitter<{ entityName: string; recordId: string }>();\n\n /**\n * @deprecated Use {@link OpenEntityRecord}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openEntityRecord = this.OpenEntityRecord;\n @Output() TaskSelected = new EventEmitter<string | null>();\n\n /**\n * @deprecated Use {@link TaskSelected}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (taskSelected) keeps working. Must stay AFTER TaskSelected: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() taskSelected = this.TaskSelected; // Emits task ID when drill-down occurs, null when returning to list\n\n public AllTasks: MJTaskEntity[] = [];\n\n /** @deprecated Use {@link AllTasks}. */\n public get allTasks(): MJTaskEntity[] {\n return this.AllTasks;\n }\n /** @deprecated Use {@link AllTasks}. */\n public set allTasks(value: MJTaskEntity[]) {\n this.AllTasks = value;\n }\n public FilteredTasks: MJTaskEntity[] = [];\n\n /** @deprecated Use {@link FilteredTasks}. */\n public get filteredTasks(): MJTaskEntity[] {\n return this.FilteredTasks;\n }\n /** @deprecated Use {@link FilteredTasks}. */\n public set filteredTasks(value: MJTaskEntity[]) {\n this.FilteredTasks = value;\n }\n public SubTasks: MJTaskEntity[] = [];\n\n /** @deprecated Use {@link SubTasks}. */\n public get subTasks(): MJTaskEntity[] {\n return this.SubTasks;\n }\n /** @deprecated Use {@link SubTasks}. */\n public set subTasks(value: MJTaskEntity[]) {\n this.SubTasks = value;\n }\n public SubTasksWithParent: MJTaskEntity[] = [];\n\n /** @deprecated Use {@link SubTasksWithParent}. */\n public get subTasksWithParent(): MJTaskEntity[] {\n return this.SubTasksWithParent;\n }\n /** @deprecated Use {@link SubTasksWithParent}. */\n public set subTasksWithParent(value: MJTaskEntity[]) {\n this.SubTasksWithParent = value;\n } // Includes parent for Gantt hierarchy\n public TaskDependencies: MJTaskDependencyEntity[] = [];\n\n /** @deprecated Use {@link TaskDependencies}. */\n public get taskDependencies(): MJTaskDependencyEntity[] {\n return this.TaskDependencies;\n }\n /** @deprecated Use {@link TaskDependencies}. */\n public set taskDependencies(value: MJTaskDependencyEntity[]) {\n this.TaskDependencies = value;\n } // Dependencies for Gantt links\n public AgentRunMap = new Map<string, string>();\n\n /** @deprecated Use {@link AgentRunMap}. */\n public get agentRunMap() {\n return this.AgentRunMap;\n }\n /** @deprecated Use {@link AgentRunMap}. */\n public set agentRunMap(value) {\n this.AgentRunMap = value;\n } // Maps TaskID -> AgentRunID\n public SelectedTask: MJTaskEntity | null = null;\n\n /** @deprecated Use {@link SelectedTask}. */\n public get selectedTask(): MJTaskEntity | null {\n return this.SelectedTask;\n }\n /** @deprecated Use {@link SelectedTask}. */\n public set selectedTask(value: MJTaskEntity | null) {\n this.SelectedTask = value;\n }\n public ShowDetailAnimation: boolean = false;\n\n /** @deprecated Use {@link ShowDetailAnimation}. */\n public get showDetailAnimation(): boolean {\n return this.ShowDetailAnimation;\n }\n /** @deprecated Use {@link ShowDetailAnimation}. */\n public set showDetailAnimation(value: boolean) {\n this.ShowDetailAnimation = value;\n }\n public isLoading: boolean = false;\n private aiEngineConfigured: boolean = false;\n\n ngOnInit() {\n this.LoadTasks();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // Reload tasks if baseFilter changes\n if (changes['baseFilter'] && !changes['baseFilter'].firstChange) {\n this.LoadTasks();\n }\n\n // Auto-drill into task if activeTaskId changes\n if (changes['activeTaskId'] && this.ActiveTaskId) {\n const task = this.AllTasks.find(t => UUIDsEqual(t.ID, this.ActiveTaskId));\n if (task) {\n this.OnTaskClick(task);\n }\n }\n }\n\n public async LoadTasks(): Promise<void> {\n this.isLoading = true;\n\n try {\n // Configure AIEngineBase on first load (false = don't force refresh)\n if (!this.aiEngineConfigured) {\n await AIEngineBase.Instance.Config(false);\n this.aiEngineConfigured = true;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n console.log('📝 Tasks filter SQL:', this.BaseFilter);\n\n // Load all tasks with the provided filter\n const tasksResult = await rv.RunView<MJTaskEntity>(\n {\n EntityName: 'MJ: Tasks',\n ExtraFilter: this.BaseFilter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.CurrentUser\n );\n\n console.log('📊 Tasks query result:', {\n success: tasksResult.Success,\n resultCount: tasksResult.Results?.length || 0,\n errorMessage: tasksResult.ErrorMessage\n });\n\n if (tasksResult.Success) {\n this.AllTasks = tasksResult.Results || [];\n this.FilteredTasks = this.AllTasks;\n console.log(`📋 Loaded ${this.AllTasks.length} tasks`);\n if (this.AllTasks.length === 0) {\n console.log('💡 No tasks found with current filter');\n } else {\n console.log('✅ Sample task:', {\n id: this.AllTasks[0].ID,\n name: this.AllTasks[0].Name,\n status: this.AllTasks[0].Status,\n conversationDetailID: this.AllTasks[0].ConversationDetailID\n });\n }\n } else {\n console.error('❌ Failed to load tasks:', tasksResult.ErrorMessage);\n this.AllTasks = [];\n this.FilteredTasks = [];\n }\n } catch (error) {\n console.error('Failed to load tasks:', error);\n this.AllTasks = [];\n this.FilteredTasks = [];\n } finally {\n this.isLoading = false;\n }\n }\n\n /** @deprecated Use {@link LoadTasks}. */\n public async loadTasks(): Promise<void> {\n return this.LoadTasks();\n }\n\n public async OnTaskClick(task: MJTaskEntity): Promise<void> {\n console.log('Task clicked:', task);\n this.SelectedTask = task;\n this.ShowDetailAnimation = true;\n\n // Emit task selection event for URL tracking\n this.TaskSelected.emit(task.ID);\n\n // Load all tasks in the hierarchy using RootParentID\n await this.loadTaskHierarchy(task);\n }\n\n /** @deprecated Use {@link OnTaskClick}. */\n public async onTaskClick(task: MJTaskEntity): Promise<void> {\n return this.OnTaskClick(task);\n }\n\n private async loadTaskHierarchy(task: MJTaskEntity): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Use RootParentID to load all tasks in this hierarchy\n // If task has no RootParentID, it's the root itself, so use its ID\n const rootId = task.RootParentID || task.ID;\n\n // Load all tasks where RootParentID matches, or tasks that are the root itself\n const hierarchyResult = await rv.RunView<MJTaskEntity>(\n {\n EntityName: 'MJ: Tasks',\n ExtraFilter: `RootParentID='${rootId}' OR ID='${rootId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.CurrentUser\n );\n\n if (hierarchyResult.Success) {\n const allHierarchy = hierarchyResult.Results || [];\n\n // For list view: Filter out the clicked task itself - only show its children/descendants\n this.SubTasks = allHierarchy.filter(t => !UUIDsEqual(t.ID, task.ID));\n\n // For Gantt view: Include the parent task so hierarchy works correctly\n this.SubTasksWithParent = allHierarchy;\n\n console.log(`📋 Loaded ${this.SubTasks.length} tasks in hierarchy for root ${rootId}`);\n\n // Load task dependencies for this hierarchy\n await this.loadTaskDependencies(rootId);\n\n // Load agent runs for this hierarchy\n this.loadAgentRuns(allHierarchy);\n } else {\n console.error('❌ Failed to load task hierarchy:', hierarchyResult.ErrorMessage);\n this.SubTasks = [];\n this.SubTasksWithParent = [];\n this.TaskDependencies = [];\n }\n } catch (error) {\n console.error('Failed to load task hierarchy:', error);\n this.SubTasks = [];\n }\n }\n\n private async loadTaskDependencies(rootId: string): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Load task dependencies where either TaskID or DependsOnTaskID is in this hierarchy\n // Use subquery to find all tasks with this RootParentID\n // Note: Using __mj as the default schema - this is the standard MJ schema\n const schema = '__mj';\n const depsResult = await rv.RunView<MJTaskDependencyEntity>(\n {\n EntityName: 'MJ: Task Dependencies',\n ExtraFilter: `\n TaskID IN (SELECT ID FROM [${schema}].[vwTasks] WHERE RootParentID='${rootId}' OR ID='${rootId}')\n OR\n DependsOnTaskID IN (SELECT ID FROM [${schema}].[vwTasks] WHERE RootParentID='${rootId}' OR ID='${rootId}')\n `,\n ResultType: 'entity_object'\n },\n this.CurrentUser\n );\n\n if (depsResult.Success) {\n this.TaskDependencies = depsResult.Results || [];\n console.log(`🔗 Loaded ${this.TaskDependencies.length} task dependencies`);\n } else {\n console.error('❌ Failed to load task dependencies:', depsResult.ErrorMessage);\n this.TaskDependencies = [];\n }\n } catch (error) {\n console.error('Failed to load task dependencies:', error);\n this.TaskDependencies = [];\n }\n }\n\n /**\n * Builds the TaskID -> AgentRunID map from each task's own AgentRunID column.\n *\n * Previously this joined tasks to runs through the shared ConversationDetailID, which meant\n * every sibling task in a graph resolved to the SAME agent run — the run link in the Gantt\n * and detail panel was wrong for all but one task. Each task now records the specific run\n * that executed it (Task.AgentRunID), so the mapping is direct and needs no query at all.\n */\n private loadAgentRuns(tasks: MJTaskEntity[]): void {\n this.AgentRunMap.clear();\n for (const task of tasks) {\n if (task.AgentRunID) {\n this.AgentRunMap.set(task.ID, task.AgentRunID);\n }\n }\n }\n\n public BackToTaskList(): void {\n this.SelectedTask = null;\n this.SubTasks = [];\n this.SubTasksWithParent = [];\n this.TaskDependencies = [];\n this.AgentRunMap.clear();\n this.ShowDetailAnimation = false;\n\n // Emit null to indicate returning to task list (for URL tracking)\n this.TaskSelected.emit(null);\n }\n\n /** @deprecated Use {@link BackToTaskList}. */\n public backToTaskList(): void {\n return this.BackToTaskList();\n }\n\n public OnSubTaskClick(subTask: MJTaskEntity): void {\n console.log('Sub-task clicked:', subTask);\n // Could drill down further if needed\n }\n\n /** @deprecated Use {@link OnSubTaskClick}. */\n public onSubTaskClick(subTask: MJTaskEntity): void {\n return this.OnSubTaskClick(subTask);\n }\n\n public OnOpenEntityRecord(event: { entityName: string; recordId: string }): void {\n // Bubble up the event to parent component\n this.OpenEntityRecord.emit(event);\n }\n\n /** @deprecated Use {@link OnOpenEntityRecord}. */\n public onOpenEntityRecord(event: { entityName: string; recordId: string }): void {\n return this.OnOpenEntityRecord(event);\n }\n\n public getDescription(): string {\n const activeCount = this.AllTasks.filter(t => t.Status === 'Pending' || t.Status === 'In Progress').length;\n const completedCount = this.AllTasks.filter(t => t.Status === 'Complete').length;\n return `${activeCount} active, ${completedCount} completed, ${this.AllTasks.length} total`;\n }\n\n public GetTaskDetailDescription(): string {\n if (this.SubTasks.length === 0) {\n return 'No sub-tasks';\n }\n const activeCount = this.SubTasks.filter(t => t.Status === 'Pending' || t.Status === 'In Progress').length;\n const completedCount = this.SubTasks.filter(t => t.Status === 'Complete').length;\n return `${activeCount} active, ${completedCount} completed, ${this.SubTasks.length} sub-tasks`;\n }\n\n /** @deprecated Use {@link GetTaskDetailDescription}. */\n public getTaskDetailDescription(): string {\n return this.GetTaskDetailDescription();\n }\n}\n"]}
1
+ {"version":3,"file":"tasks-full-view.component.js","sourceRoot":"","sources":["../../../../src/lib/components/task/tasks-full-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,KAAK,EACL,MAAM,EACN,YAAY,EAKZ,iBAAiB,EACjB,MAAM,EACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAY,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;;;;;;;IAqG3F,+BAA2B;IACzB,2BAAiC;IACjC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,yEACF;;;;IAyHJ,kCAA2F;IAA7C,2LAAS,oBAAa,KAAC;IACnE,wBAAiC;IACnC,iBAAS;;;IAoDL,kCAAwB;IAAA,YAA8B;IAAA,iBAAS;;;IAAvD,gCAAe;IAAC,cAA8B;IAA9B,6DAA8B;;;;IAT5D,+BAA6B;IAC3B,wBAAsD;IACtD,kCAI0C;IADxC,kNAAiB,6BAAsB,KAAC;IAExC,kCAAoB;IAAA,YAAoD;IAAA,iBAAS;IACjF,6GAEC;IAEL,AADE,iBAAS,EACL;;;IARF,eAA+B;IAA/B,oDAA+B;IAGX,eAAoD;IAApD,oFAAoD;IACxE,cAEC;IAFD,qCAEC;;;IAWD,AADF,+BAA4B,cACC;IACzB,wBAAgD;IAClD,iBAAM;IACN,0BAAI;IAAA,6CAA6B;IAAA,iBAAK;IACtC,yBAAG;IAAA,mGAAmF;IACxF,AADwF,iBAAI,EACtF;;;IAOF,0BAAI;IAAA,+CAA+B;IAAA,iBAAK;IACxC,yBAAG;IAAA,wKAAwJ;IAAA,iBAAI;;;;IAE/J,0BAAI;IAAA,+CAA+B;IAAA,iBAAK;IACxC,yBAAG;IAAA,iGAAiF;IAAA,iBAAI;IACxF,kCAA+E;IAA5B,2MAAS,wBAAiB,KAAC;IAC5E,wBAAuC;IACvC,4BAAM;IAAA,6BAAa;IACrB,AADqB,iBAAO,EACnB;;;IAZX,AADF,+BAA4B,cACC;IACzB,uBAA2C;IAC7C,iBAAM;IAIJ,AAHF,8FAAmC,wEAG1B;IAQX,iBAAM;;;IAXJ,eAUC;IAVD,4DAUC;;;IAmBW,wBAAiC;;;IAEjC,wBAAgD;;;IAEhD,wBAAgD;;;IA4B1C,wBAAyD;;;;IAT3D,kCAIgC;IAD9B,sPAAS,2CAAiC,KAAC;IAE3C,wBAAiC;IACjC,4BAAM;IAAA,YAAa;IACrB,AADqB,iBAAO,EACnB;IACT,kIAAe;;;;;IAJb,uBAAA,yCAA6B,CAAA;IAEvB,eAAa;IAAb,gCAAa;IAErB,cAEC;IAFD,qEAEC;;;IAZL,+BAAkC;IAChC,gIAYC;IACH,iBAAM;;;IAbJ,cAYC;IAZD,qCAYC;;;IAQL,gCAAuE;IACrE,wBAAmC;IACnC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,sDACF;;;IA0BA,YACF;;;IADE,qEACF;;;IAgBM,wBAAiC;;;IAEjC,wBAA2C;;;IAE3C,wBAAwC;;;IAExC,wBAAiC;;;IAEjC,4BAAM;IAAA,YAAqB;IAAA,iBAAO;;;IAA5B,cAAqB;IAArB,yCAAqB;;;IASzB,iCAAgC;IAC9B,wBAAiC;IACjC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,mDACF;;;IAIA,iCAAsF;IACpF,yBAAgC;IAChC,YACF;IAAA,iBAAO;;;IAHuB,uBAAA,oEAAuD,CAAA;IAEnF,eACF;IADE,yEACF;;;IAKF,8BAAsE;IACpE,YACF;IAAA,iBAAI;;;IAFuB,uDAA0C;IACnE,cACF;IADE,uDACF;;;IAMA,iCAA+B;IAAA,YAAuB;IAAA,iBAAO;;;IAA9B,cAAuB;IAAvB,2CAAuB;;;;IAMtD,mCAIsC;IADpC,+QAAS,yDAA8C,KAAC;IAExD,yBAAsD;IACxD,iBAAS;;;;IA5Df,+BAIsD;IAApD,wRAAS,uDAAyC,KAAC;IAEnD,+BAAkF;IAS9E,AAFA,AAFA,AAFA,AAFF,oHAAuC,8FAEU,8FAEJ,8FAEmC,6FAEvE;IAGX,iBAAM;IAIF,AADF,AADF,+BAA0B,cACM,gBACD;IAAA,aAAoB;IAAA,iBAAO;IAEtD,0HAAsB;IAOtB,0HAAsC;IAMxC,iBAAM;IAEN,uHAA0B;IAK5B,iBAAM;IAEN,iCAA2B;IACzB,0HAAyB;IAGzB,kCAAyF;IACvF,aACF;IAAA,iBAAO;IACP,4HAAuB;IAU3B,AADE,iBAAM,EACF;;;;IA7DJ,sEAAkD;;IAIvB,cAAsD;;IAC/E,cAUC;IAVD,mOAUC;IAK4B,eAAoB;IAApB,wCAAoB;IAE/C,cAKC;IALD,8CAKC;IAED,cAKC;IALD,8DAKC;IAGH,cAIC;IAJD,kDAIC;IAID,eAEC;IAFD,iDAEC;IACiC,cAAsD;;IACtF,cACF;IADE,qDACF;IACA,cAQC;IARD,+CAQC;;;;IA1JX,mCAMwC;IAAtC,+NAAS,qCAA2B,KAAC;IAKjC,AADF,AADF,+BAA0B,cACO,cACgD;IAKzE,AAFA,AAFF,6GAAgD,uFAEI,uFAE3C;IAGX,iBAAM;IAIF,AADF,AADF,+BAA+B,cACC,aACJ;IAAA,aAAiB;IAAA,iBAAK;IAC9C,iCAAqC;IACnC,aACF;IAAA,iBAAO;IACP,iCAA+E;IAC7E,aACF;IACF,AADE,iBAAO,EACH;IAGN,iHAAsC;IAkB1C,AADE,iBAAM,EACF;IAEN,gCAAgC;IAC9B,kHAA0B;IAM1B,iCAA8B;IAAA,aAA4B;IAAA,iBAAO;IACjE,mCAIkC;IADhC,qOAAS,sCAA4B,SAAS,SAAS,KAAC;IAExD,6BAAM;IAAA,wBAAO;IAAA,iBAAO;IACpB,yBAAyC;IAG/C,AADE,AADE,iBAAS,EACL,EACF;IAIJ,AADF,gCAAgC,eACI;IAChC,2BAIM;IACR,iBAAM;IACN,iCAAmC;IACjC,aACA;IAAA,sGAA8B;IAG9B,aACF;IACF,AADE,iBAAO,EACH;IAGN,gCAA8B;IAC5B,oHAiEC;IAEL,AADE,iBAAM,EACE;;;;IA1JR,AADA,AADA,AADA,uEAA2D,+DACM,yDACN,oDACZ;IAMZ,eAA6C;;IAC1E,cAMC;IAND,oHAMC;IAKyB,eAAiB;IAAjB,oCAAiB;IAEvC,eACF;IADE,uGACF;IACiC,cAA6C;;IAC5E,cACF;IADE,gDACF;IAIF,cAgBC;IAhBD,6DAgBC;IAKH,eAKC;IALD,iDAKC;IAC6B,eAA4B;IAA5B,+CAA4B;IAkBxD,eAAuC;IAAvC,sDAAuC;;IAIzC,eACA;IADA,+FACA;IAAA,cAEC;IAFD,qDAEC;IACD,cACF;IADE,iEACF;IAKA,eAiEC;IAjED,6BAiEC;;;IA/JT,+BAA8B;IAC5B,gHAiKC;IACH,iBAAM;;;IAlKJ,cAiKC;IAjKD,4CAiKC;;;IAmBS,iCAA6B;IAC3B,wBAAqC;IACrC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,8DACF;;;IA2BM,iCAA+B;IAC7B,yBAAgD;IAChD,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,+EACF;;;IAOF,iCAAgC;IAC9B,wBAAiC;IACjC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,mDACF;;;IAEA,iCAA4B;IAAA,4BAAY;IAAA,iBAAO;;;;IA1BrD,gCAGsD;IAApD,yRAAS,wDAAyC,KAAC;IAEjD,AADF,gCAA4B,eACyD;IACjF,YACF;IAAA,iBAAO;IAEL,AADF,gCAAoC,gBACP;IAAA,YAAoB;IAAA,iBAAO;IACtD,wHAAsC;IAO1C,AADE,iBAAM,EACF;IAEN,gCAA6B;IAMzB,AALF,wHAAsB,oGAKb;IAGX,iBAAM;IASA,AALF,AADF,AADF,iCAA4B,gBACM,gBAKgB,iBACP;IACnC,aACF;IAIR,AADE,AADE,AADE,AADE,iBAAO,EACH,EACF,EACF,EACF;;;;IAzCJ,sEAAkD;IAGpB,eAAsD;;IAChF,cACF;IADE,oDACF;IAE6B,eAAoB;IAApB,wCAAoB;IAC/C,cAKC;IALD,6DAKC;IAKH,eAOC;IAPD,6CAOC;IAQG,eAA2C;IAC3C,AADA,2DAA2C,6CACA;;IAEzC,eACF;IADE,qHACF;;;;IApEZ,AAHF,oCAEkD,eAC2B;IAAtC,6NAAS,sCAA2B,KAAC;IAEtE,AADF,gCAAoC,eAC6C;IAC7E,YACF;IAAA,iBAAO;IACP,8BAAwB;IAAA,YAAiB;IAAA,iBAAK;IAC9C,gCAAqC;IAAA,YAA4B;IACnE,AADmE,iBAAO,EACpE;IACN,gCAA8B;IAC5B,mHAA0B;IAM1B,iCAA8B;IAAA,aAA4B;IAE9D,AADE,AAD4D,iBAAO,EAC7D,EACF;IAIF,AADF,AADF,iCAAgC,gBACC,gBACD;IAAA,6CAAgC;IAAA,iBAAM;IAClE,iCAA6B;IAAA,iCAAgB;IAAA,iBAAM;IAEjD,AADF,iCAA4B,YACpB;IAAA,aAAkE;IAE5E,AADE,AAD0E,iBAAO,EAC3E,EACF;IAEN,qHA6CC;IAEL,AADE,iBAAM,EACE;;;;IA5ER,mEAA+C;IAGV,eAA6C;;IAC5E,cACF;IADE,iDACF;IACwB,eAAiB;IAAjB,qCAAiB;IACJ,eAA4B;IAA5B,yDAA4B;IAGjE,eAKC;IALD,kDAKC;IAC6B,eAA4B;IAA5B,gDAA4B;IASlD,eAAkE;IAAlE,+FAAkE;IAI5E,cA6CC;IA7CD,8BA6CC;;;IA9ET,+BAA8B;IAC5B,gHAgFC;IACH,iBAAM;;;IAjFJ,cAgFC;IAhFD,4CAgFC;;;;IA+BK,mCAImC;IAAjC,2OAAS,iCAAsB,KAAC;IAChC,iCAAyB;IAAA,YAAkB;IAAA,iBAAO;IAClD,iCAA2B;IAAA,YAAiB;IAC9C,AAD8C,iBAAO,EAC5C;;;;IAJP,4DAAwC;IAEf,eAAkB;IAAlB,sCAAkB;IAChB,eAAiB;IAAjB,qCAAiB;;;IARlD,gCAAiC;IAC/B,6HASC;IACH,iBAAM;;;IAVJ,cASC;IATD,0CASC;;;;IAsCG,mCAG2D;IAAzD,6QAAS,yDAA8C,KAAC;IACxD,gCAA+B;IAC7B,wBAAiC;IACnC,iBAAM;IAEJ,AADF,gCAA+B,gBACI;IAAA,yCAAyB;IAAA,iBAAO;IACjE,iCAAiC;IAAA,YAA0B;IAC7D,AAD6D,iBAAO,EAC9D;IACN,yBAAuE;IACzE,iBAAS;;;IAH4B,eAA0B;IAA1B,8CAA0B;;;;IAO/D,mCAGiE;IAA/D,6QAAS,+DAAoD,KAAC;IAC9D,gCAAwC;IACtC,yBAAsC;IACxC,iBAAM;IAEJ,AADF,gCAA+B,gBACI;IAAA,kCAAkB;IAAA,iBAAO;IAC1D,iCAAiC;IAAA,+CAAmC;IACtE,AADsE,iBAAO,EACvE;IACN,yBAAuE;IACzE,iBAAS;;;IAWP,iCAAiC;IAC/B,yBAAuC;IACvC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,4CACF;;;IAGA,iCAAiC;IAC/B,yBAAuC;IACvC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,4CACF;;;IAZJ,AADF,gCAA+B,cACO;IAAA,yCAAyB;IAAA,iBAAK;IAClE,gCAAiC;IAC/B,4JAKC;IACD,4JAKC;IAEL,AADE,iBAAM,EACF;;;IAbF,eAKC;IALD,4CAKC;IACD,eAKC;IALD,iDAKC;;;IAWC,AADF,gCAAuB,gBACK;IAAA,uBAAO;IAAA,iBAAO;IACxC,iCAAwB;IAAA,YAA+C;IACzE,AADyE,iBAAO,EAC1E;;;;IADoB,eAA+C;IAA/C,0EAA+C;;;IAKvE,AADF,gCAAuB,gBACK;IAAA,yBAAS;IAAA,iBAAO;IAC1C,iCAAwB;IAAA,YAAiD;IAC3E,AAD2E,iBAAO,EAC5E;;;;IADoB,eAAiD;IAAjD,4EAAiD;;;IAS7E,AADF,gCAA+B,cACO;IAAA,iCAAiB;IAAA,iBAAK;IAC1D,gCAAgC;IAAA,YAA6B;IAC/D,AAD+D,iBAAM,EAC/D;;;IAD4B,eAA6B;IAA7B,iDAA6B;;;;IAQ3D,AADF,AADF,gCAA+B,eACO,cACE;IAClC,YACF;IAAA,iBAAK;IACL,mCAImC;IADjC,uQAAS,4CAAiC,KAAC;IAE3C,yBAA0F;IAC1F,4BAAM;IAAA,YAAsC;IAEhD,AADE,AAD8C,iBAAO,EAC5C,EACL;IACN,gCAAkF;IAAA,YAAuB;IAC3G,AAD2G,iBAAM,EAC3G;;;;IAZA,eACF;IADE,+GACF;IAMwB,eAA+B;IAAC,AAAhC,+CAA+B,iCAAgC;IAC/E,eAAsC;IAAtC,6DAAsC;IAGd,cAA+C;IAA/C,4DAA+C;IAAC,cAAuB;IAAvB,2CAAuB;;;IA7HzG,AADF,AADF,gCAAoC,eACA,gBACK;IAAA,sBAAM;IAAA,iBAAO;IAClD,gCAA8F;IAC5F,YACF;IACF,AADE,iBAAO,EACH;IAEJ,AADF,gCAAkC,gBACK;IAAA,wBAAQ;IAAA,iBAAO;IACpD,iCAAmC;IAAA,aAAoC;IACzE,AADyE,iBAAO,EAC1E;IAEJ,AADF,iCAAkC,iBACK;IAAA,2BAAU;IAAA,iBAAO;IACtD,kCAAmC;IAAA,aAA2C;IAElF,AADE,AADgF,iBAAO,EACjF,EACF;IAEN,iCAAoC;IAClC,4BAIM;IACR,iBAAM;IAIJ,AADF,iCAA+B,eACO;IAAA,4CAA+B;IAAA,iBAAK;IACxE,iCAAmC;IACjC,8HAAkD;IAgBlD,8HAA6B;IAgBjC,AADE,iBAAM,EACF;IAGN,2HAA4C;IAsB1C,AADF,iCAA+B,eACO;IAAA,yBAAQ;IAAA,iBAAK;IACjD,iCAAkC;IAChC,2HAAiC;IAMjC,2HAAmC;IAOvC,AADE,iBAAM,EACF;IAGN,2HAA+B;IAQ/B,4HAAyB;;;;IA7GY,eAA4D;;IAC3F,cACF;IADE,2DACF;IAImC,eAAoC;IAApC,6DAAoC;IAIpC,eAA2C;IAA3C,wEAA2C;IAQ9E,eAAsD;IAAtD,sEAAsD;;IAQtD,eAcC;IAdD,8EAcC;IAED,cAcC;IAdD,qDAcC;IAKL,cAkBC;IAlBD,oEAkBC;IAMG,eAKC;IALD,yDAKC;IACD,cAKC;IALD,2DAKC;IAKL,cAKC;IALD,uDAKC;IAGD,cAiBC;IAjBD,iDAiBC;;;;IAtKD,AADF,AADF,AADF,iCAA4E,eAC5C,eACM,gBACA;IAC9B,yBAAsC;IACtC,YACF;IAAA,iBAAO;IACP,mCAI0B;IADxB,6LAAS,uBAAgB,KAAC;IAE1B,wBAAiC;IAErC,AADE,iBAAS,EACL;IAEN,+BAA4B;IAC1B,YACF;IAAA,iBAAK;IAGL,4GAAuC;IAczC,iBAAM;IAEN,iCAA+B;IAC7B,kGAAoC;IAsIxC,AADE,iBAAM,EACA;;;;IAvKA,eACF;IADE,mKACF;IAWA,eACF;IADE,oHACF;IAGA,cAaC;IAbD,kEAaC;IAID,eAoIC;IApID,qEAoIC;;AArpBf;;;;;GAKG;AA6/DH,MAAM,OAAO,sBAAuB,SAAQ,oBAAoB;IACtD,GAAG,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,aAAa,CAAU;IAEhC,6CAA6C;IAC7C,IAAa,aAAa,CAAC,KAAa;QACtC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IACD,6CAA6C;IAC7C,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACQ,WAAW,CAAY;IAEhC,2CAA2C;IAC3C,IAAa,WAAW,CAAC,KAAe;QACtC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IACD,2CAA2C;IAC3C,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IACQ,UAAU,GAAW,KAAK,CAAC;IAEpC,0CAA0C;IAC1C,IAAa,UAAU,CAAC,KAAa;QACnC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IACD,0CAA0C;IAC1C,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACM,kBAAkB,GAAmC,IAAI,CAAC;IAC1D,YAAY,CAAU;IAE/B,4CAA4C;IAC5C,IAAa,YAAY,CAAC,KAAyB;QACjD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IACD,4CAA4C;IAC5C,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAES,gBAAgB,GAAG,IAAI,YAAY,EAA4C,CAAC;IAC1F,gDAAgD;IACtC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;IAEzC,YAAY,GAAG,IAAI,YAAY,EAAiB,CAAC;IAC3D,4CAA4C;IAClC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IAEpC,QAAQ,GAAmB,EAAE,CAAC;IACrC,wCAAwC;IACxC,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAqB;QACvC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAEM,aAAa,GAAmB,EAAE,CAAC;IAC1C,6CAA6C;IAC7C,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,6CAA6C;IAC7C,IAAW,aAAa,CAAC,KAAqB;QAC5C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAEM,QAAQ,GAAmB,EAAE,CAAC;IACrC,wCAAwC;IACxC,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAqB;QACvC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAEM,kBAAkB,GAAmB,EAAE,CAAC;IAC/C,kDAAkD;IAClD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IACD,kDAAkD;IAClD,IAAW,kBAAkB,CAAC,KAAqB;QACjD,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAClC,CAAC;IAEM,gBAAgB,GAA6B,EAAE,CAAC;IACvD,gDAAgD;IAChD,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IACD,gDAAgD;IAChD,IAAW,gBAAgB,CAAC,KAA+B;QACzD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAEM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,2CAA2C;IAC3C,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAA0B;QAC/C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAEM,YAAY,GAAwB,IAAI,CAAC;IAChD,4CAA4C;IAC5C,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IACD,4CAA4C;IAC5C,IAAW,YAAY,CAAC,KAA0B;QAChD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAEM,mBAAmB,GAAY,KAAK,CAAC;IAC5C,mDAAmD;IACnD,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IACD,mDAAmD;IACnD,IAAW,mBAAmB,CAAC,KAAc;QAC3C,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;IACnC,CAAC;IAEM,SAAS,GAAY,KAAK,CAAC;IAC1B,kBAAkB,GAAY,KAAK,CAAC;IAE5C,uBAAuB;IAChB,eAAe,GAAkC,WAAW,CAAC;IAC7D,YAAY,GAAyB,KAAK,CAAC;IAC3C,WAAW,GAAW,EAAE,CAAC;IACzB,mBAAmB,GAAW,KAAK,CAAC;IACpC,cAAc,GAA6B,EAAE,CAAC;IAC9C,sBAAsB,GAA6B,EAAE,CAAC;IACtD,eAAe,GAAuD,EAAE,CAAC;IACzE,cAAc,GAAkC,IAAI,CAAC;IACrD,aAAa,GAAgC,IAAI,CAAC;IAClD,YAAY,GAAY,KAAK,CAAC;IAC9B,IAAI,GAA8B;QACvC,cAAc,EAAE,CAAC;QACjB,UAAU,EAAE,CAAC;QACb,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE,CAAC;QACjB,kBAAkB,EAAE,GAAG;QACvB,oBAAoB,EAAE,GAAG;KAC1B,CAAC;IAEM,iBAAiB,GAAmB,EAAE,CAAC;IACvC,kBAAkB,GAAwB,IAAI,CAAC;IAC/C,aAAa,GAA0C,IAAI,CAAC;IAEpE,QAAQ;QACN,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,8BAA8B,EAAE,CAAC;IACxC,CAAC;IAED,WAAW,CAAC,OAAsB;QAChC,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;QACnF,IAAI,aAAa,CAAC,YAAY,CAAC,IAAI,aAAa,CAAC,YAAY,CAAC,IAAI,aAAa,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACtG,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,8BAA8B;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC;YAC9C,IAAI,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;gBACzC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,EAAE;oBAC1E,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;gBACxB,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC;QACnF,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;gBACpC,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACxB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;aAAM,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5C,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,SAAS;QACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,MAAM,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACjC,CAAC;YAED,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;YAE3F,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAClC;gBACE,UAAU,EAAE,WAAW;gBACvB,WAAW,EAAE,MAAM;gBACnB,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,eAAe;gBAC3B,WAAW,EAAE,IAAI;aAClB,EACD,IAAI,CAAC,WAAW,CACjB,CAAC;YAEF,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC;gBACnC,MAAM,IAAI,CAAC,6BAA6B,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC5D,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACnB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;gBACxB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;gBAC5B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;gBACzB,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;QACnC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,yCAAyC;IAClC,KAAK,CAAC,SAAS;QACpB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,6BAA6B,CAAC,EAAW,EAAE,YAA4B;QACnF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;gBACV,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACxB,IAAI,GAAG,CACL,YAAY;aACT,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC;aAC9C,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAC7C,CACF,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,eAAe,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1E,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,OAAO,CACrC;oBACE,UAAU,EAAE,WAAW;oBACvB,WAAW,EAAE,gBAAgB,SAAS,yBAAyB,SAAS,GAAG;oBAC3E,OAAO,EAAE,oBAAoB;oBAC7B,OAAO,EAAE,IAAI;oBACb,UAAU,EAAE,eAAe;oBAC3B,WAAW,EAAE,IAAI;iBAClB,EACD,IAAI,CAAC,WAAW,CACjB,CAAC;gBACF,IAAI,cAAc,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;oBACrD,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;wBAC3C,IAAI,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;4BACxD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;wBAC/C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,iFAAiF;YACnF,CAAC;YAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;iBAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACd,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,eAAe,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9F,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CACjC;wBACE,UAAU,EAAE,uBAAuB;wBACnC,WAAW,EAAE,cAAc,YAAY,4BAA4B,YAAY,GAAG;wBAClF,UAAU,EAAE,eAAe;qBAC5B,EACD,IAAI,CAAC,WAAW,CACjB,CAAC;oBACF,IAAI,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;wBAC7C,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC;oBAC7C,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,iCAAiC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACK,4BAA4B;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QACzF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;gBACV,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,EAAE,EAAE;gBAAE,SAAS;YACrB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACrE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoC,CAAC;QACjE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxC,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC7C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnB,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAA6B,EAAE,CAAC;QAC5C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuD,CAAC;QAErF,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAClD,MAAM,UAAU,GACd,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC7B,MAAM,CAAC,CAAC,CAAC,CAAC;YACZ,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAEnE,2DAA2D;YAC3D,MAAM,cAAc,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACjD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC;gBAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC;gBAC9D,OAAO,KAAK,GAAG,KAAK,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,iCAAiC;YACjC,MAAM,eAAe,GAAG,MAAM;iBAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC;iBACzD,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACxB,MAAM,aAAa,GAAG,MAAM;iBACzB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC;iBAC3D,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACxB,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;YAC9F,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,eAAe,CAAC,CAAC;YAEpE,MAAM,cAAc,GAAwC,EAAE,CAAC;YAC/D,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;YAC7C,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAkB,CAAC;YAExD,MAAM,aAAa,GAA2B,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;gBACjF,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC;gBACzC,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;oBACzB,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;oBACtC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;wBACrC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBAChC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;oBACxD,CAAC;oBACD,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACjD,IAAI,aAAa,EAAE,CAAC;wBAClB,aAAa,CAAC,KAAK,IAAI,CAAC,CAAC;oBAC3B,CAAC;yBAAM,CAAC;wBACN,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;oBACzE,CAAC;gBACH,CAAC;gBAED,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;gBAC/G,MAAM,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;gBACtG,MAAM,MAAM,GACV,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,IAAI,kBAAkB;oBACtF,CAAC,CAAC,kBAAkB;oBACpB,CAAC,CAAC,aAAa,CAAC;gBACpB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,cAAc,CAAC,IAAI,eAAe,CAAC;gBACrG,MAAM,SAAS,GACb,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;oBACpC,CAAC,QAAQ,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;gBACxE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC;gBAE5D,MAAM,YAAY,GAAG,eAAe,GAAG,CAAC;oBACtC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,eAAe,CAAC,GAAG,WAAW,CAAC,GAAG,GAAG;oBACvD,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;gBACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBACtE,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC;gBACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBAClF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;gBAEvF,qCAAqC;gBACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxF,MAAM,cAAc,GAAa,EAAE,CAAC;gBACpC,MAAM,gBAAgB,GAAa,EAAE,CAAC;gBACtC,MAAM,mBAAmB,GAAa,EAAE,CAAC;gBACzC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;oBAC3B,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;wBACxB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;wBAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC;wBAC/D,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;4BACjB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;wBACnC,CAAC;oBACH,CAAC;oBACD,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrD,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC;gBAED,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC;gBAChD,MAAM,mBAAmB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC3D,MAAM,UAAU,GAAG,SAAS,IAAI,CAAC,MAAM;oBACrC,CAAC,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC;wBAC9B,CAAC,CAAC,+BAA+B,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,YAAY,IAAI,EAAE,EAAE;wBAC7F,CAAC,CAAC,gDAAgD,YAAY,IAAI,EAAE,EAAE;oBACxE,CAAC,CAAC,MAAM,IAAI,YAAY,IAAI,EAAE,CAAC;gBACjC,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEpF,OAAO;oBACL,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,GAAG,GAAG,CAAC;oBACnB,SAAS,EAAE,SAAS;oBACpB,OAAO,EAAE,OAAO;oBAChB,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,IAAI;oBACvC,YAAY,EAAE,YAAY;oBAC1B,MAAM,EAAE,MAAM;oBACd,aAAa,EAAE,OAAO;oBACtB,aAAa,EAAE,YAAY,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY;oBAChG,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;oBACtG,UAAU,EAAE,mBAAmB;oBAC/B,qBAAqB,EAAE,SAAS;oBAChC,oBAAoB,EAAE,QAAQ;oBAC9B,gBAAgB,EAAE,IAAI,cAAc,GAAG;oBACvC,cAAc,EAAE,cAAc;oBAC9B,gBAAgB,EAAE,gBAAgB;oBAClC,mBAAmB,EAAE,mBAAmB;iBACzC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC;YACxC,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;YACtF,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;YACnF,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAChG,CAAC,MAAM,CAAC;YACT,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,aAAa,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CACpE,CAAC,MAAM,CAAC;YAET,IAAI,QAAQ,GAAsC,QAAQ,CAAC;YAC3D,IAAI,WAAW,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC3F,QAAQ,GAAG,QAAQ,CAAC;YACtB,CAAC;iBAAM,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC,KAAK,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC9F,QAAQ,GAAG,WAAW,CAAC;YACzB,CAAC;YAED,MAAM,eAAe,GACnB,QAAQ,KAAK,WAAW;gBACtB,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,UAAU,GAAG,CAAC;oBACd,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,GAAG,YAAY,CAAC,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC;oBAClE,CAAC,CAAC,UAAU,CAAC,eAAe,IAAI,CAAC,CAAC;YAExC,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACrG,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,UAAU,CAAC,cAAc,IAAI,IAAI,CAAC;YAC9G,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,IAAI,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,WAAW,IAAI,IAAI,CAAC;YAC3G,MAAM,YAAY,GAChB,WAAW,IAAI,SAAS;gBACtB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC9E,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAE9D,MAAM,CAAC,IAAI,CAAC;gBACV,UAAU,EAAE,UAAU,CAAC,EAAE;gBACzB,UAAU,EAAE,UAAU;gBACtB,KAAK,EAAE,UAAU,CAAC,IAAI,IAAI,gBAAgB;gBAC1C,kBAAkB,EAAE,kBAAkB;gBACtC,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,kBAAkB,EAAE,QAAQ;gBAC5B,eAAe,EAAE,eAAe;gBAChC,UAAU,EAAE,UAAU;gBACtB,cAAc,EAAE,cAAc;gBAC9B,YAAY,EAAE,YAAY;gBAC1B,WAAW,EAAE,WAAW;gBACxB,WAAW,EAAE,WAAW;gBACxB,KAAK,EAAE,aAAa;gBACpB,aAAa,EAAE,cAAc;gBAC7B,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;gBACrD,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI;gBACnD,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,CAAC,CAAC;gBACnE,UAAU,EAAE,YAAY;gBACxB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC;gBACtD,oBAAoB,EAAE,UAAU,CAAC,oBAAoB,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,oBAAoB,IAAI,IAAI;gBACxG,WAAW,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QAED,8BAA8B;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACnB,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,OAAO,GAAG,GAAG,GAAG,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC5F,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,0CAA0C;QAC1C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;YACxG,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC;YACnC,IAAI,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvC,IAAI,CAAC,aAAa;oBAChB,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC/E,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;wBACrB,IAAI,CAAC;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAEO,wBAAwB,CAAC,MAAgC;QAC/D,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACpE,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QACrF,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAC5E,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,aAAa,GAAG,cAAc,GAAG,WAAW,CAAC;QACnD,MAAM,WAAW,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAEjG,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,KAAK,WAAW,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC3G,MAAM,KAAK,GACT,qBAAqB,CAAC,MAAM,GAAG,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,qBAAqB,CAAC,MAAM,CAAC;YAC5G,CAAC,CAAC,CAAC,CAAC;QAER,IAAI,CAAC,IAAI,GAAG;YACV,cAAc,EAAE,cAAc;YAC9B,UAAU,EAAE,UAAU;YACtB,eAAe,EAAE,eAAe;YAChC,cAAc,EAAE,cAAc;YAC9B,kBAAkB,EAAE,WAAW;YAC/B,oBAAoB,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG;SAC3E,CAAC;IACJ,CAAC;IAEM,oBAAoB;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAChD,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YAC/D,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClF,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,IAAI,CAAC,mBAAmB,KAAK,KAAK,EAAE,CAAC;gBACvC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC;oBAAE,OAAO,KAAK,CAAC;YAChE,CAAC;YACD,IAAI,CAAC,EAAE,CAAC;gBACN,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACzD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,CACF,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAC7C,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACxC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAC1C,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAChD,CAAC;gBACF,OAAO,UAAU,IAAI,SAAS,CAAC;YACjC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,oDAAoD;IAC7C,oBAAoB;QACzB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEM,kBAAkB,CAAC,IAAmC;QAC3D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC;IAEM,eAAe,CAAC,MAA4B;QACjD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEM,cAAc,CAAC,OAAe;QACnC,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC;QACnC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEM,uBAAuB;QAC5B,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEM,WAAW;QAChB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEM,eAAe;QACpB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEM,eAAe,CAAC,QAA2C;QAChE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACnF,CAAC;IAEM,eAAe,CAAC,MAA8B;QACnD,IAAI,MAAM,KAAK,UAAU;YAAE,OAAO,WAAW,CAAC;QAC9C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC3C,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QAC3F,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,gBAAgB,CAAC,KAA6B;QACnD,OAAO,OAAO,CAAC,IAAI,CAAC,cAAc,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACtG,CAAC;IAEM,eAAe,CAAC,IAAkB;QACvC,OAAO,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;IAEM,oBAAoB,CACzB,KAA6B,EAC7B,IAA2B,EAC3B,KAAkB;QAElB,KAAK,EAAE,eAAe,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACpD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;QACxD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,kBAAkB,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IAEM,mBAAmB,CAAC,IAA0B;QACnD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IAEO,cAAc,CAAC,MAAc,EAAE,YAAqB,IAAI;QAC9D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxC,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC;gBACzC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBAC5C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC;gBACrC,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjC,CAAC;gBACD,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvE,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBAC/B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC;gBACnC,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjC,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,IAAkB;QACzC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,2CAA2C;IACpC,KAAK,CAAC,WAAW,CAAC,IAAkB;QACzC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAEM,cAAc;QACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,8CAA8C;IACvC,cAAc;QACnB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;IAC/B,CAAC;IAEM,cAAc,CAAC,OAAqB;QACzC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,8CAA8C;IACvC,cAAc,CAAC,OAAqB;QACzC,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAEM,kBAAkB,CAAC,KAAiB,EAAE,OAAe;QAC1D,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACzB,UAAU,EAAE,eAAe;gBAC3B,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,qBAAqB,CAAC,KAAiB,EAAE,UAAkB;QAChE,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACzB,UAAU,EAAE,mBAAmB;gBAC/B,QAAQ,EAAE,UAAU;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,kBAAkB,CAAC,KAA+C;QACvE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,kDAAkD;IAC3C,kBAAkB,CAAC,KAA+C;QACvE,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAEM,cAAc,CAAC,MAAc;QAClC,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YAC5D,KAAK,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC;YAC3B,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,KAAqB;QACzC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,IAAkB;QACzC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1F,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC;gBAChB,OAAO,KAAK,CAAC,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,oBAAoB,CAAC,GAAW;QACtC,MAAM,YAAY,GAAG,sBAAsB,CAAC;QAC5C,MAAM,WAAW,GAAG,qBAAqB,CAAC;QAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACzC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAChB,OAAO;gBACL,YAAY,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE;gBAC7C,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;gBAC1D,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACxC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAChB,OAAO;gBACL,YAAY,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE;gBAC7C,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;gBACzD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,OAAO;YACL,YAAY,EAAE,GAAG,CAAC,IAAI,EAAE;YACxB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,sBAAsB,CAC5B,UAAqC,EACrC,qBAA0C;QAE1C,MAAM,OAAO,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAC9D,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,MAAM,KAAK,GAA4B,EAAE,CAAC;gBAC1C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACxC,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC;wBACnD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACf,CAAC;oBACD,qBAAqB,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;gBAC9C,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,SAAS,CAAC,IAAsC;QACtD,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAEO,gBAAgB,CAAC,UAAkB,EAAE,UAAmB;QAC9D,IAAI,CAAC,UAAU,IAAI,UAAU,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,YAAY,GAAG,EAAE,EAAE,CAAC;YACtB,OAAO,GAAG,YAAY,GAAG,CAAC;QAC5B,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;QAClC,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;IACjE,CAAC;IAEO,kBAAkB,CAAC,IAAsC;QAC/D,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACrD,IAAI,OAAO,GAAG,EAAE;YAAE,OAAO,UAAU,CAAC;QACpC,IAAI,OAAO,GAAG,IAAI;YAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAC9D,IAAI,OAAO,GAAG,KAAK;YAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACjE,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACxF,CAAC;IAEM,cAAc,CAAC,IAAiB;QACrC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACnC,KAAK,EAAE,OAAO;YACd,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC;IAEM,cAAc;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,MAAM,CAAC;QAC3G,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;QACjF,OAAO,GAAG,WAAW,YAAY,cAAc,eAAe,IAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,CAAC;IAC7F,CAAC;IAEM,wBAAwB;QAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,cAAc,CAAC;QACxB,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,MAAM,CAAC;QAC3G,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;QACjF,OAAO,GAAG,WAAW,YAAY,cAAc,eAAe,IAAI,CAAC,QAAQ,CAAC,MAAM,YAAY,CAAC;IACjG,CAAC;IAED,wDAAwD;IACjD,wBAAwB;QAC7B,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACzC,CAAC;qQAl7BU,sBAAsB,yBAAtB,sBAAsB;6DAAtB,sBAAsB;YAn/DzB,AADF,AADF,AAFF,8BAAkC,gBAEN,aACI,aACC;YACzB,uBAA2C;YAC7C,iBAAM;YAGF,AADF,AADF,8BAA4B,aACA,YACH;YAAA,0CAA8B;YAAA,iBAAK;YACxD,yFAAgC;YAMlC,iBAAM;YACN,6BAAuB;YACrB,oGACF;YAEJ,AADE,AADE,iBAAI,EACA,EACF;YAKF,AADF,AAFF,gCAA+B,eAEuC,kBAKtB;YAA1C,oGAAS,uBAAmB,WAAW,CAAC,IAAC;YACzC,yBAAuC;YACvC,6BAAM;YAAA,+BAAc;YACtB,AADsB,iBAAO,EACpB;YACT,mCAI2C;YAAzC,oGAAS,uBAAmB,UAAU,CAAC,IAAC;YACxC,yBAA0C;YAC1C,6BAAM;YAAA,yCAA4B;YAEtC,AADE,AADoC,iBAAO,EAClC,EACL;YAEN,mCAKsC;YADpC,oGAAS,eAAW,IAAC;YAErB,yBAAqE;YACrE,6BAAM;YAAA,wBAAO;YAGnB,AADE,AADE,AADe,iBAAO,EACb,EACL,EACC;YAKL,AADF,AADF,oCAA6D,eAClC,eACY;YACjC,yBAAmC;YACrC,iBAAM;YAEJ,AADF,gCAAyB,gBACI;YAAA,gCAAe;YAAA,iBAAO;YAE/C,AADF,gCAA8B,gBACD;YAAA,aAAyB;YAAA,iBAAO;YAC3D,iCAAyB;YAAA,aAAiC;YAGhE,AADE,AADE,AAD4D,iBAAO,EAC7D,EACF,EACF;YAGJ,AADF,gCAA4E,eACtC;YAClC,yBAAgC;YAClC,iBAAM;YAEJ,AADF,gCAAyB,gBACI;YAAA,iCAAgB;YAAA,iBAAO;YAEhD,AADF,gCAA8B,gBACD;YAAA,aAA0B;YAAA,iBAAO;YAC5D,iCAAyB;YAAA,aAA6E;YAG5G,AADE,AADE,AADwG,iBAAO,EACzG,EACF,EACF;YAGJ,AADF,gCAAyB,eACc;YACnC,yBAAwC;YAC1C,iBAAM;YAEJ,AADF,gCAAyB,gBACI;YAAA,gCAAe;YAAA,iBAAO;YAE/C,AADF,gCAA8B,gBACD;YAAA,aAAyB;YAAA,iBAAO;YAC3D,iCAAyB;YAAA,aAA8B;YAG7D,AADE,AADE,AADyD,iBAAO,EAC1D,EACF,EACF;YAGJ,AADF,gCAAyB,eACW;YAChC,yBAAsC;YACxC,iBAAM;YAEJ,AADF,gCAAyB,gBACI;YAAA,6BAAY;YAAA,iBAAO;YAE5C,AADF,gCAA8B,gBACD;YAAA,aAA8B;YAAA,iBAAO;YAChE,iCAAyB;YAAA,qCAAoB;YAGnD,AADE,AADE,AAD+C,iBAAO,EAChD,EACF,EACF;YAGJ,AADF,gCAAyB,eACW;YAChC,yBAAqC;YACvC,iBAAM;YAEJ,AADF,gCAAyB,gBACI;YAAA,mCAAkB;YAAA,iBAAO;YAElD,AADF,gCAA8B,gBACD;YAAA,aAA+B;YAAA,iBAAO;YACjE,iCAAyB;YAAA,uCAAsB;YAIvD,AADE,AADE,AADE,AADiD,iBAAO,EAClD,EACF,EACF,EACE;YAIR,AADF,oCAA+B,eACF;YACzB,yBAA2D;YAC3D,kCAKgD;YAD9C,uNAAyB;YACzB,mHAAiB,6BAAyB,IAAC;YAL7C,iBAKgD;YAChD,8FAAmB;YAKrB,iBAAM;YAGJ,AADF,gCAAwE,kBAKnC;YAAjC,oGAAS,oBAAgB,KAAK,CAAC,IAAC;YAChC,6BAAM;YAAA,oBAAG;YAAA,iBAAO;YAChB,iCAA4B;YAAA,aAA2B;YACzD,AADyD,iBAAO,EACvD;YACT,mCAIsC;YAApC,oGAAS,oBAAgB,QAAQ,CAAC,IAAC;YACnC,4BAA8C;YAC9C,6BAAM;YAAA,uBAAM;YAAA,iBAAO;YACnB,iCAA4B;YAAA,aAA+B;YAC7D,AAD6D,iBAAO,EAC3D;YACT,mCAIyC;YAAvC,oGAAS,oBAAgB,WAAW,CAAC,IAAC;YACtC,6BAAiD;YACjD,8BAAM;YAAA,2BAAS;YAAA,iBAAO;YACtB,kCAA4B;YAAA,cAAkC;YAChE,AADgE,iBAAO,EAC9D;YACT,oCAIsC;YAApC,qGAAS,oBAAgB,QAAQ,CAAC,IAAC;YACnC,6BAA8C;YAC9C,8BAAM;YAAA,wBAAM;YAAA,iBAAO;YACnB,kCAA4B;YAAA,cAA+B;YAE/D,AADE,AAD6D,iBAAO,EAC3D,EACL;YAEN,6FAAkC;YAepC,iBAAU;YAIR,AADF,iCAAsE,gBACxC;YAgMxB,AAtKA,AAjBA,AARF,6FAAgD,uEAQE,uEAiBJ,uEAsKrC;YAsFX,iBAAM;YAGN,gGAAsB;YAgL1B,AADE,iBAAM,EACF;;YAroBI,eAKC;YALD,uDAKC;YAcD,eAAgD;YAAhD,6DAAgD;YAQhD,eAA+C;YAA/C,4DAA+C;YAUjD,eAAsB;YAAtB,wCAAsB;YAGe,cAA2B;YAA3B,wCAA2B;YAenC,gBAAyB;YAAzB,6CAAyB;YAC3B,eAAiC;YAAjC,8DAAiC;YAKvC,cAAkD;YAAlD,+DAAkD;YAO1C,eAA0B;YAA1B,8CAA0B;YAC5B,eAA6E;YAA7E,iGAA6E;YAY3E,eAAyB;YAAzB,6CAAyB;YAC3B,eAA8B;YAA9B,2DAA8B;YAY5B,eAA8B;YAA9B,2DAA8B;YAa9B,gBAA+B;YAA/B,mDAA+B;YAe5D,eAAyB;YAAzB,+CAAyB;YAE3B,cAIC;YAJD,2CAIC;YAOC,eAAuC;YAAvC,oDAAuC;YAGX,eAA2B;YAA3B,+CAA2B;YAKvD,cAA0C;YAA1C,uDAA0C;YAId,eAA+B;YAA/B,mDAA+B;YAK3D,cAA6C;YAA7C,0DAA6C;YAIjB,eAAkC;YAAlC,sDAAkC;YAK9D,cAA0C;YAA1C,uDAA0C;YAId,eAA+B;YAA/B,mDAA+B;YAI/D,cAcC;YAdD,2DAcC;YAI4B,cAAsC;YAAtC,mDAAsC;YAEjE,eAoRC;YApRD,0KAoRC;YAIH,eA8KC;YA9KD,+CA8KC;4BA/oBG,WAAW;;iFAy/DV,sBAAsB;cA5/DlC,SAAS;2BACE,oBAAoB,cAClB,IAAI,WACP,CAAC,WAAW,CAAC,YACZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAipBT;;kBA02CA,KAAK;;kBAGL,KAAK;;kBAOL,KAAK;;kBAGL,KAAK;;kBAOL,KAAK;;kBAGL,KAAK;;kBAYL,KAAK;;kBACL,KAAK;;kBAGL,KAAK;;kBAQL,MAAM;;kBAEN,MAAM;;kBAEN,MAAM;;kBAEN,MAAM;;kFAxDI,sBAAsB","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ChangeDetectorRef,\n inject\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\nimport { UserInfo, RunView } from '@memberjunction/core';\nimport { MJTaskEntity, MJTaskDependencyEntity } from '@memberjunction/core-entities';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';\nimport { ConversationsRuntime } from '@memberjunction/conversations-runtime';\nimport { EscapeSQLString, ExcludeByUUIDs, IndexByUUID, UUIDsEqual, UUIDSet } from '@memberjunction/global';\nimport { Subscription } from 'rxjs';\n\n/**\n * Normalized status filter categories in the AI Agent Workflows & Tasks Command Center.\n */\nexport type WorkflowStatusFilter = 'all' | 'active' | 'completed' | 'failed';\n\n/**\n * Primary display modes for the AI Agent Workflows & Tasks Command Center.\n */\nexport type WorkflowCommandCenterViewMode = 'workflows' | 'timeline';\n\n/**\n * Enriched representation of an individual step within a workflow group,\n * including timing offsets for the second-resolution execution waterfall.\n */\nexport interface EnrichedWorkflowStep {\n Task: MJTaskEntity;\n StepNumber: number;\n AgentName: string | null;\n AgentID: string | null;\n AgentRunID: string | null;\n Instructions: string;\n Output: string | null;\n IsErrorOutput: boolean;\n OutputPreview: string;\n DurationText: string;\n DurationMs: number;\n /** Offset percentage (0-92) from the workflow's start timestamp */\n TimelineOffsetPercent: number;\n /** Bar width percentage (8-100) relative to the workflow's total duration */\n TimelineWidthPercent: number;\n StartOffsetLabel: string;\n DependsOnNames: string[];\n DependsOnTaskIds: string[];\n DependsOnConditions: string[];\n}\n\n/**\n * Hierarchy-aware workflow group combining a parent orchestration container task\n * (or standalone task) with its ordered specialist agent execution steps.\n */\nexport interface WorkflowGroupViewModel {\n RootTaskId: string;\n ParentTask: MJTaskEntity;\n Title: string;\n SummaryInstruction: string;\n Status: MJTaskEntity['Status'];\n NormalizedCategory: 'active' | 'completed' | 'failed';\n PercentComplete: number;\n TotalSteps: number;\n CompletedSteps: number;\n SkippedSteps: number;\n ActiveSteps: number;\n FailedSteps: number;\n Steps: EnrichedWorkflowStep[];\n AgentPipeline: Array<{ id: string; name: string }>;\n StartedAt: Date | null;\n CompletedAt: Date | null;\n DurationText: string;\n DurationMs: number;\n RelativeTimeText: string;\n ConversationDetailID: string | null;\n IsMultiStep: boolean;\n}\n\n/**\n * Summary KPI metrics displayed in the top command-center ribbon.\n */\nexport interface WorkflowCommandCenterKPIs {\n TotalWorkflows: number;\n TotalSteps: number;\n ActiveWorkflows: number;\n CompletedSteps: number;\n SuccessRatePercent: number;\n AvgExecutionTimeText: string;\n}\n\n/**\n * AI Agent Workflows & Tasks Command Center (`mj-tasks-full-view`).\n *\n * Provides a hierarchy-aware, real-time command center for monitoring and inspecting\n * multi-agent task graphs and durable background agent executions launched from conversations.\n */\n@Component({\n selector: 'mj-tasks-full-view',\n standalone: true,\n imports: [FormsModule],\n template: `\n <div class=\"tasks-command-center\">\n <!-- Top Command Center Header -->\n <header class=\"cc-header\">\n <div class=\"cc-header-left\">\n <div class=\"cc-title-icon\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n </div>\n <div class=\"cc-title-block\">\n <div class=\"cc-title-row\">\n <h1 class=\"cc-title\">AI Agent Workflows &amp; Tasks</h1>\n @if (Kpis.ActiveWorkflows > 0) {\n <span class=\"cc-live-pill\">\n <span class=\"cc-live-dot\"></span>\n {{ Kpis.ActiveWorkflows }} Running Live\n </span>\n }\n </div>\n <p class=\"cc-subtitle\">\n Real-time multi-agent task orchestration, step dependencies &amp; execution telemetry\n </p>\n </div>\n </div>\n\n <div class=\"cc-header-actions\">\n <!-- View Mode Switcher -->\n <div class=\"cc-view-switcher\" role=\"tablist\" aria-label=\"View Mode\">\n <button\n type=\"button\"\n class=\"cc-view-btn\"\n [class.active]=\"CommandViewMode === 'workflows'\"\n (click)=\"SetCommandViewMode('workflows')\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span>Workflow Cards</span>\n </button>\n <button\n type=\"button\"\n class=\"cc-view-btn\"\n [class.active]=\"CommandViewMode === 'timeline'\"\n (click)=\"SetCommandViewMode('timeline')\">\n <i class=\"fa-solid fa-bars-staggered\"></i>\n <span>Execution Timeline &amp; DAG</span>\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"cc-refresh-btn\"\n [disabled]=\"isLoading\"\n (click)=\"LoadTasks()\"\n title=\"Refresh workflows and tasks\">\n <i class=\"fa-solid fa-arrows-rotate\" [class.fa-spin]=\"isLoading\"></i>\n <span>Refresh</span>\n </button>\n </div>\n </header>\n\n <!-- KPI Metric Ribbon -->\n <section class=\"cc-kpi-ribbon\" aria-label=\"Workflow Metrics\">\n <div class=\"cc-kpi-card\">\n <div class=\"cc-kpi-icon kpi-brand\">\n <i class=\"fa-solid fa-sitemap\"></i>\n </div>\n <div class=\"cc-kpi-body\">\n <span class=\"cc-kpi-label\">Total Workflows</span>\n <div class=\"cc-kpi-value-row\">\n <span class=\"cc-kpi-value\">{{ Kpis.TotalWorkflows }}</span>\n <span class=\"cc-kpi-sub\">{{ Kpis.TotalSteps }} total steps</span>\n </div>\n </div>\n </div>\n\n <div class=\"cc-kpi-card\" [class.kpi-card-active]=\"Kpis.ActiveWorkflows > 0\">\n <div class=\"cc-kpi-icon kpi-active\">\n <i class=\"fa-solid fa-bolt\"></i>\n </div>\n <div class=\"cc-kpi-body\">\n <span class=\"cc-kpi-label\">Active / Running</span>\n <div class=\"cc-kpi-value-row\">\n <span class=\"cc-kpi-value\">{{ Kpis.ActiveWorkflows }}</span>\n <span class=\"cc-kpi-sub\">{{ Kpis.ActiveWorkflows > 0 ? 'Streaming live updates' : 'All queues idle' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"cc-kpi-card\">\n <div class=\"cc-kpi-icon kpi-success\">\n <i class=\"fa-solid fa-circle-check\"></i>\n </div>\n <div class=\"cc-kpi-body\">\n <span class=\"cc-kpi-label\">Completed Steps</span>\n <div class=\"cc-kpi-value-row\">\n <span class=\"cc-kpi-value\">{{ Kpis.CompletedSteps }}</span>\n <span class=\"cc-kpi-sub\">of {{ Kpis.TotalSteps }} steps</span>\n </div>\n </div>\n </div>\n\n <div class=\"cc-kpi-card\">\n <div class=\"cc-kpi-icon kpi-rate\">\n <i class=\"fa-solid fa-chart-line\"></i>\n </div>\n <div class=\"cc-kpi-body\">\n <span class=\"cc-kpi-label\">Success Rate</span>\n <div class=\"cc-kpi-value-row\">\n <span class=\"cc-kpi-value\">{{ Kpis.SuccessRatePercent }}%</span>\n <span class=\"cc-kpi-sub\">terminal reliability</span>\n </div>\n </div>\n </div>\n\n <div class=\"cc-kpi-card\">\n <div class=\"cc-kpi-icon kpi-time\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n </div>\n <div class=\"cc-kpi-body\">\n <span class=\"cc-kpi-label\">Avg Execution Time</span>\n <div class=\"cc-kpi-value-row\">\n <span class=\"cc-kpi-value\">{{ Kpis.AvgExecutionTimeText }}</span>\n <span class=\"cc-kpi-sub\">per completed workflow</span>\n </div>\n </div>\n </div>\n </section>\n\n <!-- Filter & Search Bar -->\n <section class=\"cc-filter-bar\">\n <div class=\"cc-search-box\">\n <i class=\"fa-solid fa-magnifying-glass cc-search-icon\"></i>\n <input\n type=\"text\"\n class=\"cc-search-input\"\n placeholder=\"Search workflows, step names, specialist agents, or outputs...\"\n [(ngModel)]=\"SearchQuery\"\n (ngModelChange)=\"OnFilterCriteriaChanged()\" />\n @if (SearchQuery) {\n <button type=\"button\" class=\"cc-search-clear\" (click)=\"ClearSearch()\" title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n\n <div class=\"cc-status-pills\" role=\"group\" aria-label=\"Filter by status\">\n <button\n type=\"button\"\n class=\"cc-filter-pill\"\n [class.active]=\"StatusFilter === 'all'\"\n (click)=\"SetStatusFilter('all')\">\n <span>All</span>\n <span class=\"cc-pill-count\">{{ WorkflowGroups.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"cc-filter-pill pill-active\"\n [class.active]=\"StatusFilter === 'active'\"\n (click)=\"SetStatusFilter('active')\">\n <span class=\"cc-status-dot dot-active\"></span>\n <span>Active</span>\n <span class=\"cc-pill-count\">{{ CountByCategory('active') }}</span>\n </button>\n <button\n type=\"button\"\n class=\"cc-filter-pill pill-completed\"\n [class.active]=\"StatusFilter === 'completed'\"\n (click)=\"SetStatusFilter('completed')\">\n <span class=\"cc-status-dot dot-completed\"></span>\n <span>Completed</span>\n <span class=\"cc-pill-count\">{{ CountByCategory('completed') }}</span>\n </button>\n <button\n type=\"button\"\n class=\"cc-filter-pill pill-failed\"\n [class.active]=\"StatusFilter === 'failed'\"\n (click)=\"SetStatusFilter('failed')\">\n <span class=\"cc-status-dot dot-failed\"></span>\n <span>Failed</span>\n <span class=\"cc-pill-count\">{{ CountByCategory('failed') }}</span>\n </button>\n </div>\n\n @if (AvailableAgents.length > 0) {\n <div class=\"cc-agent-filter\">\n <i class=\"fa-solid fa-robot cc-agent-filter-icon\"></i>\n <select\n class=\"cc-agent-select\"\n [ngModel]=\"SelectedAgentFilter\"\n (ngModelChange)=\"SetAgentFilter($event)\"\n aria-label=\"Filter by specialist agent\">\n <option value=\"all\">All Specialist Agents ({{ AvailableAgents.length }})</option>\n @for (ag of AvailableAgents; track ag.id) {\n <option [value]=\"ag.id\">{{ ag.name }} ({{ ag.count }})</option>\n }\n </select>\n </div>\n }\n </section>\n\n <!-- Main Body: Content List + Slide-Over Inspector Drawer -->\n <div class=\"cc-workspace-body\" [class.drawer-open]=\"!!InspectedGroup\">\n <div class=\"cc-main-scroll\">\n @if (isLoading && WorkflowGroups.length === 0) {\n <div class=\"cc-empty-state\">\n <div class=\"cc-empty-icon\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n </div>\n <h3>Loading AI Agent Workflows...</h3>\n <p>Fetching orchestrated task graphs, specialist agent steps, and execution telemetry.</p>\n </div>\n } @else if (FilteredWorkflowGroups.length === 0) {\n <div class=\"cc-empty-state\">\n <div class=\"cc-empty-icon\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n </div>\n @if (WorkflowGroups.length === 0) {\n <h3>No Agent Workflows Recorded Yet</h3>\n <p>When Sage or other orchestrator agents launch multi-step task graphs in Chat, their live progress, specialist delegations, and outputs will appear here.</p>\n } @else {\n <h3>No Workflows Match Your Filters</h3>\n <p>Try clearing your search query or switching the status / specialist agent filter.</p>\n <button type=\"button\" class=\"cc-reset-filters-btn\" (click)=\"ResetAllFilters()\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n <span>Reset Filters</span>\n </button>\n }\n </div>\n } @else if (CommandViewMode === 'workflows') {\n <!-- VIEW MODE 1: HIERARCHY-AWARE WORKFLOW CARDS -->\n <div class=\"cc-workflow-grid\">\n @for (group of FilteredWorkflowGroups; track group.RootTaskId) {\n <article\n class=\"cc-workflow-card\"\n [class.card-active]=\"group.NormalizedCategory === 'active'\"\n [class.card-completed]=\"group.NormalizedCategory === 'completed'\"\n [class.card-failed]=\"group.NormalizedCategory === 'failed'\"\n [class.card-selected]=\"IsGroupInspected(group)\"\n (click)=\"InspectWorkflowGroup(group)\">\n\n <!-- Workflow Card Header -->\n <div class=\"cc-wf-header\">\n <div class=\"cc-wf-header-left\">\n <div class=\"cc-wf-status-icon\" [attr.data-status]=\"group.NormalizedCategory\">\n @if (group.NormalizedCategory === 'completed') {\n <i class=\"fa-solid fa-check\"></i>\n } @else if (group.NormalizedCategory === 'active') {\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n }\n </div>\n\n <div class=\"cc-wf-title-group\">\n <div class=\"cc-wf-title-line\">\n <h3 class=\"cc-wf-title\">{{ group.Title }}</h3>\n <span class=\"cc-wf-step-count-badge\">\n {{ group.TotalSteps }} {{ group.TotalSteps === 1 ? 'Step' : 'Steps' }}\n </span>\n <span class=\"cc-wf-status-badge\" [attr.data-status]=\"group.NormalizedCategory\">\n {{ group.Status }}\n </span>\n </div>\n\n <!-- Agent Pipeline Chips -->\n @if (group.AgentPipeline.length > 0) {\n <div class=\"cc-wf-agent-pipeline\">\n @for (ag of group.AgentPipeline; track ag.id; let isLast = $last) {\n <button\n type=\"button\"\n class=\"cc-agent-chip\"\n (click)=\"OnAgentChipClicked($event, ag.id)\"\n title=\"Inspect {{ ag.name }}\">\n <i class=\"fa-solid fa-robot\"></i>\n <span>{{ ag.name }}</span>\n </button>\n @if (!isLast) {\n <i class=\"fa-solid fa-arrow-right cc-pipeline-arrow\"></i>\n }\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"cc-wf-header-right\">\n @if (group.DurationText) {\n <span class=\"cc-wf-duration\" title=\"Total workflow execution duration\">\n <i class=\"fa-regular fa-clock\"></i>\n {{ group.DurationText }}\n </span>\n }\n <span class=\"cc-wf-timestamp\">{{ group.RelativeTimeText }}</span>\n <button\n type=\"button\"\n class=\"cc-wf-inspect-btn\"\n (click)=\"InspectWorkflowGroup(group, undefined, $event)\"\n title=\"Open Workflow Inspector\">\n <span>Inspect</span>\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n </div>\n\n <!-- Progress Bar -->\n <div class=\"cc-wf-progress-row\">\n <div class=\"cc-wf-progress-track\">\n <div\n class=\"cc-wf-progress-fill\"\n [attr.data-status]=\"group.NormalizedCategory\"\n [style.width.%]=\"group.PercentComplete\">\n </div>\n </div>\n <span class=\"cc-wf-progress-label\">\n {{ group.CompletedSteps }} of {{ group.TotalSteps }} completed\n @if (group.SkippedSteps > 0) {\n &middot; {{ group.SkippedSteps }} skipped\n }\n &middot; {{ group.PercentComplete }}%\n </span>\n </div>\n\n <!-- Step Pipeline List inside Card -->\n <div class=\"cc-wf-steps-list\">\n @for (step of group.Steps; track step.Task.ID) {\n <div\n class=\"cc-step-row\"\n [class.step-selected]=\"IsStepInspected(step.Task)\"\n [attr.data-status]=\"GetStepCategory(step.Task.Status)\"\n (click)=\"InspectWorkflowGroup(group, step, $event)\">\n\n <div class=\"cc-step-index\" [attr.data-status]=\"GetStepCategory(step.Task.Status)\">\n @if (step.Task.Status === 'Complete') {\n <i class=\"fa-solid fa-check\"></i>\n } @else if (step.Task.Status === 'In Progress') {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else if (step.Task.Status === 'Skipped') {\n <i class=\"fa-solid fa-forward-step\"></i>\n } @else if (step.Task.Status === 'Failed' || step.Task.Status === 'Cancelled') {\n <i class=\"fa-solid fa-xmark\"></i>\n } @else {\n <span>{{ step.StepNumber }}</span>\n }\n </div>\n\n <div class=\"cc-step-main\">\n <div class=\"cc-step-top-line\">\n <span class=\"cc-step-name\">{{ step.Task.Name }}</span>\n\n @if (step.AgentName) {\n <span class=\"cc-step-agent-tag\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ step.AgentName }}\n </span>\n }\n\n @if (step.DependsOnNames.length > 0) {\n <span class=\"cc-step-dep-tag\" title=\"Waits for: {{ step.DependsOnNames.join(', ') }}\">\n <i class=\"fa-solid fa-link\"></i>\n After {{ step.DependsOnNames.join(', ') }}\n </span>\n }\n </div>\n\n @if (step.OutputPreview) {\n <p class=\"cc-step-preview\" [class.preview-error]=\"step.IsErrorOutput\">\n {{ step.OutputPreview }}\n </p>\n }\n </div>\n\n <div class=\"cc-step-right\">\n @if (step.DurationText) {\n <span class=\"cc-step-duration\">{{ step.DurationText }}</span>\n }\n <span class=\"cc-step-status-pill\" [attr.data-status]=\"GetStepCategory(step.Task.Status)\">\n {{ step.Task.Status }}\n </span>\n @if (step.AgentRunID) {\n <button\n type=\"button\"\n class=\"cc-step-run-btn\"\n (click)=\"OnOpenAgentRunClicked($event, step.AgentRunID)\"\n title=\"Open AI Agent Run Telemetry\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n }\n </div>\n </div>\n }\n </div>\n </article>\n }\n </div>\n } @else {\n <!-- VIEW MODE 2: EXECUTION TIMELINE & DEPENDENCY DAG WATERFALL -->\n <div class=\"cc-timeline-list\">\n @for (group of FilteredWorkflowGroups; track group.RootTaskId) {\n <section\n class=\"cc-timeline-card\"\n [class.card-selected]=\"IsGroupInspected(group)\">\n <div class=\"cc-timeline-card-header\" (click)=\"InspectWorkflowGroup(group)\">\n <div class=\"cc-timeline-title-wrap\">\n <span class=\"cc-wf-status-badge\" [attr.data-status]=\"group.NormalizedCategory\">\n {{ group.Status }}\n </span>\n <h3 class=\"cc-wf-title\">{{ group.Title }}</h3>\n <span class=\"cc-wf-step-count-badge\">{{ group.TotalSteps }} Steps</span>\n </div>\n <div class=\"cc-timeline-meta\">\n @if (group.DurationText) {\n <span class=\"cc-wf-duration\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n Total: {{ group.DurationText }}\n </span>\n }\n <span class=\"cc-wf-timestamp\">{{ group.RelativeTimeText }}</span>\n </div>\n </div>\n\n <div class=\"cc-waterfall-table\">\n <div class=\"cc-waterfall-head\">\n <div class=\"cc-wf-col-step\">Workflow Step &amp; Dependencies</div>\n <div class=\"cc-wf-col-agent\">Specialist Agent</div>\n <div class=\"cc-wf-col-bars\">\n <span>Execution Waterfall (0s &rarr; {{ group.DurationText || 'Live' }})</span>\n </div>\n </div>\n\n @for (step of group.Steps; track step.Task.ID) {\n <div\n class=\"cc-waterfall-row\"\n [class.step-selected]=\"IsStepInspected(step.Task)\"\n (click)=\"InspectWorkflowGroup(group, step, $event)\">\n <div class=\"cc-wf-col-step\">\n <span class=\"cc-step-index\" [attr.data-status]=\"GetStepCategory(step.Task.Status)\">\n {{ step.StepNumber }}\n </span>\n <div class=\"cc-waterfall-step-text\">\n <span class=\"cc-step-name\">{{ step.Task.Name }}</span>\n @if (step.DependsOnNames.length > 0) {\n <span class=\"cc-waterfall-dep\">\n <i class=\"fa-solid fa-turn-up fa-rotate-90\"></i>\n Depends on: {{ step.DependsOnNames.join(', ') }}\n </span>\n }\n </div>\n </div>\n\n <div class=\"cc-wf-col-agent\">\n @if (step.AgentName) {\n <span class=\"cc-step-agent-tag\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ step.AgentName }}\n </span>\n } @else {\n <span class=\"cc-text-muted\">Orchestrator</span>\n }\n </div>\n\n <div class=\"cc-wf-col-bars\">\n <div class=\"cc-waterfall-track\">\n <div\n class=\"cc-waterfall-bar\"\n [attr.data-status]=\"GetStepCategory(step.Task.Status)\"\n [style.left.%]=\"step.TimelineOffsetPercent\"\n [style.width.%]=\"step.TimelineWidthPercent\">\n <span class=\"cc-waterfall-bar-label\">\n {{ step.StartOffsetLabel }} &middot; {{ step.DurationText || step.Task.Status }}\n </span>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </section>\n }\n </div>\n }\n </div>\n\n <!-- SLIDE-OVER WORKFLOW & STEP INSPECTOR DRAWER -->\n @if (InspectedGroup) {\n <aside class=\"cc-inspector-drawer\" aria-label=\"Workflow and Step Inspector\">\n <div class=\"cc-drawer-header\">\n <div class=\"cc-drawer-header-top\">\n <span class=\"cc-drawer-eyebrow\">\n <i class=\"fa-solid fa-microscope\"></i>\n {{ InspectedStep ? 'Step ' + InspectedStep.StepNumber + ' of ' + InspectedGroup.TotalSteps : 'Workflow Overview' }}\n </span>\n <button\n type=\"button\"\n class=\"cc-drawer-close\"\n (click)=\"BackToTaskList()\"\n title=\"Close Inspector\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <h2 class=\"cc-drawer-title\">\n {{ InspectedStep ? InspectedStep.Task.Name : InspectedGroup.Title }}\n </h2>\n\n <!-- Step Switcher Pills inside Drawer -->\n @if (InspectedGroup.Steps.length > 1) {\n <div class=\"cc-drawer-step-tabs\">\n @for (s of InspectedGroup.Steps; track s.Task.ID) {\n <button\n type=\"button\"\n class=\"cc-drawer-step-tab\"\n [class.active]=\"IsStepInspected(s.Task)\"\n (click)=\"SelectInspectorStep(s)\">\n <span class=\"cc-tab-num\">{{ s.StepNumber }}</span>\n <span class=\"cc-tab-label\">{{ s.Task.Name }}</span>\n </button>\n }\n </div>\n }\n </div>\n\n <div class=\"cc-drawer-content\">\n @if (InspectedStep; as activeStep) {\n <!-- Status + Progress + Duration Summary -->\n <div class=\"cc-drawer-metrics-grid\">\n <div class=\"cc-drawer-metric-box\">\n <span class=\"cc-drawer-metric-label\">Status</span>\n <span class=\"cc-wf-status-badge\" [attr.data-status]=\"GetStepCategory(activeStep.Task.Status)\">\n {{ activeStep.Task.Status }}\n </span>\n </div>\n <div class=\"cc-drawer-metric-box\">\n <span class=\"cc-drawer-metric-label\">Duration</span>\n <span class=\"cc-drawer-metric-val\">{{ activeStep.DurationText || '—' }}</span>\n </div>\n <div class=\"cc-drawer-metric-box\">\n <span class=\"cc-drawer-metric-label\">Completion</span>\n <span class=\"cc-drawer-metric-val\">{{ activeStep.Task.PercentComplete ?? 0 }}%</span>\n </div>\n </div>\n\n <div class=\"cc-drawer-progress-bar\">\n <div\n class=\"cc-drawer-progress-fill\"\n [attr.data-status]=\"GetStepCategory(activeStep.Task.Status)\"\n [style.width.%]=\"activeStep.Task.PercentComplete ?? 0\">\n </div>\n </div>\n\n <!-- Specialist Agent & AI Agent Run Deep Links -->\n <div class=\"cc-drawer-section\">\n <h4 class=\"cc-drawer-section-title\">Execution &amp; Telemetry Links</h4>\n <div class=\"cc-drawer-links-stack\">\n @if (activeStep.AgentID && activeStep.AgentName) {\n <button\n type=\"button\"\n class=\"cc-drawer-link-card\"\n (click)=\"OnAgentChipClicked($event, activeStep.AgentID)\">\n <div class=\"cc-link-card-icon\">\n <i class=\"fa-solid fa-robot\"></i>\n </div>\n <div class=\"cc-link-card-body\">\n <span class=\"cc-link-card-label\">Assigned Specialist Agent</span>\n <span class=\"cc-link-card-title\">{{ activeStep.AgentName }}</span>\n </div>\n <i class=\"fa-solid fa-arrow-up-right-from-square cc-link-card-ext\"></i>\n </button>\n }\n\n @if (activeStep.AgentRunID) {\n <button\n type=\"button\"\n class=\"cc-drawer-link-card\"\n (click)=\"OnOpenAgentRunClicked($event, activeStep.AgentRunID)\">\n <div class=\"cc-link-card-icon run-icon\">\n <i class=\"fa-solid fa-gauge-high\"></i>\n </div>\n <div class=\"cc-link-card-body\">\n <span class=\"cc-link-card-label\">AI Agent Run Trace</span>\n <span class=\"cc-link-card-title\">Open Full Step &amp; Prompt Run Log</span>\n </div>\n <i class=\"fa-solid fa-arrow-up-right-from-square cc-link-card-ext\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Dependencies -->\n @if (activeStep.DependsOnNames.length > 0) {\n <div class=\"cc-drawer-section\">\n <h4 class=\"cc-drawer-section-title\">Prerequisite Dependencies</h4>\n <div class=\"cc-drawer-deps-list\">\n @for (depName of activeStep.DependsOnNames; track depName) {\n <span class=\"cc-drawer-dep-pill\">\n <i class=\"fa-solid fa-code-commit\"></i>\n {{ depName }}\n </span>\n }\n @for (cond of activeStep.DependsOnConditions; track cond) {\n <span class=\"cc-drawer-dep-pill\">\n <i class=\"fa-solid fa-code-branch\"></i>\n if {{ cond }}\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Timestamps -->\n <div class=\"cc-drawer-section\">\n <h4 class=\"cc-drawer-section-title\">Timeline</h4>\n <div class=\"cc-drawer-timestamps\">\n @if (activeStep.Task.StartedAt) {\n <div class=\"cc-ts-row\">\n <span class=\"cc-ts-label\">Started</span>\n <span class=\"cc-ts-val\">{{ FormatDateTime(activeStep.Task.StartedAt) }}</span>\n </div>\n }\n @if (activeStep.Task.CompletedAt) {\n <div class=\"cc-ts-row\">\n <span class=\"cc-ts-label\">Completed</span>\n <span class=\"cc-ts-val\">{{ FormatDateTime(activeStep.Task.CompletedAt) }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Task Instructions -->\n @if (activeStep.Instructions) {\n <div class=\"cc-drawer-section\">\n <h4 class=\"cc-drawer-section-title\">Step Instructions</h4>\n <div class=\"cc-drawer-text-box\">{{ activeStep.Instructions }}</div>\n </div>\n }\n\n <!-- Agent Output / Error Details -->\n @if (activeStep.Output) {\n <div class=\"cc-drawer-section\">\n <div class=\"cc-drawer-section-head\">\n <h4 class=\"cc-drawer-section-title\">\n {{ activeStep.IsErrorOutput ? 'Error Diagnostics' : 'Specialist Agent Output' }}\n </h4>\n <button\n type=\"button\"\n class=\"cc-copy-btn\"\n (click)=\"CopyStepOutput(activeStep.Output)\"\n title=\"Copy output to clipboard\">\n <i class=\"fa-regular\" [class.fa-copy]=\"!CopiedOutput\" [class.fa-check]=\"CopiedOutput\"></i>\n <span>{{ CopiedOutput ? 'Copied' : 'Copy' }}</span>\n </button>\n </div>\n <div class=\"cc-drawer-output-box\" [class.output-error]=\"activeStep.IsErrorOutput\">{{ activeStep.Output }}</div>\n </div>\n }\n }\n </div>\n </aside>\n }\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n\n .tasks-command-center {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n overflow: hidden;\n }\n\n /* Header */\n .cc-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 18px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .cc-header-left {\n display: flex;\n align-items: center;\n gap: 14px;\n min-width: 0;\n }\n\n .cc-title-icon {\n width: 42px;\n height: 42px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 26%, var(--mj-border-default));\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n }\n\n .cc-title-block {\n min-width: 0;\n }\n\n .cc-title-row {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n }\n\n .cc-title {\n margin: 0;\n font-size: 19px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.01em;\n }\n\n .cc-live-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 12px;\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n }\n\n .cc-live-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: var(--mj-brand-primary);\n animation: ccPulse 1.5s infinite ease-in-out;\n }\n\n @keyframes ccPulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.4; transform: scale(1.25); }\n }\n\n .cc-subtitle {\n margin: 3px 0 0 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .cc-header-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-shrink: 0;\n }\n\n .cc-view-switcher {\n display: inline-flex;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 3px;\n gap: 2px;\n }\n\n .cc-view-btn {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .cc-view-btn:hover {\n color: var(--mj-text-primary);\n }\n\n .cc-view-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n }\n\n .cc-refresh-btn {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 7px 14px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .cc-refresh-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n }\n\n .cc-refresh-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n /* KPI Ribbon */\n .cc-kpi-ribbon {\n display: grid;\n grid-template-columns: repeat(5, minmax(0, 1fr));\n gap: 12px;\n padding: 14px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .cc-kpi-card {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 11px 14px;\n border-radius: 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n min-width: 0;\n }\n\n .cc-kpi-card.kpi-card-active {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 45%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n }\n\n .cc-kpi-icon {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 15px;\n flex-shrink: 0;\n }\n\n .cc-kpi-icon.kpi-brand {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n color: var(--mj-brand-primary);\n }\n\n .cc-kpi-icon.kpi-active {\n background: rgba(245, 158, 11, 0.15);\n color: #d97706;\n }\n\n .cc-kpi-icon.kpi-success {\n background: rgba(16, 185, 129, 0.15);\n color: #059669;\n }\n\n .cc-kpi-icon.kpi-rate {\n background: rgba(99, 102, 241, 0.15);\n color: #4f46e5;\n }\n\n .cc-kpi-icon.kpi-time {\n background: rgba(14, 165, 233, 0.15);\n color: #0284c7;\n }\n\n .cc-kpi-body {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .cc-kpi-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n }\n\n .cc-kpi-value-row {\n display: flex;\n align-items: baseline;\n gap: 6px;\n margin-top: 2px;\n flex-wrap: wrap;\n }\n\n .cc-kpi-value {\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n .cc-kpi-sub {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n /* Filter Bar */\n .cc-filter-bar {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n flex-wrap: wrap;\n }\n\n .cc-search-box {\n position: relative;\n flex: 1;\n min-width: 240px;\n display: flex;\n align-items: center;\n }\n\n .cc-search-icon {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n font-size: 13px;\n pointer-events: none;\n }\n\n .cc-search-input {\n width: 100%;\n padding: 8px 32px 8px 34px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n transition: border-color 0.15s ease;\n }\n\n .cc-search-input:focus {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n }\n\n .cc-search-clear {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n }\n\n .cc-status-pills {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n\n .cc-filter-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 11px;\n border-radius: 999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .cc-filter-pill:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n }\n\n .cc-filter-pill.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n }\n\n .cc-status-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n }\n\n .cc-status-dot.dot-active { background: #f59e0b; }\n .cc-status-dot.dot-completed { background: #10b981; }\n .cc-status-dot.dot-failed { background: #ef4444; }\n\n .cc-pill-count {\n padding: 1px 6px;\n border-radius: 999px;\n background: var(--mj-bg-surface);\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .cc-agent-filter {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 0 10px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .cc-agent-filter-icon {\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .cc-agent-select {\n padding: 7px 4px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 12px;\n font-weight: 600;\n outline: none;\n cursor: pointer;\n }\n\n /* Main Workspace Body & Grid */\n .cc-workspace-body {\n flex: 1;\n min-height: 0;\n display: flex;\n overflow: hidden;\n position: relative;\n }\n\n .cc-main-scroll {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n padding: 20px 24px;\n }\n\n .cc-workflow-grid {\n display: flex;\n flex-direction: column;\n gap: 16px;\n max-width: 1280px;\n margin: 0 auto;\n }\n\n .cc-workflow-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 18px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n cursor: pointer;\n }\n\n .cc-workflow-card:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 45%, var(--mj-border-default));\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);\n }\n\n .cc-workflow-card.card-selected {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n }\n\n .cc-workflow-card.card-active {\n border-left: 4px solid var(--mj-brand-primary);\n }\n\n .cc-workflow-card.card-completed {\n border-left: 4px solid #10b981;\n }\n\n .cc-workflow-card.card-failed {\n border-left: 4px solid #ef4444;\n }\n\n .cc-wf-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n }\n\n .cc-wf-header-left {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n min-width: 0;\n flex: 1;\n }\n\n .cc-wf-status-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .cc-wf-status-icon[data-status=\"completed\"] {\n background: rgba(16, 185, 129, 0.14);\n color: #059669;\n }\n\n .cc-wf-status-icon[data-status=\"active\"] {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n color: var(--mj-brand-primary);\n }\n\n .cc-wf-status-icon[data-status=\"failed\"] {\n background: rgba(239, 68, 68, 0.14);\n color: #dc2626;\n }\n\n .cc-wf-title-group {\n min-width: 0;\n flex: 1;\n }\n\n .cc-wf-title-line {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .cc-wf-title {\n margin: 0;\n font-size: 15px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n .cc-wf-step-count-badge {\n padding: 2px 8px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n .cc-wf-status-badge {\n padding: 2px 9px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n }\n\n .cc-wf-status-badge[data-status=\"completed\"] {\n background: rgba(16, 185, 129, 0.14);\n color: #059669;\n }\n\n .cc-wf-status-badge[data-status=\"active\"] {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n color: var(--mj-brand-primary);\n }\n\n .cc-wf-status-badge[data-status=\"failed\"] {\n background: rgba(239, 68, 68, 0.14);\n color: #dc2626;\n }\n\n .cc-wf-agent-pipeline {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n margin-top: 8px;\n }\n\n .cc-agent-chip {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 9px;\n border-radius: 6px;\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 28%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .cc-agent-chip:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, var(--mj-bg-surface));\n }\n\n .cc-pipeline-arrow {\n font-size: 10px;\n color: var(--mj-text-muted);\n }\n\n .cc-wf-header-right {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-shrink: 0;\n }\n\n .cc-wf-duration {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n border-radius: 6px;\n background: var(--mj-bg-surface-sunken);\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n }\n\n .cc-wf-timestamp {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .cc-wf-inspect-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 10px;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n }\n\n .cc-wf-inspect-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n }\n\n /* Progress Bar inside Card */\n .cc-wf-progress-row {\n display: flex;\n align-items: center;\n gap: 12px;\n margin: 12px 0;\n }\n\n .cc-wf-progress-track {\n flex: 1;\n height: 6px;\n border-radius: 999px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n }\n\n .cc-wf-progress-fill {\n height: 100%;\n border-radius: 999px;\n transition: width 0.35s ease;\n }\n\n .cc-wf-progress-fill[data-status=\"completed\"] { background: #10b981; }\n .cc-wf-progress-fill[data-status=\"active\"] { background: var(--mj-brand-primary); }\n .cc-wf-progress-fill[data-status=\"failed\"] { background: #ef4444; }\n\n .cc-wf-progress-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n font-variant-numeric: tabular-nums;\n }\n\n /* Step Rows inside Card */\n .cc-wf-steps-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 10px;\n }\n\n .cc-step-row {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid transparent;\n transition: all 0.15s ease;\n }\n\n .cc-step-row:hover {\n border-color: var(--mj-border-default);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface-sunken));\n }\n\n .cc-step-row.step-selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n }\n\n .cc-step-index {\n width: 22px;\n height: 22px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n font-weight: 700;\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n .cc-step-index[data-status=\"completed\"] {\n background: rgba(16, 185, 129, 0.16);\n color: #059669;\n }\n\n .cc-step-index[data-status=\"active\"] {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n color: var(--mj-brand-primary);\n }\n\n .cc-step-index[data-status=\"failed\"] {\n background: rgba(239, 68, 68, 0.16);\n color: #dc2626;\n }\n\n .cc-step-index[data-status=\"skipped\"] {\n background: var(--mj-bg-surface);\n border: 1px dashed var(--mj-border-strong);\n color: var(--mj-text-muted);\n }\n\n .cc-step-main {\n flex: 1;\n min-width: 0;\n }\n\n .cc-step-top-line {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .cc-step-name {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .cc-step-row[data-status=\"skipped\"] .cc-step-name {\n color: var(--mj-text-muted);\n }\n\n .cc-step-agent-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 1px 7px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n .cc-step-dep-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .cc-step-preview {\n margin: 4px 0 0 0;\n font-size: 12px;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .cc-step-preview.preview-error {\n color: #dc2626;\n }\n\n .cc-step-right {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n .cc-step-duration {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n font-variant-numeric: tabular-nums;\n }\n\n .cc-step-status-pill {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n padding: 2px 7px;\n border-radius: 999px;\n }\n\n .cc-step-status-pill[data-status=\"completed\"] {\n background: rgba(16, 185, 129, 0.14);\n color: #059669;\n }\n\n .cc-step-status-pill[data-status=\"active\"] {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n color: var(--mj-brand-primary);\n }\n\n .cc-step-status-pill[data-status=\"failed\"] {\n background: rgba(239, 68, 68, 0.14);\n color: #dc2626;\n }\n\n .cc-step-status-pill[data-status=\"skipped\"] {\n background: var(--mj-bg-surface);\n border: 1px dashed var(--mj-border-strong);\n color: var(--mj-text-muted);\n }\n\n .cc-step-run-btn {\n background: none;\n border: 1px solid var(--mj-border-default);\n border-radius: 5px;\n color: var(--mj-text-muted);\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 11px;\n }\n\n .cc-step-run-btn:hover {\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n }\n\n /* Timeline & Waterfall DAG View */\n .cc-timeline-list {\n display: flex;\n flex-direction: column;\n gap: 16px;\n max-width: 1280px;\n margin: 0 auto;\n }\n\n .cc-timeline-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n\n .cc-timeline-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n }\n\n .cc-timeline-title-wrap {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n }\n\n .cc-timeline-meta {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .cc-waterfall-table {\n display: flex;\n flex-direction: column;\n }\n\n .cc-waterfall-head {\n display: grid;\n grid-template-columns: 280px 170px 1fr;\n gap: 12px;\n padding: 8px 18px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .cc-waterfall-row {\n display: grid;\n grid-template-columns: 280px 170px 1fr;\n gap: 12px;\n align-items: center;\n padding: 10px 18px;\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background 0.12s ease;\n }\n\n .cc-waterfall-row:last-child {\n border-bottom: none;\n }\n\n .cc-waterfall-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .cc-waterfall-row.step-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n }\n\n .cc-wf-col-step {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n min-width: 0;\n }\n\n .cc-waterfall-step-text {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .cc-waterfall-dep {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n\n .cc-waterfall-track {\n position: relative;\n height: 26px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .cc-waterfall-bar {\n position: absolute;\n top: 3px;\n bottom: 3px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n padding: 0 8px;\n min-width: 64px;\n white-space: nowrap;\n font-size: 11px;\n font-weight: 600;\n }\n\n .cc-waterfall-bar[data-status=\"completed\"] {\n background: rgba(16, 185, 129, 0.2);\n border: 1px solid rgba(16, 185, 129, 0.5);\n color: #047857;\n }\n\n .cc-waterfall-bar[data-status=\"active\"] {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border: 1px solid var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n }\n\n .cc-waterfall-bar[data-status=\"failed\"] {\n background: rgba(239, 68, 68, 0.2);\n border: 1px solid rgba(239, 68, 68, 0.5);\n color: #b91c1c;\n }\n\n .cc-waterfall-bar[data-status=\"skipped\"] {\n background: var(--mj-bg-surface);\n border: 1px dashed var(--mj-border-strong);\n color: var(--mj-text-muted);\n }\n\n /* Slide-Over Inspector Drawer */\n .cc-inspector-drawer {\n width: 440px;\n max-width: 46%;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n box-shadow: -4px 0 18px rgba(0, 0, 0, 0.06);\n animation: ccSlideIn 0.2s ease-out;\n }\n\n @keyframes ccSlideIn {\n from { opacity: 0; transform: translateX(24px); }\n to { opacity: 1; transform: translateX(0); }\n }\n\n .cc-drawer-header {\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .cc-drawer-header-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 6px;\n }\n\n .cc-drawer-eyebrow {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-brand-primary);\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n\n .cc-drawer-close {\n background: none;\n border: none;\n width: 28px;\n height: 28px;\n border-radius: 6px;\n color: var(--mj-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .cc-drawer-close:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n }\n\n .cc-drawer-title {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1.35;\n }\n\n .cc-drawer-step-tabs {\n display: flex;\n gap: 6px;\n overflow-x: auto;\n margin-top: 12px;\n padding-bottom: 2px;\n }\n\n .cc-drawer-step-tab {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 10px;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n max-width: 180px;\n white-space: nowrap;\n }\n\n .cc-drawer-step-tab.active {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .cc-tab-num {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: var(--mj-bg-surface-sunken);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n flex-shrink: 0;\n }\n\n .cc-tab-label {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cc-drawer-content {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 18px 20px;\n display: flex;\n flex-direction: column;\n gap: 18px;\n }\n\n .cc-drawer-metrics-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 10px;\n }\n\n .cc-drawer-metric-box {\n padding: 10px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n gap: 4px;\n align-items: flex-start;\n }\n\n .cc-drawer-metric-label {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n }\n\n .cc-drawer-metric-val {\n font-size: 14px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n .cc-drawer-progress-bar {\n height: 8px;\n border-radius: 999px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n }\n\n .cc-drawer-progress-fill {\n height: 100%;\n border-radius: 999px;\n transition: width 0.3s ease;\n }\n\n .cc-drawer-progress-fill[data-status=\"completed\"] { background: #10b981; }\n .cc-drawer-progress-fill[data-status=\"active\"] { background: var(--mj-brand-primary); }\n .cc-drawer-progress-fill[data-status=\"failed\"] { background: #ef4444; }\n\n .cc-drawer-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .cc-drawer-section-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .cc-drawer-section-title {\n margin: 0;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-muted);\n }\n\n .cc-drawer-links-stack {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .cc-drawer-link-card {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n cursor: pointer;\n text-align: left;\n transition: all 0.15s ease;\n }\n\n .cc-drawer-link-card:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n }\n\n .cc-link-card-icon {\n width: 34px;\n height: 34px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 15px;\n flex-shrink: 0;\n }\n\n .cc-link-card-body {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .cc-link-card-label {\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n }\n\n .cc-link-card-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .cc-link-card-ext {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .cc-drawer-deps-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .cc-drawer-dep-pill {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 6px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .cc-drawer-timestamps {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n }\n\n .cc-ts-row {\n display: flex;\n justify-content: space-between;\n font-size: 12px;\n }\n\n .cc-ts-label { color: var(--mj-text-muted); font-weight: 600; }\n .cc-ts-val { color: var(--mj-text-primary); font-variant-numeric: tabular-nums; }\n\n .cc-drawer-text-box {\n padding: 12px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n font-size: 13px;\n line-height: 1.55;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .cc-drawer-output-box {\n padding: 12px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n font-size: 13px;\n line-height: 1.6;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 360px;\n overflow-y: auto;\n }\n\n .cc-drawer-output-box.output-error {\n border-color: #ef4444;\n color: #dc2626;\n }\n\n .cc-copy-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n border-radius: 5px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n }\n\n /* Empty State */\n .cc-empty-state {\n max-width: 460px;\n margin: 64px auto;\n text-align: center;\n padding: 32px 24px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 14px;\n }\n\n .cc-empty-icon {\n width: 52px;\n height: 52px;\n border-radius: 12px;\n margin: 0 auto 14px auto;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 22px;\n }\n\n .cc-empty-state h3 {\n margin: 0 0 8px 0;\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n .cc-empty-state p {\n margin: 0;\n font-size: 13px;\n line-height: 1.55;\n color: var(--mj-text-secondary);\n }\n\n .cc-reset-filters-btn {\n margin-top: 14px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 14px;\n border-radius: 8px;\n border: 1px solid var(--mj-brand-primary);\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n }\n `]\n})\nexport class TasksFullViewComponent extends BaseAngularComponent implements OnInit, OnChanges, OnDestroy {\n private cdr = inject(ChangeDetectorRef, { optional: true });\n\n @Input() EnvironmentId!: string;\n\n /** @deprecated Use {@link EnvironmentId}. */\n @Input() set environmentId(value: string) {\n this.EnvironmentId = value;\n }\n /** @deprecated Use {@link EnvironmentId}. */\n get environmentId(): string {\n return this.EnvironmentId;\n }\n @Input() CurrentUser!: UserInfo;\n\n /** @deprecated Use {@link CurrentUser}. */\n @Input() set currentUser(value: UserInfo) {\n this.CurrentUser = value;\n }\n /** @deprecated Use {@link CurrentUser}. */\n get currentUser(): UserInfo {\n return this.CurrentUser;\n }\n @Input() BaseFilter: string = '1=1';\n\n /** @deprecated Use {@link BaseFilter}. */\n @Input() set baseFilter(value: string) {\n this.BaseFilter = value;\n }\n /** @deprecated Use {@link BaseFilter}. */\n get baseFilter(): string {\n return this.BaseFilter;\n }\n\n /**\n * Builds the task filter each time the view loads or refreshes, so the list includes tasks\n * created since the last load. Replaces {@link BaseFilter} when set.\n */\n @Input() BaseFilterResolver: (() => Promise<string>) | null = null;\n @Input() ActiveTaskId?: string;\n\n /** @deprecated Use {@link ActiveTaskId}. */\n @Input() set activeTaskId(value: string | undefined) {\n this.ActiveTaskId = value;\n }\n /** @deprecated Use {@link ActiveTaskId}. */\n get activeTaskId(): string | undefined {\n return this.ActiveTaskId;\n }\n\n @Output() OpenEntityRecord = new EventEmitter<{ entityName: string; recordId: string }>();\n /** @deprecated Use {@link OpenEntityRecord}. */\n @Output() openEntityRecord = this.OpenEntityRecord;\n\n @Output() TaskSelected = new EventEmitter<string | null>();\n /** @deprecated Use {@link TaskSelected}. */\n @Output() taskSelected = this.TaskSelected;\n\n public AllTasks: MJTaskEntity[] = [];\n /** @deprecated Use {@link AllTasks}. */\n public get allTasks(): MJTaskEntity[] {\n return this.AllTasks;\n }\n /** @deprecated Use {@link AllTasks}. */\n public set allTasks(value: MJTaskEntity[]) {\n this.AllTasks = value;\n }\n\n public FilteredTasks: MJTaskEntity[] = [];\n /** @deprecated Use {@link FilteredTasks}. */\n public get filteredTasks(): MJTaskEntity[] {\n return this.FilteredTasks;\n }\n /** @deprecated Use {@link FilteredTasks}. */\n public set filteredTasks(value: MJTaskEntity[]) {\n this.FilteredTasks = value;\n }\n\n public SubTasks: MJTaskEntity[] = [];\n /** @deprecated Use {@link SubTasks}. */\n public get subTasks(): MJTaskEntity[] {\n return this.SubTasks;\n }\n /** @deprecated Use {@link SubTasks}. */\n public set subTasks(value: MJTaskEntity[]) {\n this.SubTasks = value;\n }\n\n public SubTasksWithParent: MJTaskEntity[] = [];\n /** @deprecated Use {@link SubTasksWithParent}. */\n public get subTasksWithParent(): MJTaskEntity[] {\n return this.SubTasksWithParent;\n }\n /** @deprecated Use {@link SubTasksWithParent}. */\n public set subTasksWithParent(value: MJTaskEntity[]) {\n this.SubTasksWithParent = value;\n }\n\n public TaskDependencies: MJTaskDependencyEntity[] = [];\n /** @deprecated Use {@link TaskDependencies}. */\n public get taskDependencies(): MJTaskDependencyEntity[] {\n return this.TaskDependencies;\n }\n /** @deprecated Use {@link TaskDependencies}. */\n public set taskDependencies(value: MJTaskDependencyEntity[]) {\n this.TaskDependencies = value;\n }\n\n public AgentRunMap = new Map<string, string>();\n /** @deprecated Use {@link AgentRunMap}. */\n public get agentRunMap(): Map<string, string> {\n return this.AgentRunMap;\n }\n /** @deprecated Use {@link AgentRunMap}. */\n public set agentRunMap(value: Map<string, string>) {\n this.AgentRunMap = value;\n }\n\n public SelectedTask: MJTaskEntity | null = null;\n /** @deprecated Use {@link SelectedTask}. */\n public get selectedTask(): MJTaskEntity | null {\n return this.SelectedTask;\n }\n /** @deprecated Use {@link SelectedTask}. */\n public set selectedTask(value: MJTaskEntity | null) {\n this.SelectedTask = value;\n }\n\n public ShowDetailAnimation: boolean = false;\n /** @deprecated Use {@link ShowDetailAnimation}. */\n public get showDetailAnimation(): boolean {\n return this.ShowDetailAnimation;\n }\n /** @deprecated Use {@link ShowDetailAnimation}. */\n public set showDetailAnimation(value: boolean) {\n this.ShowDetailAnimation = value;\n }\n\n public isLoading: boolean = false;\n private aiEngineConfigured: boolean = false;\n\n // Command Center state\n public CommandViewMode: WorkflowCommandCenterViewMode = 'workflows';\n public StatusFilter: WorkflowStatusFilter = 'all';\n public SearchQuery: string = '';\n public SelectedAgentFilter: string = 'all';\n public WorkflowGroups: WorkflowGroupViewModel[] = [];\n public FilteredWorkflowGroups: WorkflowGroupViewModel[] = [];\n public AvailableAgents: Array<{ id: string; name: string; count: number }> = [];\n public InspectedGroup: WorkflowGroupViewModel | null = null;\n public InspectedStep: EnrichedWorkflowStep | null = null;\n public CopiedOutput: boolean = false;\n public Kpis: WorkflowCommandCenterKPIs = {\n TotalWorkflows: 0,\n TotalSteps: 0,\n ActiveWorkflows: 0,\n CompletedSteps: 0,\n SuccessRatePercent: 100,\n AvgExecutionTimeText: '—'\n };\n\n private allHierarchyTasks: MJTaskEntity[] = [];\n private streamSubscription: Subscription | null = null;\n private livePollTimer: ReturnType<typeof setInterval> | null = null;\n\n ngOnInit(): void {\n this.LoadTasks();\n this.setupLiveTaskGraphSubscription();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const filterChanged = (key: string) => !!changes[key] && !changes[key].firstChange;\n if (filterChanged('baseFilter') || filterChanged('BaseFilter') || filterChanged('BaseFilterResolver')) {\n this.LoadTasks();\n }\n\n if ((changes['activeTaskId'] || changes['ActiveTaskId']) && this.ActiveTaskId) {\n this.selectTaskById(this.ActiveTaskId);\n }\n }\n\n ngOnDestroy(): void {\n if (this.streamSubscription) {\n this.streamSubscription.unsubscribe();\n this.streamSubscription = null;\n }\n this.stopLivePolling();\n }\n\n private setupLiveTaskGraphSubscription(): void {\n try {\n const runtime = ConversationsRuntime.Instance;\n if (runtime?.Streaming?.TaskGraphEvents$) {\n this.streamSubscription = runtime.Streaming.TaskGraphEvents$.subscribe(() => {\n void this.LoadTasks();\n });\n }\n } catch {\n // Safe no-op in isolated test contexts\n }\n }\n\n private updateLivePollingState(): void {\n const hasActive = this.WorkflowGroups.some(g => g.NormalizedCategory === 'active');\n if (hasActive && !this.livePollTimer) {\n this.livePollTimer = setInterval(() => {\n void this.LoadTasks();\n }, 4000);\n } else if (!hasActive && this.livePollTimer) {\n this.stopLivePolling();\n }\n }\n\n private stopLivePolling(): void {\n if (this.livePollTimer) {\n clearInterval(this.livePollTimer);\n this.livePollTimer = null;\n }\n }\n\n public async LoadTasks(): Promise<void> {\n this.isLoading = true;\n\n try {\n if (!this.aiEngineConfigured) {\n await AIEngineBase.Instance.Config(false);\n this.aiEngineConfigured = true;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter = this.BaseFilterResolver ? await this.BaseFilterResolver() : this.BaseFilter;\n\n const tasksResult = await rv.RunView<MJTaskEntity>(\n {\n EntityName: 'MJ: Tasks',\n ExtraFilter: filter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 1000,\n ResultType: 'entity_object',\n BypassCache: true\n },\n this.CurrentUser\n );\n\n if (tasksResult.Success) {\n this.AllTasks = tasksResult.Results || [];\n this.FilteredTasks = this.AllTasks;\n await this.loadChildTasksAndDependencies(rv, this.AllTasks);\n this.rebuildWorkflowCommandCenter();\n } else {\n this.AllTasks = [];\n this.FilteredTasks = [];\n this.allHierarchyTasks = [];\n this.WorkflowGroups = [];\n this.FilteredWorkflowGroups = [];\n }\n } catch (error) {\n console.error('Failed to load tasks:', error);\n this.AllTasks = [];\n this.FilteredTasks = [];\n this.allHierarchyTasks = [];\n this.WorkflowGroups = [];\n this.FilteredWorkflowGroups = [];\n } finally {\n this.isLoading = false;\n this.updateLivePollingState();\n this.cdr?.markForCheck();\n }\n }\n\n /** @deprecated Use {@link LoadTasks}. */\n public async loadTasks(): Promise<void> {\n return this.LoadTasks();\n }\n\n /**\n * Ensures child step tasks and dependencies are loaded even when the primary filter\n * scopes to top-level (`ParentID IS NULL`) tasks.\n */\n private async loadChildTasksAndDependencies(rv: RunView, primaryTasks: MJTaskEntity[]): Promise<void> {\n const mergedMap = new Map<string, MJTaskEntity>();\n for (const t of primaryTasks) {\n if (t?.ID) {\n mergedMap.set(t.ID.toLowerCase(), t);\n }\n }\n\n const rootIds = Array.from(\n new Set(\n primaryTasks\n .map(t => t.RootParentID || t.ParentID || t.ID)\n .filter((id): id is string => Boolean(id))\n )\n );\n\n if (rootIds.length > 0) {\n const quotedIds = rootIds.map(id => `'${EscapeSQLString(id)}'`).join(',');\n try {\n const childrenResult = await rv.RunView<MJTaskEntity>(\n {\n EntityName: 'MJ: Tasks',\n ExtraFilter: `ParentID IN (${quotedIds}) OR RootParentID IN (${quotedIds})`,\n OrderBy: '__mj_CreatedAt ASC',\n MaxRows: 1000,\n ResultType: 'entity_object',\n BypassCache: true\n },\n this.CurrentUser\n );\n if (childrenResult.Success && childrenResult.Results) {\n for (const child of childrenResult.Results) {\n if (child?.ID && !mergedMap.has(child.ID.toLowerCase())) {\n mergedMap.set(child.ID.toLowerCase(), child);\n }\n }\n }\n } catch {\n // Fallback to primaryTasks when running against minimal unit-test fake providers\n }\n\n const allTaskIds = Array.from(mergedMap.values())\n .map(t => t.ID)\n .filter((id): id is string => Boolean(id));\n if (allTaskIds.length > 0) {\n const quotedAllIds = allTaskIds.slice(0, 300).map(id => `'${EscapeSQLString(id)}'`).join(',');\n try {\n const depsResult = await rv.RunView<MJTaskDependencyEntity>(\n {\n EntityName: 'MJ: Task Dependencies',\n ExtraFilter: `TaskID IN (${quotedAllIds}) OR DependsOnTaskID IN (${quotedAllIds})`,\n ResultType: 'entity_object'\n },\n this.CurrentUser\n );\n if (depsResult.Success && depsResult.Results) {\n this.TaskDependencies = depsResult.Results;\n }\n } catch {\n // Optional dependency enrichment\n }\n }\n }\n\n this.allHierarchyTasks = Array.from(mergedMap.values());\n this.loadAgentRuns(this.allHierarchyTasks);\n }\n\n /**\n * Builds the hierarchy-aware `WorkflowGroups`, KPI metrics, and agent filter options.\n */\n private rebuildWorkflowCommandCenter(): void {\n const tasks = this.allHierarchyTasks.length > 0 ? this.allHierarchyTasks : this.AllTasks;\n const taskById = new Map<string, MJTaskEntity>();\n for (const t of tasks) {\n if (t?.ID) {\n taskById.set(t.ID.toLowerCase(), t);\n }\n }\n\n // Group tasks by root workflow ID\n const buckets = new Map<string, MJTaskEntity[]>();\n for (const t of tasks) {\n if (!t?.ID) continue;\n const rootKey = (t.RootParentID || t.ParentID || t.ID).toLowerCase();\n const list = buckets.get(rootKey) ?? [];\n list.push(t);\n buckets.set(rootKey, list);\n }\n\n const depsByTaskId = new Map<string, MJTaskDependencyEntity[]>();\n for (const dep of this.TaskDependencies) {\n if (dep?.TaskID) {\n const key = dep.TaskID.toLowerCase();\n const existing = depsByTaskId.get(key) ?? [];\n existing.push(dep);\n depsByTaskId.set(key, existing);\n }\n }\n\n const groups: WorkflowGroupViewModel[] = [];\n const agentUsageMap = new Map<string, { id: string; name: string; count: number }>();\n\n for (const [rootKey, bucket] of buckets.entries()) {\n const parentTask =\n bucket.find(t => t.ID.toLowerCase() === rootKey) ??\n bucket.find(t => !t.ParentID) ??\n bucket[0];\n const childSteps = ExcludeByUUIDs(bucket, [parentTask.ID]);\n const rawSteps = childSteps.length > 0 ? childSteps : [parentTask];\n\n // Sort steps chronologically by StartedAt / __mj_CreatedAt\n const sortedRawSteps = [...rawSteps].sort((a, b) => {\n const aTime = this.toEpochMs(a.StartedAt ?? a.__mj_CreatedAt);\n const bTime = this.toEpochMs(b.StartedAt ?? b.__mj_CreatedAt);\n return aTime - bTime;\n });\n\n // Calculate workflow time bounds\n const startCandidates = bucket\n .map(t => this.toEpochMs(t.StartedAt ?? t.__mj_CreatedAt))\n .filter(ms => ms > 0);\n const endCandidates = bucket\n .map(t => this.toEpochMs(t.CompletedAt ?? t.__mj_UpdatedAt))\n .filter(ms => ms > 0);\n const workflowStartMs = startCandidates.length > 0 ? Math.min(...startCandidates) : 0;\n const workflowEndMs = endCandidates.length > 0 ? Math.max(...endCandidates) : workflowStartMs;\n const totalSpanMs = Math.max(1000, workflowEndMs - workflowStartMs);\n\n const pipelineAgents: Array<{ id: string; name: string }> = [];\n const seenPipelineAgents = new Set<string>();\n const seenUpstreamKeyValues = new Map<string, string>();\n\n const enrichedSteps: EnrichedWorkflowStep[] = sortedRawSteps.map((stepTask, idx) => {\n const agentName = this.resolveAgentName(stepTask);\n const agentId = stepTask.AgentID || null;\n if (agentId && agentName) {\n const lowerId = agentId.toLowerCase();\n if (!seenPipelineAgents.has(lowerId)) {\n seenPipelineAgents.add(lowerId);\n pipelineAgents.push({ id: agentId, name: agentName });\n }\n const existingUsage = agentUsageMap.get(lowerId);\n if (existingUsage) {\n existingUsage.count += 1;\n } else {\n agentUsageMap.set(lowerId, { id: agentId, name: agentName, count: 1 });\n }\n }\n\n const { instructions, output: rawDescOutput, isError } = this.splitTaskDescription(stepTask.Description || '');\n const deltaPayloadOutput = this.resolveDeltaStepOutput(stepTask.OutputPayload, seenUpstreamKeyValues);\n const output =\n (!rawDescOutput || rawDescOutput.startsWith('output available (')) && deltaPayloadOutput\n ? deltaPayloadOutput\n : rawDescOutput;\n const stepStartMs = this.toEpochMs(stepTask.StartedAt ?? stepTask.__mj_CreatedAt) || workflowStartMs;\n const stepEndMs =\n this.toEpochMs(stepTask.CompletedAt) ||\n (stepTask.Status === 'In Progress' ? Date.now() : stepStartMs + 1000);\n const stepDurationMs = Math.max(0, stepEndMs - stepStartMs);\n\n const rawOffsetPct = workflowStartMs > 0\n ? ((stepStartMs - workflowStartMs) / totalSpanMs) * 100\n : idx * (80 / Math.max(1, sortedRawSteps.length));\n const offsetPct = Math.max(0, Math.min(86, Math.round(rawOffsetPct)));\n const rawWidthPct = (Math.max(1000, stepDurationMs) / totalSpanMs) * 100;\n const widthPct = Math.max(14, Math.min(100 - offsetPct, Math.round(rawWidthPct)));\n const startOffsetSec = Math.max(0, Math.round((stepStartMs - workflowStartMs) / 1000));\n\n // Resolve dependencies for this step\n const stepDeps = stepTask.ID ? (depsByTaskId.get(stepTask.ID.toLowerCase()) ?? []) : [];\n const dependsOnNames: string[] = [];\n const dependsOnTaskIds: string[] = [];\n const dependsOnConditions: string[] = [];\n for (const dep of stepDeps) {\n if (dep.DependsOnTaskID) {\n dependsOnTaskIds.push(dep.DependsOnTaskID);\n const prereq = taskById.get(dep.DependsOnTaskID.toLowerCase());\n if (prereq?.Name) {\n dependsOnNames.push(prereq.Name);\n }\n }\n if (dep.Condition && dep.Condition.trim().length > 0) {\n dependsOnConditions.push(dep.Condition.trim());\n }\n }\n\n const isSkipped = stepTask.Status === 'Skipped';\n const effectiveDurationMs = isSkipped ? 0 : stepDurationMs;\n const rawPreview = isSkipped && !output\n ? dependsOnConditions.length > 0\n ? `Skipped (condition not met: ${dependsOnConditions.join(' AND ')}) — ${instructions || ''}`\n : `Skipped (conditional prerequisite not met) — ${instructions || ''}`\n : output || instructions || '';\n const cleanPreview = rawPreview.replace(/[#*`_~]/g, '').replace(/\\s+/g, ' ').trim();\n\n return {\n Task: stepTask,\n StepNumber: idx + 1,\n AgentName: agentName,\n AgentID: agentId,\n AgentRunID: stepTask.AgentRunID || null,\n Instructions: instructions,\n Output: output,\n IsErrorOutput: isError,\n OutputPreview: cleanPreview.length > 180 ? `${cleanPreview.substring(0, 180)}...` : cleanPreview,\n DurationText: isSkipped ? '' : this.formatDurationMs(effectiveDurationMs, Boolean(stepTask.StartedAt)),\n DurationMs: effectiveDurationMs,\n TimelineOffsetPercent: offsetPct,\n TimelineWidthPercent: widthPct,\n StartOffsetLabel: `+${startOffsetSec}s`,\n DependsOnNames: dependsOnNames,\n DependsOnTaskIds: dependsOnTaskIds,\n DependsOnConditions: dependsOnConditions\n };\n });\n\n const totalSteps = enrichedSteps.length;\n const completedSteps = enrichedSteps.filter(s => s.Task.Status === 'Complete').length;\n const skippedSteps = enrichedSteps.filter(s => s.Task.Status === 'Skipped').length;\n const failedSteps = enrichedSteps.filter(\n s => s.Task.Status === 'Failed' || s.Task.Status === 'Cancelled' || s.Task.Status === 'Blocked'\n ).length;\n const activeSteps = enrichedSteps.filter(\n s => s.Task.Status === 'In Progress' || s.Task.Status === 'Pending'\n ).length;\n\n let category: 'active' | 'completed' | 'failed' = 'active';\n if (failedSteps > 0 || parentTask.Status === 'Failed' || parentTask.Status === 'Cancelled') {\n category = 'failed';\n } else if ((completedSteps + skippedSteps) === totalSteps || parentTask.Status === 'Complete') {\n category = 'completed';\n }\n\n const percentComplete =\n category === 'completed'\n ? 100\n : totalSteps > 0\n ? Math.round(((completedSteps + skippedSteps) / totalSteps) * 100)\n : parentTask.PercentComplete ?? 0;\n\n const { instructions: parentInstructions } = this.splitTaskDescription(parentTask.Description || '');\n const wfStartDate = parentTask.StartedAt ?? sortedRawSteps[0]?.StartedAt ?? parentTask.__mj_CreatedAt ?? null;\n const wfEndDate = parentTask.CompletedAt ?? sortedRawSteps[sortedRawSteps.length - 1]?.CompletedAt ?? null;\n const wfDurationMs =\n wfStartDate && wfEndDate\n ? Math.max(0, new Date(wfEndDate).getTime() - new Date(wfStartDate).getTime())\n : enrichedSteps.reduce((acc, s) => acc + s.DurationMs, 0);\n\n groups.push({\n RootTaskId: parentTask.ID,\n ParentTask: parentTask,\n Title: parentTask.Name || 'Agent Workflow',\n SummaryInstruction: parentInstructions,\n Status: parentTask.Status,\n NormalizedCategory: category,\n PercentComplete: percentComplete,\n TotalSteps: totalSteps,\n CompletedSteps: completedSteps,\n SkippedSteps: skippedSteps,\n ActiveSteps: activeSteps,\n FailedSteps: failedSteps,\n Steps: enrichedSteps,\n AgentPipeline: pipelineAgents,\n StartedAt: wfStartDate ? new Date(wfStartDate) : null,\n CompletedAt: wfEndDate ? new Date(wfEndDate) : null,\n DurationText: this.formatDurationMs(wfDurationMs, wfDurationMs > 0),\n DurationMs: wfDurationMs,\n RelativeTimeText: this.formatRelativeTime(wfStartDate),\n ConversationDetailID: parentTask.ConversationDetailID || sortedRawSteps[0]?.ConversationDetailID || null,\n IsMultiStep: childSteps.length > 0\n });\n }\n\n // Sort workflows newest first\n groups.sort((a, b) => {\n const aMs = a.StartedAt ? a.StartedAt.getTime() : 0;\n const bMs = b.StartedAt ? b.StartedAt.getTime() : 0;\n return bMs - aMs;\n });\n\n this.WorkflowGroups = groups;\n this.AvailableAgents = Array.from(agentUsageMap.values()).sort((a, b) => b.count - a.count);\n this.computeCommandCenterKPIs(groups);\n this.ApplyWorkflowFilters();\n\n // Refresh open inspector drawer if active\n if (this.ActiveTaskId) {\n this.selectTaskById(this.ActiveTaskId, false);\n } else if (this.InspectedGroup) {\n const updatedGroup = IndexByUUID(groups, g => g.RootTaskId).Get(this.InspectedGroup.RootTaskId) ?? null;\n this.InspectedGroup = updatedGroup;\n if (updatedGroup && this.InspectedStep) {\n this.InspectedStep =\n IndexByUUID(updatedGroup.Steps, s => s.Task.ID).Get(this.InspectedStep.Task.ID) ??\n updatedGroup.Steps[0] ??\n null;\n }\n }\n }\n\n private computeCommandCenterKPIs(groups: WorkflowGroupViewModel[]): void {\n const totalWorkflows = groups.length;\n const totalSteps = groups.reduce((sum, g) => sum + g.TotalSteps, 0);\n const activeWorkflows = groups.filter(g => g.NormalizedCategory === 'active').length;\n const completedSteps = groups.reduce((sum, g) => sum + g.CompletedSteps, 0);\n const failedSteps = groups.reduce((sum, g) => sum + g.FailedSteps, 0);\n const terminalSteps = completedSteps + failedSteps;\n const successRate = terminalSteps > 0 ? Math.round((completedSteps / terminalSteps) * 100) : 100;\n\n const completedWithDuration = groups.filter(g => g.NormalizedCategory === 'completed' && g.DurationMs > 0);\n const avgMs =\n completedWithDuration.length > 0\n ? Math.round(completedWithDuration.reduce((sum, g) => sum + g.DurationMs, 0) / completedWithDuration.length)\n : 0;\n\n this.Kpis = {\n TotalWorkflows: totalWorkflows,\n TotalSteps: totalSteps,\n ActiveWorkflows: activeWorkflows,\n CompletedSteps: completedSteps,\n SuccessRatePercent: successRate,\n AvgExecutionTimeText: avgMs > 0 ? this.formatDurationMs(avgMs, true) : '—'\n };\n }\n\n public ApplyWorkflowFilters(): void {\n const q = this.SearchQuery.trim().toLowerCase();\n this.FilteredWorkflowGroups = this.WorkflowGroups.filter(group => {\n if (this.StatusFilter !== 'all' && group.NormalizedCategory !== this.StatusFilter) {\n return false;\n }\n if (this.SelectedAgentFilter !== 'all') {\n const stepAgentIds = new UUIDSet(group.Steps.map(s => s.AgentID));\n if (!stepAgentIds.Has(this.SelectedAgentFilter)) return false;\n }\n if (q) {\n const titleMatch = group.Title.toLowerCase().includes(q);\n const stepMatch = group.Steps.some(\n s =>\n (s.Task.Name || '').toLowerCase().includes(q) ||\n s.Instructions.toLowerCase().includes(q) ||\n (s.Output || '').toLowerCase().includes(q) ||\n (s.AgentName || '').toLowerCase().includes(q)\n );\n return titleMatch || stepMatch;\n }\n return true;\n });\n }\n\n /** @deprecated Use {@link ApplyWorkflowFilters}. */\n public applyWorkflowFilters(): void {\n this.ApplyWorkflowFilters();\n }\n\n public SetCommandViewMode(mode: WorkflowCommandCenterViewMode): void {\n this.CommandViewMode = mode;\n }\n\n public SetStatusFilter(filter: WorkflowStatusFilter): void {\n this.StatusFilter = filter;\n this.ApplyWorkflowFilters();\n }\n\n public SetAgentFilter(agentId: string): void {\n this.SelectedAgentFilter = agentId;\n this.ApplyWorkflowFilters();\n }\n\n public OnFilterCriteriaChanged(): void {\n this.ApplyWorkflowFilters();\n }\n\n public ClearSearch(): void {\n this.SearchQuery = '';\n this.ApplyWorkflowFilters();\n }\n\n public ResetAllFilters(): void {\n this.SearchQuery = '';\n this.StatusFilter = 'all';\n this.SelectedAgentFilter = 'all';\n this.ApplyWorkflowFilters();\n }\n\n public CountByCategory(category: 'active' | 'completed' | 'failed'): number {\n return this.WorkflowGroups.filter(g => g.NormalizedCategory === category).length;\n }\n\n public GetStepCategory(status: MJTaskEntity['Status']): 'active' | 'completed' | 'failed' | 'skipped' {\n if (status === 'Complete') return 'completed';\n if (status === 'Skipped') return 'skipped';\n if (status === 'Failed' || status === 'Cancelled' || status === 'Blocked') return 'failed';\n return 'active';\n }\n\n public IsGroupInspected(group: WorkflowGroupViewModel): boolean {\n return Boolean(this.InspectedGroup && UUIDsEqual(this.InspectedGroup.RootTaskId, group.RootTaskId));\n }\n\n public IsStepInspected(task: MJTaskEntity): boolean {\n return Boolean(this.InspectedStep && UUIDsEqual(this.InspectedStep.Task.ID, task.ID));\n }\n\n public InspectWorkflowGroup(\n group: WorkflowGroupViewModel,\n step?: EnrichedWorkflowStep,\n event?: MouseEvent\n ): void {\n event?.stopPropagation();\n this.InspectedGroup = group;\n this.InspectedStep = step ?? group.Steps[0] ?? null;\n this.SelectedTask = step ? step.Task : group.ParentTask;\n this.SubTasks = group.Steps.map(s => s.Task);\n this.SubTasksWithParent = [group.ParentTask, ...this.SubTasks];\n this.ShowDetailAnimation = true;\n this.TaskSelected.emit(this.SelectedTask.ID);\n }\n\n public SelectInspectorStep(step: EnrichedWorkflowStep): void {\n this.InspectedStep = step;\n this.SelectedTask = step.Task;\n this.TaskSelected.emit(step.Task.ID);\n }\n\n private selectTaskById(taskId: string, emitEvent: boolean = true): void {\n for (const group of this.WorkflowGroups) {\n if (UUIDsEqual(group.RootTaskId, taskId)) {\n this.InspectedGroup = group;\n this.InspectedStep = group.Steps[0] ?? null;\n this.SelectedTask = group.ParentTask;\n if (emitEvent) {\n this.TaskSelected.emit(taskId);\n }\n return;\n }\n const stepMatch = IndexByUUID(group.Steps, s => s.Task.ID).Get(taskId);\n if (stepMatch) {\n this.InspectedGroup = group;\n this.InspectedStep = stepMatch;\n this.SelectedTask = stepMatch.Task;\n if (emitEvent) {\n this.TaskSelected.emit(taskId);\n }\n return;\n }\n }\n }\n\n public async OnTaskClick(task: MJTaskEntity): Promise<void> {\n this.SelectedTask = task;\n this.ShowDetailAnimation = true;\n this.TaskSelected.emit(task.ID);\n this.selectTaskById(task.ID, false);\n }\n\n /** @deprecated Use {@link OnTaskClick}. */\n public async onTaskClick(task: MJTaskEntity): Promise<void> {\n return this.OnTaskClick(task);\n }\n\n public BackToTaskList(): void {\n this.InspectedGroup = null;\n this.InspectedStep = null;\n this.SelectedTask = null;\n this.SubTasks = [];\n this.SubTasksWithParent = [];\n this.ShowDetailAnimation = false;\n this.TaskSelected.emit(null);\n }\n\n /** @deprecated Use {@link BackToTaskList}. */\n public backToTaskList(): void {\n return this.BackToTaskList();\n }\n\n public OnSubTaskClick(subTask: MJTaskEntity): void {\n this.selectTaskById(subTask.ID, true);\n }\n\n /** @deprecated Use {@link OnSubTaskClick}. */\n public onSubTaskClick(subTask: MJTaskEntity): void {\n return this.OnSubTaskClick(subTask);\n }\n\n public OnAgentChipClicked(event: MouseEvent, agentId: string): void {\n event.stopPropagation();\n if (agentId) {\n this.OpenEntityRecord.emit({\n entityName: 'MJ: AI Agents',\n recordId: agentId\n });\n }\n }\n\n public OnOpenAgentRunClicked(event: MouseEvent, agentRunId: string): void {\n event.stopPropagation();\n if (agentRunId) {\n this.OpenEntityRecord.emit({\n entityName: 'MJ: AI Agent Runs',\n recordId: agentRunId\n });\n }\n }\n\n public OnOpenEntityRecord(event: { entityName: string; recordId: string }): void {\n this.OpenEntityRecord.emit(event);\n }\n\n /** @deprecated Use {@link OnOpenEntityRecord}. */\n public onOpenEntityRecord(event: { entityName: string; recordId: string }): void {\n return this.OnOpenEntityRecord(event);\n }\n\n public CopyStepOutput(output: string): void {\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n void navigator.clipboard.writeText(output);\n this.CopiedOutput = true;\n setTimeout(() => {\n this.CopiedOutput = false;\n this.cdr?.markForCheck();\n }, 1800);\n }\n }\n\n private loadAgentRuns(tasks: MJTaskEntity[]): void {\n this.AgentRunMap.clear();\n for (const task of tasks) {\n if (task?.ID && task.AgentRunID) {\n this.AgentRunMap.set(task.ID, task.AgentRunID);\n }\n }\n }\n\n private resolveAgentName(task: MJTaskEntity): string | null {\n if (task.Agent) {\n return task.Agent;\n }\n if (task.AgentID) {\n const agents = AIEngineBase.Instance.Agents || [];\n const found = agents.find((a: MJAIAgentEntityExtended) => UUIDsEqual(a.ID, task.AgentID));\n if (found?.Name) {\n return found.Name;\n }\n }\n return null;\n }\n\n private splitTaskDescription(raw: string): { instructions: string; output: string | null; isError: boolean } {\n const outputMarker = '\\n\\n--- Output ---\\n';\n const errorMarker = '\\n\\n--- Error ---\\n';\n const outIdx = raw.indexOf(outputMarker);\n if (outIdx >= 0) {\n return {\n instructions: raw.substring(0, outIdx).trim(),\n output: raw.substring(outIdx + outputMarker.length).trim(),\n isError: false\n };\n }\n const errIdx = raw.indexOf(errorMarker);\n if (errIdx >= 0) {\n return {\n instructions: raw.substring(0, errIdx).trim(),\n output: raw.substring(errIdx + errorMarker.length).trim(),\n isError: true\n };\n }\n return {\n instructions: raw.trim(),\n output: null,\n isError: false\n };\n }\n\n /**\n * Strips upstream keys inherited unchanged from earlier workflow steps and returns a formatted\n * human-readable or JSON excerpt for the step inspector drawer.\n */\n private resolveDeltaStepOutput(\n rawPayload: string | null | undefined,\n seenUpstreamKeyValues: Map<string, string>,\n ): string | null {\n const trimmed = rawPayload?.trim();\n if (!trimmed) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as Record<string, unknown>;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const delta: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(parsed)) {\n const serializedVal = JSON.stringify(v);\n if (seenUpstreamKeyValues.get(k) !== serializedVal) {\n delta[k] = v;\n }\n seenUpstreamKeyValues.set(k, serializedVal);\n }\n const source = Object.keys(delta).length > 0 ? delta : parsed;\n return JSON.stringify(source, null, 2);\n }\n } catch {\n // Non-JSON payload; return as-is.\n }\n return trimmed;\n }\n\n private toEpochMs(date: Date | string | null | undefined): number {\n if (!date) return 0;\n const ms = new Date(date).getTime();\n return Number.isFinite(ms) ? ms : 0;\n }\n\n private formatDurationMs(durationMs: number, hasStarted: boolean): string {\n if (!hasStarted || durationMs <= 0) return '';\n const totalSeconds = Math.max(1, Math.round(durationMs / 1000));\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;\n }\n\n private formatRelativeTime(date: Date | string | null | undefined): string {\n if (!date) return '';\n const ms = new Date(date).getTime();\n if (!Number.isFinite(ms)) return '';\n const diffSec = Math.round((Date.now() - ms) / 1000);\n if (diffSec < 60) return 'Just now';\n if (diffSec < 3600) return `${Math.floor(diffSec / 60)}m ago`;\n if (diffSec < 86400) return `${Math.floor(diffSec / 3600)}h ago`;\n return new Date(date).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n }\n\n public FormatDateTime(date: Date | null): string {\n if (!date) return '';\n const d = new Date(date);\n return d.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n });\n }\n\n public getDescription(): string {\n const activeCount = this.AllTasks.filter(t => t.Status === 'Pending' || t.Status === 'In Progress').length;\n const completedCount = this.AllTasks.filter(t => t.Status === 'Complete').length;\n return `${activeCount} active, ${completedCount} completed, ${this.AllTasks.length} total`;\n }\n\n public GetTaskDetailDescription(): string {\n if (this.SubTasks.length === 0) {\n return 'No sub-tasks';\n }\n const activeCount = this.SubTasks.filter(t => t.Status === 'Pending' || t.Status === 'In Progress').length;\n const completedCount = this.SubTasks.filter(t => t.Status === 'Complete').length;\n return `${activeCount} active, ${completedCount} completed, ${this.SubTasks.length} sub-tasks`;\n }\n\n /** @deprecated Use {@link GetTaskDetailDescription}. */\n public getTaskDetailDescription(): string {\n return this.GetTaskDetailDescription();\n }\n}\n"]}
@@ -391,8 +391,8 @@ export class TasksDropdownComponent {
391
391
  */
392
392
  GetAgentIconClass(agentName) {
393
393
  // Look up agent from AIEngineBase cache by name
394
- if (AIEngineBase.Instance?.Agents) {
395
- const agent = AIEngineBase.Instance.Agents.find(a => a.Name === agentName);
394
+ if (AIEngineBase.Instance.ReadableAgents.length) {
395
+ const agent = AIEngineBase.Instance.ReadableAgents.find(a => a.Name === agentName);
396
396
  if (agent?.IconClass) {
397
397
  return agent.IconClass;
398
398
  }
@@ -410,8 +410,8 @@ export class TasksDropdownComponent {
410
410
  */
411
411
  GetAgentLogoUrl(agentName) {
412
412
  // Look up agent from AIEngineBase cache by name
413
- if (AIEngineBase.Instance?.Agents) {
414
- const agent = AIEngineBase.Instance.Agents.find(a => a.Name === agentName);
413
+ if (AIEngineBase.Instance.ReadableAgents.length) {
414
+ const agent = AIEngineBase.Instance.ReadableAgents.find(a => a.Name === agentName);
415
415
  if (agent?.LogoURL) {
416
416
  return agent.LogoURL;
417
417
  }